How it is kept
Plain files first. Each tab is a session, a folder named for the moment it began. Every app writes its own file of JSON Lines inside it, one event per line, and reading a session is reading them all in order of time. The database keeps a copy of the lines, never the other way round.
~/.innernet/history/
└ 2026-10-27T20-18-44Z_rzuoyf/
innernet.jsonl written here
notes.jsonl any other appA local Innernet writes this folder to ~/.innernet/history, with its copy in ~/.innernet/db. The demo keeps the same events in your browser, and for 30 days in its database.
One line, one event
A time, the app, a kind of event, and any fields it likes. Innernet writes visit, search, back and forward.
{"at":"2026-10-27T20:18:46Z","app":"innernet","kind":"visit","url":"/wiki/galileo","title":"galileo"}Add your own
Any app or script joins the newest session by appending to a file of its own name:
echo '{"at":"'$(date -u +%FT%TZ)'","app":"notes","kind":"edit","file":"todo.md"}' >> "$(ls -d ~/.innernet/history/*/ | tail -1)notes.jsonl"App names are lowercase letters, digits, - and _. Lines over 4 KB, and lines that are not JSON, are skipped.