Files
picpeak/release-notes.md
T

403 lines
66 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
:robot: I have created a release *beep* *boop*
---
## [2.7.0](https://github.com/PicPeak/picpeak/compare/v2.6.1...v2.7.0) (2026-06-29)
### Features
* **accounting:** Accounting nav section + relocate Tax report out of CRM ([30c0007](https://github.com/PicPeak/picpeak/commit/30c0007f40594e679f5d997219985107de784cf4))
* **accounting:** Accounting settings tab (km / per-diem rate, require-proof) ([2b7495e](https://github.com/PicPeak/picpeak/commit/2b7495e4dc46c6033f581a0ce2ffde83b9ef89b4))
* **accounting:** add a Banana "Income & Expense" (cash-book) export format ([445d6d7](https://github.com/PicPeak/picpeak/commit/445d6d7b6d6b0692d5b7c0a3dd0ca8b71dfad6ef))
* **accounting:** backend rework - incoming invoices vs internal expenses (stage 2) ([5e78fb6](https://github.com/PicPeak/picpeak/commit/5e78fb6475513cbda38257b406493eb649a5e33c))
* **accounting:** bill editor VAT dropdown + GET returns vat_code snapshot ([2479d87](https://github.com/PicPeak/picpeak/commit/2479d87afc5b094a5323bca0b67e6404ce05a4e2))
* **accounting:** clearer tax-export window + gate journal export on accounting flag ([3edd832](https://github.com/PicPeak/picpeak/commit/3edd8321035c48d6b3e8b157d4b94075657fc7a0))
* **accounting:** consolidate VAT/financial config into Settings Accounting ([dc7b87b](https://github.com/PicPeak/picpeak/commit/dc7b87bb874e22ac6902fd2d48531ecdb6108c88))
* **accounting:** data-driven revenue-rate VAT map (multi-country) ([873be91](https://github.com/PicPeak/picpeak/commit/873be910a5e88a6d942f116c2bcfecfef9161024))
* **accounting:** event booking via dropdown (Company or an event) ([81af445](https://github.com/PicPeak/picpeak/commit/81af4453e796285df05446cfd333e53b6b1cc19e))
* **accounting:** expense invoiced/paid lifecycle + edit-until-invoiced; decouple tax report from bills flag ([2e8e4a0](https://github.com/PicPeak/picpeak/commit/2e8e4a0f86d5b7a4dc0fa712bcb4cbab4fbe9861))
* **accounting:** expenses ledger + supplier-payment toggle ([0c35ac4](https://github.com/PicPeak/picpeak/commit/0c35ac43e616e4b49da8089c95239ac06ec402c5))
* **accounting:** explain dispositions inline, drop markup from pass-through ([9a023c0](https://github.com/PicPeak/picpeak/commit/9a023c019750ebcd8d21e005aaf9a77a32cb34a3))
* **accounting:** frontend rework - separate Incoming invoices vs Expenses (stage 2) ([f305541](https://github.com/PicPeak/picpeak/commit/f305541f903c02329309a5d2513eded9792c58c5))
* **accounting:** inbound supplier-invoice capture + expense re-bill (backend) ([c305492](https://github.com/PicPeak/picpeak/commit/c3054928453a23c599894b669b6ac3c623fa4183))
* **accounting:** incoming-invoice triage refinements (paid badge, click-to-categorize, reference, categorize+pay) ([72b784c](https://github.com/PicPeak/picpeak/commit/72b784c9d751d2c98014cf35ce3035c60664056a))
* **accounting:** incoming-invoice workflow v2 + VAT/financial settings consolidation ([b527915](https://github.com/PicPeak/picpeak/commit/b5279155ea4c545e13bab8bde46a39cfccf107fe))
* **accounting:** incoming-invoices inbox with camera capture + triage/re-bill ([2b5efeb](https://github.com/PicPeak/picpeak/commit/2b5efebaff0ed05b99b84802811ee662911e9468))
* **accounting:** invoices force-enable the Accounting master ([51837c3](https://github.com/PicPeak/picpeak/commit/51837c3a88f711b164fafe2c7677e1a91c7542f9))
* **accounting:** Layer A backend  chart of accounts, VAT codes, Treuhänder export ([03cc250](https://github.com/PicPeak/picpeak/commit/03cc250b47518573d2cd4fa45da331a3e47ea3fd))
* **accounting:** Layer A frontend  chart of accounts CRUD + Treuhänder export UI ([7e0098e](https://github.com/PicPeak/picpeak/commit/7e0098edcd42dc9d6b91c39f60627122d8394bff))
* **accounting:** manual "add expense" (no document) on the ledger ([703f727](https://github.com/PicPeak/picpeak/commit/703f72742ddc9028a3214e108563320679ec4ade))
* **accounting:** move Chart of accounts into Settings Accounting ([97795f6](https://github.com/PicPeak/picpeak/commit/97795f6d1ed25d23396a76b63c225b110ddc315e))
* **accounting:** move Treuhänder export onto the Tax page ([b1f73c1](https://github.com/PicPeak/picpeak/commit/b1f73c1df9408ddae821760eb8ed57c726d2e056))
* **accounting:** PDF/image preview in triage, opened at the QR-bill (no OCR) ([502fbad](https://github.com/PicPeak/picpeak/commit/502fbad5a8cb11e075cb098ad05fd94a78aae396))
* **accounting:** rasterise inbound PDFs server-side (never serve raw to browser) ([e111522](https://github.com/PicPeak/picpeak/commit/e111522415c21ca8ef47f0d8be48c95bd8ab8c69))
* **accounting:** re-categorize incoming invoices, note field, pending re-bill pool ([36a8e42](https://github.com/PicPeak/picpeak/commit/36a8e42f90f15a1ba96d9c4f004fa542d33e4937))
* **accounting:** re-viewable incoming invoices + expense invoiced/paid lifecycle UI ([727bdab](https://github.com/PicPeak/picpeak/commit/727bdab6e087e1a3611295417a05f61939204487))
* **accounting:** relocate VAT codes + rate maps into Settings Accounting ([4ff5b84](https://github.com/PicPeak/picpeak/commit/4ff5b84cb66e40be960c2be7a67334cf0cc98be2))
* **accounting:** scope the tax-report export to income-only or cost-only ([9f3b286](https://github.com/PicPeak/picpeak/commit/9f3b28684ff36b131420cd975df634a29d660323))
* **accounting:** snapshot the chosen VAT code on quote/invoice create + storno ([5b52969](https://github.com/PicPeak/picpeak/commit/5b52969e36a41bbc08a98e0bca1ce0e937d77f56))
* **accounting:** snapshot vat_code on quotes/invoices + export prefers it (foundation) ([0a7dc1c](https://github.com/PicPeak/picpeak/commit/0a7dc1cf5da17a5bef204f6680844c8ab2b44269))
* **accounting:** split Incoming invoices vs Expenses - flags, schema, settings (stage 1) ([c59df52](https://github.com/PicPeak/picpeak/commit/c59df52d407fec86168aa7a2087c1a29c7660ab8))
* **accounting:** supplier-country tax default + configurable default output VAT code ([267b121](https://github.com/PicPeak/picpeak/commit/267b121d66994bc57b10cd0694ab0e4320b163d9))
* **accounting:** tax report VAT-payable honours registration + reclaim ([d7107aa](https://github.com/PicPeak/picpeak/commit/d7107aaf0adf5e03f08085c7691b6530b15ed702))
* **accounting:** tax window shows all costs (incoming invoices + expenses) alongside revenue ([545ef33](https://github.com/PicPeak/picpeak/commit/545ef334f42d3cb09e63ffc77a80dd684ab5a807))
* **accounting:** unify tax report into one signed, typed, sortable ledger ([fd1dd81](https://github.com/PicPeak/picpeak/commit/fd1dd81e8dfc790d960a7e6d888beba895a23461))
* **accounting:** VAT registration + reclaim-country settings in the Accounting tab ([4d87684](https://github.com/PicPeak/picpeak/commit/4d876848823bce2c79e629308c92206c64d9893d))
* **accounting:** VAT registration/reclaim settings + un-gated VAT-codes read ([fbbbb8a](https://github.com/PicPeak/picpeak/commit/fbbbb8ab7335f07ecf48e217632c7011bd7c88cd))
* **accounting:** VAT-code dropdown in the quote editor (+ reusable VatRateSelect) ([6e1924b](https://github.com/PicPeak/picpeak/commit/6e1924bae8b50dbb8460e151c1d9a79553fddb19))
* admin-configurable workflow engine + dunning/Mahngebühr rework (RFC  feedback welcome) ([15be3b8](https://github.com/PicPeak/picpeak/commit/15be3b8d32965eedc08d46ccc525c65a3bf34de6))
* **admin/exports:** inline preview modal with copy-to-clipboard ([#631](https://github.com/PicPeak/picpeak/issues/631)) ([fc5c1ae](https://github.com/PicPeak/picpeak/commit/fc5c1ae93f87678fcc16bc84a14a60a59b1a3c7b))
* **admin/exports:** inline preview modal with copy-to-clipboard ([#631](https://github.com/PicPeak/picpeak/issues/631)) ([27b5f7e](https://github.com/PicPeak/picpeak/commit/27b5f7e4b68e43345cd99dd5cc77308dcd7ec98b))
* **admin/users:** reactivate + delete actions for deactivated admin users ([c4a9b36](https://github.com/PicPeak/picpeak/commit/c4a9b3636fc7a9209ae724acb7c8cffe141d93ea))
* **admin/users:** reactivate + delete actions for deactivated admin users ([dfcebcc](https://github.com/PicPeak/picpeak/commit/dfcebccee98a551980ad2be78a8356fd39894f8a))
* **admin:** clickable version links + update-available modal with changelog & upgrade command ([48cf112](https://github.com/PicPeak/picpeak/commit/48cf1121e546e112cd37d94f7924a808c020dd8f))
* **admin:** link version numbers in sidebar to GitHub release notes ([#566](https://github.com/PicPeak/picpeak/issues/566)) ([d231623](https://github.com/PicPeak/picpeak/commit/d231623c59498ae56e13bee45a70100423053e9b))
* **admin:** System health page surfacing stuck/failed emails ([5d7b545](https://github.com/PicPeak/picpeak/commit/5d7b545bf74ee945799e0fbe809e9c96266f3926))
* **admin:** update-available modal with aggregated changelog + upgrade command ([#567](https://github.com/PicPeak/picpeak/issues/567)) ([832f7ba](https://github.com/PicPeak/picpeak/commit/832f7bad450112dca697b959644e259328a6cfa9))
* **analytics:** pluggable trackers  Umami + Rybbit + Custom ([#663](https://github.com/PicPeak/picpeak/issues/663) Phase 1) ([83461fe](https://github.com/PicPeak/picpeak/commit/83461fe5d4d44006482167464d92e70546cf7377))
* **analytics:** pluggable trackers  Umami + Rybbit + Custom ([#663](https://github.com/PicPeak/picpeak/issues/663) Phase 1) ([ab50145](https://github.com/PicPeak/picpeak/commit/ab501459a4208c3a30637a31f0f6f31285ae5ef2))
* **backup-stats:** per-Stage-B-path counters in backup statistics ([e7dffa6](https://github.com/PicPeak/picpeak/commit/e7dffa656bff8e4bb366bbd7f20f973c51ccb318))
* **backup:** admin endpoint to verify CRM document-artefact integrity ([4812fcd](https://github.com/PicPeak/picpeak/commit/4812fcdec38d7bfdbb5eac80eb6fe004f405b970))
* **backup:** config-driven walker via backup_paths table ([302fc6b](https://github.com/PicPeak/picpeak/commit/302fc6b9371ff08ee2d2157325d4603b00b5f7b4))
* **backup:** coverage diagnostic  what will the next backup miss? ([03e6617](https://github.com/PicPeak/picpeak/commit/03e6617f38344434add3bb866e13807f19940519))
* **backup:** UI for backup-integrity verifier  tab + post-restore CTA ([7e2feca](https://github.com/PicPeak/picpeak/commit/7e2feca12f894a9d02193d85634e69d76710fc14))
* **billing:** manual cadence + fix admin date inputs ignoring date-format setting ([06b4522](https://github.com/PicPeak/picpeak/commit/06b4522deceb06ed1d90e188a62b82fc7e0e91d6))
* **bills:** capture event name/date when importing historical invoices ([db7d11d](https://github.com/PicPeak/picpeak/commit/db7d11dc7ff7aff7f6da15698c9f964a1ab4d1a1))
* **bills:** link event label to its event detail page ([7c39a30](https://github.com/PicPeak/picpeak/commit/7c39a30957a59c379b6abe6702798923488a9021))
* **branding:** dark-mode logo variant ([4790ea5](https://github.com/PicPeak/picpeak/commit/4790ea5ccdc01f6cf3c5369b001618ed73d80b75))
* **branding:** force color mode = standard look; hide overridden theme controls ([4749e22](https://github.com/PicPeak/picpeak/commit/4749e222dc41695a2494a3b740952745bb854d4e))
* **branding:** symmetric light/dark logo fallback + customer surface ([44590b8](https://github.com/PicPeak/picpeak/commit/44590b8c0b21f22cbf7857b71951d2747db5be98))
* **categories:** per-category download permissions ([#640](https://github.com/PicPeak/picpeak/issues/640) part B) ([820f483](https://github.com/PicPeak/picpeak/commit/820f4835f1f5a41cbef6816c387ef9ec3dafd526))
* **common:** generic Promise-based ConfirmDialog primitive ([#640](https://github.com/PicPeak/picpeak/issues/640) part C) ([a3fcb5b](https://github.com/PicPeak/picpeak/commit/a3fcb5bc9e82849ebe1f55620e8aa7e60ccd973f))
* **contracts:** preview PDF before sending ([7eec133](https://github.com/PicPeak/picpeak/commit/7eec1337da80b647c560d1d876dff56ed83b77f8))
* CRM module  quotes, contracts, invoices, hours, calendar, tax ([5f0fcc2](https://github.com/PicPeak/picpeak/commit/5f0fcc225c29ce0f4410c5aba5ecd5a3a6d07259))
* **crm:** 3-reminder dunning + flat/percent Mahngebühr on 2nd & 3rd + AGB notice ([dcdbeb9](https://github.com/PicPeak/picpeak/commit/dcdbeb9cc50a888ff66e65c62597fcc84c2c8f17))
* **crm:** add event_reminder_* templates to dev email tester ([6d302e7](https://github.com/PicPeak/picpeak/commit/6d302e79983f73696f24ab1dfa71fd7f4f6345ca))
* **crm:** allow negative line items for manual discount/Rabatt rows ([3d37324](https://github.com/PicPeak/picpeak/commit/3d373240802869ae3d181b9cf67d70335809408d))
* **crm:** backend code  services + routes + utilities + tests ([d543949](https://github.com/PicPeak/picpeak/commit/d543949188e34625f7d0fa93606ad6cb22553b0b))
* **crm:** cash-basis revenue + backdatable payment date on mark-paid ([82ec238](https://github.com/PicPeak/picpeak/commit/82ec23824a3e48ef3a2abd4c52f5564c07115511))
* **crm:** country dropdown + name guard for customer create/edit ([db2c482](https://github.com/PicPeak/picpeak/commit/db2c482ae9d1049960df443c1e224a86b6e8ff2f))
* **crm:** cross-link to CRM settings from quote + invoice editors ([d7f0488](https://github.com/PicPeak/picpeak/commit/d7f0488f6e6c99526075c83e16e138f03ef977f2))
* **crm:** event-type dropdown on quotes; quoteevent uses it (no more hardcoded 'wedding') ([f78671f](https://github.com/PicPeak/picpeak/commit/f78671fc6c8d234be4dee87b45aae9d280a3a6f7))
* **crm:** Finder-style sortable column headers, default sort by issue date ([d9251c0](https://github.com/PicPeak/picpeak/commit/d9251c085039d35769aba1489aaab6eb95adbb20))
* **crm:** frontend code  pages + services + components ([a7e16e7](https://github.com/PicPeak/picpeak/commit/a7e16e7bf668ff06158f95e13843413d43a55cd4))
* **crm:** i18n EN + DE for CRM, machine fr/nl/pt/ru fallbacks ([409d414](https://github.com/PicPeak/picpeak/commit/409d41403557b28560380a9badfb4c576d1df330))
* **crm:** Mahngebühr on a separate Mahnung document; invoice stays immutable ([5ed2fec](https://github.com/PicPeak/picpeak/commit/5ed2fec2fe5cd5c2c8db6ea83c3b791313618e0f))
* **crm:** per-customer Skonto opt-out ([d788a6c](https://github.com/PicPeak/picpeak/commit/d788a6cde50a4146123bc7efadca314d6916c2a1))
* **crm:** pre-event reminder falls back to the assigned customer account ([3ccaed0](https://github.com/PicPeak/picpeak/commit/3ccaed06a226cdc4a18399f8daa9b2d420e3684b))
* **crm:** Project Overview phase 1  projects schema ([efa47d6](https://github.com/PicPeak/picpeak/commit/efa47d697d4c007f27c12f4f33eb62ef64e09e78))
* **crm:** Project Overview phase 2  project service + routes ([eb26313](https://github.com/PicPeak/picpeak/commit/eb263137b98935754155824de2a03848121304b6))
* **crm:** Project Overview phase 3  persist sent email HTML ([874c91f](https://github.com/PicPeak/picpeak/commit/874c91f944d8397edaf9f48091bab3bf5cfc30e1))
* **crm:** route billing docs to billing_email when set ([09c5110](https://github.com/PicPeak/picpeak/commit/09c5110d2b9cc8f2589731c60163897329ab4222))
* **crm:** toggle for VAT on late fees (jurisdiction-dependent) ([eaceb7e](https://github.com/PicPeak/picpeak/commit/eaceb7e71caa6466d8298c0fc84487f0f4af1dca))
* **crm:** unlock reminderEmails feature flag in Features tab ([b064aab](https://github.com/PicPeak/picpeak/commit/b064aab8ef1230cfc5f42cbdb430e55676d96d3e))
* **dashboard:** revenue "year" tile toggles 365 days ” calendar YTD ([d1c9e02](https://github.com/PicPeak/picpeak/commit/d1c9e02bcf50b6c08eebc85acdbfba29bfee84ac))
* **email:** add 'Test connection' to incoming mail + tidy IMAP label ([f017649](https://github.com/PicPeak/picpeak/commit/f017649bd5072d6d23a251fedeba473fe0bf57bf))
* **email:** hold relationship mail to business hours ([b378ad6](https://github.com/PicPeak/picpeak/commit/b378ad679f64d5be9491b2e5ec9bc0f7d3ef9484))
* **email:** incoming mail (IMAP) intake - backend + standalone flag ([5645c30](https://github.com/PicPeak/picpeak/commit/5645c304ab876f42bf6187d624c256f07e62e482))
* **email:** incoming mail UI - IMAP config block + Received emails tab ([31280e1](https://github.com/PicPeak/picpeak/commit/31280e1f7ab374f3ebd6e2b3efa5313cbde860ab))
* **email:** per-weekday business hours + manual queue flush ([621ce94](https://github.com/PicPeak/picpeak/commit/621ce942b55cea528da894593e5ba2280fe70c4e))
* **email:** read-only "Sent emails" tab over email_queue ([603ba1e](https://github.com/PicPeak/picpeak/commit/603ba1e504493b702815167cdbc22a4a892adef5))
* **email:** round-trip test  send via SMTP to the IMAP mailbox and confirm arrival ([04be51a](https://github.com/PicPeak/picpeak/commit/04be51a008d8e9e050557783fb2f5104e140847e))
* **events:** "Create invoice" action on the event detail page ([a03146e](https://github.com/PicPeak/picpeak/commit/a03146edc9aefaeff02f73752a3ebfa16809c31b))
* **events:** duplicate-gallery action ([#626](https://github.com/PicPeak/picpeak/issues/626)) ([e985d25](https://github.com/PicPeak/picpeak/commit/e985d25207671cbfefcdda9775a96eadf2fe0698))
* **feedback:** export shape toggle  per-action vs per-guest pivot ([#640](https://github.com/PicPeak/picpeak/issues/640) part E) ([fabd67a](https://github.com/PicPeak/picpeak/commit/fabd67aecd6caf308956e5b4cb9df7dd44452142))
* **feedback:** per-guest favorite + like caps with mobile-friendly limit modal ([#655](https://github.com/PicPeak/picpeak/issues/655)) ([3ac7017](https://github.com/PicPeak/picpeak/commit/3ac70177efc237b8169278208983b0de3629bc72))
* **feedback:** per-guest favorite + like caps with mobile-friendly limit modal ([#655](https://github.com/PicPeak/picpeak/issues/655)) ([f2814e4](https://github.com/PicPeak/picpeak/commit/f2814e4a4ce3aa9affc232243d615a15a1aae0c0))
* **gallery:** publish notifies assigned customer accounts via the account email ([c657892](https://github.com/PicPeak/picpeak/commit/c657892bc87f44e854827cb8a65f87cc528a2f71))
* **hours:** aggregate open-hours landing view on /admin/clients/hours ([93956db](https://github.com/PicPeak/picpeak/commit/93956db0caa4ad8a1ddb8d68c30f0912214715e8))
* **hours:** install-wide default rate + inline missing-rate CTA ([ab6bad1](https://github.com/PicPeak/picpeak/commit/ab6bad17c914efbee944e2941ce862f47db302ff))
* **hours:** open the hours invoice in the editor to add items ([02742b3](https://github.com/PicPeak/picpeak/commit/02742b3163dc70af4a799a27dbb99a9e6fa8094a))
* **i18n:** add Slovenian (sl) language support ([433af15](https://github.com/PicPeak/picpeak/commit/433af1514687b5c103e72db800954f96fd42b9b8))
* **i18n:** add Slovenian (sl) language support ([37cc363](https://github.com/PicPeak/picpeak/commit/37cc3631d8285ba9d72f0d01f37267a903f2d3e7))
* **installer:** install picpeak directly from a backup via trigger file ([83fdb47](https://github.com/PicPeak/picpeak/commit/83fdb47fbf11081a08c96d088ada00b2ab36830e))
* **invoices:** optional sub-cent rounding reconciliation ("Rundung" row) ([4670292](https://github.com/PicPeak/picpeak/commit/4670292139bf4c5ad523646f38b98b9d47ab3430))
* **invoices:** surface monthly/manual accumulator drafts in the Bills list ([e457656](https://github.com/PicPeak/picpeak/commit/e457656b9d06bb420c9d0985fe15c30d6c88aed9))
* **lightbox:** multi-photo Web Share save-to-Photos on iOS ([#557](https://github.com/PicPeak/picpeak/issues/557)) ([d5823c7](https://github.com/PicPeak/picpeak/commit/d5823c79d9a187461c0126adcff7f4374cd0e8aa))
* Live Slideshow ("Diashow")  fullscreen, auto-updating projector view for live events ([4356393](https://github.com/PicPeak/picpeak/commit/4356393b4433dd6b4147388688766b9464294c89))
* **projects:** attach-event control in the cockpit ([dffcf62](https://github.com/PicPeak/picpeak/commit/dffcf6269fe0416d7233d973a4162874337fbb9a))
* **projects:** flag re-rendered emails in the feed ([94f2c01](https://github.com/PicPeak/picpeak/commit/94f2c01590d52962c565eea5d6f47444ff0d5782))
* **projects:** gate Project Overview behind a projects feature flag + cockpit email actions ([1bf0b34](https://github.com/PicPeak/picpeak/commit/1bf0b34ea5e280770e0262660586f345860b0325))
* **projects:** gated project pickers on quote/contract/hours editors ([0175007](https://github.com/PicPeak/picpeak/commit/0175007abc675ecb18a30e05241cac62bee833f8))
* **projects:** link quotes & contracts to a project (precise cockpit rollup) ([6420047](https://github.com/PicPeak/picpeak/commit/6420047e7cda046057d27539b85334874081b51d))
* **projects:** linking a quote/contract cascades the whole deal into the project ([a702f33](https://github.com/PicPeak/picpeak/commit/a702f33004996ca53f77c9177cb50a6504410801))
* **projects:** Project Overview cockpit  link (multiple) quotes/contracts/hours into projects ([58f93ae](https://github.com/PicPeak/picpeak/commit/58f93ae71350cc4a100f15a1a11f478750dace91))
* **projects:** Project Overview cockpit UI + CRM nav entry ([81553aa](https://github.com/PicPeak/picpeak/commit/81553aa0e3476e7fdd2d6fcda7ebfa1f1d7c9b57))
* **projects:** rolled-up project value (newest stage wins per deal, cumulative) ([7ca2437](https://github.com/PicPeak/picpeak/commit/7ca243780a2165b28583a44632468fd05c4ed115))
* **quotes:** admin decline-on-behalf with optional reason ([8d14441](https://github.com/PicPeak/picpeak/commit/8d14441df492ac46235de247f59500da3eedfc2e))
* **restore:** docker-logs visibility + ADMIN_CREDENTIALS.txt restore notice ([3322a1d](https://github.com/PicPeak/picpeak/commit/3322a1d998bedf39274dbb473b44e7b1e7cbff51))
* **restore:** self-heal restore_allow_force default ON at boot ([dbcecfe](https://github.com/PicPeak/picpeak/commit/dbcecfe2aa6629a0665150e56c6306287c6fd225))
* **slideshow:** add image fit setting (fill vs black bars) ([b5c73e0](https://github.com/PicPeak/picpeak/commit/b5c73e05bd41b262f864e8c700b1d38582b3817f))
* **slideshow:** admin ui for live slideshow ([385b05a](https://github.com/PicPeak/picpeak/commit/385b05adcf6a4acb7939e372328a55df7dae5e08))
* **slideshow:** backend api for live slideshow ([dea5e0f](https://github.com/PicPeak/picpeak/commit/dea5e0f8a6421c056868c2d9bea11e5bf1ee106a))
* **slideshow:** db columns for live slideshow ([1029dd0](https://github.com/PicPeak/picpeak/commit/1029dd05bdb9ca0a97ad86100145221850648651))
* **slideshow:** en/de strings for live slideshow ([cb761ee](https://github.com/PicPeak/picpeak/commit/cb761ee621aa553cf210c4224b6cbbf7bf2ef0cb))
* **slideshow:** gate behind a feature flag + move globals to a Settings tab ([69367b4](https://github.com/PicPeak/picpeak/commit/69367b45be1c13d87e73e72da34a1f41a5849dfe))
* **slideshow:** public fullscreen slideshow viewer ([fd02254](https://github.com/PicPeak/picpeak/commit/fd02254f78bd1860780355ebaa68293d58ce18b3))
* **whatsapp:** admin-selectable template parameters + reorder ([#647](https://github.com/PicPeak/picpeak/issues/647) follow-up) ([80e8ec5](https://github.com/PicPeak/picpeak/commit/80e8ec5bc71f0653d56f1087521f5207aee0ba8f))
* **whatsapp:** admin-selectable template parameters + reorder ([#647](https://github.com/PicPeak/picpeak/issues/647) follow-up) ([16055cd](https://github.com/PicPeak/picpeak/commit/16055cdc413f0aa560c2b2a792b4e2ae8f5cbfd3))
* **whatsapp:** WhatsApp Business API notification channel ([#640](https://github.com/PicPeak/picpeak/issues/640) part D) ([78c8e9d](https://github.com/PicPeak/picpeak/commit/78c8e9d9f91d56e07e04df4ed90fb05ccdfb69d2))
* **workflows:** 'Clean up layout' auto-arrange button (dagre) ([79607c5](https://github.com/PicPeak/picpeak/commit/79607c597af07ca5b78a689469c3ffefc3699317))
* **workflows:** add workflows feature flag + Features-tab toggle ([ff47861](https://github.com/PicPeak/picpeak/commit/ff478619b580096d4dfb46dd6ad751daead082fb))
* **workflows:** admin CRUD + run-history + approvals-inbox API ([1a0d6de](https://github.com/PicPeak/picpeak/commit/1a0d6de04d3547ca0e34833befea200c2750e859))
* **workflows:** admin review gates before sends + migrate lifecycle/time triggers ([fa7b1ba](https://github.com/PicPeak/picpeak/commit/fa7b1bae951222de506ab8a3c8aee158b471efd1))
* **workflows:** advanced text mode  export/import the flow as JSON ([289568f](https://github.com/PicPeak/picpeak/commit/289568fd52fcf0f33a959f074d215853ae37e48c))
* **workflows:** approval gates  email confirm/deny + token resume ([b48d8c2](https://github.com/PicPeak/picpeak/commit/b48d8c2eb8e278d3dad8a8afef221a640bcac919))
* **workflows:** booking cutover  wire booking actions + hold documents behind approval gates ([ec33ec7](https://github.com/PicPeak/picpeak/commit/ec33ec7670a4feb1108d1bcbfe34727f63cc8cf9))
* **workflows:** collections-handoff block after dunning exhausts ([b78bd97](https://github.com/PicPeak/picpeak/commit/b78bd979dc4856a78d2022783537b8efd1297d27))
* **workflows:** crash recovery  resume runs orphaned mid-flow ([192d2cb](https://github.com/PicPeak/picpeak/commit/192d2cbc06a0295dbfdc35f05d192ae7ed5273e6))
* **workflows:** data-touching action + condition handlers ([96fb440](https://github.com/PicPeak/picpeak/commit/96fb44045e49c4cbc9b221780f7c725f80751993))
* **workflows:** emit lifecycle events from invoice + quote services ([cc0ba53](https://github.com/PicPeak/picpeak/commit/cc0ba5347d36161e3da2eaff3a1f2d56c582c4a5))
* **workflows:** execution engine core + registry + tests ([1eaef67](https://github.com/PicPeak/picpeak/commit/1eaef67c36a1a1eae6d574d2d44f2a3bdfb43d4c))
* **workflows:** hard cutover of gallery-expiry + dunning + pre-event to flows ([0b6c33e](https://github.com/PicPeak/picpeak/commit/0b6c33e59a2e1ba15210645a65800543eaf6305b))
* **workflows:** implement prepare_event so booking_full/booking_simple are enableable ([4faf5a3](https://github.com/PicPeak/picpeak/commit/4faf5a344a8d6d03cd9f374e093cc9bd8317fa48))
* **workflows:** implement remaining stub actions (prepare_quote, prepare_gallery, reserve_date) ([9414b42](https://github.com/PicPeak/picpeak/commit/9414b42b7fae9f5447c1879e9b2c34d05f7c888d))
* **workflows:** invoice prepared+approved early, dispatch waits; daysBefore in editor; dashboard approvals ([182e655](https://github.com/PicPeak/picpeak/commit/182e655fcf0fa119714e6fd34cad5f33d0087045))
* **workflows:** make approval rows clickable to open the underlying document ([7727b67](https://github.com/PicPeak/picpeak/commit/7727b6714b5654bab067b041ca9c33cf7d9270ab))
* **workflows:** migrate the dunning ladder onto the engine (cutover) ([5259ee9](https://github.com/PicPeak/picpeak/commit/5259ee97053386a63e7bcdf2a5cae22842e5ceaa))
* **workflows:** per-quote booking-workflow picker + quoteinvoice (no gallery) built-in ([d14f1d8](https://github.com/PicPeak/picpeak/commit/d14f1d850cc995b2cb1119ba0424f123feba50ec))
* **workflows:** pre-event reminder picks the template GROUP on the block, type stays automatic ([10d091b](https://github.com/PicPeak/picpeak/commit/10d091b55e0c44738b4001a71def6416a8f0aeb0))
* **workflows:** React Flow canvas editor + list + approvals UI ([5c0396d](https://github.com/PicPeak/picpeak/commit/5c0396d0c1bf69ba48b42eacc6d8f145b901a299))
* **workflows:** route webhook node through the delivery pipeline (full Option 1) ([675e41a](https://github.com/PicPeak/picpeak/commit/675e41a2f72c8c23fa5c36b13bc6b95abcb9d570))
* **workflows:** scheduler resumes elapsed wait nodes ([610a3df](https://github.com/PicPeak/picpeak/commit/610a3dfd732fbf37c68bc3edacaed6c99610a2ab))
* **workflows:** schema + permissions (migration 142) ([c818c25](https://github.com/PicPeak/picpeak/commit/c818c25cf2d7a9c9b281107a92528d5923758ab0))
* **workflows:** seed booking + pre-event built-ins, wire event.date_approaching ([62ba905](https://github.com/PicPeak/picpeak/commit/62ba905464387784be7710610a65341569b68e46))
* **workflows:** seed invoice-dunning ladder as an editable built-in flow ([9b557ef](https://github.com/PicPeak/picpeak/commit/9b557efbf347ba585ceac61cfc0b6b3038ef7de6))
* **workflows:** test-fire  safe dry-run of any flow on demand ([e70ddd3](https://github.com/PicPeak/picpeak/commit/e70ddd36b8e9558dc44fc118277539fe6e7425d7))
* **workflows:** warn when disabling a built-in (reverts to legacy, not off) ([c5f131c](https://github.com/PicPeak/picpeak/commit/c5f131cec32826331722ef3705c5f5422e31726d))
* **workflows:** wire booking document actions (prepare_invoice/contract + send_document) ([cf424ef](https://github.com/PicPeak/picpeak/commit/cf424efb4a3a5e0df3a4bb1c753ca24368446816))
### Bug Fixes
* **accounting:** 'Save & mark paid' actually pays; incoming invoices appear in tax/export ([3b70a09](https://github.com/PicPeak/picpeak/commit/3b70a09773f22e942ae80962b9b69a7712b08ff3))
* **accounting:** address the-luap PR [#636](https://github.com/PicPeak/picpeak/issues/636) review ([707c5d0](https://github.com/PicPeak/picpeak/commit/707c5d027798bdafb9fe09d7efcbd9ea65330076))
* **accounting:** always show Income/Costs/Result summary on tax page (even with zero costs) ([663daf5](https://github.com/PicPeak/picpeak/commit/663daf50ff92293adcc93aed42333eeba2d08849))
* **accounting:** Banana export is now a tab-separated .txt (actually importable) ([a195067](https://github.com/PicPeak/picpeak/commit/a19506749a449ec0a628da776af5a5bea8a2e46e))
* **accounting:** Banana I&E export uses the 'Category' column (not 'ContraAccount') ([53a16f9](https://github.com/PicPeak/picpeak/commit/53a16f9f6f9b11c224b3ff5f337f8a7fe4dbfc38))
* **accounting:** distinguish Categorized (purple) from Paid (green) ([9514f5c](https://github.com/PicPeak/picpeak/commit/9514f5cb8eadd293d4c85a3849073b59ea93161a))
* **accounting:** emit ISO dates in exports (Postgres returns Date objects) ([0c0fb29](https://github.com/PicPeak/picpeak/commit/0c0fb29770d7559b8b35a1b2a0aae1315485d875))
* **accounting:** label the outgoing-invoice totals block in the tax summary ([f3e77e7](https://github.com/PicPeak/picpeak/commit/f3e77e78079c6869a3a5de062a90f1a04fecde3c))
* **accounting:** lock company-expense to company, first-page categorise preview, auto-refresh inbox ([cee692c](https://github.com/PicPeak/picpeak/commit/cee692c10a1a96ada00a62dbcfc9f998af2c53f7))
* **accounting:** migration 127 must not insert created_at/updated_at into app_settings ([31867ef](https://github.com/PicPeak/picpeak/commit/31867efcb9b9c4f19ca8a7e59dfcbd8eb6157525))
* **accounting:** PDF pager always shown, click categorizedpay, drop duplicate Paid chip ([5fcb96c](https://github.com/PicPeak/picpeak/commit/5fcb96c723a3e5bdf2e93ff3786dfb7ba77b3d24))
* **accounting:** PR [#622](https://github.com/PicPeak/picpeak/issues/622) blockers  CSV formula injection + IMAP double-ingest race ([cd6d578](https://github.com/PicPeak/picpeak/commit/cd6d57839b4753b2848620c5960332cc945580ce))
* **accounting:** PR [#622](https://github.com/PicPeak/picpeak/issues/622) concerns  flag-cache, customer master gate, VAT-unconfigured, helpers, page cap ([a93b6dc](https://github.com/PicPeak/picpeak/commit/a93b6dc232375e1362e091c8868a409b1335dcae))
* **accounting:** tax report 500 on Postgres  drop SQL date() from cost queries ([ea8f6bc](https://github.com/PicPeak/picpeak/commit/ea8f6bc88a4d4ed39c93f80bcfcfbab283fca230))
* **accounting:** tax report cost side queried a non-existent column ([ab65a47](https://github.com/PicPeak/picpeak/commit/ab65a470a009d33558a7167dd2c3c649f785e686))
* **accounting:** tax report degrades gracefully if cost side fails (+ surface the error) ([9f85111](https://github.com/PicPeak/picpeak/commit/9f8511114a78c4c6bca2666b9c59e8325fc66dfb))
* **accounting:** tax-report storno totals + hours-line date on Postgres ([db9e41d](https://github.com/PicPeak/picpeak/commit/db9e41d19846b31b29c5c1be2ee06a7958bb43b0))
* **accounting:** tidy the tax-export scope selector styling ([8deb7e0](https://github.com/PicPeak/picpeak/commit/8deb7e0741a5bf559cb9f9b78350821dc84bdb53))
* **accounting:** UTF-8 BOM on the ledger export so Banana reads it correctly ([74144da](https://github.com/PicPeak/picpeak/commit/74144da45fc0a7a2c2e88d17a23b584ba77e9262))
* **admin-header:** hide wordmark on <sm when logo also shows ([#523](https://github.com/PicPeak/picpeak/issues/523)) ([c246fd3](https://github.com/PicPeak/picpeak/commit/c246fd3cc89962d626218029ab3da1346a726246))
* **admin-header:** skeleton brand block + move LanguageSelector into profile menu on <sm ([#523](https://github.com/PicPeak/picpeak/issues/523) follow-up) ([b48b5b0](https://github.com/PicPeak/picpeak/commit/b48b5b0000fd95bc149335614eb062dd373fc50a))
* **admin-header:** skeleton brand block + move LanguageSelector into profile menu on <sm ([#523](https://github.com/PicPeak/picpeak/issues/523) follow-up) ([fe10191](https://github.com/PicPeak/picpeak/commit/fe10191b82546473f035435731bf6d6ecca2efd6))
* **admin-header:** truncate long company names on narrow widths ([#523](https://github.com/PicPeak/picpeak/issues/523) regression) ([e7cf834](https://github.com/PicPeak/picpeak/commit/e7cf834325e8686613fbbee78d52213cb3ba98b1))
* **admin-ui:** backup download button hits API path, not SPA route ([ed7ab61](https://github.com/PicPeak/picpeak/commit/ed7ab61b90aac95da132e74468cf19ef7f0f8a46))
* **admin/events:** delete cascade orphaned photo folders because it read a non-existent column ([#608](https://github.com/PicPeak/picpeak/issues/608)) ([284680e](https://github.com/PicPeak/picpeak/commit/284680e0357db20177e45ab4ab01de0fbcac2a98))
* **admin/events:** delete cascade orphaned photo folders because it read a non-existent column ([#608](https://github.com/PicPeak/picpeak/issues/608)) ([457c956](https://github.com/PicPeak/picpeak/commit/457c9563869156bc4773d873661a75d5115b25db))
* **admin/exports:** Lightroom TXT export joins with comma + drops extension ([#623](https://github.com/PicPeak/picpeak/issues/623)) ([a239fec](https://github.com/PicPeak/picpeak/commit/a239fec9d7b6c01c9649c075a40427b8844f83b8))
* **admin:** graceful logo-img fallback + show sidebar widgets during perm hydration ([#523](https://github.com/PicPeak/picpeak/issues/523) follow-up 2) ([f51b9cf](https://github.com/PicPeak/picpeak/commit/f51b9cf8df2dfba07590b35cc63def689df98c4a))
* **admin:** logo-img fallback + sidebar perm hydration + filename NFD transliteration ([#523](https://github.com/PicPeak/picpeak/issues/523) follow-up 2, [#607](https://github.com/PicPeak/picpeak/issues/607)) ([fcd3ca3](https://github.com/PicPeak/picpeak/commit/fcd3ca36c659eafa47c036f622da8114433b1c74))
* **admin:** stack publish-gallery dialog CTAs so the German label fits ([#670](https://github.com/PicPeak/picpeak/issues/670)) ([748af98](https://github.com/PicPeak/picpeak/commit/748af98f3d3f8c00695b82e94d741a0e10a39a81))
* **admin:** stack publish-gallery dialog CTAs so the German label fits ([#670](https://github.com/PicPeak/picpeak/issues/670)) ([ea2852d](https://github.com/PicPeak/picpeak/commit/ea2852dcb0a0f00318a2c8067405630bcff4eee6))
* **analytics:** admin dashboard reads correct fields + Umami device API ([#661](https://github.com/PicPeak/picpeak/issues/661)) ([349f566](https://github.com/PicPeak/picpeak/commit/349f566e87b33c59f61eb28b8abc5f889e6285d6))
* **analytics:** admin dashboard reads correct fields + Umami device API ([#661](https://github.com/PicPeak/picpeak/issues/661)) ([7534447](https://github.com/PicPeak/picpeak/commit/7534447b6c0df4290fd8dac12270673097096f1b))
* **api/v1/events:** also honour require_password + branding defaults ([#592](https://github.com/PicPeak/picpeak/issues/592) follow-up) ([2d44b1a](https://github.com/PicPeak/picpeak/commit/2d44b1ab2d251a4fc752cfeb645cb2126c0da3b7))
* **api/v1/events:** honour global devtools-detection default on create ([#592](https://github.com/PicPeak/picpeak/issues/592)) ([2304b25](https://github.com/PicPeak/picpeak/commit/2304b2562465f8c86c82f2155fbdce264e68fdb3))
* **archives:** stream-extract restore for >2 GiB + preserve original_filename via manifest ([#640](https://github.com/PicPeak/picpeak/issues/640)) ([e4e79a0](https://github.com/PicPeak/picpeak/commit/e4e79a0b3a6d3ddbbc2f3cebdcadc89307147248))
* **backup-dashboard:** show last SUCCESSFUL backup + last attempt separately ([155aa63](https://github.com/PicPeak/picpeak/commit/155aa631035ab62a1aed5ca052b7eb7c57b431e4))
* **backup-history:** show Total + Other so per-row sums match the count ([7f7c8ee](https://github.com/PicPeak/picpeak/commit/7f7c8eee61f7a721e65c0409aaf2028e2fb58c37))
* **backup-ui:** respect general_date_format + general_time_format ([09f6a1a](https://github.com/PicPeak/picpeak/commit/09f6a1af6acfce5ef0da173fb3c17a16bb679047))
* **backup:** include storage/business-docs/ in the in-app backup walker ([a9280ea](https://github.com/PicPeak/picpeak/commit/a9280ea9bac731199133a34ede5a89359bcde89e))
* **backup:** inline DB dump + fail-loud guard so "Run Backup Now" can't ship files-only ([7fdf01a](https://github.com/PicPeak/picpeak/commit/7fdf01ad21da70ae534867e15ae2af1afd4899f4))
* **backup:** inline DB dump + fail-loud guard so "Run Backup Now" can't ship files-only ([7c230bd](https://github.com/PicPeak/picpeak/commit/7c230bdc242fa99e12e42c5fb6ee9202243a36e7))
* **bills:** localize the event_date on the invoice detail card ([095edfe](https://github.com/PicPeak/picpeak/commit/095edfe06d7d251f608dcf05b7f0a48397c84430))
* **branding+whatsapp:** preserve customCss through preset switches ([#645](https://github.com/PicPeak/picpeak/issues/645)) + admin-pinned WhatsApp template language ([#647](https://github.com/PicPeak/picpeak/issues/647)) ([cde028e](https://github.com/PicPeak/picpeak/commit/cde028e9199a9ddb09957a87590732f4bd4d7a7b))
* **branding:** accept SVG favicons ([1259155](https://github.com/PicPeak/picpeak/commit/12591556a01f3803cf326a1c251a9309d6e13734))
* **branding:** allow larger square favicons ([11257a7](https://github.com/PicPeak/picpeak/commit/11257a7936c3cc6a786f4ffe91ad3744f0d97600))
* **branding:** dark logo in the Branding live preview ([4d3da35](https://github.com/PicPeak/picpeak/commit/4d3da35168e767714d710ad499e16437f497aaaf))
* **branding:** dark-mode logo in the admin sidebar ([7d34c97](https://github.com/PicPeak/picpeak/commit/7d34c97c584eb5e9c56ca1535d8afa8e6564d328))
* **branding:** force lock = light/dark only; Branding stays the full preset, galleries hide color+mode ([a7c1913](https://github.com/PicPeak/picpeak/commit/a7c19135bb9645a7f95d5fe76581098db305394f))
* **branding:** point HTML favicon link at /favicon.ico (the real Safari fix) ([c60e34e](https://github.com/PicPeak/picpeak/commit/c60e34ecae5eadcde47aebcb1c3b32741be576ff))
* **branding:** preserve customCss through preset switches + theme changes ([#645](https://github.com/PicPeak/picpeak/issues/645)) ([7cf2679](https://github.com/PicPeak/picpeak/commit/7cf26795ec12845743a30d48956381f25c6e181c))
* **branding:** serve favicon via backend route so Safari picks it up ([db3e327](https://github.com/PicPeak/picpeak/commit/db3e3270f311c31d2e6bfad7c0a5e5c204a2fedc))
* **branding:** stream favicon bytes directly (Safari ignores the 302) ([7ccfdc1](https://github.com/PicPeak/picpeak/commit/7ccfdc1aea564b7d056a2e75385c6534c1729b0b))
* **branding:** SVG (and .ico) favicons now render ([a6e6ef7](https://github.com/PicPeak/picpeak/commit/a6e6ef7b83796ced497f1093ce010b5c5cc5526c))
* **branding:** theme-aware logo across all login / auth entry pages ([0b4b5cf](https://github.com/PicPeak/picpeak/commit/0b4b5cf46ee5c99e440dbad08b1e42d337dc1d57))
* **branding:** theme-aware logo on customer-facing public pages ([05c1e8d](https://github.com/PicPeak/picpeak/commit/05c1e8d18ba1e2029e2da62d6ffb4c701b725660))
* **branding:** use dark-mode logo on the admin login page ([307b84f](https://github.com/PicPeak/picpeak/commit/307b84fe05d679d1d3c4d7a2a48a6d7b24ef496c))
* **branding:** when a force lock is active, collapse the theme customizer to just the Force control ([1ac653a](https://github.com/PicPeak/picpeak/commit/1ac653ad1b9f47af8cb24cb53ffa60a1e95192fc))
* **bug-batch:** [#523](https://github.com/PicPeak/picpeak/issues/523) [#564](https://github.com/PicPeak/picpeak/issues/564) [#590](https://github.com/PicPeak/picpeak/issues/590) [#591](https://github.com/PicPeak/picpeak/issues/591) [#592](https://github.com/PicPeak/picpeak/issues/592) ([c68a03c](https://github.com/PicPeak/picpeak/commit/c68a03c20e70b8049ed851d41e20143813935a3a))
* **business-profile:** align business-hours time columns ([f4af290](https://github.com/PicPeak/picpeak/commit/f4af290fa03b626fcb84a7d64d334ee6ad9b96c7))
* **business-profile:** honor 24h time format in business-hours pickers ([2723b3f](https://github.com/PicPeak/picpeak/commit/2723b3f29ea41e43184920d04eaac2a955cdd45f))
* **business-profile:** setting-aware custom time field for business hours ([2149f38](https://github.com/PicPeak/picpeak/commit/2149f38cd19ff8b8d04cccc632639987cec3a668))
* **business-profile:** use the app-standard de-DE lang hint for 24h time ([e1d9d06](https://github.com/PicPeak/picpeak/commit/e1d9d06ae9bda82f2b6c915e8450787517abee95))
* **crm:** admin surfaces follow the admin light/dark toggle, not the gallery theme ([#620](https://github.com/PicPeak/picpeak/issues/620)) ([d3266a0](https://github.com/PicPeak/picpeak/commit/d3266a0d1c458e8ae9c57ccd2f650e699544d2d6))
* **crm:** anchor imported invoice dates to issue_date, not import time ([c6b8cc9](https://github.com/PicPeak/picpeak/commit/c6b8cc9199fc107ac4ba8e1899dc8b066aa3b5d5))
* **crm:** commit LocalizedDateInput value live, not only on blur ([0b4690a](https://github.com/PicPeak/picpeak/commit/0b4690afabe75a906bea6240241e7a285c1107b4))
* **crm:** country dropdown on customer onboarding, placed after State/region ([18ffff2](https://github.com/PicPeak/picpeak/commit/18ffff29c3f3da4a9ef49cc29fa70ab50131d5e9))
* **crm:** country dropdown on customer profile billing address too ([fe56d24](https://github.com/PicPeak/picpeak/commit/fe56d24a6b4cc0b191e910a76c0d2c0c58307df8))
* **crm:** drop redundant 'Country (full name)' field ([a2b5ae1](https://github.com/PicPeak/picpeak/commit/a2b5ae17f3014036354f91f8924a5e5c02dbf98e))
* **crm:** editor totals box computed VAT 100× too small ([e9b297c](https://github.com/PicPeak/picpeak/commit/e9b297c162a19da31d53de377b90bfd5cda1b0a7))
* **crm:** localize scheduled-send + installment date + timezone picker ([43b10f9](https://github.com/PicPeak/picpeak/commit/43b10f91c05818ad244f64284aef6b83b0319214))
* **crm:** make 'Configure defaults in Settings' link navigate in-app ([7b36582](https://github.com/PicPeak/picpeak/commit/7b36582ef5aa6cf2ecc9bd1cc037407d48781bd3))
* **crm:** offer full ISO 3166-1 country list in pickers ([615ef75](https://github.com/PicPeak/picpeak/commit/615ef757d3dc7cf0a1350c1c82e17c9515b74c2d))
* **crm:** PR [#603](https://github.com/PicPeak/picpeak/issues/603) review follow-ups + Outlook-proof email design ([a2b2d3f](https://github.com/PicPeak/picpeak/commit/a2b2d3fb313f347bac505b5d1846dce2b679ce55))
* **crm:** pre-event reminder passes raw event_date (fixes "Invalid Date" in the email) ([250b240](https://github.com/PicPeak/picpeak/commit/250b240337733362cb9a74b248ac78b6e9347bf7))
* **crm:** pre-event reminder resolves recipient from the event row, not a non-existent column ([5fbe514](https://github.com/PicPeak/picpeak/commit/5fbe514db6e386eee2eeade548bccbb5bbc5b422))
* **crm:** quoteevent fallback resolves an ACTIVE event type, never hardcoded 'wedding' ([2309812](https://github.com/PicPeak/picpeak/commit/23098127a83fb12f6a32809666ec93eef9ac90cb))
* **crm:** recent-activity email placeholder + customer-dashboard locale dates ([ea09a86](https://github.com/PicPeak/picpeak/commit/ea09a86d0505b08f38e70be0c8717df414144a75))
* **crm:** recognise imported-invoice revenue on issue_date, not paid_at ([5e79c69](https://github.com/PicPeak/picpeak/commit/5e79c69cda93c2aef8176768d29c5ea47a95c90d))
* **crm:** respect general_date_format on all admin date inputs ([840df52](https://github.com/PicPeak/picpeak/commit/840df525817f1bcfa65dbf1fd47e4adbe349c13c))
* **crm:** self-heal missing CRM email templates at boot + recover queue ([83933ba](https://github.com/PicPeak/picpeak/commit/83933baeecdc7e0272f2da0ff79fb1fb33bea114))
* **crm:** thread trx through sequence-claim sites to unblock SQLite ([d1aecaa](https://github.com/PicPeak/picpeak/commit/d1aecaa1804c0039744eb79a4032d1ed923e0b85))
* **csp:** external bootstrap script to survive strict reverse-proxy CSP ([#564](https://github.com/PicPeak/picpeak/issues/564)) ([dcc629c](https://github.com/PicPeak/picpeak/commit/dcc629cad23ce0ca89aabb6f8b1eacfde599774e))
* **database-backup:** Postgres-safe insert destructure (runs the inline dump) ([f741e88](https://github.com/PicPeak/picpeak/commit/f741e88acbaf6135be575dc7f42b80bce735abad))
* **date-input:** render pg full-ISO dates in the configured format ([f3a6c89](https://github.com/PicPeak/picpeak/commit/f3a6c8940aa705d336cca4e9695e5acec6d44a89))
* **deps:** bump qs/brace-expansion overrides + add uuid override for node-cron ([d705059](https://github.com/PicPeak/picpeak/commit/d705059d3c2904184f037bbe0208fe128fdb9b63))
* **docker:** chown /backup mount to nodejs on container startup ([3ab3756](https://github.com/PicPeak/picpeak/commit/3ab3756a56dc8c3bcd517d2d60c7ffd10688a945))
* **downloads:** transliterate accented characters in filename via NFD instead of dropping them ([#607](https://github.com/PicPeak/picpeak/issues/607)) ([620163f](https://github.com/PicPeak/picpeak/commit/620163f2db77cda40b81edcac79a32cbb4fd278f))
* **email:** always log incoming mail to received_emails (was lost on insert error) ([9c18dcf](https://github.com/PicPeak/picpeak/commit/9c18dcf377fca1e3650b0e20c926ecd7728aec9a))
* **email:** fail-fast IMAP timeouts + manual 'Check now' poll ([8a54c6f](https://github.com/PicPeak/picpeak/commit/8a54c6f6b115513ba88a51dea43fad5f8e114c86))
* **email:** guard round-trip test when IMAP username isn't an email ([e258472](https://github.com/PicPeak/picpeak/commit/e258472391b7f91b07a916b7edb6ecc5e5c3c048))
* **email:** IMAP Security dropdown auto-fills the conventional port ([bd402d2](https://github.com/PicPeak/picpeak/commit/bd402d2e89bcb88b1cabdcf3a59a206116a968f9))
* **email:** IMAP Security dropdown matches outgoing  no port in label, manual port ([d04a697](https://github.com/PicPeak/picpeak/commit/d04a6978e9c5df0af5c570df8f35a1a690a0ae9c))
* **email:** log all received mail, not just unseen (90-day lookback + dedup) ([c36797d](https://github.com/PicPeak/picpeak/commit/c36797db2db265ad49049c06cee543b1b528a759))
* **email:** mark required fields on incoming mail to match outgoing SMTP ([fb48ba4](https://github.com/PicPeak/picpeak/commit/fb48ba4cb4cbd2ec5836fc3adaffb79ea8d20787))
* **email:** match IMAP card to SMTP styling + auto-detect mailbox folders ([abb23f0](https://github.com/PicPeak/picpeak/commit/abb23f01c745d4285fbc07994c136a719a66b1d0))
* **email:** preserve dots + subaddresses across all normalization sites ([de9a924](https://github.com/PicPeak/picpeak/commit/de9a924c77faebc2d0c1ff230a52d8da313259e8))
* **email:** preserve dots + subaddresses across all normalization sites ([#574](https://github.com/PicPeak/picpeak/issues/574)) ([075b45f](https://github.com/PicPeak/picpeak/commit/075b45f02050a694937d42e85fac10d65bb574dd))
* **email:** recover stuck queue  reinit transporter on config save + manual flush ignores retry cap ([68c967f](https://github.com/PicPeak/picpeak/commit/68c967f9bbc388a3a4605a13d440389929e2561b))
* **email:** resolve recipient language from the queue row's event_id, not just email_data ([10559fd](https://github.com/PicPeak/picpeak/commit/10559fd68e77eb00f3dd79366fcbb7880321e6b8))
* **email:** surface the real error on test/save/flush instead of generic toast ([47edbf6](https://github.com/PicPeak/picpeak/commit/47edbf64b5a83c571df62a71b4c3525fe314abfe))
* event-reminder, email-language & gallery-publish bugs surfaced during workflow testing ([c8714ca](https://github.com/PicPeak/picpeak/commit/c8714ca42f4d82d50fe611b2a630260ebecbe740))
* **event-types:** renaming a type's slug cascades to events, quotes + reminder template ([415c93a](https://github.com/PicPeak/picpeak/commit/415c93a512f74898d0225ce2e9298f24cc12f60d))
* **events:** preserve branding inheritance when saving events with null color_theme ([d5a37df](https://github.com/PicPeak/picpeak/commit/d5a37df2c41425511dc8a1f974088bebb768f0d5))
* **events:** publish-from-draft email carries the real password ([#627](https://github.com/PicPeak/picpeak/issues/627)) ([83b568e](https://github.com/PicPeak/picpeak/commit/83b568ee2ddc007b7d981fd4b46b69810f0165c3))
* **events:** wire customer notifications into both public API entry points ([#647](https://github.com/PicPeak/picpeak/issues/647)) ([f017542](https://github.com/PicPeak/picpeak/commit/f01754247cdb94c5935ad5abbda116841f6c7fba))
* **events:** wire customer notifications into both public API entry points ([#647](https://github.com/PicPeak/picpeak/issues/647)) ([511d647](https://github.com/PicPeak/picpeak/commit/511d647eec656cd223c029a9455420fc0621cc80))
* **flags:** close CRM/accounting feature-gating gaps from the audit ([03fa3d8](https://github.com/PicPeak/picpeak/commit/03fa3d82962d6d6f3cd9630e01258013d567865e))
* **gallery:** admin edits to welcome_message land for returning guests ([#625](https://github.com/PicPeak/picpeak/issues/625)) ([ea6245c](https://github.com/PicPeak/picpeak/commit/ea6245cfdea67bd4668e2100f295433a3d29f7f1))
* **gallery:** guest upload honours general_max_files_per_upload + i18n placeholder interpolates ([#613](https://github.com/PicPeak/picpeak/issues/613)) ([40a4aa2](https://github.com/PicPeak/picpeak/commit/40a4aa2d85d93c9dc1faa69f0e6f8524ff917e29))
* **gallery:** guest upload honours general_max_files_per_upload + i18n placeholder interpolates ([#613](https://github.com/PicPeak/picpeak/issues/613)) ([69b5186](https://github.com/PicPeak/picpeak/commit/69b5186582d56c42cec520abbe5454171f9f666b))
* **gallery:** leave a visible gap between filter bar and hero header ([#624](https://github.com/PicPeak/picpeak/issues/624)) ([178d6da](https://github.com/PicPeak/picpeak/commit/178d6dafb18cd4d30229d745a82af9ce27c41f08))
* **gallery:** preserve per-viewer is_liked across hard refresh ([#590](https://github.com/PicPeak/picpeak/issues/590) follow-up) ([791e997](https://github.com/PicPeak/picpeak/commit/791e9974eb4c81cc4b095f9b604eccd708fb3a66))
* **gallery:** publish dialog stuck for password-protected galleries with no inline email ([aa3471e](https://github.com/PicPeak/picpeak/commit/aa3471efe1629f36adeff8774dfdc379d4652e26))
* **gallery:** toggle (not add) the local liked set on click ([#590](https://github.com/PicPeak/picpeak/issues/590)) ([d292b9f](https://github.com/PicPeak/picpeak/commit/d292b9fa10bffe5d751629b900c606763fa8e73a))
* **gallery:** unbreak password entry in Instagram in-app browser ([#654](https://github.com/PicPeak/picpeak/issues/654)) ([6193ab7](https://github.com/PicPeak/picpeak/commit/6193ab7f6aafd94b6e2e432ddf170361fd306d4e))
* **gallery:** unbreak password entry in Instagram in-app browser ([#654](https://github.com/PicPeak/picpeak/issues/654)) ([b1bfd48](https://github.com/PicPeak/picpeak/commit/b1bfd4838e7104e4f85695e180b20222206073ac))
* **hours:** move logActivity out of the entry transactions (SQLite deadlock) ([348955b](https://github.com/PicPeak/picpeak/commit/348955b261713fc9f0b48391a1d4117f6f8c873f))
* **i18n:** align quoteResponse.changeWithin DE placeholder with call site ([45f0606](https://github.com/PicPeak/picpeak/commit/45f0606ea318e21e43cb53f9674c1f7dd702e1e5))
* **i18n:** honor general_time_format across all time displays ([2ef8376](https://github.com/PicPeak/picpeak/commit/2ef837680e2b3f3260685b962c9c5d7273d0f8bc))
* **i18n:** replace ASCII quote with U+201D in DE perGuestLimitsDesc ([98e97e3](https://github.com/PicPeak/picpeak/commit/98e97e3cf214c96cdefd99bfedd6724f0b85c41c))
* **i18n:** sweep activity-type translations + Events / API Tokens / Webhooks settings tabs ([f17c654](https://github.com/PicPeak/picpeak/commit/f17c654e146683683f347ae2cd46de9cf3e47989))
* **i18n:** sweep activity-type translations + smart notification fallback ([bc8d333](https://github.com/PicPeak/picpeak/commit/bc8d3330bbe02041760063dcbf5cb5984945a25f))
* **i18n:** sweep Events / API Tokens / Webhooks settings tabs ([997a412](https://github.com/PicPeak/picpeak/commit/997a41293ef7de9bdef1546634cb7e549f9c1331))
* **i18n:** wrap WhatsApp token show/hide aria-label through t() ([a8bb7b4](https://github.com/PicPeak/picpeak/commit/a8bb7b439f6f57af9653ce283c951070bd52f3c2))
* **invoices:** add bank transfer to the mark-paid method list ([e96ef4c](https://github.com/PicPeak/picpeak/commit/e96ef4c5a35bc9e575bc3419fb318a3ee9df1bd6))
* **invoices:** anchor issue date + Skonto window to the actual send date ([45c7cc8](https://github.com/PicPeak/picpeak/commit/45c7cc80ab68d00d3dc9b84dcf5f29e5d918aef5))
* **invoices:** auto-track due date from send date + payment term ([522cf2a](https://github.com/PicPeak/picpeak/commit/522cf2aa4a58a3126ce08c780ba46d4b53149f23))
* **invoices:** badge held (unsent, no send date) invoices as "Draft" ([e4367e0](https://github.com/PicPeak/picpeak/commit/e4367e028a5228ef50c4bbd522d0777bc7340b52))
* **invoices:** show "Draft" on the invoice detail page for accumulator drafts ([ca09442](https://github.com/PicPeak/picpeak/commit/ca0944293f66b6465a577340e63d592598915092))
* **invoices:** show sub-cent Rundung in the editor totals preview ([c2bc2b0](https://github.com/PicPeak/picpeak/commit/c2bc2b098e6af3e984e5b06f42e21a8d9501349b))
* **lightbox+events:** Android download lag, multi-photo Web Share re-land, theme branding inheritance ([e016f51](https://github.com/PicPeak/picpeak/commit/e016f510b6cc57a9ed1b59e2ee24fedd5d7097c3))
* **lightbox:** eliminate download lag on Android by skipping the blob round-trip ([0479521](https://github.com/PicPeak/picpeak/commit/04795219a0b66fdd1ef73748d803adfdfc0d676f))
* **lightbox:** restrict Web Share save-to-Photos path to iOS ([#554](https://github.com/PicPeak/picpeak/issues/554)) ([578397b](https://github.com/PicPeak/picpeak/commit/578397bc6b27b56ccf3bf1f2f244e0e0053c493a))
* **lightbox:** restrict Web Share save-to-Photos path to iOS ([#554](https://github.com/PicPeak/picpeak/issues/554)) ([2a309c7](https://github.com/PicPeak/picpeak/commit/2a309c75a74be3af3eb67758f8d65f801ef3019a))
* **maintenance:** enabling maintenance mode no longer locks admins out ([2493130](https://github.com/PicPeak/picpeak/commit/249313072b08ad79146b397bc08436e9de366d22))
* **maintenance:** never block /admin/* with the maintenance screen ([fdde469](https://github.com/PicPeak/picpeak/commit/fdde4696e7025d7e41dd85eeda26b946f6713e13))
* **migrations:** defer cross-table FKs in 107_crm_consolidated ([88a6b34](https://github.com/PicPeak/picpeak/commit/88a6b34c5e8a48c9e6419554b8f813ae02f2e519))
* **nginx:** defensive large_client_header_buffers bump ([#591](https://github.com/PicPeak/picpeak/issues/591)) ([c83e883](https://github.com/PicPeak/picpeak/commit/c83e88348fbd473fb1de041cebabd3ace65d4d98))
* **notifications:** restore /clear-all route the frontend already calls ([#597](https://github.com/PicPeak/picpeak/issues/597)) ([940fc60](https://github.com/PicPeak/picpeak/commit/940fc607400afa528f7f464c1d41541f46a4070d))
* **notifications:** restore /clear-all route the frontend already calls ([#597](https://github.com/PicPeak/picpeak/issues/597)) ([29e63e5](https://github.com/PicPeak/picpeak/commit/29e63e5ce58b1850b422bba22f69664091104096))
* **pdf:** correct multi-page invoice/quote layout + drop IBAN dup under Swiss QR ([2205b0b](https://github.com/PicPeak/picpeak/commit/2205b0bd687587ff2b54fbddb4770bf69a5ef3b2))
* **pdf:** install fonts so SVG logo text rasterises correctly ([9454f43](https://github.com/PicPeak/picpeak/commit/9454f43eba3a65cf1aaeb2fb448f958abcce1a41))
* **pdf:** version the logo rasterisation cache so the font fix takes effect ([a5011b1](https://github.com/PicPeak/picpeak/commit/a5011b1ea26803fec42349a10296afbec6989cfe))
* **projects:** "one customer matches" rule for deal-lineage attach ([f74d8d4](https://github.com/PicPeak/picpeak/commit/f74d8d4e8cd9fa040e067ffd751b183a9673161b))
* **projects:** address review  cross-customer guards + email/queue hardening ([9d13880](https://github.com/PicPeak/picpeak/commit/9d13880f2b177a1a090c4685798e199a1f47b5ec))
* **projects:** clickable milestones/feed, email rollup by customer, PG amount coercion ([c0b6d14](https://github.com/PicPeak/picpeak/commit/c0b6d14d08755f23665eaa8d52dd6a250d6c9074))
* **projects:** enforce single-customer projects (guard event attach + re-label) ([4b1e85c](https://github.com/PicPeak/picpeak/commit/4b1e85c8555b03cbed4abbd80e9cb45b831df6bf))
* **projects:** make email preview fully read-only (no clickable links) ([fa622cf](https://github.com/PicPeak/picpeak/commit/fa622cf2f87f447952b2e6e6e9d7fe60a1c14fb7))
* **projects:** make the whole email row clickable (opens preview) ([84b4a5f](https://github.com/PicPeak/picpeak/commit/84b4a5f049a12bb22941dac733044d90a01fe052))
* **projects:** only link cockpit rows when the target feature is enabled ([2369323](https://github.com/PicPeak/picpeak/commit/236932325971e23db17d6245d1ab2e9f2c1b4eec))
* **projects:** render email preview with its own brand colors, not forced light ([b9a9c01](https://github.com/PicPeak/picpeak/commit/b9a9c018c0d2e0ff6c78ce0a1419ac28449043a4))
* **projects:** scope 'book to project' to the current customer ([89bfb6c](https://github.com/PicPeak/picpeak/commit/89bfb6c5190ec0480168f9b59dc8ce5c2f104068))
* **projects:** scope email rollup to CRM types + re-render unstored previews ([f02fba6](https://github.com/PicPeak/picpeak/commit/f02fba63325115fe416366c5d1c4f38900386cce))
* **projects:** use real events.edit permission for project writes ([f71243e](https://github.com/PicPeak/picpeak/commit/f71243e388e12da840aa70193b4907af2866c039))
* **projects:** wrap long URLs in email preview (no horizontal scroll) ([0cc52f3](https://github.com/PicPeak/picpeak/commit/0cc52f36938be2dc6c8a699afdc55d70831c02a9))
* **quote-response:** compute minutes-remaining for the DE changeWithin string ([5ce0b6e](https://github.com/PicPeak/picpeak/commit/5ce0b6edc3fef41f2f22dd585a668f471ac47a2e))
* **reminders:** wrap is_active/is_archived wheres in formatBoolean ([b9d9138](https://github.com/PicPeak/picpeak/commit/b9d91385b43de7ede508884f7cf78b5cf785f853))
* **restore-wizard:** surface failure status, stop showing "completed at 0%" ([47ed690](https://github.com/PicPeak/picpeak/commit/47ed6907d141de883e95377665fdd61527bba107))
* **restore-wizard:** warn on backups without a database dump ([989b42c](https://github.com/PicPeak/picpeak/commit/989b42c2f1c2cbf97c612fa790d1ae77d16e3626))
* **restore:** coerce pg bigint counts to Number before comparing (PR [#596](https://github.com/PicPeak/picpeak/issues/596) round 2) ([354fbed](https://github.com/PicPeak/picpeak/commit/354fbed18220b47167b9bf6b11b3881fc120b7ae))
* **restore:** default restore_allow_force=true + auto-upgrade existing installs ([c435263](https://github.com/PicPeak/picpeak/commit/c435263744cf6a23b6cd9e0466cc8af3f6c4894a))
* **restore:** discover backups from disk, not just the DB ([f664fea](https://github.com/PicPeak/picpeak/commit/f664fea60ca223479b917abb7a256d4320f089e3))
* **restore:** DROP/CREATE DATABASE needs explicit -d maintenance DB ([4c31a22](https://github.com/PicPeak/picpeak/commit/4c31a22626db47bbbffadd823ae5129ff079faad))
* **restore:** evict active sessions before dropping target DB ([a39def6](https://github.com/PicPeak/picpeak/commit/a39def672ef054ed17fd2e65cec6ae90adf1d959))
* **restore:** hoist preservedMeta above SQLite/PG split (PR [#596](https://github.com/PicPeak/picpeak/issues/596) blocker) ([a23fa3b](https://github.com/PicPeak/picpeak/commit/a23fa3bb12cd05a922c0fb860ae97ffd3fe2baff))
* **restore:** move operator-meta replay after post-restore verification (PR [#596](https://github.com/PicPeak/picpeak/issues/596) round 3) ([20e3092](https://github.com/PicPeak/picpeak/commit/20e3092c146dd9151b6e7a370f885154f0adeecc))
* **restore:** preserve operator-meta settings across restore ([e0ace08](https://github.com/PicPeak/picpeak/commit/e0ace0864e320d262b913dc9924e89fc940a41b3))
* **restore:** re-init knex pool after DROP/CREATE DATABASE ([48e9c9c](https://github.com/PicPeak/picpeak/commit/48e9c9c79aa87b5e5450c76afd00b31de6597d6c))
* **restore:** resolve 'local' source to backup_destination_path ([44c7935](https://github.com/PicPeak/picpeak/commit/44c7935b8483be6aa9282c158cfa0d026f301808))
* **restore:** resolve local source + always rollback on failure ([5c0be66](https://github.com/PicPeak/picpeak/commit/5c0be66a14e4ad854b7e1325ff32a075b480cffd))
* **restore:** set was_successful=true on the completed update ([7988c18](https://github.com/PicPeak/picpeak/commit/7988c189723fa4639413b3a5339c148521c92c11))
* **safe-exec:** Node 22-compatible stdio + error-bridge for spawnTo/FromFile ([d34036c](https://github.com/PicPeak/picpeak/commit/d34036c4efd7769ef4896107cc53ea1a4cd1fa84))
* **security:** block script execution in served SVGs via CSP ([807ae3d](https://github.com/PicPeak/picpeak/commit/807ae3d4fa69d4058a5f886b922efb570fb27227))
* **security:** close BOLA on photo-export + NAT64 SSRF in URL guard ([b8211e9](https://github.com/PicPeak/picpeak/commit/b8211e9944da9e7b1c43a25e2f24c8a2425000cf))
* **security:** close NAT64 SSRF + photo-export BOLA + sweep Trivy alerts (GHSA-wmjx-pc37-272r, GHSA-9v4w-jrhx-g5wr) ([6f40db8](https://github.com/PicPeak/picpeak/commit/6f40db859751efc2c931bc981a48148808fd3701))
* **security:** re-apply SVG CSP on the direct favicon route (PR [#603](https://github.com/PicPeak/picpeak/issues/603) blocker) ([1214b6b](https://github.com/PicPeak/picpeak/commit/1214b6b762ce6c763b9a28389c17905d8e47d87f))
* **settings:** don't insert non-existent created_at into app_settings ([8621338](https://github.com/PicPeak/picpeak/commit/8621338c489cbd5194da6ac22d1fe1bd9d730cb0))
* **settings:** hoist tab-visibility useEffect above isLoading early return ([49bfb45](https://github.com/PicPeak/picpeak/commit/49bfb45332993b919ad4f949a0cd912a85888620))
* **settings:** use CountrySelect for business-profile country (no more FL) ([c2d3f66](https://github.com/PicPeak/picpeak/commit/c2d3f663bc965287f4c050a7a069649d8f7c1d5d))
* **slideshow:** deny display-only token on download/upload/feedback (PR [#646](https://github.com/PicPeak/picpeak/issues/646) review) ([e36b330](https://github.com/PicPeak/picpeak/commit/e36b3309ca66404d189d5b218cc1f0eba925e4c7))
* **slideshow:** dip-to-white/black no longer flickers the image ([db8388c](https://github.com/PicPeak/picpeak/commit/db8388c79e44f5d254d984810bd62bfb11effd0f))
* **slideshow:** drop updated_at from event writes ([1e40f82](https://github.com/PicPeak/picpeak/commit/1e40f8296ca59ff0395f6cc09ee452ab62653cdc))
* **slideshow:** feature flag is a master kill-switch, not just admin UI ([759784a](https://github.com/PicPeak/picpeak/commit/759784a4d1cfe7e67c825293760169ad6904f090))
* **slideshow:** fill the viewport instead of black bars ([6ec46de](https://github.com/PicPeak/picpeak/commit/6ec46de0e7bb821ea4e4a7fc2318792b810c3f36))
* **slideshow:** read globals from app_settings, not the missing settings table ([0f4388d](https://github.com/PicPeak/picpeak/commit/0f4388d68ab85049c46e7af566d35f4fbf6e4d02))
* **slideshow:** surface backend error in the live slideshow card ([056f938](https://github.com/PicPeak/picpeak/commit/056f9381de5dbe90243bea409b587b4910050cbf))
* **test-infra:** scope databaseBackup fs.unlink stub so it doesn't leak ([3f5d006](https://github.com/PicPeak/picpeak/commit/3f5d006625fdbd8f34ad57d901dd55f543878e05))
* **test-infra:** unref sessionTimeout cleanup interval so workers exit gracefully ([ecb2aea](https://github.com/PicPeak/picpeak/commit/ecb2aeacf9569bb2ea4d678a97c527234aefd159))
* **test:** raise bootCrmDb beforeAll timeout on slideshow suites ([f4b6b89](https://github.com/PicPeak/picpeak/commit/f4b6b8941a30a20615cc87627a0663ff6d03c932))
* **upload:** auto-throttle on low-memory hosts + correct documented RAM minimum ([#628](https://github.com/PicPeak/picpeak/issues/628)) ([714a9f6](https://github.com/PicPeak/picpeak/commit/714a9f6fb1f48ba1316cc240054d5128749581d8))
* **whatsapp:** admin-pinned template language + Arabic locale support ([#647](https://github.com/PicPeak/picpeak/issues/647)) ([4fd7709](https://github.com/PicPeak/picpeak/commit/4fd7709596e7a0dd3fedef63772ddd52ce5561c9))
* **workflows:** close review blockers  prefetch-safe approvals + loud gate-edge failure ([98ab717](https://github.com/PicPeak/picpeak/commit/98ab717043e3fdefac0934bf8f4621d523b15e9a))
* **workflows:** dark-mode canvas + readable nodes + structured config ([1734aba](https://github.com/PicPeak/picpeak/commit/1734aba39c199c8dee1b69e9933ddf57579f9d50))
* **workflows:** defer quote.accepted/declined emit until the 15-min response window locks ([539a837](https://github.com/PicPeak/picpeak/commit/539a83711d1996dc9c262365f2c511e7bc445add))
* **workflows:** harden graph validation + refuse enabling unimplemented flows ([d927464](https://github.com/PicPeak/picpeak/commit/d927464778272bd862aa01903179672f4d47368a))
* **workflows:** held booking invoices are 'scheduled', not 'pending_delivery'  so send_document can issue them ([882cfc0](https://github.com/PicPeak/picpeak/commit/882cfc0661b02602bae91b928a46ceea754f7f29))
* **workflows:** make the dashboard pending-approvals card items clickable too ([6e20d58](https://github.com/PicPeak/picpeak/commit/6e20d58487c5e20b08e1d1b4ddd4e76f9e922a79))
* **workflows:** matchFilter strict equality + accurate comment ([dee8d40](https://github.com/PicPeak/picpeak/commit/dee8d40bb3235a908bba514a97a62d3a91a6e131))
* **workflows:** Postgres-safe id capture on workflow inserts ([cede885](https://github.com/PicPeak/picpeak/commit/cede885b04854fd667f65a19697505c0a7c52739))
* **workflows:** ship built-ins disabled for first beta + enabled-based mutex + admin sentinel ([5893ecb](https://github.com/PicPeak/picpeak/commit/5893ecb27a0365a79ec04336c5a122b31d31db0e))
* **workflows:** wire a real, SSRF-guarded webhook action (was a silent no-op) ([af7eea8](https://github.com/PicPeak/picpeak/commit/af7eea8b43e37905a79138bcde4b1026dea13050))
### Performance Improvements
* **slideshow:** cache global settings to cut /state DB reads (PR [#646](https://github.com/PicPeak/picpeak/issues/646) review) ([a995131](https://github.com/PicPeak/picpeak/commit/a995131f4266e112c96c6e8cedd5158995ebe899))
### Reverts
* **docker:** drop /backup chown from wait-for-db.sh ([5b3bfed](https://github.com/PicPeak/picpeak/commit/5b3bfed144e10a74c222b693095b55d77ee07816))
### Documentation
* branch model + migration-to-org guide + PR template ([166ef47](https://github.com/PicPeak/picpeak/commit/166ef47611a248c4d517e26d390d87d21f077ca1))
* branch model + migration-to-org guide + PR-template target hint ([d606fcd](https://github.com/PicPeak/picpeak/commit/d606fcd5a425fed3c968ec06b071a386bf558c28))
* consolidate disaster-recovery into Backup & Restore guide ([43cb0ea](https://github.com/PicPeak/picpeak/commit/43cb0ea4bfc4f241a55d2681f14c064df6b87920))
* **contributing:** note rebuild-after-package.json gotcha for dev compose ([2692e71](https://github.com/PicPeak/picpeak/commit/2692e71297925b7c117108fa9da9defe87dfe88e))
* **crm:** legal/financial disclaimers  examples only ([e7db0bb](https://github.com/PicPeak/picpeak/commit/e7db0bb8668a2cda9ee5469bcfb1a2e2cfd05403))
* list CRM under Beta Features + note dev-compose rebuild gotcha ([1ed4804](https://github.com/PicPeak/picpeak/commit/1ed48046cbba1df3710cee197943521aedd1fe3d))
* **readme:** add CRM + accounting to features, tax disclaimer, update contributor ([116743b](https://github.com/PicPeak/picpeak/commit/116743ba438505a52b021f80f678c5a0094d20d4))
* **readme:** list CRM module under Beta Features with own-risk disclaimer ([c2dcd9c](https://github.com/PicPeak/picpeak/commit/c2dcd9ca840b9c1905e75bd9b4b31b5c0b75043d))
* **release:** establish stable-channel cadence + promotion process ([e537923](https://github.com/PicPeak/picpeak/commit/e537923857b4b6000d715bba23a78f8685b44ee6))
* **release:** establish stable-channel cadence + promotion process ([#565](https://github.com/PicPeak/picpeak/issues/565)) ([ab81998](https://github.com/PicPeak/picpeak/commit/ab819989960e7e7336a47ba93a0472bfbcb10efb))
* **slideshow:** add Live Slideshow guide + README entries ([16013d1](https://github.com/PicPeak/picpeak/commit/16013d1cf9ad82ee052f905f9702feffde7b67eb))
---
This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).