Your notes. Your files. Your server.
openvlt.com
Self-hosted, open-source notes app built on plain markdown files.
Think Obsidian meets Apple Notes. But you own everything. No Sync Conflicts.
We've all been there. Apple Notes silently corrupts an attachment and you don't notice until you need it. Obsidian's sync creates duplicate conflict files that quietly overwrite your edits. Notion goes down and your entire workspace is unreachable. Your notes deserve better than this.
openvlt was built out of frustration with tools that treat your data as their product:
- Your notes are real
.mdfiles on your filesystem. Browse them in Finder, edit with Vim, back up with rsync. No proprietary database sitting between you and your words. - No sync conflicts. openvlt uses three-way merge with vector clocks. When conflicts do happen, you see both versions and choose. Nothing gets silently overwritten or duplicated.
- No cloud dependency. Runs on your machine or your VPS. Your notes never pass through someone else's servers. If openvlt disappears tomorrow, your files are still right there on disk.
- Attachments that don't corrupt. Files are stored alongside your notes as regular files on your filesystem. No re-encoding, no compression, no database blobs. What you put in is exactly what you get out.
- No vendor lock-in. Every note is a plain markdown file. Walk away anytime with all your data intact, no export tool needed.
curl -fsSL https://openvlt.com/install.sh | bashThat's it. This will:
- Install Node.js, bun, and pm2 (if not present)
- Clone and build openvlt to
~/.openvlt/app/ - Start the server on port 3456
- Configure auto-restart on crash and reboot
Then open http://localhost:3456 and create your account.
After installation, the openvlt command is available globally:
openvlt start # Start the server (default port 3456)
openvlt start 8080 # Start on a custom port
openvlt stop # Stop the server
openvlt restart # Restart the server
openvlt status # Show status + check for updates
openvlt update # Pull latest, rebuild, restart
openvlt logs # Show recent logs
openvlt logs -f # Follow logs in real-time
openvlt uninstall # Remove openvlt (keeps your notes)Your Filesystem openvlt
────────────── ────────
~/Documents/Notes/ ← You choose the vault directory
├── meeting-notes.md ← Real markdown files
├── project/
│ ├── roadmap.md
│ └── ideas.md
└── attachments/
└── screenshot.png
~/.openvlt/
├── app/ ← Application files
└── data/.openvlt/openvlt.db ← Metadata & search index only
(never stores note content)
Notes are always plain markdown files on disk. SQLite handles metadata, search indexing, and sessions, but never note content. Delete the database and your notes are still there.
git clone https://github.com/ericvaish/openvlt.git
cd openvlt
bun install
bun run build
bun run start # Starts on port 3456bun install
bun run dev # Dev server with Turbopack → localhost:3000
bun run lint # ESLint
bun run format # Prettier
bun run typecheck # TypeScript checksFor server/VPS deployments:
docker compose up -dData is stored in ./data/ on the host via bind mount. Server runs on port 3456.
Note: In Docker mode, all vaults live under the mounted
./data/directory. For full filesystem access (choose any directory as a vault), use the native install.
| Layer | Technology |
|---|---|
| Frontend | React 19, Next.js 16 (App Router, Turbopack) |
| Backend | Next.js API routes, Node.js |
| Database | SQLite via better-sqlite3 (WAL mode, FTS5) |
| Editor | TipTap + tiptap-markdown |
| UI | shadcn/ui, Tailwind CSS v4, Lucide icons |
| Auth | bcryptjs + WebAuthn + recovery keys |
| Package Manager | bun |
| Process Manager | pm2 |
| Variable | Default | Description |
|---|---|---|
PORT |
3456 |
Server port |
openvlt_DB_PATH |
data/.openvlt/openvlt.db |
SQLite database path |
WEBAUTHN_ORIGIN |
http://localhost:3456 |
WebAuthn origin |
WEBAUTHN_RP_ID |
localhost |
WebAuthn relying party ID |
PRs are welcome.
Built for people who believe their notes should outlive any app.
