A local-first, Markdown-based note-taking system with beautiful TUI and web clients.
cp .env.example .env
docker-compose up -d
# Access:
# - Web UI: http://localhost:3000
# - API: http://localhost:8080
cd tui-client
go build -o lumi
./lumi ../notes
Dependencies (optional for image support):
brew install timg # or chafa, or viu
Key Bindings:
hjkl - Navigate / move cursorenter - Open note / follow linkn - Create new noter - Rename noted - Delete noteD - Duplicate notev - Visual modey - Copy (in visual mode)t - Tree modal (file switcher)/ - Search modale - Edit in external editors/S - Horizontal/vertical splitesc - Go back / exit modeq - Quitcd server
LUMI_ROOT=../notes LUMI_PASSWORD=dev go run main.go
Or with Docker:
cd server
docker build -t lumi-server .
docker run -p 8080:8080 -v $(pwd)/../notes:/notes -e LUMI_PASSWORD=dev lumi-server
cd web-client
npm install
npm run dev
# Open http://localhost:5173
Features:
enter - Go to treej/k - Move cursorh - Go backl/enter - Open folder/noteesc - Clear searchhjkl - Move cursor0/$ - Start/end of lineg/G - Top/bottomv - Visual modey - Copy (in visual)enter - Follow [[link]]t - Tree modal/ - Search modals/S - Splitse - External editoresc - BackCtrl+F - Toggle filename/content searchj/k - Navigate resultsenter - Open noteesc - Closehjkl - Navigateenter - Open noteesc - CloseNavigation:
j/k - Move cursorenter - Open note/ - Focus searchesc - Clear searchFeatures:
GET /api/folders - List all folders
GET /api/notes - List all notes
GET /api/notes/:id - Get note by ID
POST /api/notes - Create note
PUT /api/notes/:id - Update note
DELETE /api/notes/:id - Delete note
WS /ws - WebSocket for updates
Include header: X-Lumi-Token: <your-token>
lumi/
āāā tui-client/ # Go TUI with Bubbletea
āāā server/ # Go HTTP + WebSocket server
āāā web-client/ # Svelte web app
āāā wiki/ # Documentation
āāā notes/ # Your notes (markdown files)
---
id: my-note-id
title: My Note Title
tags: [tag1, tag2]
created_at: 2026-02-16T10:00:00Z
updated_at: 2026-02-16T10:00:00Z
---
# My Note Title
Your content here with **markdown** formatting.
Link to other notes: [[other-note-id]]
v ā j/k ā y ā paste anywhere/ ā type ā entert ā type ā enterenters ā navigate to second noteMIT
Built with: