Raw text in.Memory out.
blk/txt reads the raw, dated, messy notes you already write: logs, tickets, journals. It compiles them into typed entities, timelines, and metrics you can search. Your files stay the source of truth.
Entity types: ticket, URL, environment, tag, mention, date, metric, and your own.
Four passes, one direction.
Nothing is locked in a database you can't leave. Text goes in one end; a rebuildable index and a browsable lens come out the other.
Raw text
Dated blocks in any .txt / .md / .log. Your files never move. They stay canonical on disk.
Extract entities
A regex dictionary you control pulls typed entities out of the prose: tickets, tags, mentions, metrics.
Into SQLite
One compiled index: content-hash dedup, full-text search, per-run provenance. Delete it and rebuild it any time.
Explore it
Search, timelines, heatmaps, and metric charts. The same data through web, CLI, JSON API, and mobile.
Everything worth tracking has a type.
blk/txt ships knowing dates, tickets, tags, mentions, environments, and URLs. Add numeric metrics with one line of config. One ink, one mark per type, the same mark everywhere it appears: badge, timeline, chart.
Once it's compiled, the patterns surface.
The index isn't the destination. It's what makes six years of notes answer a question in milliseconds.
Every day you wrote, at a glance.
TICK-1842
p95 latency, last 30 days
Built to be left, so it's worth keeping.
Text is the truth
The database is derived, never authoritative. Your notes stay grep-able files you own. rm notes.db and rebuild loses nothing.
Runs where you do
blktxt ingest from the terminal, browse in the web lens, pull the JSON API, or sync from anywhere with the push agent.
Private by default
Self-host it and there's no account at all — one file, nothing to sign into. Prefer not to run infrastructure? Use it hosted behind your own login: every account's notes are isolated from every other.
Point it at your notes.
Watch them compile.
Install the CLI, run one preset, and open the lens on text you already have.
# pick a shape, ingest, and serve $ blktxt init --preset incidents $ blktxt ingest ~/logs $ blktxt serve # http://127.0.0.1:5000