0d8123ed4a
Build and Push Docker Images / build-backend (linux/amd64, ubuntu-latest) (push) Has been cancelled
Build and Push Docker Images / build-backend (linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build and Push Docker Images / merge-backend (push) Has been cancelled
Build and Push Docker Images / build-frontend (linux/amd64, ubuntu-latest) (push) Has been cancelled
Build and Push Docker Images / build-frontend (linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build and Push Docker Images / merge-frontend (push) Has been cancelled
Build and Push Docker Images / summary (push) Has been cancelled
325 KiB
325 KiB
Changelog
All notable changes to PicPeak will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
3.45.3 (2026-07-17)
Bug Fixes
- update: target docker-compose.production.yml in dashboard update steps (64bcd0a)
- update: target docker-compose.production.yml in dashboard update steps + gate mailhog (stable) (db1d28a)
3.45.2 (2026-07-17)
Bug Fixes
- security: remove unguarded legacy /api/events router (GHSA-4j34-x562-5vfq) (9ee3ff4)
- security: remove unguarded legacy /api/events router on stable (GHSA-4j34-x562-5vfq) (e37d1fa)
3.45.1 (2026-07-16)
Bug Fixes
- security: close 4 open security advisories on stable (backup takeover, share-login bypass, ZIP slip, chunked-upload traversal) (b416bae)
- security: harden .picpeak restore operator-preservation (GHSA-qxfx follow-up) (b00a161)
- security: preserve current admin on .picpeak restore (GHSA-qxfx-4493-4v8f) (1cf82d8)
- security: reject ZIP-slip entries in archive/backup restore (GHSA-jfhw-fj23-fx6x) (cde0b46)
- security: sanitize chunked-upload filename (GHSA-pc72-jf53-w28j) (dcfcb67)
- security: share-login must not bypass gallery password (GHSA-9hmx-68vc-qpqw) (28f69e4)
3.45.0 (2026-07-09)
Features
- accounting: Accounting nav section + relocate Tax report out of CRM (30c0007)
- accounting: Accounting settings tab (km / per-diem rate, require-proof) (2b7495e)
- accounting: add a Banana "Income & Expense" (cash-book) export format (445d6d7)
- accounting: backend rework - incoming invoices vs internal expenses (stage 2) (5e78fb6)
- accounting: bill editor VAT dropdown + GET returns vat_code snapshot (2479d87)
- accounting: clearer tax-export window + gate journal export on accounting flag (3edd832)
- accounting: consolidate VAT/financial config into Settings → Accounting (dc7b87b)
- accounting: data-driven revenue-rate VAT map (multi-country) (873be91)
- accounting: event booking via dropdown (Company or an event) (81af445)
- accounting: expense invoiced/paid lifecycle + edit-until-invoiced; decouple tax report from bills flag (2e8e4a0)
- accounting: expenses ledger + supplier-payment toggle (0c35ac4)
- accounting: explain dispositions inline, drop markup from pass-through (9a023c0)
- accounting: frontend rework - separate Incoming invoices vs Expenses (stage 2) (f305541)
- accounting: inbound supplier-invoice capture + expense re-bill (backend) (c305492)
- accounting: incoming-invoice triage refinements (paid badge, click-to-categorize, reference, categorize+pay) (72b784c)
- accounting: incoming-invoice workflow v2 + VAT/financial settings consolidation (b527915)
- accounting: incoming-invoices inbox with camera capture + triage/re-bill (2b5efeb)
- accounting: invoices force-enable the Accounting master (51837c3)
- accounting: Layer A backend — chart of accounts, VAT codes, Treuhänder export (03cc250)
- accounting: Layer A frontend — chart of accounts CRUD + Treuhänder export UI (7e0098e)
- accounting: manual "add expense" (no document) on the ledger (703f727)
- accounting: move Chart of accounts into Settings → Accounting (97795f6)
- accounting: move Treuhänder export onto the Tax page (b1f73c1)
- accounting: PDF/image preview in triage, opened at the QR-bill (no OCR) (502fbad)
- accounting: rasterise inbound PDFs server-side (never serve raw to browser) (e111522)
- accounting: re-categorize incoming invoices, note field, pending re-bill pool (36a8e42)
- accounting: re-viewable incoming invoices + expense invoiced/paid lifecycle UI (727bdab)
- accounting: relocate VAT codes + rate maps into Settings → Accounting (4ff5b84)
- accounting: scope the tax-report export to income-only or cost-only (9f3b286)
- accounting: snapshot the chosen VAT code on quote/invoice create + storno (5b52969)
- accounting: snapshot vat_code on quotes/invoices + export prefers it (foundation) (0a7dc1c)
- accounting: split Incoming invoices vs Expenses - flags, schema, settings (stage 1) (c59df52)
- accounting: supplier-country tax default + configurable default output VAT code (267b121)
- accounting: tax report VAT-payable honours registration + reclaim (d7107aa)
- accounting: tax window shows all costs (incoming invoices + expenses) alongside revenue (545ef33)
- accounting: unify tax report into one signed, typed, sortable ledger (fd1dd81)
- accounting: VAT registration + reclaim-country settings in the Accounting tab (4d87684)
- accounting: VAT registration/reclaim settings + un-gated VAT-codes read (fbbbb8a)
- accounting: VAT-code dropdown in the quote editor (+ reusable VatRateSelect) (6e1924b)
- admin photos list/grid toggle + upload failure report (#707, #708) (e873f7c)
- admin photos list/grid toggle + upload failure report (#707, #708) (6f95796)
- admin two-factor authentication (TOTP) with recovery codes + CLI reset (cf07361)
- admin-configurable workflow engine + dunning/Mahngebühr rework (RFC — feedback welcome) (15be3b8)
- admin-ui: TOTP MFA enrollment + two-step login; remove stub 2FA toggle (96e3c68)
- admin/exports: inline preview modal with copy-to-clipboard (#631) (fc5c1ae)
- admin/exports: inline preview modal with copy-to-clipboard (#631) (27b5f7e)
- admin: in-app migration banner for the org rename (0213347)
- admin: in-app migration banner for the org rename (#669) (2a4bf3b)
- analytics: pluggable trackers — Umami + Rybbit + Custom (#663 Phase 1) (83461fe)
- analytics: pluggable trackers — Umami + Rybbit + Custom (#663 Phase 1) (ab50145)
- auth: admin TOTP MFA — enrollment, login challenge, recovery, CLI reset (72e2ef6)
- backup: .picpeak download + upload-restore UI in Backup Manager (66d61c8)
- backup: .picpeak import/restore (full override, keeps current account) (2920d82)
- backup: .picpeak portable export (engine-neutral logical snapshot) (38b3aef)
- backup: fold .picpeak restore into the Restore wizard's Upload source (86324e7)
- backup: upload + restore endpoint for .picpeak (2b66f6d)
- branding: force color mode = standard look; hide overridden theme controls (4749e22)
- categories: per-category download permissions (#640 part B) (820f483)
- common: generic Promise-based ConfirmDialog primitive (#640 part C) (a3fcb5b)
- crm: 3-reminder dunning + flat/percent Mahngebühr on 2nd & 3rd + AGB notice (dcdbeb9)
- crm: event-type dropdown on quotes; quote→event uses it (no more hardcoded 'wedding') (f78671f)
- crm: Mahngebühr on a separate Mahnung document; invoice stays immutable (5ed2fec)
- crm: pre-event reminder falls back to the assigned customer account (3ccaed0)
- crm: Project Overview phase 1 — projects schema (efa47d6)
- crm: Project Overview phase 2 — project service + routes (eb26313)
- crm: Project Overview phase 3 — persist sent email HTML (874c91f)
- crm: toggle for VAT on late fees (jurisdiction-dependent) (eaceb7e)
- dashboard: revenue "year" tile toggles 365 days ↔ calendar YTD (d1c9e02)
- email: add 'Test connection' to incoming mail + tidy IMAP label (f017649)
- email: incoming mail (IMAP) intake - backend + standalone flag (5645c30)
- email: incoming mail UI - IMAP config block + Received emails tab (31280e1)
- email: round-trip test — send via SMTP to the IMAP mailbox and confirm arrival (04be51a)
- events: duplicate-gallery action (#626) (e985d25)
- feedback: export shape toggle — per-action vs per-guest pivot (#640 part E) (fabd67a)
- feedback: per-guest favorite + like caps with mobile-friendly limit modal (#655) (3ac7017)
- feedback: per-guest favorite + like caps with mobile-friendly limit modal (#655) (f2814e4)
- first-run setup wizard (feature selection + config) and portable .picpeak backup roundtrip (e513e83)
- gallery: branded URL shortener — /s/<slug> with OG injection (#699) (a0f7033)
- gallery: branded URL shortener — /s/<slug> with OG injection (#699) (56c2386)
- gallery: publish notifies assigned customer accounts via the account email (c657892)
- invoices: optional sub-cent rounding reconciliation ("Rundung" row) (4670292)
- invoices: surface monthly/manual accumulator drafts in the Bills list (e457656)
- Live Slideshow ("Diashow") — fullscreen, auto-updating projector view for live events (4356393)
- messages: create/select quote, contract, invoice, gallery from a message (0dbf863)
- messages: Outlook-style Messages email client (3 phases, flag-gated) (d0bdcb1)
- messages: Phase 1 read-only Messages viewer (email client shell) (26eeb76)
- messages: Phase 2 — customer (hello@) mailbox + inbound body capture (ee46cf2)
- messages: Phase 3 — editable-template composer, reply + create actions (768e847)
- messages: search bar + Archive/Delete with Archived & Deleted folders (99d5996)
- messages: unified Messages email client (flag-gated, default off) (a71b9b5)
- projects: attach-event control in the cockpit (dffcf62)
- projects: flag re-rendered emails in the feed (94f2c01)
- projects: gate Project Overview behind a projects feature flag + cockpit email actions (1bf0b34)
- projects: gated project pickers on quote/contract/hours editors (0175007)
- projects: link quotes & contracts to a project (precise cockpit rollup) (6420047)
- projects: linking a quote/contract cascades the whole deal into the project (a702f33)
- projects: Project Overview cockpit — link (multiple) quotes/contracts/hours into projects (58f93ae)
- projects: Project Overview cockpit UI + CRM nav entry (81553aa)
- projects: rolled-up project value (newest stage wins per deal, cumulative) (7ca2437)
- setup wizard + argument-driven unattended install (681619f)
- setup: add "How will you use PicPeak?" feature-selection step (422dfe1)
- setup: add restore-from-backup branch to the first-run wizard (a95ee47)
- setup: brand first-run screen and split into two-step wizard (d9b0eb7)
- setup: final community step (#732) + fix create-admin button overflow (#730) (a5f49e3)
- setup: final community/thank-you step (#732); fix create-admin button overflow (#730) (dadaaee)
- setup: per-feature config step after feature selection (07b450a)
- setup: step-by-step wizard + argument-driven unattended install (d35c413)
- setup: validate setup token at step 1 before advancing (b0912c7)
- slideshow: add image fit setting (fill vs black bars) (b5c73e0)
- slideshow: admin ui for live slideshow (385b05a)
- slideshow: backend api for live slideshow (dea5e0f)
- slideshow: db columns for live slideshow (1029dd0)
- slideshow: en/de strings for live slideshow (cb761ee)
- slideshow: gate behind a feature flag + move globals to a Settings tab (69367b4)
- slideshow: public fullscreen slideshow viewer (fd02254)
- updates: "What's New" highlights after update + pre-update teaser (a1a73bf)
- updates: "What's New" highlights after update + pre-update teaser (500cf85)
- whatsapp: admin-selectable template parameters + reorder (#647 follow-up) (80e8ec5)
- whatsapp: admin-selectable template parameters + reorder (#647 follow-up) (16055cd)
- whatsapp: WhatsApp Business API notification channel (#640 part D) (78c8e9d)
- workflows: 'Clean up layout' auto-arrange button (dagre) (79607c5)
- workflows: add workflows feature flag + Features-tab toggle (ff47861)
- workflows: admin CRUD + run-history + approvals-inbox API (1a0d6de)
- workflows: admin review gates before sends + migrate lifecycle/time triggers (fa7b1ba)
- workflows: advanced text mode — export/import the flow as JSON (289568f)
- workflows: approval gates — email confirm/deny + token resume (b48d8c2)
- workflows: booking cutover — wire booking actions + hold documents behind approval gates (ec33ec7)
- workflows: collections-handoff block after dunning exhausts (b78bd97)
- workflows: crash recovery — resume runs orphaned mid-flow (192d2cb)
- workflows: data-touching action + condition handlers (96fb440)
- workflows: emit lifecycle events from invoice + quote services (cc0ba53)
- workflows: execution engine core + registry + tests (1eaef67)
- workflows: hard cutover of gallery-expiry + dunning + pre-event to flows (0b6c33e)
- workflows: implement prepare_event so booking_full/booking_simple are enableable (4faf5a3)
- workflows: implement remaining stub actions (prepare_quote, prepare_gallery, reserve_date) (9414b42)
- workflows: invoice prepared+approved early, dispatch waits; daysBefore in editor; dashboard approvals (182e655)
- workflows: make approval rows clickable to open the underlying document (7727b67)
- workflows: migrate the dunning ladder onto the engine (cutover) (5259ee9)
- workflows: per-quote booking-workflow picker + quote→invoice (no gallery) built-in (d14f1d8)
- workflows: pre-event reminder picks the template GROUP on the block, type stays automatic (10d091b)
- workflows: React Flow canvas editor + list + approvals UI (5c0396d)
- workflows: route webhook node through the delivery pipeline (full Option 1) (675e41a)
- workflows: scheduler resumes elapsed wait nodes (610a3df)
- workflows: schema + permissions (migration 142) (c818c25)
- workflows: seed booking + pre-event built-ins, wire event.date_approaching (62ba905)
- workflows: seed invoice-dunning ladder as an editable built-in flow (9b557ef)
- workflows: test-fire — safe dry-run of any flow on demand (e70ddd3)
- workflows: warn when disabling a built-in (reverts to legacy, not off) (c5f131c)
- workflows: wire booking document actions (prepare_invoice/contract + send_document) (cf424ef)
- zero-config first run — in-browser admin bootstrap + auto-generated secrets (bafc96f)
- zero-config first run — in-browser admin bootstrap + auto-generated secrets (415bffa)
Bug Fixes
- accounting: 'Save & mark paid' actually pays; incoming invoices appear in tax/export (3b70a09)
- accounting: address the-luap PR #636 review (707c5d0)
- accounting: always show Income/Costs/Result summary on tax page (even with zero costs) (663daf5)
- accounting: Banana export is now a tab-separated .txt (actually importable) (a195067)
- accounting: Banana I&E export uses the 'Category' column (not 'ContraAccount') (53a16f9)
- accounting: distinguish Categorized (purple) from Paid (green) (9514f5c)
- accounting: emit ISO dates in exports (Postgres returns Date objects) (0c0fb29)
- accounting: label the outgoing-invoice totals block in the tax summary (f3e77e7)
- accounting: lock company-expense to company, first-page categorise preview, auto-refresh inbox (cee692c)
- accounting: migration 127 must not insert created_at/updated_at into app_settings (31867ef)
- accounting: PDF pager always shown, click categorized→pay, drop duplicate Paid chip (5fcb96c)
- accounting: PR #622 blockers — CSV formula injection + IMAP double-ingest race (cd6d578)
- accounting: PR #622 concerns — flag-cache, customer master gate, VAT-unconfigured, helpers, page cap (a93b6dc)
- accounting: tax report 500 on Postgres — drop SQL date() from cost queries (ea8f6bc)
- accounting: tax report cost side queried a non-existent column (ab65a47)
- accounting: tax report degrades gracefully if cost side fails (+ surface the error) (9f85111)
- accounting: tax-report storno totals + hours-line date on Postgres (db9e41d)
- accounting: tidy the tax-export scope selector styling (8deb7e0)
- accounting: UTF-8 BOM on the ledger export so Banana reads it correctly (74144da)
- admin-header: skeleton brand block + move LanguageSelector into profile menu on <sm (#523 follow-up) (b48b5b0)
- admin-header: skeleton brand block + move LanguageSelector into profile menu on <sm (#523 follow-up) (fe10191)
- admin/events: delete cascade orphaned photo folders because it read a non-existent column (#608) (284680e)
- admin/events: delete cascade orphaned photo folders because it read a non-existent column (#608) (457c956)
- admin/exports: Lightroom TXT export joins with comma + drops extension (#623) (a239fec)
- admin: graceful logo-img fallback + show sidebar widgets during perm hydration (#523 follow-up 2) (f51b9cf)
- admin: logo-img fallback + sidebar perm hydration + filename NFD transliteration (#523 follow-up 2, #607) (fcd3ca3)
- admin: stack publish-gallery dialog CTAs so the German label fits (#670) (748af98)
- admin: stack publish-gallery dialog CTAs so the German label fits (#670) (ea2852d)
- admin: stop the event-date field crashing the page on backspace (760a201)
- admin: stray literal "0" rendered from SQLite integer booleans (760c3d7)
- analytics: admin dashboard reads correct fields + Umami device API (#661) (349f566)
- analytics: admin dashboard reads correct fields + Umami device API (#661) (7534447)
- archives: stream-extract restore for >2 GiB + preserve original_filename via manifest (#640) (e4e79a0)
- auto-publish release-please PRs without manual approval (fb64ec0)
- backup: address .picpeak review — table filter, superuser guard, tests (fa7665c)
- backup: make .picpeak roundtrip work on Postgres (f57462f)
- branding+whatsapp: preserve customCss through preset switches (#645) + admin-pinned WhatsApp template language (#647) (cde028e)
- branding: force lock = light/dark only; Branding stays the full preset, galleries hide color+mode (a7c1913)
- branding: make 'Show logo in hero' a true global toggle with per-event override (#756) (a88da99)
- branding: make 'Show logo in hero' a true global toggle with per-event override (#756) (96fe478)
- branding: point HTML favicon link at /favicon.ico (the real Safari fix) (c60e34e)
- branding: preserve customCss through preset switches + theme changes (#645) (7cf2679)
- branding: unify hero logo SIZE the same way as visibility (#756) (60b03b1)
- branding: when a force lock is active, collapse the theme customizer to just the Force control (1ac653a)
- ci: auto-publish release-please PRs without manual approval (#719) (a3e7232)
- ci: enable release-PR auto-merge with the PAT, not GITHUB_TOKEN (e08a33d)
- ci: set GH_REPO in release-please auto-merge step (0cab43e)
- ci: whatsnew highlights — set GH_REPO so gh runs without a checkout (3feed0f)
- ci: whatsnew highlights — set GH_REPO so gh runs without a checkout (2a5f0a8)
- conform moved code to eslint indent/quotes, 4-arg mutation callbacks (2ea26a4)
- crm: admin surfaces follow the admin light/dark toggle, not the gallery theme (#620) (d3266a0)
- crm: country dropdown on customer onboarding, placed after State/region (18ffff2)
- crm: country dropdown on customer profile billing address too (fe56d24)
- crm: drop redundant 'Country (full name)' field (a2b5ae1)
- crm: editor totals box computed VAT 100× too small (e9b297c)
- crm: localize scheduled-send + installment date + timezone picker (43b10f9)
- crm: PR #603 review follow-ups + Outlook-proof email design (a2b2d3f)
- crm: pre-event reminder passes raw event_date (fixes "Invalid Date" in the email) (250b240)
- crm: pre-event reminder resolves recipient from the event row, not a non-existent column (5fbe514)
- crm: quote→event fallback resolves an ACTIVE event type, never hardcoded 'wedding' (2309812)
- crm: recent-activity email placeholder + customer-dashboard locale dates (ea09a86)
- deps: bump qs/brace-expansion overrides + add uuid override for node-cron (d705059)
- downloads: transliterate accented characters in filename via NFD instead of dropping them (#607) (620163f)
- email,ui: billing emails follow customer language + readable pay… (ea86871)
- email,ui: billing emails follow customer language + readable payment-check confirmation (0c2d319)
- email,ui: billing emails follow customer language + readable payment-check confirmation (fcc3e91)
- email: always log incoming mail to received_emails (was lost on insert error) (9c18dcf)
- email: fail-fast IMAP timeouts + manual 'Check now' poll (8a54c6f)
- email: guard round-trip test when IMAP username isn't an email (e258472)
- email: IMAP Security dropdown auto-fills the conventional port (bd402d2)
- email: IMAP Security dropdown matches outgoing — no port in label, manual port (d04a697)
- email: log all received mail, not just unseen (90-day lookback + dedup) (c36797d)
- email: mark required fields on incoming mail to match outgoing SMTP (fb48ba4)
- email: match IMAP card to SMTP styling + auto-detect mailbox folders (abb23f0)
- email: recover stuck queue — reinit transporter on config save + manual flush ignores retry cap (68c967f)
- email: resolve recipient language from the queue row's event_id, not just email_data (10559fd)
- email: sibling billing emails follow customer language too (c0008be)
- email: surface the real error on test/save/flush instead of generic toast (47edbf6)
- enable release-PR auto-merge with the PAT so releases actually publish (97b9853)
- event creation 500s on PostgreSQL (NaN slideshow seed) + stray "0" boolean renders (b187f58)
- event-reminder, email-language & gallery-publish bugs surfaced during workflow testing (c8714ca)
- event-types: renaming a type's slug cascades to events, quotes + reminder template (415c93a)
- events: NaN from slideshow seed breaks event creation on PostgreSQL (8c86518)
- events: publish-from-draft email carries the real password (#627) (83b568e)
- events: wire customer notifications into both public API entry points (#647) (f017542)
- events: wire customer notifications into both public API entry points (#647) (511d647)
- flags: close CRM/accounting feature-gating gaps from the audit (03fa3d8)
- gallery: admin edits to welcome_message land for returning guests (#625) (ea6245c)
- gallery: guest upload honours general_max_files_per_upload + i18n placeholder interpolates (#613) (40a4aa2)
- gallery: guest upload honours general_max_files_per_upload + i18n placeholder interpolates (#613) (69b5186)
- gallery: leave a visible gap between filter bar and hero header (#624) (178d6da)
- gallery: publish dialog stuck for password-protected galleries with no inline email (aa3471e)
- gallery: unbreak password entry in Instagram in-app browser (#654) (6193ab7)
- gallery: unbreak password entry in Instagram in-app browser (#654) (b1bfd48)
- hours: move logActivity out of the entry transactions (SQLite deadlock) (348955b)
- i18n: replace ASCII quote with U+201D in DE perGuestLimitsDesc (98e97e3)
- i18n: sweep activity-type translations + Events / API Tokens / Webhooks settings tabs (f17c654)
- i18n: sweep activity-type translations + smart notification fallback (bc8d333)
- i18n: sweep Events / API Tokens / Webhooks settings tabs (997a412)
- i18n: wrap WhatsApp token show/hide aria-label through t() (a8bb7b4)
- invoices: add bank transfer to the mark-paid method list (e96ef4c)
- invoices: badge held (unsent, no send date) invoices as "Draft" (e4367e0)
- invoices: correct payment-check email template key so dunning email sends (9a76333)
- invoices: correct payment-check email template key so dunning email sends (3682de1)
- invoices: show "Draft" on the invoice detail page for accumulator drafts (ca09442)
- invoices: show sub-cent Rundung in the editor totals preview (c2bc2b0)
- maintenance: enabling maintenance mode no longer locks admins out (2493130)
- maintenance: never block /admin/* with the maintenance screen (fdde469)
- messages: dynamic addresses, branding accent, compose/sync, per-identity SMTP (7cc1c59)
- messages: dynamic addresses, branding accent, compose/sync, per-identity SMTP (f9c2b4e)
- messages: make the Messaging feature flag toggleable (b96ad36)
- messages: PR #769 nits — server-side search, bare-email recipient, DE i18n (1e08a4f)
- messages: PR #769 review — escape reply sender (XSS), gate backend routes, exact customer match (bb235e7)
- messages: show only the mailbox local part in the sidebar (full … (c622a35)
- messages: show only the mailbox local part in the sidebar (full address on hover) (88fe9f9)
- messages: show the resolved customer's name in the doc-action modal (2c5c1d5)
- mirror #734 onto decomposed files (PG NaN slideshow seed, SQLite bool renders) (766351b)
- og: broaden social-crawler coverage (Bluesky Cardyb, WeChat-scraper, fediverse, etc.) (a0a28a4)
- og: rich social previews for share-token + slideshow URLs (#699) (25bf7bb)
- og: rich social previews for share-token + slideshow URLs (#699) (1b8747d)
- og: route branded short URLs + slideshow links to OG, add Viber (#699) (0dffe0c)
- og: route branded short URLs + slideshow to OG handler, add Viber (#699) (a87ad77)
- pdf: correct multi-page invoice/quote layout + drop IBAN dup under Swiss QR (2205b0b)
- projects: "one customer matches" rule for deal-lineage attach (f74d8d4)
- projects: address review — cross-customer guards + email/queue hardening (9d13880)
- projects: clickable milestones/feed, email rollup by customer, PG amount coercion (c0b6d14)
- projects: enforce single-customer projects (guard event attach + re-label) (4b1e85c)
- projects: make email preview fully read-only (no clickable links) (fa622cf)
- projects: make the whole email row clickable (opens preview) (84b4a5f)
- projects: only link cockpit rows when the target feature is enabled (2369323)
- projects: render email preview with its own brand colors, not forced light (b9a9c01)
- projects: scope 'book to project' to the current customer (89bfb6c)
- projects: scope email rollup to CRM types + re-render unstored previews (f02fba6)
- projects: use real events.edit permission for project writes (f71243e)
- projects: wrap long URLs in email preview (no horizontal scroll) (0cc52f3)
- reminders: wrap is_active/is_archived wheres in formatBoolean (b9d9138)
- security: close BOLA on photo-export + NAT64 SSRF in URL guard (b8211e9)
- security: close cross-event thumbnail leak, bulk-op ownership bypass, + hardening (081f3ed)
- security: close NAT64 SSRF + photo-export BOLA + sweep Trivy alerts (GHSA-wmjx-pc37-272r, GHSA-9v4w-jrhx-g5wr) (6f40db8)
- security: cross-event thumbnail leak, bulk-op ownership bypass + auth hardening (b732974)
- security: re-apply SVG CSP on the direct favicon route (PR #603 blocker) (1214b6b)
- set GH_REPO in release-please auto-merge step (d00d52a)
- settings: don't insert non-existent created_at into app_settings (8621338)
- settings: hoist tab-visibility useEffect above isLoading early return (49bfb45)
- settings: remove duplicate Mail import that broke the dev server (5b535f8)
- settings: remove duplicate Mail import that crashes the dev server (4aa6583)
- setup: address PR #714 review — password UX, script token, race, nits (286975d)
- setup: keep the first-run wizard light regardless of dark mode (d4b143f)
- setup: match first-run logo size to the login page default (3e69c5d)
- slideshow: deny display-only token on download/upload/feedback (PR #646 review) (e36b330)
- slideshow: dip-to-white/black no longer flickers the image (db8388c)
- slideshow: drop updated_at from event writes (1e40f82)
- slideshow: feature flag is a master kill-switch, not just admin UI (759784a)
- slideshow: fill the viewport instead of black bars (6ec46de)
- slideshow: read globals from app_settings, not the missing settings table (0f4388d)
- slideshow: surface backend error in the live slideshow card (056f938)
- test: raise bootCrmDb beforeAll timeout on slideshow suites (f4b6b89)
- upload: auto-throttle on low-memory hosts + correct documented RAM minimum (#628) (714a9f6)
- whatsapp: admin-pinned template language + Arabic locale support (#647) (4fd7709)
- whatsnew: decode HTML entities and trim em-dash detail in fallback bullets (5582644)
- workflows: backfill existing invoices + anchor dunning grace to due date when enabled (#750) (9596342)
- workflows: backfill existing invoices + anchor grace to due date when dunning is enabled (#750) (2c7b351)
- workflows: close review blockers — prefetch-safe approvals + loud gate-edge failure (98ab717)
- workflows: dark-mode canvas + readable nodes + structured config (1734aba)
- workflows: defer quote.accepted/declined emit until the 15-min response window locks (539a837)
- workflows: harden graph validation + refuse enabling unimplemented flows (d927464)
- workflows: held booking invoices are 'scheduled', not 'pending_delivery' — so send_document can issue them (882cfc0)
- workflows: make the dashboard pending-approvals card items clickable too (6e20d58)
- workflows: matchFilter strict equality + accurate comment (dee8d40)
- workflows: Postgres-safe id capture on workflow inserts (cede885)
- workflows: scope dunning backfill to its own flow via targetWorkflowId (da3a77d)
- workflows: ship built-ins disabled for first beta + enabled-based mutex + admin sentinel (5893ecb)
- workflows: wire a real, SSRF-guarded webhook action (was a silent no-op) (af7eea8)
Performance Improvements
Documentation
- branch model + migration-to-org guide + PR template (166ef47)
- branch model + migration-to-org guide + PR-template target hint (d606fcd)
- prominent migration banner at the top of README (14bd3e1)
- prominent migration banner at the top of README (#669) (5839bba)
- readme: add CRM + accounting to features, tax disclaimer, update contributor (116743b)
- readme: add Pixieset to comparison + customer-accounts/CRM/accounting rows (721f440)
- readme: clarify comparison footnotes — $0 cost caveat + Pixieset video cap (b043963)
- readme: credit @the-luap as creator/lead maintainer (3528f6b)
- readme: credit @the-luap as creator/lead maintainer (748238e)
- require screenshots for UI changes in PRs (f5b4aa7)
- require screenshots for UI changes in PRs (8ca7477)
- slideshow: add Live Slideshow guide + README entries (16013d1)
3.44.0 (2026-05-27)
Features
- api/v1: accept category_id on POST /events/:id/photos (2d5a2ad)
- api/v1: accept category_id on POST /events/:id/photos (6901e26)
- branding: Customer dashboard header toggles in Branding page (b252cb6)
- branding: toggle login-page logo frame + size (75e41eb)
- clients: scaffold top-level Clients section with sub-nav around Accounts (9091ed4)
- customer accounts (#354) — recurring logins, profile, password reset, branded customer surface (fe52953)
- customers: "Manage galleries" dialog on customer detail page (6d1af7a)
- customers: "Manage galleries" dialog with immediate access revocation + section reorder + portal-flag revert (9be9296)
- customers: customer portal (#354) on top of feature-flags reorg (087ef45)
- customers: email customer when admin adds new gallery access (c02c947)
- customers: replace-assignments endpoint for a single customer (5377b88)
- downloads: preserve original camera filenames on download (opt-in) (#493) (826e43e)
- downloads: preserve original camera filenames on download (opt-in) (#493) (7eeef2b)
- email-templates: categorise + link to feature flags (84c06af)
- email-templates: categorise + sub-categorise + link to feature flags (2cae3fe)
- email-templates: group Templates UI by category + Feature off chip (5ec26fc)
- email-templates: group Templates UI by category with core sub-sections (53eecb6)
- email-templates: seed missing locale translations + post-075 templates (e3150e4)
- email-templates: seed missing nl/pt/ru/fr translations (358f7ee)
- events: default Guest Feedback ON via admin setting (#520) (3465b55)
- footer: hideable legal links + socials + promo banner (#441 + #440) (f3505c2)
- footer: hideable legal links + socials + promo banner (#441 + #440) (3a731e7)
- gallery: revoke customer-minted JWTs when assignment is removed (55a5846)
- i18n: add Spanish (es) locale (#510) (061712e)
- install: skip legacy chain when modern bootstrap fingerprint detected (#530) (8f0108c)
- lightbox: medium-resolution preview tier (#492) (3083c74)
- lightbox: medium-resolution preview tier (#492) (61f1d13)
- lightbox: multi-photo Web Share save-to-Photos on iOS (#557) (d5823c7)
- lightbox: save photo to Photos app on mobile via Web Share (#531) (b2bbf7e)
- lightbox: surface original camera filenames (#508) (33de294)
- localization: add French translations for fit options in thumbnails (2c12885)
- localization: add i18next configuration and CLI commands for localization management (74e87b9)
- localization: add i18next extraction helper & refactor backup configuration component to tsx (e7228b0)
- localization: add missing translations (86ee6c8)
- localization: improve English translations for clarity and consistency (46b99c6)
- localization: update thumbnail settings and add fit options translations (5fc427c)
- og: per-event opt-in to use hero photo as social-share preview (#474) (d856340)
- og: per-event opt-in to use hero photo as social-share preview (#474) (0bc7e2a)
- settings: Features tab + sidebar reorg with feature-flag gating (c3798e1)
- settings: Features tab + sidebar reorg with feature-flag gating (15e3336)
- translations: add French language support and improve localization handling (a5db4bd)
Bug Fixes
- activity-log: smart feature_flags_updated rendering + 33 missing activity types (4703fd5)
- activity-log: smart feature_flags_updated rendering + 33 missing types (fad2de5)
- admin-users: normalise date fields to ISO across DB drivers (#485) (d300426)
- admin-users: normalise date fields to ISO across DB drivers (#485) (b6b58d0)
- admin: test email always sends, regardless of update availability (#418) (9326a42)
- admin: test email always sends, regardless of update availability (#418) (c2b1854)
- api/v1: accept color_theme + create feedback row on event create (#550) (7ef0e40)
- api/v1: accept color_theme + create feedback row on event create (#550) (1b521e7)
- api/v1: scope category lookup to event_owned or global (92bb9e1)
- auth: default COOKIE_SECURE to 'auto' in production + first-install UX (#427) (e1c9382)
- auth: default COOKIE_SECURE to 'auto' in production + first-install UX (#427) (5c7de96)
- auth: restore COOKIE_SECURE='auto' default for production (adfa29e)
- brand-title: runtime substitution so GHCR-image users can override (#521 follow-up) (efa6b4a)
- branding: socials + promo round-trip from DB to form (#460) (bd2288e)
- branding: socials + promo round-trip from DB to form (#460) (ae64a6a)
- bug-batch-518: lightbox comments toggle + further fixes (633a2ae)
- categories: strip diacritics from auto-generated slugs (a747eb3)
- categories: strip diacritics from auto-generated slugs (848430e)
- ci: pin TRIVY_PLATFORM per matrix arch (post-#477 follow-up) (6750f5d)
- ci: pin TRIVY_PLATFORM per matrix arch (post-#477 follow-up) (c3256dc)
- ci: scan multi-arch images per-arch by digest, pin trivy-action (#476) (1144e9d)
- ci: scan multi-arch images per-arch by digest, pin trivy-action (#476) (caf0d61)
- ci: trivy-action tag is v0.36.0 (was 0.28.0 — does not exist) (40e176c)
- create-event: branding-default theme survives eventTypes refetch (d62c529)
- create-event: branding-default theme survives eventTypes refetch (#323-B) (37d487d)
- create-event: re-apply Branding theme on stale→fresh settings (#323-B) (401abf7)
- customer-portal: post-merge fixes for event save, theme fonts, and customer→gallery handoff (9776d8a)
- customer-routes: Cache-Control: no-store on customer endpoints (#470) (3122dd0)
- customer: customer sidebar active state matches admin pattern (8d9d0be)
- customer: don't log customer out on transient session-refresh errors (9e418c7)
- customer: preserve slug-scoped gallery tokens on auth provider mount (7ac1d14)
- customer: unwrap /customer/* from RequireFeature gate (da08a58)
- downloads: apply original-filename toggle to individual downloads too (#507) (38343e6)
- email-templates: backfill subcategory + customer password reset translations (2343a16)
- email: parse JSON-encoded language setting before using as locale (ebc7da2)
- email: parse JSON-encoded language setting before using as locale (f12062f)
- event: correct updating client access (d00f6fa)
- event: ensure client share token is generated only when necessary (916580a)
- events: admins can clear expiration on edit even when 'Require expiration' is ON (#426) (3fd8af3)
- events: admins can clear expiration on edit even when "Require expiration" is ON (#426) (e544561)
- events: clamp page state when totalPages drops below current page (#442) (b4e30a4)
- events: clamp page state when totalPages drops below current page (#442) (9c4a96f)
- events: CustomerAccountPicker hooks order crashed /admin/events/new (2a7ae07)
- events: preserve branding inheritance when saving events with null color_theme (d5a37df)
- events: strip customer_account_ids from update spread (dde72a1)
- events: TDZ ReferenceError on /admin/events from #442 fix (#454) (2f63188)
- events: typed-DELETE confirmation for bulk delete (#417) (e165ee5)
- events: typed-DELETE confirmation for bulk delete (#417) (99e420b)
- external-media: pre-generate thumbnails so reference-mode galleries load fast (#423) (e2ffd9f)
- external-media: pre-generate thumbnails so reference-mode galleries load fast (#423) (f3d0f16)
- features-tab: icon tiles + preview pills follow CI accent (15d01f3)
- features: customer-portal card uses 'Clients' to match sidebar wording (441cc41)
- features: customer-portal card uses 'Clients' to match sidebar wording (dec2f5d)
- feedback: three guest-mode bugs from #538 (filter, like state, count leak) (c900be9)
- feedback: three guest-mode bugs reported in #538 (5311588)
- gallery: hide Like button when guest feedback is off (#506) (9d2db9a)
- gallery: serve thumbnails / photos / hero via storage abstraction (#432) (d3007b0)
- gallery: serve thumbnails / photos / hero via storage abstraction (#432) (83d79f4)
- header: hide language name on mobile to free the title (#523) (4b4ecfd)
- i18n: drive customer "Preferred language" select from SUPPORTED_LANGUAGES (#510) (51890e1)
- i18n: settings page resets UI language to server default (482e91b)
- import: capture photo dimensions in fileWatcher + s3AutoImporter (#447) (5b14854)
- import: capture photo dimensions in fileWatcher + s3AutoImporter (#447) (936a277)
- install: defer events.hero_photo_id FK to break circular reference (#484) (62b3ed6)
- install: defer events.hero_photo_id FK to break circular reference (#484) (87834a7)
- install: drop racy migration step + add missing frontend container (#484) (d4155c4)
- install: self-chowning entrypoint kills fresh-install restart loop (#484) (42c5cda)
- install: self-chowning entrypoint kills fresh-install restart loop (#484) (1505775)
- install: silence clean-install postgres log noise (#484) (99e60a2)
- install: silence clean-install postgres log noise (#484) (86b33d4)
- install: silence pg healthcheck noise + drop legacy workers container (#484) (d39406b)
- install: silence pg healthcheck noise + drop legacy workers container (#484) (0b0b1bb)
- install: skip legacy chain on recovery-state DBs + schema-drift CI (#530) (a0ebc97)
- lightbox+events: Android download lag, multi-photo Web Share re-land, theme branding inheritance (e016f51)
- lightbox: align swipe-neighbour height + stop black flash on commit (#505) (d2d5509)
- lightbox: eliminate download lag on Android by skipping the blob round-trip (0479521)
- lightbox: fill the heart icon when liked (#538 follow-up) (3e39112)
- lightbox: fill the heart icon when liked (#538 follow-up) (600c29d)
- lightbox: hide comments toggle when allow_comments=false (#518) (d44e1ad)
- lightbox: pan zoomed image with single-finger touch on mobile (#532) (53139b8)
- lightbox: restrict Web Share save-to-Photos path to iOS (#554) (578397b)
- lightbox: restrict Web Share save-to-Photos path to iOS (#554) (2a309c7)
- nginx: honour outer X-Forwarded-Proto when behind a reverse proxy (#547) (b351d17)
- nginx: honour outer X-Forwarded-Proto when behind a reverse proxy (#547) (5488de3)
- og: brandable static title + wider crawler UA coverage (#521) (b960639)
- promo-banner: center by default + admin alignment selector (#482) (d1034ce)
- promo-banner: center by default + admin alignment selector (#482) (a803491)
- public-site: honor dark theme surface colors (8b72721)
- recover three orphaned commits from #527 (BRAND_TITLE runtime, Web Share, pan zoom) (9607b46)
- security: scan triage cleanup — drop dead deps, harden Docker/nginx/postMessage (7abfeb9)
- security: scan triage cleanup — drop dead deps, harden Docker/nginx/postMessage (6b6191a)
- server: drop missing requireCustomerPortal middleware import (4fa7225)
- server: mount /api/admin/feature-flags route (f048011)
- settings page resets UI language to server default (165ebce)
- settings: neutralize sidebar icons for a consistent palette (2f00bbd)
- settings: readable contrast on accent-tinted icon tiles + pills (bf7ef14)
- theme: 'Same as body' heading font no longer inherits stale value (35f5b86)
- upload: restore configurable batch-size for reverse proxies (#509) (98f3c3d)
- upload: wire drag-and-drop on admin + user upload zones (#504) (577c4bd)
Reverts
- customer-portal: make the global flag UI-only, drop the kill-switch middleware (3f44193)
Documentation
- contributing: update branch reference from main to beta (ed37caf)
- contributing: update branch reference from main to beta (c114749)
- localization: enhance French language support and improve i18next configuration (d1bc5e0)
3.43.1 (2026-05-07)
Bug Fixes
- security: backport 18 dependency CVE patches from beta (3.42.2 stable) (74eacbc)
- security: patch 18 dependency CVEs (axios + transitives + nodemailer + i18next-http-backend) (37bf894)
3.43.0 (2026-05-07)
Features
- add admin dark mode and SEO/robots.txt settings (9c2a0d2)
- add bulk category editing for photos (#157) (eca36c7)
- add category hero/cover photo selection (#163) (6c30e2c)
- add configurable upload batch size for reverse proxy compatibility (#208) (02a46e0)
- add COOKIE_SECURE=auto for mixed HTTPS/HTTP deployments (#298) (b1dfbe4)
- add COOKIE_SECURE=auto for mixed HTTPS/HTTP deployments (#298) (15a8ab4)
- add customizable event types with admin management (f8881d5)
- add Dutch (nl) locale and fix missing translation keys across all locales (b54a80d)
- add Dutch locale and fix missing translation keys (e32da68)
- add Gallery Premium and Gallery Story layouts (Beta) (e179def)
- add hero image focal point picker with anchor positioning (#162) (734868a)
- add justified layout modes and aspect-ratio-aware mosaic (#146) (608bbd5)
- Add justified layout modes and aspect-ratio-aware mosaic (#146) (ef2ae00)
- add justified/rows layout mode to masonry gallery (#146) (e081b56)
- add justified/rows layout mode to masonry gallery (#146) + security fixes (cd1d504)
- add optional event date and expiration settings (3079eaa)
- add optional event date and expiration settings (2151147), closes #118
- add original filename preservation and Lightroom export support (a59f414)
- add original filename preservation and Lightroom export support (9872ad3)
- add per-event custom logo upload with bug fixes (85170b8)
- add per-event hero logo customization options (0790a1d)
- add per-gallery thumbnail scale setting (#172) (#251) (ee46088)
- add photo cap per event and Portuguese (pt-BR) locale (1fa222e)
- add photo cap per event and Portuguese locale (088de43)
- add quilted layout, fix mosaic, and backfill photo dimensions (#146) (46ed1bc)
- add thumbnail settings UI to admin panel (3a30fea)
- add thumbnail settings UI to admin settings page (#206) (7d6d2f5)
- add update instructions dialog, email notifications, and capture date sorting (50c0990), closes #181
- add visual WYSIWYG email template editor (#229) (04a7ea8)
- branding: 8-token CI palette + force color mode + dark-mode consistency (8050927)
- branding: force color mode (dark or light) site-wide (5a162fc)
- branding: inline force color mode with auto-save + clearer palette help text (67d7d8d)
- branding: per-family generic fallback via meta.json (dcff451)
- branding: preview each font in its own face in the picker dropdown (b4f9b65)
- branding: self-hosted webfonts with filesystem scanner (d04bf28)
- branding: self-hosted webfonts with filesystem scanner (bac51fe)
- cms: add external URL toggle for imprint and privacy pages (b2c8161)
- cms: add per-page external URL override — backend (66423bb)
- cms: admin UI for external imprint/privacy URL (a4e3d10)
- cms: redirect legal links to external URL when configured (c5bba50)
- configurable upload batch size for reverse proxy compatibility (9b7495e)
- configurable upload batch size for reverse proxy compatibility (4243363)
- customisable 404 + gallery-not-found pages via CMS (#324) (4f77905)
- decouple hero header from gallery layouts (#158) (7b8d8bd)
- draft mode, admin branding, and workflow improvements (dc98206)
- draft mode, admin branding, and workflow improvements (40332a7)
- dynamic website title from branding settings (d29aab7)
- email: expand email palette to 8 tokens + Sync from Branding button (47b6b39)
- events: add Photos column to admin events list (#384) (d561db8)
- events: add Photos column to admin events list (#384) (ffb4318)
- events: bulk delete with password confirmation (#384) (647aea2)
- events: bulk delete with password confirmation (#384) (48d538f)
- events: prefill admin email + admin picker on event creation (3fe8e61)
- events: prefill admin email + admin picker on event creation (ee56b67)
- events: Sync from Branding button in gallery theme customizer + clarified default inheritance (bdbe7b8)
- events: tree view for external media folder picker (cdd40ac)
- events: tree view for external media folder picker (f927b09)
- frontend: dedupe /public/settings via shared usePublicSettings hook (#325) (3d4ae4d)
- gallery layouts, bulk category editing, and hero header improvements (7037106)
- gallery layouts, hero customization, bulk categories & event types (d9e00dc)
- gallery layouts, hero customization, event types, and UX improvements (#146, #155-163, #170, #171) (4280444)
- gallery: decouple header style from layout, add banner option (1f1a856)
- gallery: decouple header style from layout, add banner option (24d7277)
- gallery: decouple header style from layout, add banner option (aff29c9)
- gallery: icon-only menu, accent Download CTA (#386) (876b35b)
- gallery: icon-only menu, accent Download CTA, logo aligned (#386) (de8ad5f)
- guest selections with per-person identity (#292) (3856ba2)
- guest selections with per-person identity (#292) (ad4e5a7)
- i18n: add Brazilian Portuguese (pt-BR) locale (375f512)
- i18n: improve pt locale with pt-BR phrasings, remove duplicate pt-BR file (f25559c)
- improve gallery layouts with aspect-ratio-aware masonry and mosaic modes (#146) (aacfcd5)
- improve hero image UX and live preview (#163, #158) (d63f67a)
- multilingual email templates with translations table (8c5996e)
- multilingual email templates with translations table (f50d7c0)
- native multi-arch Docker images (Apple Silicon, ARM64 Linux) (df30618)
- native S3 storage backend (#328) + presigned download follow-up (1b717ce)
- new features and bug fixes for beta release (151e1bf)
- optional customer phone field gated by global toggle (#322) (be6cb28)
- original filename in admin UI, update dialog, and security hardening (3ea9d5b)
- original filename in admin UI, update dialog, security hardening, and bug fixes (bcf2745)
- outbound webhooks for event/photo lifecycle (#327) (c488f48)
- per-event custom logos, customizable event types, and multiple bug fixes (4c08160)
- photo visibility control with client access (#172) (4a93e4e)
- photo visibility control with client access (#172) (e1b6e43)
- pre-generate watermarks for instant lightbox loading (1be974a), closes #112
- pre-generated watermarks and mobile upload button improvements (c6fdd38)
- pre-zip download all and photo replacement by name (#312, #313) (d3f1206)
- pre-zip download all and photo replacement by name (#312, #313) (e18afd3)
- presigned download UI + S3 prefix walker auto-importer (follow-ups) (446d80a)
- public v1 API + token management + OpenAPI docs (#322) (808b15b)
- register Russian locale and add to language selector (6f95b8c)
- S3 storage + webhooks + settings dedupe + backup fixes (06d54be)
- show original filename in admin UI (#184) (0891be1)
- sort photos by capture date with configurable default sort (#283) (8805fa5)
- sort photos by capture date with configurable default sort (#283) (633d4a0)
- support Apple Silicon natively via multi-arch images (c282a72)
- theme: expand color settings to 8-token CI palette + alt button (114aab5)
- upload: async photo processing — backend (PR-B part 1) (851744c)
- upload: async photo processing — frontend (PR-B part 2) (3b827b8)
- upload: async photo processing + fix(auth): /auth/session symmetry (loop fix) (907bcf1)
- upload: two-state UI + temp dir cleanup (PR-A of async processing) (86dfcc4)
- visual WYSIWYG email template editor (703c03f)
- warn about low thumbnail resolution when selecting beta themes (ee3f6ae)
- warn about low thumbnail resolution with beta themes (aef9b4e)
- webhooks: enrich event.* payloads with customer contact + share_token (#341) (7ea4801)
- webhooks: enrich event.* payloads with customer contact + share_token (#341) (1e69d5f)
Bug Fixes
- add allow_user_uploads to gallery API responses (691e3ab)
- add lightbox loading spinner and watermark cache invalidation (050ed37)
- add STORAGE_PATH to production docker-compose (cdda709)
- address beta feedback - gallery layout fixes, Russian locale, email logo (#249) (486239a)
- address bugs and feature requests from discussion #317 (6cfff6f)
- address Shannon security assessment findings (37 vulnerabilities) (#254) (23cd9cb)
- admin photo feedback filters have no effect (#293) (9ed8a2b)
- admin: tab underlines use accent (not accent-dark) for proper highlight color (565ae45)
- apply password change fix to regular modal + longer toast delay (#263) (c63bc47)
- apply password change redirect fix to regular modal too (#263) (147dc28)
- apply sort direction in gallery and respect show_feedback_to_guests (#302, #303) (3716ff5)
- apply sort direction in gallery view and respect show_feedback_to_guests (#302, #303) (dffe057)
- auth: /auth/session must enforce session timeout symmetrically (#350 recurrence) (c8e09c2)
- auth: /auth/session must enforce session timeout symmetrically (#350 recurrence) (b106da1)
- auth: /auth/session must reject tokens that adminAuth/galleryAuth would reject (f905f7e)
- auth: /auth/session must verify issuer claim like adminAuth (#350) (83dedbc)
- auth: make /auth/session verify the issuer claim like adminAuth (#350) (88a6c6a)
- backup: cron schedule mapping + manifest format detection + bigint coerce (ab4095f)
- backup: incremental backups against S3 + jsonb stats parsing (e232f9f)
- branding: admin sidebar uses accent-dark, primary buttons follow CI token (fc2bce3)
- branding: comprehensive sweep — replace remaining primary-* legacy colors with accent tokens (578a174)
- branding: selected-state accent colors, force-mode actually flips galleries, compact color picker layout (5b410ed)
- branding: working tooltips, high-contrast selected states, gallery chrome follows accent (b19bb0c)
- checkbox and toggle settings not persisting after page refresh (808ed1d), closes #117
- cms: apply dark mode to CMS editor, public CMS, and admin modals (d2a10f6)
- cms: nl/pt/ru i18n + gate external_url in public response (08d0462)
- cms: nl/pt/ru i18n + gate external_url in public response (bce5c1f)
- correct invitation activation validation and add missing translations (991aa98), closes #129
- correct invitation email link URL path (86fa104), closes #129
- correct storage path resolution in multiple files (#96) (0e3674b)
- correct storage path resolution in multiple files (#96) (3ccb815)
- database migration restart bug, lightbox loading spinner, and watermark cache invalidation (7c58749)
- dedupe parallel admin 401 redirects to /admin/login (038e84c)
- discussion #317 issues and #318 archive crash (2f2f405)
- display welcome message in gallery and fix guest thumbnail URLs (#306, #307) (b05c36a)
- display welcome message in gallery and fix guest thumbnail URLs (#306, #307) (9323bef)
- docker compose v2 syntax and add missing ADMIN_PASSWORD to .env.example (#189) (0817443)
- docker: install system ffmpeg on Alpine, drop broken bundled binary (3ab8a64)
- docker: install system ffmpeg on Alpine, drop broken bundled binary (96818c7)
- dynamic website title from branding settings (4701edc)
- email: render conditionals, localise password placeholders, fix caller/template variable drift (0767203)
- email: render conditionals, localise password placeholders, fix caller/template variable drift (e8052ad)
- event-specific custom CSS settings not being saved (dadef81), closes #136
- events search/counters (#346), lazy gallery skeleton (#321), smooth lightbox swipe (#348) (6229b38)
- events without expiration date incorrectly shown as expired (c4f16eb)
- events: admin-set password on reset, full-URL gallery_link in all emails (0d1f82d)
- events: admin-set password on reset, full-URL gallery_link in all emails (ff50c74)
- events: coerce expires_in_days to Number before addDays (e5712d8)
- events: coerce expires_in_days to Number before addDays (db29d0e)
- events: match scrollbar to theme in external folder tree picker (bd42ee1)
- events: server-side search/pagination to remove first-100 cap (#346) (a5b20ca)
- events: show customer phone in event details view (#331) (4c73d22)
- events: stop mapping branding_logo_position onto hero_logo_position (af2b062)
- events: stop mapping branding_logo_position onto hero_logo_position (ef1c875)
- external media dimensions, theme race condition, email color customization (dfae2c2)
- floor password_changed_at when comparing against JWT iat (793e410)
- fonts: drop immutable Cache-Control to allow font replacement rollout (5703fcb)
- gallery: default controls to inline for every layout (045e9ea)
- gallery: lazy-render skeleton grid for fast loads (#321 follow-up) (d9d8137)
- gallery: preserve sidebar controlsStyle on banner migration (05dadff)
- gallery: single-finger swipe nav in mobile lightbox (#332) (4c8eba0)
- gallery: use ref for swipe-start to avoid stale-closure miss (#332) (fcddfe0)
- gallery: WCAG-safe Download button text + extract HeaderDownloadButton (#401 follow-ups) (04e928d)
- gallery: WCAG-safe Download button text + extract HeaderDownloadButton (#401 follow-ups) (0c80abd)
- guest feedback flow bugs in Masonry grid and PhotoLightbox (#292) (54badef)
- guest feedback flow bugs in Masonry grid and PhotoLightbox (#292) (77f07e9)
- handle null dates in dashboard and gallery pages (c5a8ffc)
- hero header state and preview in admin theme editor (#158) (f554f46)
- improve ghost button visibility in admin dark mode (4912e2b)
- improve password validation errors and event list UX (#170, #171) (171abb3)
- improve photo serving, category filters, and upload chunking (#155, #156, #161) (fa4c838)
- increase upload limit to 1GB and fix category filters (#155, #156) (397d33a)
- issue #203 file type validation + security CVE fixes (8017171)
- lightbox: mobile toolbar clipping + iOS safe-area + viewport-fit (#336) (42a7ae4)
- lightbox: smooth carousel swipe + drop instructional hint (#348) (743086d)
- mobile lightbox + share previews + customer phone bug triage (1e40677)
- mobile upload button not visible in gallery (#113) (cacaffa)
- mobile upload button visibility in gallery (2a2c23d), closes #113
- mobile upload button visibility in gallery (df7dbff), closes #113
- mobile upload button visibility in gallery (#113) (05a5307)
- mobile upload button visibility in gallery (#113) (6cb4342)
- nginx: proxy /fonts requests to backend (e6c03e4)
- pin npm to v10 in backend Dockerfile (ddefd3a)
- pin npm upgrade to v10 in backend Dockerfile (978e447)
- prevent backend crash on archive when admin_email is null (#318) (e4b0f96)
- prevent database migration restart failures (83a4344), closes #107
- remove non-functional watermark toggle from Feature Toggles (d4a15db)
- render minimal/none header styles, cap hero height, switch category hero images (#158, #162, #163) (bc6c48b)
- resend gallery email fails for events without password (6b3ead7), closes #137
- resolve admin invitation flow issues and improve STORAGE_PATH documentation (41bf6ff)
- resolve code quality issues and add missing i18n keys (#162, #163) (329d224)
- resolve code scanning security alerts (multer, tar, Node 22) (85a07fc)
- resolve external media dimensions, gallery theme race condition, and add email color customization (bbeedd1)
- resolve issues #194, #195, #196, #197 (33af088)
- resolve issues #194, #195, #196, #197 (5ea4ef3)
- resolve issues #194, #195, #196, #197 (33483cf)
- resolve issues #194, #195, #196, #197 (cd00bc1)
- resolve JWT iat timing issue in password change (#263) (c031b1e)
- resolve mixed light/dark mode styling in admin UI (#175) (f8c8abd)
- resolve password change redirect loop (#263) and file watcher crash (#269) (b23c51b)
- resolve password change redirect loop and file watcher crash (835bdf5), closes #269
- resolve redirect loop after mandatory password change (#263) (07fc5e6)
- resolve redirect loop after mandatory password change (#263) (3c8d344)
- respect allowed_file_types setting for upload validation (#203) (fe07a14)
- respect optional email settings in event creation (831ea6a)
- respect optional email settings in event creation (#217) (9c44a0e)
- restore aspect-ratio layouts and improve hero image quality (#180) (3974ba5)
- restore aspect-ratio layouts and improve hero image quality (#180) (5cef7fd)
- revert /api prefix in adminPhotos.js to avoid double-prefix (094276d)
- revert /api prefix in adminPhotos.js to avoid double-prefix (#307) (ceb2a09)
- security: invalidate tokens on password change, enforce session timeout, fix role update (85a60a2)
- security: invalidate tokens on password change, enforce session timeout, fix role update (f362239)
- security: resolve all npm audit vulnerabilities (4272618)
- security: resolve Docker image CVEs for code scanning alerts (cbecb93)
- security: token invalidation on password change, session timeout enforcement (0a3a537)
- security: token invalidation on password change, session timeout enforcement (7ca9631)
- set JWT iat after password_changed_at to prevent token rejection (#263) (b1d1667)
- share: OG/Twitter-card metadata for gallery share URLs (#333) (5275621)
- shorten Save button label on email template editor (7250c42)
- show upload button in mobile topbar instead of sidebar (ae181cf), closes #113
- sync backend package-lock.json for security deps (bb81fa5)
- sync backend package-lock.json with security dep updates (03e1989)
- sync header_style DB column with theme editor selections (#158) (2288309)
- sync header_style DB column with theme editor selections (#158) (a19e7c4)
- theme picker buttons no longer submit the parent form (#326) (2eead52)
- theme save without Live Preview, Branding default on new events, gallery loading flicker (#323, #321) (822be9a)
- theme-preset match loop ignores extra fields like logoUrl (#323) (b63a877)
- theme: centralise force-mode enforcement inside ThemeContext so every gallery flips (21188f4)
- theme: kill initial white frame + theme-aware skeleton tiles (#358 follow-up) (f529c9e)
- theme: kill initial white frame + theme-aware skeleton tiles (#358 follow-up) (1a530ae)
- theme: pre-React bootstrap to kill white-flash on dark galleries (#358) (07b41e6)
- theme: pre-React bootstrap to kill white-flash on dark galleries (#358) (f81a872)
- update dependencies to resolve code scanning security alerts (1f524f2)
- update docker-compose to docker compose and add ADMIN_PASSWORD to .env.example (#189) (a4c6248)
- update packages to fix security vulnerabilities (8097a0c)
- update security policy with private reporting channels (308e086)
- update security policy with private reporting channels (7f77362)
- update security policy with proper contact email and private reporting (67b0f32), closes #223
- use actual photo aspect ratios in masonry columns mode (#146) (8711f96)
- use CSS Columns for gap-free mosaic layout (#146) (821d329)
- use photo dimensions for mosaic aspect ratios (#146) (27ff51e)
- video upload media type, select all, and dimension repair (#203, #220, #180) (fc75bcd)
- video upload, select all, and dimension repair (#203, #220, #180) (a0bb080)
- wire admin photo feedback filters into grid query (#293) (d4b4dc6)
- wrap email preview with full styled header/footer template (9a6d2e8)
- wrap email preview with full styled header/footer template (fc0911a), closes #229
- wrap test email with standard email template (#252) (954a011)
Reverts
- branding: per-option font preview (defer to follow-up) (f410207)
Documentation
- add API_URL environment variable to .env.example files (3e69579)
- add Buy Me a Coffee badge + Support section (46bc894)
- add External Media Library section to deployment guide (#270) (2e1c71c)
- add External Media Library section to deployment guide (#270) (f6ca713)
- clarify file system photo import requires existing event (#269) (5295516)
- clarify file system photo import requires existing event (#269) (ee0baaf)
- emphasize importance of STORAGE_PATH in env example (3397807)
- fonts: cache rollout, stale-list note, meta.json (bd0e052)
- move documentation to docs.picpeak.app, drop in-repo copies (02ed5d4)
- move documentation to docs.picpeak.app, drop in-repo copies (0faf9b3)
- readme: add Contributors section with @Luca-Timo and @Rekoo-PS (c60ab74)
- readme: add Contributors section with @Luca-Timo and @Rekoo-PS (dbe0a30)
- rewrite README — shorter, cleaner (62643f2)
- rewrite README — shorter, cleaner, less AI-sounding (64f6061)
3.42.1 (2026-05-07)
Stable release promoting the entire beta channel to main. Brings ~300 commits of features, fixes, and infrastructure improvements that have been baked on the beta channel since v2.6.5. Highlights below; full per-version notes follow in the beta history.
Major themes since v2.6.5
- Multi-administrator support with RBAC — super admin / admin / editor roles, fine-grained permissions
- Async upload pipeline — bytes-on-wire returns 202; sharp/ffmpeg/EXIF/watermark/webhooks happen in a background worker pool
- Self-hosted webfonts — filesystem-driven scanner, GDPR-compliant, replaces Google Fonts CDN
- 8-token CI palette + force color mode — full theme customization across admin and public site
- Native multi-arch Docker images — Apple Silicon and ARM64 Linux supported natively
- Native S3 storage backend — S3 + S3-compatible providers
- Comprehensive video support — upload, stream, and play MP4/WebM/MOV alongside photos
- Outbound webhooks — event/photo lifecycle push API with HMAC signatures
- Gallery layout system — decoupled header style from layout, banner option, theme-aware skeletons, and lazy-loaded folder picker
- Multilingual email templates — translations table for EN/DE/NL/PT/RU
- Bulk operations — bulk delete with password confirmation, bulk archive
- Photo dimensions backfill — true masonry layout with portrait/landscape sizing
- Customer client access — separate review/visibility area before the gallery is shared with guests
- Image security — devtools detection, watermarking, right-click prevention, secure thumbnails
Bug fixes (highlights from beta)
/auth/sessionsymmetry fixes for the admin-login redirect-loop family (#350, #355, #363, #398)- Email template renderer: handle
{{#if}}conditionals, fix CSS leak in plain-text fallback, gate publish-from-draft password placeholder, gateexternal_urlin public response - Customer email caller/template variable drift across gallery_created, expiration_warning, archive_complete, gallery_expired
- Full-URL
gallery_linkin all email types (was path-only in 3 sites) - ffmpeg/ffprobe installed via apk for Alpine compatibility (was glibc-bundled binary)
- Theme-aware skeleton tiles, dark theme white-flash on first paint
- Admin events search and counters not bounded to first 100 records (#346)
- Login redirect loop with stale admin cookies (#350) — three rounds of asymmetry fixes
3.42.1-beta.0 (2026-05-07)
Bug Fixes
- gallery: WCAG-safe Download button text + extract HeaderDownloadButton (#401 follow-ups) (04e928d)
- gallery: WCAG-safe Download button text + extract HeaderDownloadButton (#401 follow-ups) (0c80abd)
3.42.0-beta.0 (2026-05-07)
Features
3.41.0-beta.0 (2026-05-06)
Features
- branding: 8-token CI palette + force color mode + dark-mode consistency (8050927)
- branding: force color mode (dark or light) site-wide (5a162fc)
- branding: inline force color mode with auto-save + clearer palette help text (67d7d8d)
- email: expand email palette to 8 tokens + Sync from Branding button (47b6b39)
- events: Sync from Branding button in gallery theme customizer + clarified default inheritance (bdbe7b8)
- i18n: add Brazilian Portuguese (pt-BR) locale (375f512)
- i18n: improve pt locale with pt-BR phrasings, remove duplicate pt-BR file (f25559c)
- theme: expand color settings to 8-token CI palette + alt button (114aab5)
Bug Fixes
- admin: tab underlines use accent (not accent-dark) for proper highlight color (565ae45)
- branding: admin sidebar uses accent-dark, primary buttons follow CI token (fc2bce3)
- branding: comprehensive sweep — replace remaining primary-* legacy colors with accent tokens (578a174)
- branding: selected-state accent colors, force-mode actually flips galleries, compact color picker layout (5b410ed)
- branding: working tooltips, high-contrast selected states, gallery chrome follows accent (b19bb0c)
- cms: apply dark mode to CMS editor, public CMS, and admin modals (d2a10f6)
- theme: centralise force-mode enforcement inside ThemeContext so every gallery flips (21188f4)
3.40.1-beta.0 (2026-05-04)
Bug Fixes
- auth: /auth/session must enforce session timeout symmetrically (#350 recurrence) (c8e09c2)
- auth: /auth/session must enforce session timeout symmetrically (#350 recurrence) (b106da1)
3.40.0-beta.0 (2026-05-04)
Features
- branding: per-family generic fallback via meta.json (dcff451)
- branding: self-hosted webfonts with filesystem scanner (d04bf28)
Bug Fixes
- fonts: drop immutable Cache-Control to allow font replacement rollout (5703fcb)
Documentation
- fonts: cache rollout, stale-list note, meta.json (bd0e052)
3.39.1-beta.0 (2026-05-04)
Documentation
- readme: add Contributors section with @Luca-Timo and @Rekoo-PS (c60ab74)
- readme: add Contributors section with @Luca-Timo and @Rekoo-PS (dbe0a30)
3.39.0-beta.0 (2026-05-04)
Features
- gallery: decouple header style from layout, add banner option (1f1a856)
3.38.0-beta.0 (2026-05-04)
Features
3.37.0-beta.0 (2026-05-04)
Features
- events: add Photos column to admin events list (#384) (d561db8)
- events: add Photos column to admin events list (#384) (ffb4318)
3.36.0-beta.0 (2026-05-04)
Features
- events: prefill admin email + admin picker on event creation (3fe8e61)
3.35.0-beta.0 (2026-05-04)
Features
- events: tree view for external media folder picker (cdd40ac)
- events: tree view for external media folder picker (f927b09)
Bug Fixes
- events: match scrollbar to theme in external folder tree picker (bd42ee1)
3.34.2-beta.0 (2026-05-04)
Bug Fixes
- docker: install system ffmpeg on Alpine, drop broken bundled binary (3ab8a64)
- docker: install system ffmpeg on Alpine, drop broken bundled binary (96818c7)
3.34.1-beta.0 (2026-05-03)
Bug Fixes
- cms: nl/pt/ru i18n + gate external_url in public response (08d0462)
- cms: nl/pt/ru i18n + gate external_url in public response (bce5c1f)
3.34.0-beta.0 (2026-05-03)
Features
- cms: add external URL toggle for imprint and privacy pages (b2c8161)
- cms: add per-page external URL override — backend (66423bb)
- cms: admin UI for external imprint/privacy URL (a4e3d10)
- cms: redirect legal links to external URL when configured (c5bba50)
3.33.2-beta.0 (2026-05-03)
Bug Fixes
- events: admin-set password on reset, full-URL gallery_link in all emails (0d1f82d)
- events: admin-set password on reset, full-URL gallery_link in all emails (ff50c74)
3.33.1-beta.0 (2026-05-03)
Bug Fixes
- email: render conditionals, localise password placeholders, fix caller/template variable drift (0767203)
- email: render conditionals, localise password placeholders, fix caller/template variable drift (e8052ad)
3.33.0-beta.0 (2026-05-02)
Features
- native multi-arch Docker images (Apple Silicon, ARM64 Linux) (df30618)
3.32.5-beta.0 (2026-05-02)
Bug Fixes
- theme: kill initial white frame + theme-aware skeleton tiles (#358 follow-up) (f529c9e)
- theme: kill initial white frame + theme-aware skeleton tiles (#358 follow-up) (1a530ae)
3.32.4-beta.0 (2026-05-01)
Bug Fixes
- events: stop mapping branding_logo_position onto hero_logo_position (af2b062)
- events: stop mapping branding_logo_position onto hero_logo_position (ef1c875)
- theme: pre-React bootstrap to kill white-flash on dark galleries (#358) (07b41e6)
- theme: pre-React bootstrap to kill white-flash on dark galleries (#358) (f81a872)
3.32.3-beta.0 (2026-05-01)
Bug Fixes
- auth: /auth/session must verify issuer claim like adminAuth (#350) (83dedbc)
- auth: make /auth/session verify the issuer claim like adminAuth (#350) (88a6c6a)
- events: coerce expires_in_days to Number before addDays (e5712d8)
- events: coerce expires_in_days to Number before addDays (db29d0e)
3.32.2-beta.0 (2026-05-01)
Bug Fixes
- events search/counters (#346), lazy gallery skeleton (#321), smooth lightbox swipe (#348) (6229b38)
- events: server-side search/pagination to remove first-100 cap (#346) (a5b20ca)
- gallery: lazy-render skeleton grid for fast loads (#321 follow-up) (d9d8137)
- lightbox: smooth carousel swipe + drop instructional hint (#348) (743086d)
3.32.1-beta.0 (2026-04-30)
Documentation
- move documentation to docs.picpeak.app, drop in-repo copies (02ed5d4)
- move documentation to docs.picpeak.app, drop in-repo copies (0faf9b3)
3.32.0-beta.0 (2026-04-29)
Features
- webhooks: enrich event.* payloads with customer contact + share_token (#341) (7ea4801)
- webhooks: enrich event.* payloads with customer contact + share_token (#341) (1e69d5f)
3.31.1-beta.0 (2026-04-28)
Bug Fixes
- events: show customer phone in event details view (#331) (4c73d22)
- gallery: single-finger swipe nav in mobile lightbox (#332) (4c8eba0)
- gallery: use ref for swipe-start to avoid stale-closure miss (#332) (fcddfe0)
- lightbox: mobile toolbar clipping + iOS safe-area + viewport-fit (#336) (42a7ae4)
- mobile lightbox + share previews + customer phone bug triage (1e40677)
- share: OG/Twitter-card metadata for gallery share URLs (#333) (5275621)
3.31.0-beta.0 (2026-04-28)
Features
- frontend: dedupe /public/settings via shared usePublicSettings hook (#325) (3d4ae4d)
- native S3 storage backend (#328) + presigned download follow-up (1b717ce)
- outbound webhooks for event/photo lifecycle (#327) (c488f48)
- presigned download UI + S3 prefix walker auto-importer (follow-ups) (446d80a)
- S3 storage + webhooks + settings dedupe + backup fixes (06d54be)
Bug Fixes
- backup: cron schedule mapping + manifest format detection + bigint coerce (ab4095f)
- backup: incremental backups against S3 + jsonb stats parsing (e232f9f)
3.30.0-beta.0 (2026-04-27)
Features
- customisable 404 + gallery-not-found pages via CMS (#324) (4f77905)
- optional customer phone field gated by global toggle (#322) (be6cb28)
- public v1 API + token management + OpenAPI docs (#322) (808b15b)
Bug Fixes
- dedupe parallel admin 401 redirects to /admin/login (038e84c)
- floor password_changed_at when comparing against JWT iat (793e410)
- theme picker buttons no longer submit the parent form (#326) (2eead52)
- theme save without Live Preview, Branding default on new events, gallery loading flicker (#323, #321) (822be9a)
- theme-preset match loop ignores extra fields like logoUrl (#323) (b63a877)
Documentation
- add Buy Me a Coffee badge + Support section (46bc894)
3.29.1-beta.0 (2026-04-26)
Bug Fixes
- address bugs and feature requests from discussion #317 (6cfff6f)
- discussion #317 issues and #318 archive crash (2f2f405)
- prevent backend crash on archive when admin_email is null (#318) (e4b0f96)
3.29.0-beta.0 (2026-04-23)
Features
- pre-zip download all and photo replacement by name (#312, #313) (d3f1206)
- pre-zip download all and photo replacement by name (#312, #313) (e18afd3)
3.28.3-beta.0 (2026-04-13)
Bug Fixes
- revert /api prefix in adminPhotos.js to avoid double-prefix (094276d)
- revert /api prefix in adminPhotos.js to avoid double-prefix (#307) (ceb2a09)
3.28.2-beta.0 (2026-04-12)
Bug Fixes
- display welcome message in gallery and fix guest thumbnail URLs (#306, #307) (b05c36a)
- display welcome message in gallery and fix guest thumbnail URLs (#306, #307) (9323bef)
3.28.1-beta.0 (2026-04-12)
Bug Fixes
- apply sort direction in gallery and respect show_feedback_to_guests (#302, #303) (3716ff5)
- apply sort direction in gallery view and respect show_feedback_to_guests (#302, #303) (dffe057)
3.28.0-beta.0 (2026-04-11)
Features
- add COOKIE_SECURE=auto for mixed HTTPS/HTTP deployments (#298) (b1dfbe4)
- add COOKIE_SECURE=auto for mixed HTTPS/HTTP deployments (#298) (15a8ab4)
Bug Fixes
- guest feedback flow bugs in Masonry grid and PhotoLightbox (#292) (54badef)
- guest feedback flow bugs in Masonry grid and PhotoLightbox (#292) (77f07e9)
3.27.0-beta.0 (2026-04-11)
Features
- add admin dark mode and SEO/robots.txt settings (9c2a0d2)
- add Apple Liquid Glass templates, image security settings, and automated releases (6033461)
- add bulk category editing for photos (#157) (eca36c7)
- add category hero/cover photo selection (#163) (6c30e2c)
- add configurable upload batch size for reverse proxy compatibility (#208) (02a46e0)
- Add CSS template system with custom gallery styling support (0da45e6)
- add customizable event types with admin management (f8881d5)
- add Dutch (nl) locale and fix missing translation keys across all locales (b54a80d)
- add Dutch locale and fix missing translation keys (e32da68)
- add event management, gallery customization, and release automationFeature/event rename (40ee671)
- add Gallery Premium and Gallery Story layouts (Beta) (e179def)
- add hero image focal point picker with anchor positioning (#162) (734868a)
- add justified layout modes and aspect-ratio-aware mosaic (#146) (608bbd5)
- Add justified layout modes and aspect-ratio-aware mosaic (#146) (ef2ae00)
- add justified/rows layout mode to masonry gallery (#146) (e081b56)
- add justified/rows layout mode to masonry gallery (#146) + security fixes (cd1d504)
- add multi-administrator support with RBAC and fix backup/restore for S3 (892e47d)
- add optional event date and expiration settings (3079eaa)
- add optional event date and expiration settings (2151147), closes #118
- add original filename preservation and Lightroom export support (a59f414)
- add original filename preservation and Lightroom export support (9872ad3)
- add per-event custom logo upload with bug fixes (85170b8)
- add per-event hero logo customization options (0790a1d)
- add per-gallery thumbnail scale setting (#172) (#251) (ee46088)
- add photo cap per event and Portuguese (pt-BR) locale (1fa222e)
- add photo cap per event and Portuguese locale (088de43)
- add quilted layout, fix mosaic, and backfill photo dimensions (#146) (46ed1bc)
- add thumbnail settings UI to admin panel (3a30fea)
- add thumbnail settings UI to admin settings page (#206) (7d6d2f5)
- add update instructions dialog, email notifications, and capture date sorting (50c0990), closes #181
- add visual WYSIWYG email template editor (#229) (04a7ea8)
- admin: refine header layout and logo placement (d64e7d0)
- allow admin email updates in UI (#36) (3c2a79a)
- beta/stable release channels with update notifications and bug fixes (3c7dc20)
- beta/stable release channels with update notifications and bug fixes (#98) (3c7dc20)
- configurable upload batch size for reverse proxy compatibility (9b7495e)
- configurable upload batch size for reverse proxy compatibility (4243363)
- decouple hero header from gallery layouts (#158) (7b8d8bd)
- docker: add PUID/PGID and user mapping to avoid bind mount permission issues; feat(setup): prompt for admin email interactively; docs: PUID/PGID in .env.example (410a33f)
- draft mode, admin branding, and workflow improvements (dc98206)
- draft mode, admin branding, and workflow improvements (40332a7)
- dynamic website title from branding settings (d29aab7)
- events: add CSS template selector to event edit page (6a6c2cd)
- gallery layouts, bulk category editing, and hero header improvements (7037106)
- gallery layouts, hero customization, bulk categories & event types (d9e00dc)
- gallery layouts, hero customization, event types, and UX improvements (#146, #155-163, #170, #171) (4280444)
- gallery/filters: add Rated and Commented filters (UI + backend).\n\n- UI: add star (Rated) and message (Commented) buttons to feedback filter bars (desktop + mobile)\n- Backend: support filter=rated, commented, and combinations via aggregate counts/queries (b03760a)
- gallery: add quick Like/Favorite actions on thumbnails across layouts (6368f10)
- gallery: always-visible feedback indicators on grid tiles; fallback image rendering in lightbox/hero; auto-auth from shared-link token; fix external photo resolver\n\n- GridGallery: bottom-left icons for like/rated/comment on every tile\n- Hero layout grid: added same indicators (non-intrusive icons)\n- Lightbox/Hero: add fallbackSrc to display thumbnail if original fails\n- GalleryAuth: auto-store token from /gallery/:slug/:token and hydrate event\n- Backend gallery photo route: use resolvePhotoFilePath for external-media\n\nfix(admin): move photo feedback badges to bottom-right on admin grid tiles\n\nfix(dashboard): add missing i18n keys for activity types + fallback to formatter\n\nfix(admin/feedback): correct thumbnail URL base + robust date parsing\n\nRefs: #19 (6948aaa)
- gallery: compact vertical icon-only feedback filter in PhotoFilterBar; remove wide buttons to prevent overflow\n\n- Desktop: vertical icon stack (All/Grid, Likes, Favorites) outside scroll area\n- Mobile: vertical icon stack below categories\n- Keeps existing category bar layout and count\n\nRefs: #19 (465f997)
- i18n: add translations for settings tabs (c030e87)
- implement 4 new features with bug fixes and refactoring plan (77a4bfd)
- implement beta/stable release channels with update notifications (617e778)
- improve gallery layouts with aspect-ratio-aware masonry and mosaic modes (#146) (aacfcd5)
- improve hero image UX and live preview (#163, #158) (d63f67a)
- lightbox: keep feedback usable while navigating (6368f10), closes #19
- Multi-administrator RBAC, CSS templates & security hardening (#78) (16b3ab0)
- multilingual email templates with translations table (8c5996e)
- multilingual email templates with translations table (f50d7c0)
- native: auto-serve SPA when dist exists (unless SERVE_FRONTEND=false); add clear logging; serve index.html for /admin (fb16b7b)
- native: build frontend and serve SPA from backend (SERVE_FRONTEND); fix Cannot GET /admin on native installs (9fe10bc)
- native: serve built frontend from backend; build frontend during install/update; ensure env flags (SERVE_FRONTEND, FRONTEND_DIR) (61ad2d6)
- new features and bug fixes for beta release (151e1bf)
- original filename in admin UI, update dialog, and security hardening (3ea9d5b)
- original filename in admin UI, update dialog, security hardening, and bug fixes (bcf2745)
- overhaul public landing page and backup tooling (2a4d388)
- per-event custom logos, customizable event types, and multiple bug fixes (4c08160)
- photo visibility control with client access (#172) (4a93e4e)
- photo visibility control with client access (#172) (e1b6e43)
- pre-generate watermarks for instant lightbox loading (1be974a), closes #112
- pre-generated watermarks and mobile upload button improvements (c6fdd38)
- register Russian locale and add to language selector (6f95b8c)
- select: add per-tile checkbox selection in Admin grid and all gallery layouts; tile click opens viewer; checkbox toggles selection; auto-enable selection mode; add testids (9fda54b)
- setup/docker: auto-set PUID/PGID from invoking user and chown bind-mount folders; create missing data/events dirs (0618b78)
- setup: remove --admin-password; print admin credentials from ADMIN_CREDENTIALS.txt; fix ADMIN_URL to avoid /admin/admin; update native service commands (84d0f63)
- show original filename in admin UI (#184) (0891be1)
- sort photos by capture date with configurable default sort (#283) (8805fa5)
- sort photos by capture date with configurable default sort (#283) (633d4a0)
- support per-gallery password toggle (5d6c061)
- visual WYSIWYG email template editor (703c03f)
- warn about low thumbnail resolution when selecting beta themes (ee3f6ae)
- warn about low thumbnail resolution with beta themes (aef9b4e)
Bug Fixes
- add allow_user_uploads to gallery API responses (691e3ab)
- add lightbox loading spinner and watermark cache invalidation (050ed37)
- Add settings translations and fix manual backup process (#82) (476fcce)
- add STORAGE_PATH to production docker-compose (cdda709)
- address beta feedback - gallery layout fixes, Russian locale, email logo (#249) (486239a)
- address Shannon security assessment findings (37 vulnerabilities) (#254) (23cd9cb)
- admin photo feedback filters have no effect (#293) (9ed8a2b)
- admin/feedback: use correct event id when rendering photo thumbnails (4c7b49a), closes #19
- admin: prevent category badge overlap in grid (d64e7d0)
- align backend port to 3000 across all configurations (3a8d53f)
- Align nginx backend port for production Docker deployments (v2.2.2) (#88) (e0bd19a)
- apply password change fix to regular modal + longer toast delay (#263) (c63bc47)
- apply password change redirect fix to regular modal too (#263) (147dc28)
- backup: add lastBackup alias and totalBackups for frontend compatibility (749100c)
- backup: allow manual backups when automated backups are disabled (e6dd89e)
- checkbox and toggle settings not persisting after page refresh (808ed1d), closes #117
- CI workflow fixes for protected branches (657c205)
- CI workflow fixes for protected branches (cb01218)
- ci: add QEMU setup for multi-arch builds and skip for PRs (0d36a27)
- clear notifications via API (#35) (013be18)
- correct invitation activation validation and add missing translations (991aa98), closes #129
- correct invitation email link URL path (86fa104), closes #129
- correct storage path resolution in multiple files (#96) (0e3674b)
- correct storage path resolution in multiple files (#96) (3ccb815)
- cors: scope CORS to /api only and avoid throwing on disallowed origins; prevents static asset 500s on native (90bb21e)
- database migration restart bug, lightbox loading spinner, and watermark cache invalidation (7c58749)
- db: improve PostgreSQL connection check in wait-for-db.sh (e85a68a)
- display new password after admin password reset (bd8b885)
- docker compose v2 syntax and add missing ADMIN_PASSWORD to .env.example (#189) (0817443)
- Docker Swarm DNS resolution and backup status display (v2.2.3) (082d8ab)
- Docker Swarm DNS resolution and backup status display (v2.2.3) (082d8ab)
- dynamic website title from branding settings (4701edc)
- event-specific custom CSS settings not being saved (dadef81), closes #136
- events without expiration date incorrectly shown as expired (c4f16eb)
- external media dimensions, theme race condition, email color customization (dfae2c2)
- frontend: add missing externalMedia service and mount admin external-media routes; verify Vite build (ab324f1)
- gallery thumbnails not loading (404 errors) #96 (e3c3c4c)
- gallery/filters: always apply global liked/favorited filters by aggregate counts (ignore guest_id); resolves mismatch between client guest_id and server identifier (526dcd8)
- gallery/filters: make feedback filters work globally when no guest_id is provided; remove guest_id from client photos query\n\n- Backend /api/gallery/:slug/photos: if filter present and guest_id missing, filter by like_count/favorite_count\n- Frontend useGalleryPhotos: stop passing random guestId (does not match server guest_identifier)\n\nThis makes Liked/Favorited filters reflect photos with aggregate feedback counts as expected. (5b2561b)
- gallery/sidebar: compact icon-only feedback filter in sidebar (vertical, small) to avoid overflow; use GalleryFilter variant=compact (ff89f96)
- gallery: feedback filter headline + horizontal icons in sidebar (compact variant); ensure sidebar content scrolls (flex-col container) (3a6d061)
- handle legacy non-JSON logo paths when replacing logo (0d5ce48)
- handle null dates in dashboard and gallery pages (c5a8ffc)
- harden gallery downloads and per-gallery auth (fc1bf53)
- hero header state and preview in admin theme editor (#158) (f554f46)
- improve ghost button visibility in admin dark mode (4912e2b)
- improve password validation errors and event list UX (#170, #171) (171abb3)
- improve photo serving, category filters, and upload chunking (#155, #156, #161) (fa4c838)
- increase upload limit to 1GB and fix category filters (#155, #156) (397d33a)
- issue #203 file type validation + security CVE fixes (8017171)
- JSON serialize favicon and logo URLs for PostgreSQL storage (b83f427)
- lightbox watermark loading, white label translations, and dynamic footer year (3b720ed)
- lightbox watermark loading, white label translations, and dynamic footer year (ce8587b)
- lightbox watermark loading, white label translations, and dynamic footer year (#108) (3b720ed)
- mobile upload button not visible in gallery (#113) (cacaffa)
- mobile upload button visibility in gallery (2a2c23d), closes #113
- mobile upload button visibility in gallery (df7dbff), closes #113
- mobile upload button visibility in gallery (#113) (05a5307)
- mobile upload button visibility in gallery (#113) (6cb4342)
- Multi-administrator RBAC, CSS templates & security hardening (#80) (37d4e1c)
- native/http: disable CSP upgrade-insecure-requests and HSTS unless ENABLE_HSTS=true; prevents HTTPS upgrades on HTTP installs (24b4a31)
- native: correct setup paths to /opt/picpeak/app, update repo URL, add sqlite prod support; docs path fixes (b992b15)
- native: remove obsolete workers service; restart only backend; add API request logging and preflight handler; keep static assets outside CORS (f3604b4)
- nginx: add Docker DNS resolver for Swarm/dynamic service discovery (049837f)
- nginx: Add Docker DNS resolver for Swarm/dynamic service discovery (v2.2.3) (cc1ddfd)
- photos: category changes now persist and display correctly (#77) (d9da98c)
- photos: resolve upload category selection and improve feedback buttons (#77) (856d533)
- pin npm to v10 in backend Dockerfile (ddefd3a)
- pin npm upgrade to v10 in backend Dockerfile (978e447)
- prefer admin token on admin routes (#23 #28) (d4404e3)
- prevent database migration restart failures (83a4344), closes #107
- prevent unnecessary image recompression and fix SQLite migration #95 (3cdc0ea)
- remove non-functional watermark toggle from Feature Toggles (d4a15db)
- render minimal/none header styles, cap hero height, switch category hero images (#158, #162, #163) (bc6c48b)
- resend gallery email fails for events without password (6b3ead7), closes #137
- resolve admin invitation flow issues and improve STORAGE_PATH documentation (41bf6ff)
- resolve branding display issues and invitation parsing errors (1931d73)
- Resolve branding display issues and invitation parsing errors (v2.2.1) (#86) (d7ecf83)
- resolve code quality issues and add missing i18n keys (#162, #163) (329d224)
- resolve code scanning security alerts (multer, tar, Node 22) (85a07fc)
- resolve external media dimensions, gallery theme race condition, and add email color customization (bbeedd1)
- resolve issues #194, #195, #196, #197 (33af088)
- resolve issues #194, #195, #196, #197 (5ea4ef3)
- resolve issues #194, #195, #196, #197 (33483cf)
- resolve issues #194, #195, #196, #197 (cd00bc1)
- resolve JWT iat timing issue in password change (#263) (c031b1e)
- resolve mixed light/dark mode styling in admin UI (#175) (f8c8abd)
- resolve password change redirect loop (#263) and file watcher crash (#269) (b23c51b)
- resolve password change redirect loop and file watcher crash (835bdf5), closes #269
- resolve redirect loop after mandatory password change (#263) (07fc5e6)
- resolve redirect loop after mandatory password change (#263) (3c8d344)
- respect allowed_file_types setting for upload validation (#203) (fe07a14)
- respect optional email settings in event creation (831ea6a)
- respect optional email settings in event creation (#217) (9c44a0e)
- restore aspect-ratio layouts and improve hero image quality (#180) (3974ba5)
- restore aspect-ratio layouts and improve hero image quality (#180) (5cef7fd)
- security: invalidate tokens on password change, enforce session timeout, fix role update (f362239)
- security: resolve all npm audit vulnerabilities (4272618)
- security: resolve Docker image CVEs for code scanning alerts (cbecb93)
- security: token invalidation on password change, session timeout enforcement (7ca9631)
- security: upgrade Alpine base image to fix libpng and c-ares CVEs (b706eeb)
- set JWT iat after password_changed_at to prevent token rejection (#263) (b1d1667)
- setup/native: correct repo URL, paths, and systemd for native install; support sqlite in production knex config (87b8414)
- setup/native: Debian 12 compatibility (reliable RAM detection, sudo-less run_as_user, git safe.directory); ensure SQLite data dir; use user for migrate (dc482e6)
- setup/native: handle forced updates safely by fetch+checkout/reset instead of pull; stable on rewritten histories (3697344)
- setup/update: detect native installs first (/opt/picpeak/app/backend or systemd unit); avoid false docker updates on root (adf576f)
- shorten Save button label on email template editor (7250c42)
- show upload button in mobile topbar instead of sidebar (ae181cf), closes #113
- stabilize uploads and guest feedback filters (aaaf598)
- sync header_style DB column with theme editor selections (#158) (2288309)
- sync header_style DB column with theme editor selections (#158) (a19e7c4)
- update dependencies to resolve code scanning security alerts (1f524f2)
- update docker-compose to docker compose and add ADMIN_PASSWORD to .env.example (#189) (a4c6248)
- update packages to fix security vulnerabilities (8097a0c)
- update security policy with private reporting channels (308e086)
- update security policy with private reporting channels (7f77362)
- update security policy with proper contact email and private reporting (67b0f32), closes #223
- use actual photo aspect ratios in masonry columns mode (#146) (8711f96)
- use CSS Columns for gap-free mosaic layout (#146) (821d329)
- use photo dimensions for mosaic aspect ratios (#146) (27ff51e)
- use Release Please extra-files instead of sync-versions job (fe7d45d)
- video upload media type, select all, and dimension repair (#203, #220, #180) (fc75bcd)
- video upload, select all, and dimension repair (#203, #220, #180) (a0bb080)
- watermark thumbnails, custom logo display, and German translations (f843e4c)
- watermark thumbnails, custom logo display, and German translations (ea20446)
- watermark upload JSON parsing and image quality preservation (0e3b50d)
- wire admin photo feedback filters into grid query (#293) (d4b4dc6)
- wrap email preview with full styled header/footer template (9a6d2e8)
- wrap email preview with full styled header/footer template (fc0911a), closes #229
- wrap test email with standard email template (#252) (954a011)
Documentation
- add API_URL environment variable to .env.example files (3e69579)
- add PUID/PGID note for Docker bind mounts to avoid permission issues (0178e71)
- clarify file system photo import requires existing event (#269) (5295516)
- clarify file system photo import requires existing event (#269) (ee0baaf)
- emphasize importance of STORAGE_PATH in env example (3397807)
- readme: reflect new External Media reference mode and update roadmap (gallery feedback status) (ee13556)
3.26.2-beta.0 (2026-04-11)
Bug Fixes
- admin photo feedback filters have no effect (#293) (9ed8a2b)
- wire admin photo feedback filters into grid query (#293) (d4b4dc6)
3.26.1-beta.0 (2026-04-09)
Bug Fixes
- apply password change fix to regular modal + longer toast delay (#263) (c63bc47)
- apply password change redirect fix to regular modal too (#263) (147dc28)
- resolve JWT iat timing issue in password change (#263) (c031b1e)
- set JWT iat after password_changed_at to prevent token rejection (#263) (b1d1667)
Documentation
- clarify file system photo import requires existing event (#269) (5295516)
- clarify file system photo import requires existing event (#269) (ee0baaf)
3.26.0-beta.0 (2026-04-09)
Features
- sort photos by capture date with configurable default sort (#283) (8805fa5)
- sort photos by capture date with configurable default sort (#283) (633d4a0)
Bug Fixes
- resolve password change redirect loop (#263) and file watcher crash (#269) (b23c51b)
- resolve password change redirect loop and file watcher crash (835bdf5), closes #269
3.25.0-beta.0 (2026-04-08)
Features
- draft mode, admin branding, and workflow improvements (dc98206)
- draft mode, admin branding, and workflow improvements (40332a7)
3.24.1-beta.0 (2026-04-05)
Bug Fixes
- resolve redirect loop after mandatory password change (#263) (07fc5e6)
- resolve redirect loop after mandatory password change (#263) (3c8d344)
3.24.0-beta.0 (2026-04-04)
Features
- warn about low thumbnail resolution when selecting beta themes (ee3f6ae)
- warn about low thumbnail resolution with beta themes (aef9b4e)
3.23.0-beta.0 (2026-04-04)
Features
- multilingual email templates with translations table (8c5996e)
- multilingual email templates with translations table (f50d7c0)
Bug Fixes
- pin npm to v10 in backend Dockerfile (ddefd3a)
- pin npm upgrade to v10 in backend Dockerfile (978e447)
3.22.0-beta.0 (2026-03-25)
Features
- add Dutch (nl) locale and fix missing translation keys across all locales (b54a80d)
- add Dutch locale and fix missing translation keys (e32da68)
3.21.1-beta.0 (2026-03-22)
Bug Fixes
3.21.0-beta.0 (2026-03-18)
Features
Bug Fixes
3.20.1-beta.0 (2026-03-17)
Bug Fixes
3.20.0-beta.0 (2026-03-17)
Features
- photo visibility control with client access (#172) (4a93e4e)
- photo visibility control with client access (#172) (e1b6e43)
3.19.2-beta.0 (2026-03-16)
Bug Fixes
- security: invalidate tokens on password change, enforce session timeout, fix role update (f362239)
- security: token invalidation on password change, session timeout enforcement (7ca9631)
3.19.1-beta.0 (2026-03-16)
Bug Fixes
- external media dimensions, theme race condition, email color customization (dfae2c2)
- resolve external media dimensions, gallery theme race condition, and add email color customization (bbeedd1)
3.19.0-beta.0 (2026-03-16)
Features
- add photo cap per event and Portuguese (pt-BR) locale (1fa222e)
- add photo cap per event and Portuguese locale (088de43)
3.18.2-beta.0 (2026-03-16)
Bug Fixes
- resolve code scanning security alerts (multer, tar, Node 22) (85a07fc)
- update dependencies to resolve code scanning security alerts (1f524f2)
3.18.1-beta.0 (2026-03-16)
Bug Fixes
- wrap email preview with full styled header/footer template (9a6d2e8)
- wrap email preview with full styled header/footer template (fc0911a), closes #229
3.18.0-beta.0 (2026-03-16)
Features
- add visual WYSIWYG email template editor (#229) (04a7ea8)
- register Russian locale and add to language selector (6f95b8c)
- visual WYSIWYG email template editor (703c03f)
Bug Fixes
- shorten Save button label on email template editor (7250c42)
3.17.2-beta.0 (2026-03-11)
Bug Fixes
- update security policy with private reporting channels (308e086)
- update security policy with proper contact email and private reporting (67b0f32), closes #223
- video upload media type, select all, and dimension repair (#203, #220, #180) (fc75bcd)
- video upload, select all, and dimension repair (#203, #220, #180) (a0bb080)
3.17.1-beta.0 (2026-03-08)
Bug Fixes
- respect optional email settings in event creation (831ea6a)
- respect optional email settings in event creation (#217) (9c44a0e)
3.17.0-beta.0 (2026-03-05)
Features
- configurable upload batch size for reverse proxy compatibility (9b7495e)
3.16.0-beta.0 (2026-03-05)
Features
- add thumbnail settings UI to admin panel (3a30fea)
- add thumbnail settings UI to admin settings page (#206) (7d6d2f5)
3.15.3-beta.0 (2026-03-02)
Bug Fixes
- issue #203 file type validation + security CVE fixes (8017171)
- respect allowed_file_types setting for upload validation (#203) (fe07a14)
- security: resolve all npm audit vulnerabilities (4272618)
- security: resolve Docker image CVEs for code scanning alerts (cbecb93)
2.6.0 (2026-03-11)
Features
- add configurable upload batch size for reverse proxy compatibility (#208) (02a46e0)
- configurable upload batch size for reverse proxy compatibility (4243363)
Bug Fixes
- video upload media type, select all, and dimension repair (#203, #220, #180) (fc75bcd)
- video upload, select all, and dimension repair (#203, #220, #180) (a0bb080)
2.5.1 (2026-02-22)
Bug Fixes
2.5.0 (2026-02-21)
Features
- add admin dark mode and SEO/robots.txt settings (9c2a0d2)
- add bulk category editing for photos (#157) (eca36c7)
- add category hero/cover photo selection (#163) (6c30e2c)
- add customizable event types with admin management (f8881d5)
- add Gallery Premium and Gallery Story layouts (Beta) (e179def)
- add hero image focal point picker with anchor positioning (#162) (734868a)
- add justified layout modes and aspect-ratio-aware mosaic (#146) (608bbd5)
- Add justified layout modes and aspect-ratio-aware mosaic (#146) (ef2ae00)
- add justified/rows layout mode to masonry gallery (#146) (e081b56)
- add justified/rows layout mode to masonry gallery (#146) + security fixes (cd1d504)
- add optional event date and expiration settings (3079eaa)
- add optional event date and expiration settings (2151147), closes #118
- add original filename preservation and Lightroom export support (a59f414)
- add original filename preservation and Lightroom export support (9872ad3)
- add per-event custom logo upload with bug fixes (85170b8)
- add per-event hero logo customization options (0790a1d)
- add quilted layout, fix mosaic, and backfill photo dimensions (#146) (46ed1bc)
- add update instructions dialog, email notifications, and capture date sorting (50c0990), closes #181
- decouple hero header from gallery layouts (#158) (7b8d8bd)
- gallery layouts, bulk category editing, and hero header improvements (7037106)
- gallery layouts, hero customization, bulk categories & event types (d9e00dc)
- gallery layouts, hero customization, event types, and UX improvements (#146, #155-163, #170, #171) (4280444)
- improve gallery layouts with aspect-ratio-aware masonry and mosaic modes (#146) (aacfcd5)
- improve hero image UX and live preview (#163, #158) (d63f67a)
- new features and bug fixes for beta release (151e1bf)
- original filename in admin UI, update dialog, and security hardening (3ea9d5b)
- original filename in admin UI, update dialog, security hardening, and bug fixes (bcf2745)
- per-event custom logos, customizable event types, and multiple bug fixes (4c08160)
- pre-generate watermarks for instant lightbox loading (1be974a), closes #112
- pre-generated watermarks and mobile upload button improvements (c6fdd38)
- show original filename in admin UI (#184) (0891be1)
3.15.2-beta.0 (2026-02-22)
Bug Fixes
- add allow_user_uploads to gallery API responses (691e3ab)
- add STORAGE_PATH to production docker-compose (cdda709)
- checkbox and toggle settings not persisting after page refresh (808ed1d), closes #117
- correct invitation activation validation and add missing translations (991aa98), closes #129
- correct invitation email link URL path (86fa104), closes #129
- correct storage path resolution in multiple files (#96) (0e3674b)
- correct storage path resolution in multiple files (#96) (3ccb815)
- docker compose v2 syntax and add missing ADMIN_PASSWORD to .env.example (#189) (0817443)
- event-specific custom CSS settings not being saved (dadef81), closes #136
- events without expiration date incorrectly shown as expired (c4f16eb)
- handle null dates in dashboard and gallery pages (c5a8ffc)
- hero header state and preview in admin theme editor (#158) (f554f46)
- improve ghost button visibility in admin dark mode (4912e2b)
- improve password validation errors and event list UX (#170, #171) (171abb3)
- improve photo serving, category filters, and upload chunking (#155, #156, #161) (fa4c838)
- increase upload limit to 1GB and fix category filters (#155, #156) (397d33a)
- mobile upload button not visible in gallery (#113) (cacaffa)
- mobile upload button visibility in gallery (2a2c23d), closes #113
- mobile upload button visibility in gallery (df7dbff), closes #113
- mobile upload button visibility in gallery (#113) (05a5307)
- mobile upload button visibility in gallery (#113) (6cb4342)
- remove non-functional watermark toggle from Feature Toggles (d4a15db)
- render minimal/none header styles, cap hero height, switch category hero images (#158, #162, #163) (bc6c48b)
- resend gallery email fails for events without password (6b3ead7), closes #137
- resolve admin invitation flow issues and improve STORAGE_PATH documentation (41bf6ff)
- resolve code quality issues and add missing i18n keys (#162, #163) (329d224)
- resolve mixed light/dark mode styling in admin UI (#175) (f8c8abd)
- restore aspect-ratio layouts and improve hero image quality (#180) (3974ba5)
- restore aspect-ratio layouts and improve hero image quality (#180) (5cef7fd)
- show upload button in mobile topbar instead of sidebar (ae181cf), closes #113
- sync header_style DB column with theme editor selections (#158) (2288309)
- sync header_style DB column with theme editor selections (#158) (a19e7c4)
- update docker-compose to docker compose and add ADMIN_PASSWORD to .env.example (#189) (a4c6248)
- update packages to fix security vulnerabilities (8097a0c)
- use actual photo aspect ratios in masonry columns mode (#146) (8711f96)
- use CSS Columns for gap-free mosaic layout (#146) (821d329)
- use photo dimensions for mosaic aspect ratios (#146) (27ff51e)
Documentation
- add API_URL environment variable to .env.example files (3e69579)
- emphasize importance of STORAGE_PATH in env example (3397807)
- resolve issues #194, #195, #196, #197 (5ea4ef3)
- resolve issues #194, #195, #196, #197 (cd00bc1)
3.15.1-beta.0 (2026-02-21)
Bug Fixes
- docker compose v2 syntax and add missing ADMIN_PASSWORD to .env.example (#189) (0817443)
- update docker-compose to docker compose and add ADMIN_PASSWORD to .env.example (#189) (a4c6248)
3.15.0-beta.0 (2026-02-17)
Features
- original filename in admin UI, update dialog, security hardening, and bug fixes (bcf2745)
Bug Fixes
- events without expiration date incorrectly shown as expired (c4f16eb)
3.14.0-beta.0 (2026-02-17)
Features
- add update instructions dialog, email notifications, and capture date sorting (50c0990), closes #181
- original filename in admin UI, update dialog, and security hardening (3ea9d5b)
- show original filename in admin UI (#184) (0891be1)
3.13.1-beta.0 (2026-02-15)
Bug Fixes
- restore aspect-ratio layouts and improve hero image quality (#180) (3974ba5)
- restore aspect-ratio layouts and improve hero image quality (#180) (5cef7fd)
3.13.0-beta.0 (2026-02-06)
Features
3.12.0-beta.0 (2026-02-06)
Features
- add admin dark mode and SEO/robots.txt settings (9c2a0d2)
Bug Fixes
- improve ghost button visibility in admin dark mode (4912e2b)
- resolve mixed light/dark mode styling in admin UI (#175) (f8c8abd)
3.11.0-beta.0 (2026-02-06)
Features
- add Gallery Premium and Gallery Story layouts (Beta) (e179def)
- gallery layouts, hero customization, event types, and UX improvements (#146, #155-163, #170, #171) (4280444)
Bug Fixes
- improve password validation errors and event list UX (#170, #171) (171abb3)
- render minimal/none header styles, cap hero height, switch category hero images (#158, #162, #163) (bc6c48b)
3.10.1-beta.0 (2026-02-03)
Bug Fixes
- sync header_style DB column with theme editor selections (#158) (2288309)
- sync header_style DB column with theme editor selections (#158) (a19e7c4)
3.10.0-beta.0 (2026-02-03)
Features
- add category hero/cover photo selection (#163) (6c30e2c)
- add hero image focal point picker with anchor positioning (#162) (734868a)
- gallery layouts, hero customization, bulk categories & event types (d9e00dc)
Bug Fixes
- hero header state and preview in admin theme editor (#158) (f554f46)
- improve photo serving, category filters, and upload chunking (#155, #156, #161) (fa4c838)
- resolve code quality issues and add missing i18n keys (#162, #163) (329d224)
3.9.0-beta.0 (2026-02-01)
Features
- add bulk category editing for photos (#157) (eca36c7)
- decouple hero header from gallery layouts (#158) (7b8d8bd)
- gallery layouts, bulk category editing, and hero header improvements (7037106)
Bug Fixes
3.8.0-beta.0 (2026-01-30)
Features
- add quilted layout, fix mosaic, and backfill photo dimensions (#146) (46ed1bc)
- improve gallery layouts with aspect-ratio-aware masonry and mosaic modes (#146) (aacfcd5)
Bug Fixes
- use actual photo aspect ratios in masonry columns mode (#146) (8711f96)
- use CSS Columns for gap-free mosaic layout (#146) (821d329)
- use photo dimensions for mosaic aspect ratios (#146) (27ff51e)
3.7.0-beta.0 (2026-01-28)
Features
- add justified layout modes and aspect-ratio-aware mosaic (#146) (608bbd5)
- Add justified layout modes and aspect-ratio-aware mosaic (#146) (ef2ae00)
3.6.0-beta.0 (2026-01-27)
Features
- add justified/rows layout mode to masonry gallery (#146) (e081b56)
- add justified/rows layout mode to masonry gallery (#146) + security fixes (cd1d504)
Bug Fixes
- update packages to fix security vulnerabilities (8097a0c)
3.5.0-beta.0 (2026-01-25)
Features
- add per-event custom logo upload with bug fixes (85170b8)
- per-event custom logos, customizable event types, and multiple bug fixes (4c08160)
3.4.0-beta.0 (2026-01-22)
Features
- add customizable event types with admin management (f8881d5)
- add per-event hero logo customization options (0790a1d)
- new features and bug fixes for beta release (151e1bf)
Bug Fixes
- event-specific custom CSS settings not being saved (dadef81), closes #136
- handle null dates in dashboard and gallery pages (c5a8ffc)
- remove non-functional watermark toggle from Feature Toggles (d4a15db)
- resend gallery email fails for events without password (6b3ead7), closes #137
3.3.0-beta.0 (2026-01-21)
Features
- add original filename preservation and Lightroom export support (a59f414)
- add original filename preservation and Lightroom export support (9872ad3)
3.2.5-beta.0 (2026-01-18)
Bug Fixes
- add STORAGE_PATH to production docker-compose (cdda709)
- correct invitation activation validation and add missing translations (991aa98), closes #129
- correct invitation email link URL path (86fa104), closes #129
- resolve admin invitation flow issues and improve STORAGE_PATH documentation (41bf6ff)
Documentation
- emphasize importance of STORAGE_PATH in env example (3397807)
3.2.4-beta.0 (2026-01-17)
Bug Fixes
- correct storage path resolution in multiple files (#96) (0e3674b)
- correct storage path resolution in multiple files (#96) (3ccb815)
3.2.3-beta.0 (2026-01-16)
Bug Fixes
- add allow_user_uploads to gallery API responses (691e3ab)
- mobile upload button not visible in gallery (#113) (cacaffa)
3.2.2-beta.0 (2026-01-16)
Bug Fixes
- mobile upload button visibility in gallery (2a2c23d), closes #113
- mobile upload button visibility in gallery (#113) (05a5307)
3.2.1-beta.0 (2026-01-16)
Bug Fixes
- mobile upload button visibility in gallery (df7dbff), closes #113
- mobile upload button visibility in gallery (#113) (6cb4342)
3.2.0-beta.0 (2026-01-16)
Features
- add optional event date and expiration settings (3079eaa)
- add optional event date and expiration settings (2151147), closes #118
Bug Fixes
Documentation
- add API_URL environment variable to .env.example files (3e69579)
3.1.0-beta.0 (2026-01-15)
Features
- dynamic website title from branding settings (d29aab7)
- pre-generate watermarks for instant lightbox loading (1be974a), closes #112
- pre-generated watermarks and mobile upload button improvements (c6fdd38)
Bug Fixes
- add lightbox loading spinner and watermark cache invalidation (050ed37)
- lightbox watermark loading, white label translations, and dynamic footer year (ce8587b)
- prevent database migration restart failures (83a4344), closes #107
- show upload button in mobile topbar instead of sidebar (ae181cf), closes #113
- watermark thumbnails, custom logo display, and German translations (ea20446)
3.0.1-beta.0 (2026-01-15)
Bug Fixes
- CI workflow fixes for protected branches (cb01218)
- lightbox watermark loading, white label translations, and dynamic footer year (3b720ed)
- lightbox watermark loading, white label translations, and dynamic footer year (ce8587b)
- lightbox watermark loading, white label translations, and dynamic footer year (#108) (3b720ed)
2.3.2 (2026-01-15)
Bug Fixes
- watermark thumbnails, custom logo display, and German translations (f843e4c)
- watermark thumbnails, custom logo display, and German translations (ea20446)
2.3.1 (2026-01-15)
Bug Fixes
- CI workflow fixes for protected branches (657c205)
- use Release Please extra-files instead of sync-versions job (fe7d45d)
3.0.0-beta.0 (2026-01-15)
⚠ BREAKING CHANGES
- Deployment now requires external reverse proxy for SSL/HTTPS
Features
- add Apple Liquid Glass templates, image security settings, and automated releases (6033461)
- add complete translation support for backup admin page (e9f92e6)
- Add CSS template system with custom gallery styling support (0da45e6)
- add event management, gallery customization, and release automationFeature/event rename (40ee671)
- add feedback management enhancements (0064122)
- add GitHub Actions workflow for Docker image builds (4029559)
- add multi-administrator support with RBAC and fix backup/restore for S3 (892e47d)
- admin: external media import modal + thumbnail fixes for reference events\n\n- Photos tab: replace inline external folder picker with a modal opened via "Import from External Folder" button next to "Upload Photos"; add info that all pictures in the selected folder will be imported.\n- Admin thumbnails: align list endpoint to /api/admin/photos/:eventId/photos and always return thumbnail_url to trigger on-demand generation; normalize external paths to avoid duplicated folder segments (e.g., individual/individual) that broke resolver; improve thumbnail logging.\n- Use authenticated image fetching on admin feedback pages to prevent 401s in automation.\n- i18n: add backup.external.warning strings; complete German backup/restore coverage; add common keys (notSet, of, up, select, selected).\n- Docs: add Local (npm) setup for EXTERNAL_MEDIA_ROOT in deployment guide.\n\nRefs #17 – gallery feature request: https://github.com/the-luap/picpeak/issues/17 (49c7778)
- admin: refine header layout and logo placement (d64e7d0)
- allow admin email updates in UI (#36) (3c2a79a)
- beta/stable release channels with update notifications and bug fixes (3c7dc20)
- beta/stable release channels with update notifications and bug fixes (#98) (3c7dc20)
- completely rewrite GitHub mirror to create new history from target commit (febacb7)
- consolidate setup scripts and guides into unified solution (29a8ff9)
- docker: add PUID/PGID and user mapping to avoid bind mount permission issues; feat(setup): prompt for admin email interactively; docs: PUID/PGID in .env.example (410a33f)
- enhance mirror-to-github workflow with commit-based history filtering (b4b09c1)
- events: add CSS template selector to event edit page (6a6c2cd)
- exclude Claude contributor from GitHub mirror workflow (abbcdb1)
- fix analytics dashboard and implement complete Umami integration (45ce988)
- gallery/filters: add Rated and Commented filters (UI + backend).\n\n- UI: add star (Rated) and message (Commented) buttons to feedback filter bars (desktop + mobile)\n- Backend: support filter=rated, commented, and combinations via aggregate counts/queries (b03760a)
- gallery: add quick Like/Favorite actions on thumbnails across layouts (6368f10)
- gallery: always-visible feedback indicators on grid tiles; fallback image rendering in lightbox/hero; auto-auth from shared-link token; fix external photo resolver\n\n- GridGallery: bottom-left icons for like/rated/comment on every tile\n- Hero layout grid: added same indicators (non-intrusive icons)\n- Lightbox/Hero: add fallbackSrc to display thumbnail if original fails\n- GalleryAuth: auto-store token from /gallery/:slug/:token and hydrate event\n- Backend gallery photo route: use resolvePhotoFilePath for external-media\n\nfix(admin): move photo feedback badges to bottom-right on admin grid tiles\n\nfix(dashboard): add missing i18n keys for activity types + fallback to formatter\n\nfix(admin/feedback): correct thumbnail URL base + robust date parsing\n\nRefs: #19 (6948aaa)
- gallery: compact vertical icon-only feedback filter in PhotoFilterBar; remove wide buttons to prevent overflow\n\n- Desktop: vertical icon stack (All/Grid, Likes, Favorites) outside scroll area\n- Mobile: vertical icon stack below categories\n- Keeps existing category bar layout and count\n\nRefs: #19 (465f997)
- i18n: add translations for settings tabs (c030e87)
- implement 4 new features with bug fixes and refactoring plan (77a4bfd)
- implement beta/stable release channels with update notifications (617e778)
- implement comprehensive backup and restore system with S3 support (f6a79c8)
- implement feedback filter for liked/favorited photos (Issue #17) (41857ec)
- implement gallery feedback system with version tracking for backups (dc1419c)
- implement gallery logo customization (Issue #17) (909e760)
- lightbox: keep feedback usable while navigating (6368f10), closes #19
- Multi-administrator RBAC, CSS templates & security hardening (#78) (16b3ab0)
- native: auto-serve SPA when dist exists (unless SERVE_FRONTEND=false); add clear logging; serve index.html for /admin (fb16b7b)
- native: build frontend and serve SPA from backend (SERVE_FRONTEND); fix Cannot GET /admin on native installs (9fe10bc)
- native: serve built frontend from backend; build frontend during install/update; ensure env flags (SERVE_FRONTEND, FRONTEND_DIR) (61ad2d6)
- overhaul public landing page and backup tooling (2a4d388)
- select: add per-tile checkbox selection in Admin grid and all gallery layouts; tile click opens viewer; checkbox toggles selection; auto-enable selection mode; add testids (9fda54b)
- setup/docker: auto-set PUID/PGID from invoking user and chown bind-mount folders; create missing data/events dirs (0618b78)
- setup: remove --admin-password; print admin credentials from ADMIN_CREDENTIALS.txt; fix ADMIN_URL to avoid /admin/admin; update native service commands (84d0f63)
- support per-gallery password toggle (5d6c061)
- update GitHub mirror workflow to start history from specific commit (08da01f)
Bug Fixes
- add missing route for feedback management page (517128f)
- add missing translations and fix BackupHistory useTranslation error (99e4778)
- Add settings translations and fix manual backup process (#82) (476fcce)
- admin/feedback: use correct event id when rendering photo thumbnails (4c7b49a), closes #19
- admin: prevent category badge overlap in grid (d64e7d0)
- align backend port to 3000 across all configurations (3a8d53f)
- Align nginx backend port for production Docker deployments (v2.2.2) (#88) (e0bd19a)
- auto-convert old date formats to new date-fns syntax (e1aca6b)
- backup: add lastBackup alias and totalBackups for frontend compatibility (749100c)
- backup: allow manual backups when automated backups are disabled (e6dd89e)
- ci: add QEMU setup for multi-arch builds and skip for PRs (0d36a27)
- clear notifications via API (#35) (013be18)
- complete backup page translations and improve UI (7387a5e)
- complete restore page translations and fix structure (618e269)
- configure github-release plugin to use GitHub API instead of Gitea (2624ea6)
- correct GitHub repository path in Drone CI release config (247e154)
- correct import statements for api in backup JSX files (30f6780)
- correct malformed gallery URLs in admin panel View Gallery links (3074748)
- correct password generator function name in reset password route (65d796b)
- correct script name in Gitea mirror workflow (828d6bc)
- cors: scope CORS to /api only and avoid throwing on disallowed origins; prevents static asset 500s on native (90bb21e)
- critical database connection pool exhaustion issues (8588133)
- db: improve PostgreSQL connection check in wait-for-db.sh (e85a68a)
- display new password after admin password reset (bd8b885)
- Docker Swarm DNS resolution and backup status display (v2.2.3) (082d8ab)
- Docker Swarm DNS resolution and backup status display (v2.2.3) (082d8ab)
- force github-release plugin to use GitHub API instead of Gitea (558a966)
- frontend: add missing externalMedia service and mount admin external-media routes; verify Vite build (ab324f1)
- gallery thumbnails not loading (404 errors) #96 (e3c3c4c)
- gallery/filters: always apply global liked/favorited filters by aggregate counts (ignore guest_id); resolves mismatch between client guest_id and server identifier (526dcd8)
- gallery/filters: make feedback filters work globally when no guest_id is provided; remove guest_id from client photos query\n\n- Backend /api/gallery/:slug/photos: if filter present and guest_id missing, filter by like_count/favorite_count\n- Frontend useGalleryPhotos: stop passing random guestId (does not match server guest_identifier)\n\nThis makes Liked/Favorited filters reflect photos with aggregate feedback counts as expected. (5b2561b)
- gallery/sidebar: compact icon-only feedback filter in sidebar (vertical, small) to avoid overflow; use GalleryFilter variant=compact (ff89f96)
- gallery: feedback filter headline + horizontal icons in sidebar (compact variant); ensure sidebar content scrolls (flex-col container) (3a6d061)
- handle auth errors and JSON parsing in admin panel (b2ae5f1)
- handle legacy non-JSON logo paths when replacing logo (0d5ce48)
- harden gallery downloads and per-gallery auth (fc1bf53)
- implement 9 production enhancements and security fixes (c584369)
- improve admin credentials display and configuration (ad495a9)
- improve version bump workflow with better conflict resolution (c787510)
- JSON serialize favicon and logo URLs for PostgreSQL storage (b83f427)
- Multi-administrator RBAC, CSS templates & security hardening (#80) (37d4e1c)
- multiple improvements and CI/CD updates (bf70567)
- native/http: disable CSP upgrade-insecure-requests and HSTS unless ENABLE_HSTS=true; prevents HTTPS upgrades on HTTP installs (24b4a31)
- native: correct setup paths to /opt/picpeak/app, update repo URL, add sqlite prod support; docs path fixes (b992b15)
- native: remove obsolete workers service; restart only backend; add API request logging and preflight handler; keep static assets outside CORS (f3604b4)
- nginx: add Docker DNS resolver for Swarm/dynamic service discovery (049837f)
- nginx: Add Docker DNS resolver for Swarm/dynamic service discovery (v2.2.3) (cc1ddfd)
- photos: category changes now persist and display correctly (#77) (d9da98c)
- photos: resolve upload category selection and improve feedback buttons (#77) (856d533)
- prefer admin token on admin routes (#23 #28) (d4404e3)
- prevent unnecessary image recompression and fix SQLite migration #95 (3cdc0ea)
- remove description field from migration 035 app_settings inserts (22cc406)
- remove file requirement from GitHub release in Drone CI (8335916)
- remove formatBoolean calls from migration 032 - critical production fix (0502ed3)
- remove unnecessary publish-manifest job from Docker workflow (986b101)
- remove unused formatBoolean import from migration 033 (1238db5)
- remove updated_at field from password reset query (ed0243e)
- remove updated_at from app_settings inserts in multiple migrations (4c42b4c)
- replace github-release plugin with direct curl API call (76a466c)
- resolve backend startup errors in development (f8fb1c3)
- resolve branding display issues and invitation parsing errors (1931d73)
- Resolve branding display issues and invitation parsing errors (v2.2.1) (#86) (d7ecf83)
- resolve CI/CD version bump race condition (0bf4764)
- resolve database connection error for analytics settings (95939d5)
- resolve date formatting error in event creation (c51d756)
- resolve development environment issues (61299a3)
- resolve duplicate logger declaration and syntax error in rate limit service (0fe6d73)
- resolve feedback validation issues from GitHub issue #16 (f26beca)
- resolve feedback validation issues from GitHub issue #16 (67ff415)
- resolve GitHub issues #4, #8, #9, and #10 (934d6dd)
- resolve GitHub mirror workflow cherry-pick failure with merge commits (d6adde4)
- resolve language-specific column issues in core migrations (62617f6)
- resolve migration conflicts and duplicate numbering (a401fbd)
- resolve multiple feedback management issues (ad75818)
- resolve multiple issues from GitHub issue #14 (e91209f)
- resolve port configuration issues and database column mismatch (6de64a1)
- resolve PostgreSQL migration issues for development environment (ee855a3)
- resolve production UI and API issues (d5790ad)
- resolve SIGPIPE error in GitHub mirror workflow file cleanup (b7c8953)
- resolve translation interpolation issue for download button (c1e10f1)
- security: upgrade Alpine base image to fix libpng and c-ares CVEs (b706eeb)
- setup/native: correct repo URL, paths, and systemd for native install; support sqlite in production knex config (87b8414)
- setup/native: Debian 12 compatibility (reliable RAM detection, sudo-less run_as_user, git safe.directory); ensure SQLite data dir; use user for migrate (dc482e6)
- setup/native: handle forced updates safely by fetch+checkout/reset instead of pull; stable on rewritten histories (3697344)
- setup/update: detect native installs first (/opt/picpeak/app/backend or systemd unit); avoid false docker updates on root (adf576f)
- simplify Drone github-release step to avoid shell parsing issues (94f10e1)
- stabilize uploads and guest feedback filters (aaaf598)
- update all deployment guide links in README.md (6389b9d)
- update deployment guide with critical URL configuration and nginx port fixes (1cadce1)
- update form-data and multer to address security vulnerabilities (7750170)
- update Gitea mirror workflow to selectively remove scripts (296430e)
- update GitHub mirror action to support fine-grained personal access tokens (827eb48)
- use admin API for Umami config in analytics page (a54a2c0)
- use plugins/gitea-release for Drone CI/CD (0c783c6)
- use plugins/github-release for Drone CI/CD (f926cd3)
- watermark upload JSON parsing and image quality preservation (0e3b50d)
Documentation
- add minimum system requirements section to README (4615a5d)
- add PUID/PGID note for Docker bind mounts to avoid permission issues (0178e71)
- add transparency note about AI-assisted development (35e360d)
- add warnings about $ character in Docker Compose passwords (87d1761)
- clarify VITE_API_URL usage; remove FRONTEND_API_URL; add storage vars; simplify compose mounts and external DB example (refs #18) (758c085)
- compose: fix backend healthcheck path; remove frontend VITE_API_URL env and document /api proxy (refs #18) (ecbc488)
- fix deployment/admin routing and CORS guidance; add AGENTS.md; ignore AGENTS.md (refs #18) (dad1787)
- follow-up on PR #15 — clarify VITE_API_URL usage, compose mounts, and admin routing (refs #15) (e9171c7)
- readme: reflect new External Media reference mode and update roadmap (gallery feedback status) (ee13556)
- replace email addresses with GitHub issue links (0c989ce)
- update deployment guide with GitHub Container Registry images (2c9a56f)
Code Refactoring
- simplify deployment structure with direct port exposure (6492cb9)
2.3.0 (2026-01-15)
Features
- beta/stable release channels with update notifications and bug fixes (3c7dc20)
- beta/stable release channels with update notifications and bug fixes (#98) (3c7dc20)
- implement beta/stable release channels with update notifications (617e778)
Bug Fixes
- display new password after admin password reset (bd8b885)
- gallery thumbnails not loading (404 errors) #96 (e3c3c4c)
- prevent unnecessary image recompression and fix SQLite migration #95 (3cdc0ea)
- watermark upload JSON parsing and image quality preservation (0e3b50d)
2.2.4 (2026-01-08)
Bug Fixes
- backup: add lastBackup alias and totalBackups for frontend compatibility (749100c)
- Docker Swarm DNS resolution and backup status display (v2.2.3) (082d8ab)
- Docker Swarm DNS resolution and backup status display (v2.2.3) (082d8ab)
2.2.3 (2026-01-08)
Bug Fixes
- nginx: add Docker DNS resolver for Swarm/dynamic service discovery (049837f)
- nginx: Add Docker DNS resolver for Swarm/dynamic service discovery (v2.2.3) (cc1ddfd)
2.2.2 (2026-01-08)
Bug Fixes
- align backend port to 3000 across all configurations (3a8d53f)
- Align nginx backend port for production Docker deployments (v2.2.2) (#88) (e0bd19a)
2.2.1 (2026-01-08)
Bug Fixes
- handle legacy non-JSON logo paths when replacing logo (0d5ce48)
- JSON serialize favicon and logo URLs for PostgreSQL storage (b83f427)
- resolve branding display issues and invitation parsing errors (1931d73)
- Resolve branding display issues and invitation parsing errors (v2.2.1) (#86) (d7ecf83)
2.2.0 (2026-01-08)
Features
- i18n: add translations for settings tabs (c030e87)
Bug Fixes
- Add settings translations and fix manual backup process (#82) (476fcce)
- backup: allow manual backups when automated backups are disabled (e6dd89e)
- db: improve PostgreSQL connection check in wait-for-db.sh (e85a68a)
2.1.1 (2026-01-07)
Bug Fixes
- ci: add QEMU setup for multi-arch builds and skip for PRs (0d36a27)
- Multi-administrator RBAC, CSS templates & security hardening (#80) (37d4e1c)
2.1.0 (2026-01-07)
Features
- add multi-administrator support with RBAC and fix backup/restore for S3 (892e47d)
- events: add CSS template selector to event edit page (6a6c2cd)
- Multi-administrator RBAC, CSS templates & security hardening (#78) (16b3ab0)
Bug Fixes
- photos: category changes now persist and display correctly (#77) (d9da98c)
- photos: resolve upload category selection and improve feedback buttons (#77) (856d533)
2.0.0 (2026-01-03)
⚠ BREAKING CHANGES
- Deployment now requires external reverse proxy for SSL/HTTPS
Features
- add Apple Liquid Glass templates, image security settings, and automated releases (6033461)
- add complete translation support for backup admin page (e9f92e6)
- Add CSS template system with custom gallery styling support (0da45e6)
- add event management, gallery customization, and release automationFeature/event rename (40ee671)
- add feedback management enhancements (0064122)
- add GitHub Actions workflow for Docker image builds (4029559)
- admin: external media import modal + thumbnail fixes for reference events\n\n- Photos tab: replace inline external folder picker with a modal opened via "Import from External Folder" button next to "Upload Photos"; add info that all pictures in the selected folder will be imported.\n- Admin thumbnails: align list endpoint to /api/admin/photos/:eventId/photos and always return thumbnail_url to trigger on-demand generation; normalize external paths to avoid duplicated folder segments (e.g., individual/individual) that broke resolver; improve thumbnail logging.\n- Use authenticated image fetching on admin feedback pages to prevent 401s in automation.\n- i18n: add backup.external.warning strings; complete German backup/restore coverage; add common keys (notSet, of, up, select, selected).\n- Docs: add Local (npm) setup for EXTERNAL_MEDIA_ROOT in deployment guide.\n\nRefs #17 – gallery feature request: https://github.com/the-luap/picpeak/issues/17 (49c7778)
- admin: refine header layout and logo placement (d64e7d0)
- allow admin email updates in UI (#36) (3c2a79a)
- completely rewrite GitHub mirror to create new history from target commit (febacb7)
- consolidate setup scripts and guides into unified solution (29a8ff9)
- docker: add PUID/PGID and user mapping to avoid bind mount permission issues; feat(setup): prompt for admin email interactively; docs: PUID/PGID in .env.example (410a33f)
- enhance mirror-to-github workflow with commit-based history filtering (b4b09c1)
- exclude Claude contributor from GitHub mirror workflow (abbcdb1)
- fix analytics dashboard and implement complete Umami integration (45ce988)
- gallery/filters: add Rated and Commented filters (UI + backend).\n\n- UI: add star (Rated) and message (Commented) buttons to feedback filter bars (desktop + mobile)\n- Backend: support filter=rated, commented, and combinations via aggregate counts/queries (b03760a)
- gallery: add quick Like/Favorite actions on thumbnails across layouts (6368f10)
- gallery: always-visible feedback indicators on grid tiles; fallback image rendering in lightbox/hero; auto-auth from shared-link token; fix external photo resolver\n\n- GridGallery: bottom-left icons for like/rated/comment on every tile\n- Hero layout grid: added same indicators (non-intrusive icons)\n- Lightbox/Hero: add fallbackSrc to display thumbnail if original fails\n- GalleryAuth: auto-store token from /gallery/:slug/:token and hydrate event\n- Backend gallery photo route: use resolvePhotoFilePath for external-media\n\nfix(admin): move photo feedback badges to bottom-right on admin grid tiles\n\nfix(dashboard): add missing i18n keys for activity types + fallback to formatter\n\nfix(admin/feedback): correct thumbnail URL base + robust date parsing\n\nRefs: #19 (6948aaa)
- gallery: compact vertical icon-only feedback filter in PhotoFilterBar; remove wide buttons to prevent overflow\n\n- Desktop: vertical icon stack (All/Grid, Likes, Favorites) outside scroll area\n- Mobile: vertical icon stack below categories\n- Keeps existing category bar layout and count\n\nRefs: #19 (465f997)
- implement 4 new features with bug fixes and refactoring plan (77a4bfd)
- implement comprehensive backup and restore system with S3 support (f6a79c8)
- implement feedback filter for liked/favorited photos (Issue #17) (41857ec)
- implement gallery feedback system with version tracking for backups (dc1419c)
- implement gallery logo customization (Issue #17) (909e760)
- lightbox: keep feedback usable while navigating (6368f10), closes #19
- native: auto-serve SPA when dist exists (unless SERVE_FRONTEND=false); add clear logging; serve index.html for /admin (fb16b7b)
- native: build frontend and serve SPA from backend (SERVE_FRONTEND); fix Cannot GET /admin on native installs (9fe10bc)
- native: serve built frontend from backend; build frontend during install/update; ensure env flags (SERVE_FRONTEND, FRONTEND_DIR) (61ad2d6)
- overhaul public landing page and backup tooling (2a4d388)
- select: add per-tile checkbox selection in Admin grid and all gallery layouts; tile click opens viewer; checkbox toggles selection; auto-enable selection mode; add testids (9fda54b)
- setup/docker: auto-set PUID/PGID from invoking user and chown bind-mount folders; create missing data/events dirs (0618b78)
- setup: remove --admin-password; print admin credentials from ADMIN_CREDENTIALS.txt; fix ADMIN_URL to avoid /admin/admin; update native service commands (84d0f63)
- support per-gallery password toggle (5d6c061)
- update GitHub mirror workflow to start history from specific commit (08da01f)
Bug Fixes
- add missing route for feedback management page (517128f)
- add missing translations and fix BackupHistory useTranslation error (99e4778)
- admin/feedback: use correct event id when rendering photo thumbnails (4c7b49a), closes #19
- admin: prevent category badge overlap in grid (d64e7d0)
- auto-convert old date formats to new date-fns syntax (e1aca6b)
- clear notifications via API (#35) (013be18)
- complete backup page translations and improve UI (7387a5e)
- complete restore page translations and fix structure (618e269)
- configure github-release plugin to use GitHub API instead of Gitea (2624ea6)
- correct GitHub repository path in Drone CI release config (247e154)
- correct import statements for api in backup JSX files (30f6780)
- correct malformed gallery URLs in admin panel View Gallery links (3074748)
- correct password generator function name in reset password route (65d796b)
- correct script name in Gitea mirror workflow (828d6bc)
- cors: scope CORS to /api only and avoid throwing on disallowed origins; prevents static asset 500s on native (90bb21e)
- critical database connection pool exhaustion issues (8588133)
- force github-release plugin to use GitHub API instead of Gitea (558a966)
- frontend: add missing externalMedia service and mount admin external-media routes; verify Vite build (ab324f1)
- gallery/filters: always apply global liked/favorited filters by aggregate counts (ignore guest_id); resolves mismatch between client guest_id and server identifier (526dcd8)
- gallery/filters: make feedback filters work globally when no guest_id is provided; remove guest_id from client photos query\n\n- Backend /api/gallery/:slug/photos: if filter present and guest_id missing, filter by like_count/favorite_count\n- Frontend useGalleryPhotos: stop passing random guestId (does not match server guest_identifier)\n\nThis makes Liked/Favorited filters reflect photos with aggregate feedback counts as expected. (5b2561b)
- gallery/sidebar: compact icon-only feedback filter in sidebar (vertical, small) to avoid overflow; use GalleryFilter variant=compact (ff89f96)
- gallery: feedback filter headline + horizontal icons in sidebar (compact variant); ensure sidebar content scrolls (flex-col container) (3a6d061)
- handle auth errors and JSON parsing in admin panel (b2ae5f1)
- harden gallery downloads and per-gallery auth (fc1bf53)
- implement 9 production enhancements and security fixes (c584369)
- improve admin credentials display and configuration (ad495a9)
- improve version bump workflow with better conflict resolution (c787510)
- multiple improvements and CI/CD updates (bf70567)
- native/http: disable CSP upgrade-insecure-requests and HSTS unless ENABLE_HSTS=true; prevents HTTPS upgrades on HTTP installs (24b4a31)
- native: correct setup paths to /opt/picpeak/app, update repo URL, add sqlite prod support; docs path fixes (b992b15)
- native: remove obsolete workers service; restart only backend; add API request logging and preflight handler; keep static assets outside CORS (f3604b4)
- prefer admin token on admin routes (#23 #28) (d4404e3)
- remove description field from migration 035 app_settings inserts (22cc406)
- remove file requirement from GitHub release in Drone CI (8335916)
- remove formatBoolean calls from migration 032 - critical production fix (0502ed3)
- remove unnecessary publish-manifest job from Docker workflow (986b101)
- remove unused formatBoolean import from migration 033 (1238db5)
- remove updated_at field from password reset query (ed0243e)
- remove updated_at from app_settings inserts in multiple migrations (4c42b4c)
- replace github-release plugin with direct curl API call (76a466c)
- resolve backend startup errors in development (f8fb1c3)
- resolve CI/CD version bump race condition (0bf4764)
- resolve database connection error for analytics settings (95939d5)
- resolve date formatting error in event creation (c51d756)
- resolve development environment issues (61299a3)
- resolve duplicate logger declaration and syntax error in rate limit service (0fe6d73)
- resolve feedback validation issues from GitHub issue #16 (f26beca)
- resolve feedback validation issues from GitHub issue #16 (67ff415)
- resolve GitHub issues #4, #8, #9, and #10 (934d6dd)
- resolve GitHub mirror workflow cherry-pick failure with merge commits (d6adde4)
- resolve language-specific column issues in core migrations (62617f6)
- resolve migration conflicts and duplicate numbering (a401fbd)
- resolve multiple feedback management issues (ad75818)
- resolve multiple issues from GitHub issue #14 (e91209f)
- resolve port configuration issues and database column mismatch (6de64a1)
- resolve PostgreSQL migration issues for development environment (ee855a3)
- resolve production UI and API issues (d5790ad)
- resolve SIGPIPE error in GitHub mirror workflow file cleanup (b7c8953)
- resolve translation interpolation issue for download button (c1e10f1)
- setup/native: correct repo URL, paths, and systemd for native install; support sqlite in production knex config (87b8414)
- setup/native: Debian 12 compatibility (reliable RAM detection, sudo-less run_as_user, git safe.directory); ensure SQLite data dir; use user for migrate (dc482e6)
- setup/native: handle forced updates safely by fetch+checkout/reset instead of pull; stable on rewritten histories (3697344)
- setup/update: detect native installs first (/opt/picpeak/app/backend or systemd unit); avoid false docker updates on root (adf576f)
- simplify Drone github-release step to avoid shell parsing issues (94f10e1)
- stabilize uploads and guest feedback filters (aaaf598)
- update all deployment guide links in README.md (6389b9d)
- update deployment guide with critical URL configuration and nginx port fixes (1cadce1)
- update form-data and multer to address security vulnerabilities (7750170)
- update Gitea mirror workflow to selectively remove scripts (296430e)
- update GitHub mirror action to support fine-grained personal access tokens (827eb48)
- use admin API for Umami config in analytics page (a54a2c0)
- use plugins/gitea-release for Drone CI/CD (0c783c6)
- use plugins/github-release for Drone CI/CD (f926cd3)
Documentation
- add minimum system requirements section to README (4615a5d)
- add PUID/PGID note for Docker bind mounts to avoid permission issues (0178e71)
- add transparency note about AI-assisted development (35e360d)
- add warnings about $ character in Docker Compose passwords (87d1761)
- clarify VITE_API_URL usage; remove FRONTEND_API_URL; add storage vars; simplify compose mounts and external DB example (refs #18) (758c085)
- compose: fix backend healthcheck path; remove frontend VITE_API_URL env and document /api proxy (refs #18) (ecbc488)
- fix deployment/admin routing and CORS guidance; add AGENTS.md; ignore AGENTS.md (refs #18) (dad1787)
- follow-up on PR #15 — clarify VITE_API_URL usage, compose mounts, and admin routing (refs #15) (e9171c7)
- readme: reflect new External Media reference mode and update roadmap (gallery feedback status) (ee13556)
- replace email addresses with GitHub issue links (0c989ce)
- update deployment guide with GitHub Container Registry images (2c9a56f)
Code Refactoring
- simplify deployment structure with direct port exposure (6492cb9)
1.2.0 (2026-01-03)
Features
- Event Rename: Safe event renaming with automatic slug updates, old URL redirects via
slug_redirectstable, and optional email notifications to clients - Optional Event Fields: Make customer name, email, and admin email fields optional via admin settings with "(optional)" labels in forms
- Photo Filtering: Filter photos by rating, likes, favorites, and comments with a new PhotoFilterPanel component
- Photo Export: Export filtered photo selections as ZIP, generate Capture One/Lightroom-compatible XMP sidecar files, or export metadata lists
- Custom CSS Templates: 3 customizable CSS template slots with live preview, XSS-safe sanitization, and per-event template assignment
- Apple Liquid Glass Theme: Starter CSS template inspired by iOS 26 / macOS Tahoe Liquid Glass design with glass morphism effects, Apple SF Pro fonts, and responsive layout
- Liquid Glass Dark Theme: Neon-accented dark glass theme with animated gradient backgrounds
- Image Security Settings: Per-event download protection with configurable protection levels (basic, standard, enhanced, maximum), canvas rendering, DevTools detection, and right-click prevention
- Automated Releases: Release Please integration for automatic versioning, changelog generation, and GitHub releases that trigger Docker image builds
Bug Fixes
- Date Parsing: Fix event date formatting in slugs (now uses YYYY-MM-DD format correctly)
- Search Placeholder: Fix search field placeholder visibility in glass-styled sidebar
- Vite Proxy: Fix Vite dev server proxy port configuration
- Photo Export Button: Fix export button staying disabled when photos are selected
- Boolean Parsing: Fix boolean parsing in publicSettings.js for optional fields
- Translation Keys: Add missing
common.optionaltranslation key in locales
Security
- Fix critical vulnerabilities and harden application security
- Add CSS sanitizer utility blocking XSS vectors in custom templates
- Implement secure gallery CSS endpoint for template delivery
Code Refactoring
- Add Photo and Settings service layers for better code organization
- Phase 1 code consolidation with service layer architecture
- Modular settings page with feature-based tab components
- Create photoFilterBuilder utility for query construction
- Add eventRenameService for safe event operations
Documentation
- Add comprehensive REFACTORING_PLAN.md for codebase improvement roadmap
- Update README roadmap with implemented features (Download Protection, Gallery Templates, Filtering & Export)
- Add test specification documents for all new features
Database Migrations
049_add_slug_redirects.js- Store old slugs for URL redirects after rename050_add_optional_event_fields_settings.js- Settings for optional form fields051_add_photo_filter_indexes.js- Performance indexes for photo filtering052_add_css_templates.js- CSS template storage with 3 slots053_add_liquid_glass_templates.js- Apple Liquid Glass and Dark theme starter templates
[1.1.15] - Previous Release
Initial stable release with core functionality.
Pre-3.x history (main 2.x channel)
2.6.5 (2026-04-08)
Documentation
- rewrite README — shorter, cleaner (62643f2)
- rewrite README — shorter, cleaner, less AI-sounding (64f6061)
2.6.4 (2026-04-08)
Bug Fixes
- sync backend package-lock.json for security deps (bb81fa5)
- sync backend package-lock.json with security dep updates (03e1989)
2.6.3 (2026-04-07)
Documentation
- add External Media Library section to deployment guide (#270) (2e1c71c)
- add External Media Library section to deployment guide (#270) (f6ca713)
2.6.2 (2026-03-16)
Bug Fixes
- security: invalidate tokens on password change, enforce session timeout, fix role update (85a60a2)
- security: token invalidation on password change, session timeout enforcement (0a3a537)