notes, measured and searchable

Raw text in.Memory out.

blk/txt reads the notes you already write, then reads them back in the app without being asked. The letter names which subjects went quiet or appeared for the first time, which numbers moved, which loose ends opened, and which subjects carried from the week before. A statement in a note, such as a 30-day count of INC-9021, shows its current value and opens onto the blocks behind it. Sort by date, length, or structure. Click a word for its offline definition, and your files stay the source of truth.

0 lock-in: plain text in, plain text out 1 derived index, always rebuildable 11 built-in entity types, plus your own A letter in the app, with an archive of saved letters 19.8:1 primary body-text contrast; WCAG AAA requires 7:1
~/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

Notes and logs, one index.

Text goes in, and a rebuildable index comes out. An access log can sit in that index beside the notes, rolled up by the hour. Your files stay where they are, and they remain the source of truth.

Source

Raw text.

Dated blocks in any .txt / .md / .log. Your files never move, and they stay the source of truth. Access logs (Apache or nginx), syslog, and JSON lines can sit beside them, rolled up by the hour.

Parse

Extract entities.

Rules you control pull typed entities out of the prose: tickets, tags, mentions, metrics. You can mark a counterexample, such as "this is not a ticket", and preview what a change would match before you save it.

Compile

Into an index.

One index holds full-text search, duplicate detection, and a record of each ingest. Delete it and rebuild it from your files any time.

Lens

Explore it.

Search, timelines, heatmaps, and metric charts, through web, CLI, JSON API, and mobile. You read the letter in the app, and saved copies stay in an archive.

typed extraction

Teach the type, then test it.

blk/txt ships knowing dates, tickets, tags, mentions, environments, and URLs. You teach a further type, a counterexample such as "this is not a ticket", and which sources a type may match. A preview shows what a change would match across your whole history before you save it, and taught examples stay as tests a later change must pass. Each type keeps one mark, the same mark in search, on a timeline, and on a chart. A note that only says the thing broke again, with no ticket or host in it, has nothing for a later search to retrieve.

01Date 19/07/2026 Header or ISO. Starts a block.
02Ticket TICK-1842 Your ID scheme, your rule.
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 a metric and the numbers become a series.
08+ Your own DEAL-0042 Teach a type, including what a value is not.
Start from a preset: incidents research support journal then adjust the rules. Export that teaching as a file with no note content, or import someone else's after a preview.
the lens

Patterns, with the history of each value.

Search years of notes, then follow the entities, dates, and metrics that connect them. The latest recorded value of a reading keeps every change, and a phrase such as try, deployed, or reverted suggests a label you confirm. Those labels only know the phrases you teach.

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
workaround shipped, added to on-call runbook
02/07/2026
first raised with @dana
metric series · latency

p95 latency, last 30 days

480 ms · p95, last 30 days

Latest recorded value, and every change since. A phrase such as try, deployed, or reverted suggests a label, which stays a suggestion until you confirm it.

the letter

Your notes, read back.

Quiet and first seen.

The letter names subjects that went quiet, and subjects that appeared for the first time. A subject that stays quiet is listed once, in the period it crosses the line, and a later week leaves it out while it stays quiet.

Numbers and loose ends.

It names which numbers moved, which loose ends opened, and which subjects carried from the week before. Every number opens onto the exact blocks behind it.

Saved in the app.

You read the letter in the app. Saved letters stay in an archive, newest period first, holding the numbers from the day you saved them.

A shared window.

Subjects listed together share a window. The letter never says one thing caused another.

in the writing

Statements, logs, and a file to hand on.

These sit in the notes you already write, or in a file built from them. Each one has a limit, named with it. None of them changes the text you stored.

Instruments

Live statements.

You write a live statement in double braces inside a note, such as {{ count ticket:INC-9021 in 30d }}, {{ last host:vpn.internal.example }}, or {{ latest p95 }}. Each one shows its current value and opens onto the blocks behind it. p95 has to be a metric you defined, and host has to be a type you track.

Loose ends

Still open.

A workaround, a TODO, or a note that says waiting on, with no later note that closes it, shows up with the opening block as evidence. Loose ends only know the phrases you teach: an opening such as temporary or TODO, and a closing such as done or resolved. A fix you described in other words stays off the list.

Logs

Logs beside notes.

Access logs (Apache or nginx), syslog, and JSON lines sit beside the notes and roll up by the hour into counts and the same entities. Each hour opens onto its raw lines, and a source that stops sending shows as no lines received since a date. Raw lines are kept for 30 days by default, and they are not stored as individual notes past that window.

Files

A file to hand on.

Export the types, aliases, metrics, and examples you taught as a file with no note content, and import someone else's only after a preview. You can also pick blocks and download one self-contained file anyone can open offline. That file carries the interpretation those blocks need, and each instrument's value is frozen when you build it.

the contract

Built to be left, so it's worth keeping.

Text is the truth

The database is derived, never authoritative. Your notes stay searchable files you own, and the index rebuilds from those files whenever you want. Anything you wrote here rather than in a file comes back the same way, through a Markdown export that reads straight back in. Hosted account? Export everything, JSON, CSV, or Markdown, any time. No lock-in either way.

Runs where you do

Browse in the web lens, pull the JSON API, or send text from another machine with an API token. Paste, drop a file, or point a script at it: the index is the same either way.

Private by default

The trial hands you a sandbox with no login, and it clears itself after 48 hours of inactivity. Every account's notes are isolated from every other, and everything exports to JSON, CSV, or Markdown whenever you ask.

Every answer is a query

No language model reads your notes. Every answer the app gives is a query you can run again yourself. The optional analysis that suggests key terms and similar notes runs where your notes already live, and never changes the source text.

Read back the notes
you already have.

Paste text you already have and read what it found: blocks, entities, metrics, and the patterns it noticed but has no rule for yet. Open a worked example and the trial opens on the letter those notes would produce, which you read in the app. The sandbox clears itself after 48 hours of inactivity.