Journiv v0.1.0-beta.25: The new frontend
Important
This release contains patch for a security vulnerablity. Please update your Journiv instance to this beta.25 (latest) release. See notes below for details.
This is one of the largest user-facing updates to Journiv so far.
The main highlight of v0.1.0-beta.25 is the introduction of Journiv's completely new React-based web frontend. The new interface is now the default Journiv web experience, replacing the previous Flutter frontend while keeping the legacy interface available at /legacy/ during the transition.
The release contains more than a frontend rewrite: it establishes a new design system and frontend architecture, brings many Journiv features into the new interface, introduces PWA and offline-reading support, strengthens browser authentication, and includes a number of backend improvements required by the new experience.
Highlights
A completely new Journiv web experience
Journiv's web interface has been rebuilt using React and TypeScript with a new responsive design system based on shadcn components.
The new frontend has been designed for both desktop and mobile use, with responsive navigation, adaptive dialogs and mobile sheets, improved loading and error states, and a more consistent interface throughout the application.
React is now served as the primary interface at /. If you need the previous Flutter interface while the new frontend continues to mature, it remains available at:
/legacy/
There is also a Use legacy interface option under Help & feedback.
π A redesigned writing and reading experience
The new editor and reader are now integrated throughout the React application.
Highlights include:
- Rich-text editing powered by Quill
- Markdown-style typing shortcuts for headings, lists, quotes, emphasis, links, and more
- Draft autosave and local draft recovery
- Conflict handling to help prevent accidental overwrites
- Improved media attachment handling
- Entry deletion from the new interface
- PDF export directly from the reader
- Prompt support while writing
- A new full-screen media viewer with image zoom, video playback, keyboard navigation, deep links, and media recovery
ποΈ Timeline, Calendar and Library
The new frontend includes the main Journiv browsing and organization experiences, including:
- Timeline browsing and search
- Calendar navigation
- Journals and journal management
- Media browsing
- People
- Tags
- Moods
- Activities
- Goals
- Filtering Moments by related entities
- Improved preservation of search and filter state while navigating
The supporting backend media and Moment APIs were also expanded as part of this release.
π± Install Journiv as a PWA
Journiv can now be installed as a Progressive Web App on supported desktop and mobile browsers.
PWA support includes:
- Installable application manifest and icons
- Service-worker based application caching
- Optional bounded offline reading
- Offline status and connection-aware navigation
- Offline storage management
- Application update notifications
- Safer update handling when unsaved drafts exist
β οΈ About the legacy frontend
The React frontend is now the default Journiv interface, but this is still a beta release and the transition is intentionally gradual.
The previous Flutter web frontend remains available at:
/legacy/
This provides a fallback while the React interface continues to receive improvements and remaining gaps are addressed.
π Security
Fixed an SSRF vulnerability in the Immich integration that could allow an authenticated non-admin user to make Journiv request internal network resources.
The fix restricts custom Immich URLs to administrators and adds destination validation, redirect protection, DNS-rebinding mitigation, and safer credential forwarding.
Users running v0.1.0-beta.24 and below should upgrade to beta.25, especially on untrusted multi-user instances.
Thanks to Ahmed Ibrahim @skeletonsec and Onur Alp Akin @otuva for responsibly reporting the issue.
See #655.
What's Changed
- feat(backend): reject stale entry updates by @swalabtech in #605
- feat(backend): add media library browsing by @swalabtech in #606
- Fix harden media processing, support mood scope moment search and filter moment by entities by @swalabtech in #607
- feat(backend): expose public Plus capabilities by @swalabtech in #608
- feat(backend): add unused-tag cleanup by @swalabtech in #609
- fix(backend): preserve an active administrator by @swalabtech in #610
- chore(frontend): establish the React toolchain by @swalabtech in #611
- feat(frontend): add the shadcn design foundation by @swalabtech in #612
- chore: do not run smoke test on frontend code change by @swalabtech in #613
- feat(frontend): establish API and server-state boundaries by @swalabtech in #614
- feat(frontend): add shared Journiv domain utilities by @swalabtech in #615
- feat: shared journiv presentation comps and login by @swalabtech in #616
- feat: add quill editor in journiv frontend v2 by @swalabtech in #617
- Add major functionality in new frontend by @swalabtech in #618
- docs(frontend): document the Journiv design system by @swalabtech in #619
- feat(frontend): add signup page by @swalabtech in #620
- feat: playwright e2e test by @swalabtech in #621
- fix: rename sessionStore by @swalabtech in #622
- feat(auth): add OIDC web flow by @swalabtech in #623
- chore(test): Add auth and shell frontend e2e test by @swalabtech in #624
- chore(test): add e2e tests for journal by @swalabtech in #625
- feat: add support for delete entry in frontend v2 by @swalabtech in #626
- chore(tests): add more e2e tests for timeline, search, setting, tags etc by @swalabtech in #627
- feat: add dialog sheet and dropdown menu architecture by @swalabtech in #628
- Feat/frontend playwright tests by @swalabtech in #629
- feat: add support for connect to immich and media by @swalabtech in #630
- feat: adjust frontend theme by @swalabtech in #631
- feat(web): make React the primary interface by @swalabtech in #632
- chore: update documentations by @swalabtech in #633
- doc update by @swalabtech in #634
- feat: add insights support by @swalabtech in #636
- feat: add journiv brand mark by @swalabtech in #637
- feat: add account deletion in ui v2 by @swalabtech in #638
- feat: Add prompt support in UI by @swalabtech in #639
- feat: add pdf export in frontend v2 by @swalabtech in #640
- feat: add update and license registration setting in frontend v2 by @swalabtech in #641
- feat: quick log by @swalabtech in #642
- feat: add support for markdown writing by @swalabtech in #643
- feat: Improve import and export feature by @swalabtech in #644
- fix: improve setting page layout by @swalabtech in #645
- feat: add full screen media viewer by @swalabtech in #646
- Second workspace by @swalabtech in #649
- disable quicklog option by @swalabtech in #650
- fix failing github workflow by @swalabtech in #651
- chore: update version to beta.25 by @swalabtech in #653
- fix(integrations): restrict Immich base_url override to admins, guard⦠by @swalabtech in #655
- chore: build frontend on docker build by @swalabtech in #656
- fix: e2e web playwright tests by @swalabtech in #657
- fix: e2e web playwright tests by @swalabtech in #658
- feat(auth): refresh-session cookie by @swalabtech in #659
- feat(auth): in-memory access token and boot session restore by @swalabtech in #660
- feat(pwa): manifest, icons, and installability by @swalabtech in #661
- Feat/add pwa support by @swalabtech in #662
- chore(pwa): serving headers ios install warning and fixes by @swalabtech in #663
- feat: standardize navigation animation by @swalabtech in #664
- fix: frontend e2e tests by @swalabtech in #665
- fix: e2e playwright tests by @swalabtech in #666
- fix: broken library navigation screen by @swalabtech in #667
- fix: update flutter web by @swalabtech in #668
Full Changelog: v0.1.0-beta.24...v0.1.0-beta.25