a compiler for messy text

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.

0 lock-in: plain text in, plain text out 1 SQLite index, always rebuildable 5 built-in entity types, plus your own
~/journal/2026-07.md parsing
Chased TICK-1842 with @dana, prod tunnel to vpn.internal.example still dropping. #checkout latency 480ms, retested after INC-9021.
extracted … entity types
date
19/07/2026
ticket
TICK-1842INC-9021
mention
dana
environment
prod
url
vpn.internal.example
tag
checkout
metric
480 ms

Entity types: ticket, URL, environment, tag, mention, date, metric, and your own.

the pipeline

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.

Source

Raw text

Dated blocks in any .txt / .md / .log. Your files never move. They stay canonical on disk.

Parse

Extract entities

A regex dictionary you control pulls typed entities out of the prose: tickets, tags, mentions, metrics.

Compile

Into SQLite

One compiled index: content-hash dedup, full-text search, per-run provenance. Delete it and rebuild it any time.

Lens

Explore it

Search, timelines, heatmaps, and metric charts. The same data through web, CLI, JSON API, and mobile.

typed extraction

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.

01Date 19/07/2026 Header or ISO. Starts a block.
02Ticket TICK-1842 Your ID scheme, your regex.
03Tag #checkout Ad-hoc topics, out of the box.
04Mention @dana People, without an address book.
05Environment prod Where it happened.
06URL status.internal Links, made first-class.
07Metric 480 ms Name one in config and numbers become series.
08+ Your own DEAL-0042 Define any entity in config.
Start from a preset: incidents research support journal then bend the dictionary to your world.
the lens

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.

activity heatmap

Every day you wrote, at a glance.

lessmore
entity timeline

TICK-1842

19/07/2026
prod tunnel dropping, retested after INC-9021
11/07/2026
registry check added to reconns report
02/07/2026
first raised with @dana
metric series · latency

p95 latency, last 30 days

480 ms · p95, last 30 days
the contract

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.

zsh
# pick a shape, ingest, and serve
$ blktxt init --preset incidents
$ blktxt ingest ~/logs
$ blktxt serve  # http://127.0.0.1:5000