An outliner with a clean web interface, shipped as a single binary.
Built with plain Go + plain JavaScript, embedded frontend assets, and SQLite.
- Local-only demo (no backend required): https://sri.github.io/orgline/index.html
- Fast hierarchical outlining with keyboard-first workflows.
- Collapsible tree with persisted open/closed state.
- Inline editing with contenteditable and server persistence.
- Single-binary deployment (frontend embedded with
go:embed).
- Go
1.26(standard library-first backend) - Plain JavaScript (
internal/frontend/static/index.html) for the UI - SQLite 3 (via
modernc.org/sqlite) - In-house SQL migration runner (
internal/db/migrate)
just devThen open http://localhost:8080.
just dev: run dev supervisor (watch + restart + browser auto-reload support)just loadtest: run dev withShakespeare.dbjust prod: build./bin/orgline(single deployable binary)
- Outline model:
uuid,created_at,updated_at,body, ordered children,is_open,is_favorite. - Tree controls: expand all, collapse all, expand one more level.
- Zoom mode per item (
?item_id=<uuid>) with back-to-all and go-to-parent links. - Favorites:
- per-item toggle via heart in item tools
- top-bar favorites filter
- Search:
- client-side filtering after minimum query length
- match highlighting in item body
- temporary path expansion to show matching lineage
- Selection and editing:
- drag selection across rows
- Shift+Up / Shift+Down range selection
- multi-select delete/tab operations
- in-memory undo stack (including multi-item delete restore)
- Local mode for static demo use without backend API calls.
- Theme system with runtime switcher:
default,dark,matrix,ocean,solar,graphite- persisted in
localStoragekeyorgline-theme
Enter: create new item (context-aware sibling/child behavior)Shift+Enter: newline in current itemTab: indentShift+Tab: outdentBackspace/Deleteon empty item: delete itemArrowUp/ArrowDown: navigate visible itemsShift+ArrowUp/Shift+ArrowDown: grow/shrink range selection
GET /api/helloGET /api/itemsPOST /api/itemsPOST /api/items/{uuid}/childPATCH /api/items/{uuid}DELETE /api/items/{uuid}PATCH /api/items/{uuid}/open-statePATCH /api/items/{uuid}/favorite-statePOST /api/items/{uuid}/enterPOST /api/items/{uuid}/indentPOST /api/items/{uuid}/outdentPOST /api/items/{uuid}/moveGET /api/dev/build(dev mode only)
Flags (with matching env vars):
-port(ORGLINE_PORT) default8080-addr(ORGLINE_ADDR) full listen address (overrides-port)-db-path(ORGLINE_DB_PATH) defaultorgline.db-read-header-timeout(ORGLINE_READ_HEADER_TIMEOUT) default5s-read-timeout(ORGLINE_READ_TIMEOUT) default15s-write-timeout(ORGLINE_WRITE_TIMEOUT) default15s-idle-timeout(ORGLINE_IDLE_TIMEOUT) default60s
Example:
./bin/orgline -port 9090 -db-path /var/lib/orgline/orgline.dborglinecurrently has no built-in login, authentication, or authorization.- Run it on
localhostfor personal use, or behind a protected private network. - Do not expose it directly to the public internet without adding your own auth and network controls.

