{"id":44887555,"url":"https://github.com/fjrevoredo/mini-diarium","last_synced_at":"2026-06-28T00:01:07.682Z","repository":{"id":338361166,"uuid":"1157592286","full_name":"fjrevoredo/mini-diarium","owner":"fjrevoredo","description":"A local-only journal with serious encryption. Free, open source, and never touches the internet.","archived":false,"fork":false,"pushed_at":"2026-06-27T16:05:05.000Z","size":17983,"stargazers_count":278,"open_issues_count":4,"forks_count":18,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-06-27T18:05:49.561Z","etag":null,"topics":["journaling","open-source","privacy","privacy-tools","rust"],"latest_commit_sha":null,"homepage":"https://mini-diarium.com/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fjrevoredo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":"fjrevoredo","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":null}},"created_at":"2026-02-14T02:22:58.000Z","updated_at":"2026-06-27T15:57:25.000Z","dependencies_parsed_at":"2026-04-01T19:02:34.647Z","dependency_job_id":null,"html_url":"https://github.com/fjrevoredo/mini-diarium","commit_stats":null,"previous_names":["fjrevoredo/mini-diarium"],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/fjrevoredo/mini-diarium","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fjrevoredo%2Fmini-diarium","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fjrevoredo%2Fmini-diarium/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fjrevoredo%2Fmini-diarium/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fjrevoredo%2Fmini-diarium/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fjrevoredo","download_url":"https://codeload.github.com/fjrevoredo/mini-diarium/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fjrevoredo%2Fmini-diarium/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34872279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["journaling","open-source","privacy","privacy-tools","rust"],"created_at":"2026-02-17T18:05:33.229Z","updated_at":"2026-06-28T00:01:07.673Z","avatar_url":"https://github.com/fjrevoredo.png","language":"TypeScript","funding_links":["https://ko-fi.com/fjrevoredo"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"public/logo-transparent.svg\" alt=\"Mini Diarium\" width=\"128\" /\u003e\n\n# Mini Diarium\n\n**A local-only journal with serious encryption.**\nFree, open source, and never touches the internet.\n\n[![CI](https://github.com/fjrevoredo/mini-diarium/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/fjrevoredo/mini-diarium/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/fjrevoredo/mini-diarium/graph/badge.svg?token=0ABJIE0333)](https://codecov.io/gh/fjrevoredo/mini-diarium)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=fjrevoredo_mini-diarium\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=fjrevoredo_mini-diarium)\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Version](https://img.shields.io/badge/version-0.6.0-blue)](https://github.com/fjrevoredo/mini-diarium/releases)\n[![Platform](https://img.shields.io/badge/platform-Windows_%7C_macOS_%7C_Linux-lightgrey)](https://github.com/fjrevoredo/mini-diarium#download)\n[![Follow @MiniDiarium](https://img.shields.io/badge/Follow-%40MiniDiarium-000?logo=x\u0026logoColor=white)](https://x.com/MiniDiarium)\n[![Ko-fi](https://img.shields.io/badge/Ko--fi-Buy_me_a_coffee-ff5f5f?logo=kofi\u0026logoColor=white)](https://ko-fi.com/fjrevoredo)\n\n[![Tauri v2](https://img.shields.io/badge/Tauri_v2-24C8DB?logo=tauri\u0026logoColor=white)](https://tauri.app)\n[![SolidJS](https://img.shields.io/badge/SolidJS-2C4F7C?logo=solid\u0026logoColor=white)](https://solidjs.com)\n[![Rust](https://img.shields.io/badge/Rust-CE422B?logo=rust\u0026logoColor=white)](https://www.rust-lang.org)\n[![Flathub](https://img.shields.io/flathub/v/io.github.fjrevoredo.mini-diarium?logo=flathub\u0026logoColor=white\u0026label=Flathub)](https://flathub.org/apps/io.github.fjrevoredo.mini-diarium)\n\n[mini-diarium.com](https://mini-diarium.com) · [Download](#download) · [Documentation](https://mini-diarium.com/docs) · [Features](#features) · [Philosophy](PHILOSOPHY.md) · [Benchmarks](https://fjrevoredo.github.io/mini-diarium/benchmarks/)\n\n\u003cimg src=\"public/demo.gif\" alt=\"Demo\" width=\"768\" /\u003e\n\n## ☕ Support the Project\n\nMini Diarium is free, open source, and will always be. If you find it useful and want to support its development, consider buying me a coffee on Ko-fi. Every donation goes directly toward keeping this project alive and improving.\n\n\u003ca href=\"https://ko-fi.com/fjrevoredo\" target=\"_blank\"\u003e\n  \u003cimg src=\"https://storage.ko-fi.com/cdn/kofi2.png\" alt=\"Buy Me a Coffee on Ko-fi\" height=\"48\" /\u003e\n\u003c/a\u003e\n\n\u003c/div\u003e\n\n## Download\n\nDownload the latest release for your platform from [GitHub Releases](https://github.com/fjrevoredo/mini-diarium/releases).\n\nQuick install:\n\n- Windows (WinGet): `winget install fjrevoredo.MiniDiarium`\n- macOS (Homebrew): `brew tap fjrevoredo/mini-diarium` then `brew install --cask mini-diarium`\n- Linux (Flatpak): `flatpak install flathub io.github.fjrevoredo.mini-diarium`\n- NixOS / Nix (Flakes): `nix run github:fjrevoredo/mini-diarium`\n\nFor package formats, first-run notes (Gatekeeper / SmartScreen), and checksum verification, see [docs/INSTALLATION.md](docs/INSTALLATION.md).\n\n## Quick Start\n\n1. Launch Mini Diarium\n2. Create a password (this encrypts your journal; there is no recovery if forgotten)\n3. Write your first entry. It auto-saves as you type\n4. Navigate between days with `Ctrl+[` / `Ctrl+]` or click dates on the calendar\n5. Lock your journal when you're done\n\n## Background\n\nMini Diarium is a spiritual successor to [Mini Diary](https://github.com/samuelmeuli/mini-diary) by Samuel Meuli. I loved the original tool. It was simple, private, and did exactly what a journal app should do. Unfortunately, it's been unmaintained for years and its dependencies have aged out. I initially thought about forking it and modernizing the stack, but turned out impractical. So I started over from scratch, keeping the same core philosophy (encrypted, local-only, focused) while rebuilding completely with Tauri 2, SolidJS, and Rust. The result is a lighter, faster app with stronger encryption and a few personal touches.\n\n## Philosophy First\n\nMini Diarium is intentionally opinionated. The philosophy is not a side note, it is the product:\n\n- **Small, extensible core**: keep core responsibilities tight (encrypt, store, authenticate) and push extras to extension points\n- **Boring security**: use established algorithms and audited libraries, never custom crypto\n- **Local-only by design**: no cloud sync, no telemetry, no analytics, no hidden network behavior\n- **Easy in, easy out**: import from common formats and export in open formats to avoid lock-in\n- **Focused scope**: private journaling over feature sprawl\n- **Simplicity over cleverness**: fewer moving parts, smaller attack surface, easier maintenance\n\nRead the full principles and how these translates to the architecture in [PHILOSOPHY.md](PHILOSOPHY.md).\n\n\u003e [!NOTE]\n\u003e Mini Diarium uses AI tooling as leverage for human engineers, never as a replacement. Every change still passes through deliberate design, careful implementation, proper testing, and direct feedback. Responsibility, authorship, and final judgment remain human.\n\n## Features\n\n- **Key file authentication**: unlock your journal with an X25519 private key file instead of (or alongside) your password, like SSH keys for your journal. See [docs/KEY_FILE_AUTHENTICATION.md](docs/KEY_FILE_AUTHENTICATION.md).\n- **Local-only journals**: create journals that auto-unlock on your device (no password prompt) while still encrypting entries at rest.\n- **AES-256-GCM encryption**: all entries are encrypted with a random master key. Each auth method holds its own wrapped copy of that key, so adding or removing a method is O(1), with no re-encryption of your entries.\n- **Multiple journals**: keep separate journals for different purposes (personal, work, travel).\n- **Rich text editor**: including images.\n- **Tags**\n- **Multiple entries per day**: keep separate entries for the same date without merging them together\n- **Calendar navigation**\n- **Import**: Mini Diary JSON, Day One JSON/TXT, and jrnl JSON with additive imports that preserve separate same-date entries\n- **Export**: JSON for structural fidelity and Markdown for human-readable best-effort export\n- **Themes**\n- **Automatic backups**: backup on unlock with rotation\n- **Statistics**\n- **Preferences**: first day of week, future entries toggle, title visibility, spellcheck, auto-lock, password change, authentication method management\n- **Cross-platform**: Windows, macOS, and Linux\n- **Zero network access**: no telemetry, no analytics, no update checks\n\n## Documentation\n\n- Online user docs: https://mini-diarium.com/docs\n- Offline / GitHub user guide: [docs/USER_GUIDE.md](docs/USER_GUIDE.md)\n- Installation: [docs/INSTALLATION.md](docs/INSTALLATION.md)\n- Key file authentication: [docs/KEY_FILE_AUTHENTICATION.md](docs/KEY_FILE_AUTHENTICATION.md)\n- Architecture diagrams and flows: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)\n- Known issues / tradeoffs: [docs/KNOWN_ISSUES.md](docs/KNOWN_ISSUES.md)\n- Privacy: [docs/PRIVACY.md](docs/PRIVACY.md)\n- Security model + reporting: [SECURITY.md](SECURITY.md)\n- User plugins (Rhai): [docs/user-plugins/USER_PLUGIN_GUIDE.md](docs/user-plugins/USER_PLUGIN_GUIDE.md)\n\n## Architecture\n\nFor the diagrams and detailed data flows, see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).\n\n## Keyboard Shortcuts\n\n| Action         | Shortcut       |\n| -------------- | -------------- |\n| Previous Day   | `Ctrl+[`       |\n| Next Day       | `Ctrl+]`       |\n| Go to Today    | `Ctrl+T`       |\n| Go to Date     | `Ctrl+G`       |\n| Previous Month | `Ctrl+Shift+[` |\n| Next Month     | `Ctrl+Shift+]` |\n| Preferences    | `Ctrl+,`       |\n\nStatistics, Import, and Export are available via the Journal menu (no default keyboard accelerators).\n\nOn macOS, use `Cmd` instead of `Ctrl`.\n\n## Building from Source\n\n**Prerequisites:** Rust (see `rust-toolchain.toml`), Bun 1.x, and [Tauri v2 system dependencies](https://v2.tauri.app/start/prerequisites/).\n\nFor detailed platform-specific instructions (Linux package names, Fedora setup, Wayland troubleshooting), see [CONTRIBUTING.md](CONTRIBUTING.md).\n\n```bash\ngit clone https://github.com/fjrevoredo/mini-diarium.git\ncd mini-diarium\nbun install\nbun run tauri build\n```\n\nArtifacts will be in `src-tauri/target/release/bundle/`.\n\n## Tech Stack\n\n- [Tauri 2](https://v2.tauri.app/): desktop app framework (Rust backend, web frontend)\n- [SolidJS](https://www.solidjs.com/): reactive UI framework\n- [Rust](https://www.rust-lang.org/): backend logic, encryption, database\n  - `x25519-dalek`, `hkdf`, `sha2`: X25519 ECIES key wrapping for key file authentication\n- [SQLite](https://www.sqlite.org/): local encrypted database storage\n- [TipTap](https://tiptap.dev/): rich text editor\n- [UnoCSS](https://unocss.dev/): utility-first CSS\n- [Kobalte](https://kobalte.dev/): accessible UI primitives\n\n## Known Issues\n\nFor the full list of known limitations, deliberate tradeoffs, and technical debt, see [docs/KNOWN_ISSUES.md](docs/KNOWN_ISSUES.md).\n\n**User-facing highlights:**\n\n- Concurrent access to the same journal file is not supported (by design)\n- No password recovery — losing all credentials is permanent (by design)\n- Full-text search runs as an in-memory scan over decrypted entries (added back after the v0.2.0 FTS removal); nothing searchable is written to disk\n- Importing the same file twice creates duplicate entries (no deduplication)\n- Plugin changes require an app restart to take effect\n\n## Extending Mini Diarium\n\nYou can add local import/export extensions using Rhai scripts in your journal's `plugins/` folder.\nSee [docs/user-plugins/USER_PLUGIN_GUIDE.md](docs/user-plugins/USER_PLUGIN_GUIDE.md) for requirements, best practices, and a complete example plugin.\n\n## Performance Benchmarks\n\nCriterion benchmarks for the crypto and database hot paths are tracked on every push to `master` and published at **[fjrevoredo.github.io/mini-diarium/benchmarks/](https://fjrevoredo.github.io/mini-diarium/benchmarks/)**.\n\nThe page covers four areas: Argon2id key derivation (intentionally slow — ~200 ms to resist brute-force), AES-256-GCM encrypt/decrypt at three entry sizes, SQLite operations (insert, update, delete, date enumeration, full scan), and word-count calculation. Each card shows the latest timing and a Chart.js trend chart over the last 30 CI runs.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions, development workflow, and conventions.\nFor maintainers adding official plugins, see [docs/BUILTIN_PLUGIN_GUIDE.md](docs/BUILTIN_PLUGIN_GUIDE.md).\nFor maintainers changing frontend UI/state, the Rust backend, Tauri IPC boundary, WebView security, or CI, see [docs/best-practices](docs/best-practices/README.md).\n\n### Translations\n\nMini Diarium ships in the following languages:\n\n\u003c!-- supported-languages-start --\u003e\n- English\n- Spanish (Español)\n- German (Deutsch)\n- French (Français)\n- Hindi (हिन्दी)\n- Italian (Italiano)\n\u003c!-- supported-languages-end --\u003e\n\nIf you'd like to add support for another language, see [docs/TRANSLATIONS.md](docs/TRANSLATIONS.md) for instructions on creating a locale file and submitting a PR.\n\n## Releasing\n\nFor maintainers: See [docs/RELEASING.md](docs/RELEASING.md) for step-by-step release instructions.\n\n## Security\n\nSee [SECURITY.md](SECURITY.md) for the security model and how to report vulnerabilities.\n\n## License\n\nMini Diarium is licensed under the MIT License. See [LICENSE](LICENSE).\n\n## Credits\n\nMade with love by [Francisco J. Revoredo](https://github.com/fjrevoredo) (with a little help from Claude Code).\n\n## Contributors\n\nThanks to everyone who has contributed code, translations, or improvements to Mini Diarium:\n\n\u003ca href=\"https://github.com/jottyfan\"\u003e\u003cimg src=\"https://github.com/jottyfan.png?size=40\" width=\"40\" height=\"40\" alt=\"jottyfan\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Yujonpradhananga\"\u003e\u003cimg src=\"https://github.com/Yujonpradhananga.png?size=40\" width=\"40\" height=\"40\" alt=\"Yujonpradhananga\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/albanobattistella\"\u003e\u003cimg src=\"https://github.com/albanobattistella.png?size=40\" width=\"40\" height=\"40\" alt=\"albanobattistella\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/tyler274\"\u003e\u003cimg src=\"https://github.com/tyler274.png?size=40\" width=\"40\" height=\"40\" alt=\"tyler274\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/bronty13\"\u003e\u003cimg src=\"https://github.com/bronty13.png?size=40\" width=\"40\" height=\"40\" alt=\"bronty13\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/kenlacroix\"\u003e\u003cimg src=\"https://github.com/kenlacroix.png?size=40\" width=\"40\" height=\"40\" alt=\"kenlacroix\" /\u003e\u003c/a\u003e\n\n## Star History\n\n\u003ca href=\"https://www.star-history.com/?repos=fjrevoredo%2Fmini-diarium\u0026type=date\u0026legend=top-left\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/chart?repos=fjrevoredo/mini-diarium\u0026type=date\u0026theme=dark\u0026legend=top-left\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/chart?repos=fjrevoredo/mini-diarium\u0026type=date\u0026legend=top-left\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/chart?repos=fjrevoredo/mini-diarium\u0026type=date\u0026legend=top-left\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffjrevoredo%2Fmini-diarium","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffjrevoredo%2Fmini-diarium","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffjrevoredo%2Fmini-diarium/lists"}