One place for everything worth saving. On your machine. Free.
A personal space for saving links, files, notes, and videos. No cloud, no subscriptions, no API keys.
Articles in bookmarks you'll never re-read. Notes scattered across 4 apps. PDFs buried in Downloads. YouTube videos you meant to summarise. Screenshots you can't find.
openMemo brings it all together. One place to capture, organise, and actually use everything you save.
| π Articles | π¬ Videos | π Notes |
| π Links | πΈ Images | π Files |
| ποΈ Audio | π Reports | πΌοΈ Screenshots |
Drop a PDF. Paste a URL. Jot a quick note. Record a voice memo. The Chrome Extension captures any webpage in one click. On your phone, share any post to your private Telegram bot and it lands in openMemo by itself.
Record a voice memo straight from your mic, or drop in any audio file (lossless WAV and FLAC included). Play it from a now-playing player in the sidebar that follows you across the app. Every recording and upload transcribes on your own machine with faster-whisper, in dozens of languages, on your GPU or CPU. The transcript becomes searchable text, so you can find and ask about what you said.
Get the transcript of any video without losing the video. One click pulls the source's own captions (YouTube, Vimeo, and any host yt-dlp supports), instant and no download, and falls back to local Whisper speech-to-text when a host has none. The video keeps playing inline while the timestamped transcript fills its tab, fully searchable and ask-able. Then summarise it three ways: a Timestamp outline of the talk, Key Insights bullets, or a flowing Essay, each generated on demand by your local Ollama model.
Point it at any video or audio link (YouTube, Vimeo, podcast hosts, direct media files, anything yt-dlp can fetch) and openMemo pulls the media down and keeps it. A Memo survives the original being taken offline. Or convert a long video into an audio-only copy when you just want the podcast.
Organise Memos into themed collections with emoji icons and descriptions. Drag and drop cards directly into collections. Scope your AI chat to a single project or topic.
One-click save from any webpage. Site-specific extractors pull clean article text, video metadata, and source attribution automatically.
See a post worth keeping while you're out. Share it to your private Telegram bot and keep scrolling. openMemo polls Telegram from your machine, no VPN, no open ports, and files each link like a paste: photo, caption, thumbnail, AI tags. The bot replies with a receipt and buttons to re-file into any collection, or reply with a collection name and it moves. Your PC asleep? Messages queue on Telegram until it wakes. Instagram photo posts land as real image files, not embeds. Add your cookie file and they arrive full resolution, uncropped.
A full music page of its own. Paste a Spotify, Apple Music, or YouTube playlist and get it back as a real playlist: per-track downloads, lossless FLAC where the source allows, a play queue with OS media keys, and a now-playing player that follows you across the app. Voice notes and music live apart, each with their own dashboard filter.
Two computers, one library. Your Mac and your PC each hold everything, and both can write. Changes travel in both directions, so it stops mattering which machine you happen to be sat at.
No account. No cloud. Nothing in the middle. You pair them once with a 12 word code, or point a camera at a QR, and they find each other on your network from then on.
It does not shove 25 GB around. Your library's text is a few megabytes, and most of your media can be fetched again from where it came from. So the other machine pulls what you actually open, grabs your 20 most recent Memos up front, and fills in the rest quietly. Your laptop is usable in seconds instead of after a two hour progress bar. Notes, tags, transcripts and AI summaries all arrive as text, so joining a Mesh never re-runs Whisper or Ollama.
Spaces, collections, playlists and covers come across first. A Space showing up without its artwork looks broken. A track still downloading does not.
Nothing gets overwritten behind your back. Edit the same note on both machines and openMemo shows you both versions, says which device each came from, and keeps both by default. Every sync is written down with the reason it decided what it did, and any of them can be undone.
openMemo itself never goes online. Mesh runs on its own separate port that serves exactly one thing, the sync channel, and everything on the wire is encrypted with AES-256 and signed with a key only your two computers hold. Off by default, behind one toggle in Settings. While it is off it costs your install nothing at all.
Two switches, not one. Turning Mesh on lets you pair. A second switch, Reachable from your other computer, is what actually opens the port. Off, openMemo listens only to itself. That is deliberate: opening a port is a decision you make, not something an update does to you. Your 12 word code lives in your operating system's own vault, the keychain on a Mac and account level encryption on Windows.
Step by step for two machines, including from different networks: the pairing walkthrough. Design in ADR-024, full write-up in the handbook, and what it does before, during and after you switch it on in the security audit.
Group whole areas of your life. A Space bundles Memos and collections under one cover, one color, one name. Client work, home projects, research topics. Each Space gets its own page.
Semantic + Full-Text. ChromaDB finds things by meaning. SQLite FTS5 finds things by exact words. Combined, they surface what you need even when you can't describe it perfectly.
Every saved item is automatically processed in the background:
- Extracted: PDFs, DOCX, images, audio, and webpages parsed into clean text
- Embedded: Vectorised by your local Ollama embed model for semantic search
- Indexed: Added to FTS5 for instant keyword retrieval
Ask questions in plain language. Get answers grounded in your actual saved content, with citations back to the source Memos. One toggle switches between Memos (searches your library, cites what it used) and Chat (straight to the model, your data stays out of it). Live status while it thinks, streaming answers, scoped chat per memo or per collection. The whole retrieval flow is documented and locked in ADR-022.
| Cloud Tools | openMemo |
|---|---|
| Your data lives on their servers | β Your data lives on your machine |
| Monthly subscription fees | β Free forever. Open source. |
| Vendor lock-in, proprietary formats | β SQLite + markdown. Export anytime. |
| Closed-source black box AI | β You choose the model. Ollama runs locally. |
| Upload limits, usage caps | β No limits. Your hardware is the ceiling. |
| Privacy policy changes | β No policy. No tracking. No telemetry. |
| Sync means uploading to their servers | β Your devices talk to each other. Nothing in between. |
git clone https://github.com/izored/OpenMemo.git
cd OpenMemo
docker-compose up -dOpen http://localhost:8091. That's it.
openMemo also runs as a native Mac app. Its own window, Dock icon, βN, PIN
lock, no Docker and no browser. Everything Mac-specific lives under
macOS/; build and install guide in docs/MACOS.md.
- Ollama installed and running (ollama.ai)
- Pull the recommended models:
ollama pull nomic-embed-text-v2-moe # embeddings
ollama pull gemma4:e4b # chat + vision (fast, capable)Any Ollama chat model works. Pick yours in Settings β Local AI, or per conversation from the Ask composer. Full model guide in docs/ollama.md.
# Backend
cd backend
python -m venv .venv
.venv\Scripts\activate # Windows
pip install -r requirements.txt
uvicorn backend.main:app --reload --port 8000
# Frontend (new terminal)
cd frontend
npm install
npm run devOpen http://localhost:3000. See docs/INSTALL.md for the full guide, troubleshooting matrix, and Ollama setup for every platform.
| Layer | Technology |
|---|---|
| Frontend | React 19 + Vite + TypeScript (strict mode), custom token CSS system |
| State | Zustand + TanStack Query |
| Backend | FastAPI (async Python 3.12) |
| Vector DB | ChromaDB (local persistence) |
| Embeddings | Ollama (nomic embed models, async background queue) |
| LLM | Ollama (any model you choose) |
| Search | Hybrid: ChromaDB semantic + SQLite FTS5, re-ranked |
| Chat | Server-Sent Events (SSE) streaming |
| Database | SQLite (metadata) |
| Proxy | nginx (Docker production, single port 80) |
- Open
chrome://extensions - Enable Developer mode
- Click Load unpacked β select the
chrome-extension/folder - Click the openMemo icon to save any page
openmemo/
βββ backend/ # FastAPI Python backend
β βββ api/ # REST routes (memos, chat, ingest, search)
β βββ core/ # RAG, embeddings, extractors, transcription, localize
β βββ db/ # SQLAlchemy models, SQLite, FTS5
βββ frontend/ # React 19 + TypeScript + token CSS system
β βββ src/
β βββ components/ # UI components
β βββ pages/ # Route pages
β βββ stores/ # Zustand state
β βββ lib/ # API client, utilities
βββ chrome-extension/ # Manifest V3 browser extension
βββ docs/
β βββ INSTALL.md # Full installation & troubleshooting
β βββ ollama.md # Models, retrieval, context windows
β βββ DECISIONS.md # Architecture Decision Records
β βββ ADR-022-ASK-RAG.md # The locked Ask Memo / RAG flow
β βββ memo-card-visual-system.md # Card UI design reference
β βββ settings-and-appearance.md # Settings bento + live appearance panel
β βββ CHANGELOG.md # Release history
βββ docker-compose.yml
v3.0 (current): Music library with playlist import and lossless pulls, Spaces, Ask Memo with the Memos/Chat toggle and per-memo citations, native macOS app, mobile responsive pass, editable thumbnails, hidden section behind a passcode, cinematic onboarding Next: Transcript-synced playback, AI-suggested collections, similar Memos, multiple views (grid/list/board) Later: Multi-user workspaces, Notion/Obsidian import, PWA offline support, plugin system
See Specs/ROADMAP.md for the full roadmap, architectural findings, and contributor guide.
openMemo was my first serious attempt at building something useful for myself with AI.
It started with Kimi 2.6 Pro, then Claude Code (Opus 4.7 / Sonnet 4.6), and later Perplexity for quick fixes and release help.
Most of the code is AI-assisted, but not directionless. I knew what I wanted to build from the start, and used AI as a tool to steer execution, iterate faster, and explore solutions.
This project is also a learning record: a messy, practical discovery step into AI-powered software building.
Contributions are welcome. See CONTRIBUTING.md for setup, coding style, and PR guidelines.
- π Report a bug
- π‘ Request a feature
openMemo stands on the shoulders of incredible open-source projects: MDXEditor, Ollama, ChromaDB, faster-whisper, yt-dlp, TanStack Query, Zustand, Lucide, dnd-kit, FastAPI, React, Vite, Tailwind CSS.
AGPL 3.0. Free to use, modify, and self-host. Any derivative work or service must remain open source and share improvements back to the community, and must keep the credit: "Based on openMemo by DIR (dev.izo.red)". Full text in LICENSE, attribution terms in NOTICE, plain-English walkthrough in docs/LICENSE-EXPLAINED.md.