Zelium is a self-hostable personal knowledge base and note-taking app for Markdown vaults.
- Web UI only.
- One or more Markdown root folders passed at startup with
VAULT_DIRor semicolon-separatedVAULT_DIRS. - No in-app authentication. Put Zelium behind Caddy HTTP Basic Auth or another trusted reverse proxy.
- Markdown files remain the only content storage format.
- YAML frontmatter is shown as a collapsed, editable block.
- Page editing autosaves as you type.
- File operations: create, rename, move, delete pages and folders.
npm install
npm run build
HOST=127.0.0.1 PORT=3000 VAULT_DIR=/path/to/markdown-vault npm startOpen http://127.0.0.1:3000.
Multiple vault roots:
HOST=127.0.0.1 PORT=3000 VAULT_DIRS="/path/to/vault-a;/path/to/vault-b" npm startVAULT_DIRS wins over VAULT_DIR when both are set.
Run the API/static backend and the Vite UI dev server separately:
# terminal 1: vault API on http://127.0.0.1:3000
HOST=127.0.0.1 PORT=3000 VAULT_DIR=tests/fixtures/vault-a npm start
# terminal 2: Vite UI on http://127.0.0.1:5173
npm run devThe Vite dev server proxies /api to http://127.0.0.1:3000.
npm run build && npm start serves the built Svelte UI and the vault API from the Fastify backend. Bind it to loopback and put authentication in front of it:
npm run build
HOST=127.0.0.1 PORT=3000 VAULT_DIR=/srv/zelium/vault npm startZelium V1 has no built-in authentication. Never expose it directly to the public internet.
See docs/deployment.md for Caddy Basic Auth deployment notes.
npm run test:unit
npm run test:e2e
npm run test
npm run build
npm run test:e2e:prodTests use fixture vaults under tests/fixtures. The final live Codex smoke test, when run, must be read-only against ~/.hermes/codex.
Version 1 uses a TypeScript/Svelte web client and a small TypeScript Fastify server. The client/server boundary is deliberately thin so a future Tauri mobile/desktop shell can reuse the same UI and replace the HTTP vault adapter with local filesystem commands without Electron.
See docs/plans/2026-05-31-zelium-v1.md.