Skip to content
MemloreAppPublic

About

A little life. A lasting story. A cross-platform, privacy-first, local-first journal — with rich, optional AI.

Topics

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Latest commit

 

History

375 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Memlore logo

Memlore

A little life. A lasting story.
A cross-platform, privacy-first, local-first journal — with rich, optional AI.

Website · Download for Mac · Web version · Live demo · Intro Video

Warning

Memlore is under active development. What is here today is reasonably stable, with a lot more still to come. Current focus is the desktop macOS app and the web version; Windows, Linux, iOS, and Android are planned.

Memlore: A little life. A lasting story.

✨ Features

  • Local-first & private — works fully offline. Your journal stays on your device. No Memlore server, no account, no telemetry.
  • Rich editor — write with markdown shortcuts, then add plugins for anything: math, code, tables, checklists, media, and more.
  • Find anything — instant search, tags, favorites, calendar, and On This Day lookback.
  • Media & places — photos, video, voice memos, a media gallery, and a locations map.
  • AI, when you want it — a rich set of optional AI tools over your journal. Bring your own provider or run models on-device. Off until you opt in.
  • MCP server — opt in to let desktop MCP clients search, read, create and append entries on your machine, so you can journal from the AI app you already use. Local only, off by default, and no AI provider required.
  • Sync you control — encrypted sync over your own Google Drive or iCloud Drive, with more services coming. Recover across devices, see who is connected, and revoke any of them.
  • Locks — lock the app with a password or Touch ID. Second lock hides chosen entries behind an extra password. Invisible lock keeps separate vaults that vanish until you enter the right password.
  • Import & export — import from Day One, Journey, Apple Journal, markdown, and more; export to files.
  • Yours to look at — UI and layout are highly customizable, with different design systems and layouts to choose from.

💻 Platforms

macOS (desktop) is the primary supported target today. Windows, Linux, iOS, and Android are planned.

🌐 Memlore Web

Memlore Web (web.memlore.app) is an in-browser companion to the desktop app. It allows reading, searching, and writing entries from any modern browser by connecting directly to your Google Drive appDataFolder without any Memlore intermediary server.

  • Zero-knowledge: Master encryption keys are handled in WebAssembly memory and never leave the browser.
  • Safety first: Uses an outbox intent model (OutboxEntryV1) — the web never mutates sync manifests directly; desktop imports and merges all changes with CRDT conflict resolution.
  • Onboarding: Opens an existing desktop vault using your Google account and 24-word recovery phrase.
  • Documentation: See the Web companion guide and Privacy Policy.

🛠️ Tech stack

Layer Technology
App Tauri 2 (Rust) + React 19 + TypeScript + Vite
Web React 19 + WebAssembly (Rust memlore-wasm) + IndexedDB + Cloudflare Worker
UI Tailwind CSS v4, Zustand, i18next, Leaflet, Recharts
Editor TipTap + Yjs (CRDT)
Data SQLite / SQLCipher, FTS5
Crypto AES-256-GCM, Argon2id
Sync Yjs over iCloud Drive / Google Drive
AI HTTP providers + opt-in on-device embedding (fastembed) and llama-server sidecar

🚀 Development

Prerequisites: Rust 1.88+, Node.js 20+, pnpm 9+, and the Tauri prerequisites for your OS. VS Code: install the recommended extensions when prompted (format-on-save + ESLint).

mockup/ is the in-browser preview of the Tauri app UI (mocked backend). website/ is the public marketing site and interactive demo at memlore.app. web/ is the production Web companion app.

pnpm install
pnpm tauri dev                    # native app
# MEMLORE_REACT_DEVTOOLS=1 pnpm tauri dev   # optional, after `npx react-devtools`

# web companion (web/) — first time: create workers/web-auth/.dev.vars,
# see CONTRIBUTING.md → "Run it locally". Each web:local runs the OAuth Worker too.
pnpm web:local                    # hot reload on http://localhost:5176 (no CSP)
pnpm web:local --prod             # production bundle + headers on http://localhost:5176
pnpm web:test                     # web companion test suite

pnpm mockup:dev                   # app UI preview (mockup/) — http://localhost:5175
pnpm mockup:build && pnpm mockup:preview

pnpm website:dev                  # marketing site (website/) — http://localhost:5177
pnpm website:build && pnpm website:preview

pnpm test                         # frontend
cd src-tauri && cargo test        # backend
pnpm lint && pnpm format:check

pnpm tauri build --no-sign        # current platform (see CONTRIBUTING.md)

Cargo build cache

A debug target on macOS grows past 10 GB. The dev profile in src-tauri/Cargo.toml keeps a fresh build small. To share that cache, ~/.cargo/config.toml is created once per machine and stays outside git. Cargo does not expand ~; the path below is ~/.cargo/shared-target:

[build]
target-dir = ".cargo/shared-target"

[profile.dev]
opt-level = 1
split-debuginfo = "off"

[profile.dev.package."*"]
debug = "line-tables-only"
incremental = false

Keep that profile identical to src-tauri/Cargo.toml. After the config is in place, delete this repo's old src-tauri/target — cargo clean no longer sees it. pnpm tauri dev and cargo test use the shared directory. pnpm tauri build still writes src-tauri/target. Why these flags are set is in CONTRIBUTING.md.

Optional .env (copy .env.example): Google Drive OAuth and MapKit JS.

📦 Releasing

Releases are cut with /cf-ship, a custom guide for Coding Friend — an AI coding assistant toolkit of skills, agents and hooks. Its skills live in .coding-friend/skills/ and are version-controlled so the release procedure travels with the repo (.coding-friend/config.json stays local).

.coding-friend/skills/cf-ship-custom/ holds that procedure:

File What it does
README.md Usage guide — which command for which situation, and what to check when a release misbehaves
SKILL.md The contract the assistant follows, loaded on demand
scripts/bump-info.sh Reads commits since the last published tag, names the release state, and computes the next version. Writes nothing
scripts/bump.sh Writes the version into package.json, tauri.conf.json, Cargo.toml and Cargo.lock, then verifies all four agree
scripts/release-mac-local.sh Builds, signs, notarizes and verifies the universal .dmg on this Mac, then publishes the GitHub Release
scripts/deploy-web-local.sh Builds the web companion and deploys it to Cloudflare Pages (+ the Worker when it changed)

Memlore ships two platforms, each with its own version and tags:

Platform Ship with Version file Tag Built by (default: this Mac) With --cloud
Desktop app (macOS) /cf-ship --mac src-tauri/tauri.conf.json v0.2.1 release-mac-local.sh: signed, notarized .dmg release.yml
Web companion (web.memlore.app) /cf-ship --web web/version.json web-v0.1.0 deploy-web-local.sh: Cloudflare Pages (+ Worker) deploy-web.yml

/cf-ship --all ships every platform that has changes; plain /cf-ship asks which one. /cf-ship builds and publishes locally by default, from the tag commit, with release-mac-local.sh / deploy-web-local.sh; --cloud dispatches the GitHub workflow on the tag instead. Pushing a tag triggers nothing, and the web is never deployed by hand from a branch. Releases are stable only: prereleases are discontinued, and --rc / --beta are rejected. Changes under website/, mockup/, docs/ and e2e/ never drive a version bump. See .github/release-setup.md for the local release materials and the signing and notarization secrets the desktop build needs. Locally the web deploys with wrangler login; --cloud needs the CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID repository secrets.

🔄 Reset local state

# Quit the app first
./scripts/reset-machine.sh           # interactive
./scripts/reset-machine.sh --force   # non-interactive local wipe

Wipes the app data dir, Keychain biometric key, and WebView caches. Cloud appdata (Google Drive hidden folder, iCloud) is not deleted automatically — disconnect or wipe from the app / provider UI if you need a clean cloud too.

Need demo data: Settings → Data → Import → Seed demo data.

🤝 Contributing

See CONTRIBUTING.md.

🙏 Credits

The website/ landing page visual style is adapted from TablePro Web.

📄 License

Memlore is licensed under AGPL-3.0-or-later.

About

A little life. A lasting story. A cross-platform, privacy-first, local-first journal — with rich, optional AI.

Topics

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages