单条 docker run 启动的是精简版,缺少 Redis/Valkey 与 Celery worker 时图片、视频、音频会一直停在 Processing,导入导出任务也无法运行,需要改用完整 docker-compose.yml;项目处于 beta 阶段,升级可能引入破坏性变更,需定期备份数据;ALLOW_INSECURE_COOKIE_AUTH_OVER_HTTP 只适用于隔离的可信局域网,公网部署应改用 DOMAIN_SCHEME=https。
docker run -d --name journiv -p 8000:8000 -e SECRET_KEY=your-secret-key-here -e DOMAIN_NAME=192.168.1.1 -e ALLOW_INSECURE_COOKIE_AUTH_OVER_HTTP=true -v journiv_data:/data --restart unless-stopped swalabtech/journiv-app:latestREADME 未说明具体硬件要求;仅给出 Docker 运行方式,未提及 CPU、内存或 GPU 配置。
自托管的私密日记应用,支持情绪追踪、提示写作、媒体上传与分析搜索
自托管的私密日记应用,数据全留在自己服务器上,支持心情追踪和笔记记录,适合注重隐私、想搭在 homelab 里的用户。
核心能力
- 记录日记并追踪每日情绪状态
- 按提示词引导写作,支持媒体文件上传
- 提供统计分析与高级搜索,界面简洁
- 同一 FastAPI 端口同时提供 React 与旧版 Flutter 前端
- 提供 Docker 镜像,可一键部署到 PikaPods 或 Easypanel
容易踩的坑
- v0.1.0-beta.26最新正式版2026-09-28 · 2026-09-28 04:37 UTC
Highlight
- Now you can add audio note to your journal entries.
What's Changed
- chore: bump version to beta.26 by @swalabtech in https://github.com/journiv/journiv-app/pull/669
- fix: immich media edit and other fixes #367 by @swalabtech in https://github.com/journiv/journiv-app/pull/678
- fix: update flutter frontend to fix period stripping #652 by @swalabtech in https://github.com/journiv/journiv-app/pull/679
- fix: rest tab focus #674 by @swalabtech in https://github.com/journiv/journiv-app/pull/680
- fix: image thumbnail rotation #635 by @swalabtech in https://github.com/journiv/journiv-app/pull/681
- feat: Add support for audio dictation by @swalabtech in https://github.com/journiv/journiv-app/pull/682
- fix: editor on pwa #670 by @swalabtech in https://github.com/journiv/journiv-app/pull/683
- fix: require building react for manual install by @swalabtech in https://github.com/journiv/journiv-app/pull/684
- fix: updates for celery required for image processing #600 by @swalabtech in https://github.com/journiv/journiv-app/pull/685
- fix: improve pwa editor #670 by @swalabtech in https://github.com/journiv/journiv-app/pull/686
- Add Easypanel deploy badge by @Ahson-Shaikh in https://github.com/journiv/journiv-app/pull/677
- fix: audio recording and playbook on safari app on mobile by @swalabtech in https://github.com/journiv/journiv-app/pull/689
- feat: add ability to add activity when creating entry by @swalabtech in https://github.com/journiv/journiv-app/pull/690
New Contributors
- @Ahson-Shaikh made their first contribution in https://github.com/journiv/journiv-app/pull/677
Full Changelog: https://github.com/journiv/journiv-app/compare/v0.1.0-beta.25...v0.1.0-beta.26
❤️ Supporters
Ongoing
Stay updated
Join subreddit. Join discord community. Subscribe to blog posts.
- v0.1.0-beta.252026-09-19 · 2026-09-19 19:10 UTC
查看更新说明
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 mitiga
- v0.1.0-beta.242026-08-23 · 2026-08-23 12:12 UTC
查看更新说明
Highlights
- Improved Web-Native Editor: Journiv now uses an enhanced Tiptap editor, delivering a smoother and more reliable editing experience, especially on mobile devices when using Journiv as a PWA.
What's Changed
- chore: bump to beta.24 by @swalabtech in https://github.com/journiv/journiv-app/pull/565
- fix: CORS rejecting browser video Range requests by @swalabtech in https://github.com/journiv/journiv-app/pull/590
- fix-591: Improve editor experience on mobile PWA using tiptap editor by @swalabtech in https://github.com/journiv/journiv-app/pull/592
- feat-591: Support markdown switch with tiptap editor by @swalabtech in https://github.com/journiv/journiv-app/pull/593
- fix: add back navigation on setting screen on mobile #582 by @swalabtech in https://github.com/journiv/journiv-app/pull/594
- feat: Add support for 12 or 24 hour time format #545 by @swalabtech in https://github.com/journiv/journiv-app/pull/595
- feat: web ui update add support for 12 or 24 hour time format #545 by @swalabtech in https://github.com/journiv/journiv-app/pull/596
- fix failing flutter test by @swalabtech in https://github.com/journiv/journiv-app/pull/599
- chroe: update web frontend for release by @swalabtech in https://github.com/journiv/journiv-app/pull/601
Full Changelog: https://github.com/journiv/journiv-app/compare/v0.1.0-beta.23...v0.1.0-beta.24
❤️ Supporters
Ongoing
Stay updated
Join subreddit. Join discord community. Subscribe to blog posts.
- v0.1.0-beta.232026-05-25 · 2026-05-25 17:17 UTC
查看更新说明
[!CAUTION] Starting with this release (beta.23), Journiv is dropping support for Progressive Web App (PWA) service workers due to their removal in recent Flutter upstream versions. To ensure you see the new user interface and avoid loading a broken or outdated version of the app, you must clear the cache of your browser, reverse proxy, or Cloudflare setup (depending on your deployment environment). How to force a clean reload: Chromium-based browsers (Chrome, Brave, Edge): Open the Developer Tools (F12), right-click or hold-click the browser's refresh button, and select "Empty Cache and Hard Reload". Other environments: Ensure any edge caching or CDN rules are purged for your domain.
[!IMPORTANT] Creating full database backup (not just a Journiv export) before upgrading is highly recommended. Do NOT upgrade without a proper database backup if you care about your existing entries.
Highlights
- People Support: Add and manage important people in your life, then attach them to journal entries to better organize and revisit memories shared with them. Learn more.
- Automatic Immich People Sync: Sync people from your Immich instance into Journiv. When you attach Immich assets to a journal entry, Journiv can automatically associate the entry with the people detected in those assets. Learn more and watch demo.
Blogpost
Journiv People Tracking with Immich: Remembering Who Was There
What's Changed
- chore: update version to 0.1.0-beta.23 by @swalabtech in https://github.com/journiv/journiv-app/pull/528
- fix: handle last_error for scheduled sync for transient failures by @swalabtech in https://github.com/journiv/journiv-app/pull/533
- chore: update frontend for immich connection refresh fix by @swalabtech in https://github.com/journiv/journiv-app/pull/534
- fix: update frontend for #531 #542 by @swalabtech in https://github.com/journiv/journiv-app/pull/543
- feat: Add support for people and sync with immich people #294 by @swalabtech in https://github.com/journiv/journiv-app/pull/548
- feat: Add UI for people and immich people sync #294 by @swalabtech in https://github.com/journiv/journiv-app/pull/549
- fix: keyboard close on android browser #438 by @swalabtech in https://github.com/journiv/journiv-app/pull/550
- fix: quicklog note display on ios when keyboard is open #551 by @swalabtech in https://github.com/journiv/journiv-app/pull/552
- fix: memory selection logic #529 by @swalabtech in https://github.com/journiv/journiv-app/pull/553
- fix: remove redundant request logging from middleware #471 by @swalabtech in https://github.com/journiv/journiv-app/pull/554
- fix: title gesture out of focus #529 by @swalabtech in https://github.com/journiv/journiv-app/pull/555
- fix: handle standard Quill block attributes on newline ops #362 by @swalabtech in https://github.com/journiv/journiv-app/pull/556
- fix: preserve non-collapsed selections for block formatting #362 by @swalabtech in https://github.com/journiv/journiv-app/pull/557
- fix: frontend crash from immich photos for archived people by @swalabtech in https://github.com/journiv/journiv-app/pull/558
- fix: support people profile photo import and export by @swalabtech in https://github.com/journiv/journiv-app/pull/559
- chore: update web for beta.23 release by @swalabtech in https://github.com/journiv/journiv-app/pull/560
- fix: update frontend for people filter in timeline and journal screen by @swalabtech in https://github.com/journiv/journiv-app/pull/561
- fix: long caching flutter_bootstrap.js which stop new UI from showing up by @swalabtech in https://github.com/journiv/journiv-app/pull/562
- fix: remove service worker registration from frontend by @swalabtech in https://git
- v0.1.0-beta.222026-04-13 · 2026-04-13 04:00 UTC
查看更新说明
[!WARNING] ⚠️ Creating full database backup (not just a Journiv export) before upgrading is highly recommended. Do NOT upgrade without a proper database backup if you care about your existing entries. After upgrade clear cache for browser/reverse proxy/cloudflare etc depending on your setup.
Making Backup
1. Make Postgres DB backup
This will dump your database backup to file named in
journiv_full_backup.sqlin current working directory. If you are using sqlite then you can just copy the sqlite db file to a safe location.docker exec -t journiv-postgres-db pg_dumpall -c -U journiv > journiv_full_backup.sql2. Journiv Export (Optional)
Make a Journiv export of you journals as back up. You should select "All Journals" and you would need to ask all user on your instances to make the export (if you have multiple users). We will keep this as a secondary backup but the guide below prefer direct docker backup and restore.
Highlights
- PDF generation now happens in backend for consistent and stable PDF generation.
- Public publishing letting you share selected entries at public URLs (Plus Feature)
- oEmbed support for embedding Journal entries with richer previews (Plus Feature)
- New Journiv Plus architecture with both inline mode and air-gaped sidecar deployment mode
What's Changed
- chore: version bump to beta.22 by @swalabtech in https://github.com/journiv/journiv-app/pull/490
- feat: add support for pdf export, publish and oembed by @swalabtech in https://github.com/journiv/journiv-app/pull/504
- feat: update frontend for entry pdf download, publish and oembed by @swalabtech in https://github.com/journiv/journiv-app/pull/505
- fix: media embed in pdf by @swalabtech in https://github.com/journiv/journiv-app/pull/506
- fix: restore soft deleted mood on recreate and fix activity delete #501 by @swalabtech in https://github.com/journiv/journiv-app/pull/507
- fix: update web for 500 character quick log improvements by @swalabtech in https://github.com/journiv/journiv-app/pull/508
- fix: update tag response with moment entry details by @swalabtech in https://github.com/journiv/journiv-app/pull/512
- fix: update frontend to fix displaying more than 50 activities by @swalabtech in https://github.com/journiv/journiv-app/pull/513
- fix: remove the anti-framing headers for oembed by @swalabtech in https://github.com/journiv/journiv-app/pull/515
- fix: update web for oembed fixes by @swalabtech in https://github.com/journiv/journiv-app/pull/516
- chore: update frontend for beta.22 by @swalabtech in https://github.com/journiv/journiv-app/pull/520
- fix: update web to fix goal selection screen theme in dark mode by @swalabtech in https://github.com/journiv/journiv-app/pull/521
- fix: goal icon visibilty in dark mode by @swalabtech in https://github.com/journiv/journiv-app/pull/522
- fix: wire tag analytics api in proxy mode by @swalabtech in https://github.com/journiv/journiv-app/pull/524
- fix: frontend for mood add and edit and timleine tab color by @swalabtech in https://github.com/journiv/journiv-app/pull/526
- fix: old upgraded entry publishing on sqlite db by @swalabtech in https://github.com/journiv/journiv-app/pull/527
❤️ Supporters
Ongoing
Stay updated
Join subreddit. Join discord community. Subscribe to blog posts.
Full Changelog: https://github.com/journiv/journiv-app/compare/v0.1.0-beta.21...v0.1.0-beta.22
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
📘 Journiv - Private Journal
⚠️ Beta Software
Journiv is currently in beta and under active development. While the developers aims to keep data backward-compatible, breaking changes may still occur. Please keep regular backups of your data to avoid loss during updates.
Journiv is a self-hosted private journal. It features comprehensive journaling capabilities including mood tracking, prompt-based journaling, media uploads, analytics, and advanced search with a clean and minimal UI.
Quick Start
Give Journiv a quick try with one docker command.
[!NOTE] This
docker runcommand starts a minimal version of Journiv. Media files can be uploaded, but images, videos, and audio will stay at Processing and will not appear in entries without a Redis/Valkey broker and a Celery worker. Import and export jobs also require the worker. For these features, use the complete Docker Compose file.
Docker Run
docker run -d \
--name journiv \
-p 8000:8000 \
-e SECRET_KEY=your-secret-key-here \
-e DOMAIN_NAME=192.168.1.1 \
-e ALLOW_INSECURE_COOKIE_AUTH_OVER_HTTP=true \
-v journiv_data:/data \
--restart unless-stopped \
swalabtech/journiv-app:latest
Access Journiv: Open http://192.168.1.1:8000 (replace with your server IP) in your browser to try it out.
[!WARNING] The insecure HTTP opt-in above exists for isolated, trusted LANs only. HTTP exposes passwords and refresh cookies to interception by other devices on the network. Use
DOMAIN_SCHEME=httpsfor any internet-accessible or untrusted network deployment.
For complete installation guide see installation guide.
Web interfaces
The production container serves both compiled frontends from the same FastAPI origin and public port:
/ React frontend (primary)
/legacy/ Flutter frontend (temporary legacy interface)
/api/v1/* FastAPI API
/pub/* Public publishing routes
/docs FastAPI docs when enabled
/openapi.json FastAPI OpenAPI schema
React is the default Journiv interface from this release onward. The Flutter
interface remains available temporarily at /legacy/ for users who need to
switch back during the transition and may be removed in a future release.
Upgrades from versions where Flutter owned / are handled by a narrowly scoped
retirement worker at /flutter_service_worker.js. It replaces only the old
root Flutter worker, removes the standard flutter-app-* caches, unregisters
itself, and reloads a controlled window. React also performs a one-time check
for that exact root registration. Other service-worker registrations are left
untouched, preserving a path for future React PWA support.
Demo
Want to just try a demo? (Thanks to JasonFieldz for hosting a demo instance).
- Username: [email protected]
- Password: Demo1234
Documentation
Read the docs to learn more about Journiv and configuring it.
Contributing
Contributions are welcome! Please see CONTRIBUTING.md and LICENSE for guidelines.
License
This project is licensed under the terms specified in the LICENSE file.
Support
Need help or want to report an issue?
- GitHub Issues: Report bugs or request features
- Discussions: Ask questions and share ideas
- Email: [email protected]
- Discord: Join our community server
Disclaimer
AI-Assisted Development
Journiv is a personal source avaliable project developed outside of my full-time work as a software engineer. It grew out of a need I had for many years for a capable, private, self-hosted journaling application. I could not find an existing option that matched what I wanted, so Journiv started as a project to build one.
AI-powered software development tools have made it practical for me to develop and maintain a project of this scope in the limited time available outside of work. Without these tools, I realistically would not have the time to build many of the features and experiences that Journiv provides today.
AI assistance has been used most extensively in the development of the latest React frontend (V2), including implementation, refactoring, testing, code review assistance, and documentation. Other parts of the repository also contains portions of code, documentation, or text generated with the assistance of AI/LLM tools.
AI tools are used as development aids, while product requirements, architecture, design decisions, and release decisions remain human-directed.
The level of manual review varies by area of the codebase. Backend changes are generally read and reviewed at the code level, with an understanding of the Python implementation and surrounding application behavior. For the React frontend, review is more heavily focused on the resulting user experience and application behavior through hands-on UI testing, automated tests, and targeted inspection of the generated code rather than a line-by-line review of every change.
AI-assisted contributions are refined, tested, and iterated on as part of the normal development process, with the goal of meeting the same functional, maintainability, security, and quality expectations as the rest of the project.
AI use during development is separate from Journiv's runtime behavior. Journiv does not require an LLM service in order to run, and the use of AI coding tools during development does not cause journal entries or other private user content to be sent to an AI provider.
Journiv recognizes that people have different preferences and comfort levels around AI-assisted software development. This disclosure is intended to be clear about how Journiv is built so that users and contributors can make an informed decision about whether the project is right for them.