olai GitHub

a git-native outliner

olai

An outliner that lives in files you own.

Indent, check off, search. Markdown sits beside the outline. Git records every edit.

nix run github:juspay/olai -- web path/to/outlines

one directory. a browser. that’s the whole install.

A palm leaf drawn in ink on sea-glass paper, coral at the tips.
kitchen.olai
Kitchen renovation 2/4
Demolition
Pick the counter stone
Order the new cabinets #blocking5 days late
cabinets.md
Book the plumber
Paint samples on the north wall

Compared to Workflowy and Dynalist

Same outlining model — indent, move, mirror, check off. The difference is where the data lives.

Workflowy, Dynalistolai
StorageA hosted databasePlain files in a directory you choose
SyncTheir cloudgit, or anything that moves files
HistoryIn-app version historygit log
SearchKeyword, in their appFilter the page you’re on, or search the whole directory
SourceProprietaryOpen source (AGPL-3.0)

Outlines are ordinary files. The format spec is there if you want it.

What’s due

Dated work from every outline, on one page. Late things sit above today. A birthday isn’t a task — it stays on its day and never turns red. The calendar is a plugin.

/agenda · 2026-08-12

5 days ago · Fri, Aug 7

Order the new cabinets #blocking5 days late

Kitchen renovation

Today · Wed, Aug 12

Book the plumber

Kitchen renovation

Sat, Aug 15in 3 days

Template the countertop

Kitchen renovation

two quiet weeks

Fri, Aug 28in 2 weeks

Meet the tiler on site14:00

Kitchen renovation

A file named for the day — 2026-08-12.md, anywhere in the directory — is that day’s note. Open the day and the note is on top, with everything dated that day underneath it.

Weekly chores come back as a fresh row on the next date, so eleven Mondays are eleven rows, not one row whose date kept moving.

Stay on the page

The box above the outline hides what doesn’t match. A tag you click does the same. The address holds the query, so a narrowed page is a link you can send.

/house.olai?q=%23home+OR+alcove
kitchen remodel #home
order the new cabinets
…measure the alcove before ordering.
install the cabinets
pick the hinges #home

Matches stay where they live. Ancestors stay so a bare title still makes sense.

Done, last week, a quoted phrase — the rest of the query language is in the search docs.

Type like an outliner

Click a title to edit it in place. Enter makes the next line. Tab indents. The rest is the usual outliner muscle memory.

Entercommit, and open the next line
Enter mid-linesplit the row in two, there
Backspace at the startjoin this row onto the one above
Tab / Shift+Tabindent, or out again
Alt+Shift+/move a row among its siblings
+Ztake back your last edit here
+Entertick it off, or take that back
++Enterwalk the mark on: to do, then doing, then none
++Dduplicate the row, and everything under it
++Mmove it under a node you search for, anywhere
Shift+Enterwrite the note under it
Escdrop what you were typing

The full map — dragging, the palette, pins, the inbox — is in the editing docs.

How it looks

Ten palettes. Press a chip — this page follows.

reef leaf manuscript bloom sky chalk aurora pitch ember dusk
kitchen.olai · ember
Kitchen renovation 2/4
Demolition
Order the new cabinets #blocking2026-08-07
Book the plumber
kitchen.olai · bloom
Kitchen renovation 2/4
Demolition
Order the new cabinets #blocking2026-08-07
Book the plumber

An agent in the same notebook

Chat lives in a side panel. You keep the keyboard. The agent ticks boxes and rewrites the markdown, and you see it happen. Git records both of you.

chat
Book the plumber
plumber's booked — tick it off
marked done · Book the plumber
Book the plumbermarked done
kitchen.olai
Done. Marked “Book the plumber” as done.
the base units are carcass-only — say so in the doc
cabinets.md

cabinets.md+3−2

1 # Cabinet specs
⋯ 3 unchanged
6-- 600 mm base × 4
6+- 600 mm base × 4, carcass only
7+- filler strip × 2
8 - corner carousel × 1

+4 more lines

Added the carcass note and the filler strips.
kitchen.olai · live
Kitchen renovation 3/4
Order the new cabinets #blocking
Book the plumber

The page updates because the file on disk changed.

How to point an agent at a running olai is in the chat docs.

Plugins

The outline editor, the Markdown reader, the shell, chat, git, search — they are plugins. They show on one panel. Switch one off while olai is running; the rest keep going. The runtime is Cordis, a meta-framework of spatiotemporal composability. The paper is on arXiv.

plugins
chatOffOn
vaultOffOn
gitOffOn
journalOffOn

Switched off here. A restart brings it back.

searchOffOn
xyne-spacesOffOn

Off by default — --plugins=xyne-spaces starts it at boot.

A flip lasts until this process ends.

An agent can write one into your vault. You read the source on the panel and approve it. The worked example is a morning agenda: each morning it reads the day and puts it into the conversation. Read the morning agenda.

A serve starts with the default set. Add a row with --extra-plugins, drop one with --without-plugins, or name the exact set with --plugins. The Nix module has the same three. The rest is in the running docs.

PluginDefault
chatThe conversation: panel, transcript, agents.on
vaultThe directory. Switching it off clears served files.on
gitThe pill and the commit panel.on
searchThe box in the header, and the index behind it.on
identityWho is looking, as a chip in the bar.on
journalCalendar, today, the agenda.on
claudeClaude Code, the agent olai ships.on
codexCodex, also shipped.on
opencodeopencode, if it is on this machine.on
pipi, if it is on this machine.on
koluLive terminals from a running Kolu.on
oduCI on the board, from a running odu.on
xyne-spacesMirror the conversation into team chat.off
wsThe browser socket. Leave it on if you want a tab.on
mcpThe door agents dial.on
web-appThe browser build. Leave it on if you want a tab.on
ui-rendererThe tab’s Solid root.on
layoutThe frame, the header, the seats.on
sidebarThe directory column and the rail.on
preferencesHow it looks, from this browser.on
themePalette, typeface, size.on
plugin-inspectorThe panel itself.on
navigationAddresses, history, the palette.on
outlinesThe outline editor.on
markdownDocuments, and the files olai only shows.on
filesThe directory tree.on
pinsThe pinned shelf.on
captureThe inbox, and + in the palette.on
trashWhat you threw away.on
vault-pluginsPlugins an agent wrote into this vault.on

Every edit is a commit

Writes go to disk immediately. Commit from the panel when you’re ready — or turn on Auto-commit, and a quiet moment becomes one commit.

┌─ Changes ─────────────────────────────────┐
│ olai: Outlines as a collection done       │
│   · chat agent · 12m ago · 1a2b3c4        │
│                                           │
│ OUTLINES ─────────────────────────────    │
│ ☑ roadmap.olai                            │
│   ✓  Outlines as a collection    done     │
│   ✎  Notes: one state, same line  note    │
│   +  Kolu integration: auto-…    created  │
│                                           │
│ OTHER FILES ──────────────────────────    │
│ ☑ README.md                    modified   │
│ ☐ notes/scratch.md            untracked   │
│                                           │
│ 2 commits not on origin/master   [ Push ] │
│         [ Commit 3 changes · 1 file ]     │
└───────────────────────────────────────────┘

Commit messages start with olai, so the trail is easy to find. The rest is in the git docs.