v3.27.0-beta.0
Pre-release
Pre-release
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)
- guest selections with per-person identity (#292) (3856ba2)
- guest selections with per-person identity (#292) (ad4e5a7)
- 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)
- 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)