notes, measured and searchable

Keep writing notes. Build more from them.

blk/txt is a notes app that turns the dated notes and logs you already keep into searchable blocks, which you can also count and open. The same entries can rebuild a ticket's history or back up a summary with what you wrote. A week opens into its days and a day into its notes, and every count along the way opens onto the entries it was taken from. Importing your files leaves the originals as they were.

0proprietary formats: plain text in; JSON, CSV, or Markdown out
1search index, rebuildable from your source text
11built-in entity types, plus the ones you teach
19.8:1primary body-text contrast; WCAG AAA requires 7:1
week · 21 to 27 sepWeek 39
14 notes
mon 212
tue 224
4
09:12 · morningChased TICK-1842 with @dana, prod tunnel to vpn.internal.example still dropping.
11:40 · morningp95 now {{ latest p95 }}480 ms, and INC-9021 came up {{ count ticket:INC-9021 in 30d }}6 times this month.
16:05 · afternoonTODO remove the temporary retry once the tunnel holds.
agent · deploy-botRolled checkout to prod on 3 hosts.
wed 233
thu 241
fri 254
sat 260
sun 270
A week of notes shown as one block. Opening it lists the days, opening a day lists its notes, and the count on each block opens onto the notes it counts.
where it started

Dated work notes held a timeline, and I had not read it yet.

I wrote down what happened at work one dated entry at a time, with the ticket reference in the line. I wanted to search them. Then I found the same entries could rebuild a ticket's history, show an issue coming back, and back up a project summary with the entries behind it.

three things the notes heldFrom search to evidence
a · history

A ticket's history comes back in date order.

Every entry that names a ticket is listed with the sentence around it, so the timeline is already in what you wrote.

INC-9 › 6 days 11
b · recurrence

An issue that keeps returning shows its dates.

Counting how often a ticket or a phrase appears is a query over your entries, and the count opens onto the entries it counted.

last 30 days 6
c · evidence

A summary can carry the entries behind it.

You pick the entries and export them as one file that opens without an account, with the figures and their sources beside them.

summary › 9 entries 9
how it works

Your dated files become blocks you can search.

You keep writing dated plain text, and blk/txt splits it into blocks and picks out the identifiers in them. Access logs, syslog, and JSON lines can be imported beside your notes.

  1. 01 · source

    Your files stay the source.

    Dated blocks in any .txt, .md, or .log file are read where they are, and importing them leaves the files unchanged.

  2. 02 · parse

    Rules you can read find the entities.

    Tickets, tags, mentions, and metrics are picked out by rules you can change. Before you save a change, a preview shows which matches would change and says when the scan was cut short.

  3. 03 · index

    One index covers search and imports.

    You can search everything you imported and see what each import added or skipped. The search index can be rebuilt from your source text.

  4. 04 · read

    The same account on the web and your phone.

    Browse your notes in the web app and the mobile app, and connect your own tools through the JSON API.

~/journal/2026-07.mdparsing
Chased TICK-1842 with @dana, prod tunnel to vpn.internal.example still dropping. #checkout latency 480ms, retested after INC-9021.
found … entity types
date19/07/2026
ticketTICK-1842 INC-9021
mentiondana
environmentprod
tagcheckout
metric480 ms
One dated block from a journal file. The rules found six entity types in it without the text being changed.
typed entities

You teach each type what counts and what does not.

blk/txt recognises date headers and common identifiers such as ticket IDs, tags, mentions, environments, and web links. You can add your own types, mark a value as a false match, and preview the effect before you save. Lines you keep starting with the same word and a colon, in at least five blocks, are offered back with examples and counterexamples, and nothing is added unless you press add.

01Date19/07/2026A date on its own line dates the blocks that follow it.
02TicketTICK-1842You set the rule that matches your own ticket IDs.
03Tag#checkoutYou can use #checkout as a tag without setting up a rule.
04Mention@danaYou can follow @dana across your notes without an address book.
05EnvironmentprodYou can follow every mention of prod across your notes.
06URLstatus.internalWeb links become entities, and a separate rule can match bare hostnames.
07Metric480 msYou define how a number is recognised, and each block records its reading.
08Your ownDEAL-0042Teach a new type, including the values it should ignore.

Your taught examples are checked against every later change, and a change that would break one needs your confirmation. A note that only says "the thing broke again" can still be found by its words, but it gives blk/txt no identifier to connect it to the same problem elsewhere.

Start from the incidents research support journal or agents preset and adjust its rules. You can export what you taught as a file with no note content in it, and import someone else's after a preview.

blocks that open

A group of notes opens into the smaller groups inside it.

You can go from a count to the sentences behind it by opening blocks instead of writing a search. Notes that agents post from other machines land in the same account and open the same way. A quiet stretch also says how many of its days had no writing at all, so a gap in a subject is told apart from a gap in your notebook, and agent notes and logs do not count as writing.

four kinds of blockWays into your notes
a · days

Notes without a recorded time keep their date.

blk/txt never guesses an hour, so a view grouped by time of day lists them under "any time".

W39 › TUE 22 › ANY TIME 2
b · tickets

A ticket opens into the days it was mentioned.

INC-9021 opens into each day it appears, then into the notes from that day, and the counts along the way open onto their blocks.

INC-9021 › 6 days 11
c · agents

Each agent writes under its own token.

Agents on different machines post under tokens you can revoke. blk/txt groups their notes by agent and by day, and shows what two agents both touched on the same day.

agent · deploy-botRolled checkout to prod.
d · digest

A digest shows what the agents posted.

You can open a daily or weekly digest in the app, and a connected agent can check for open loose ends before it starts. A summary an agent supplies carries its name and stays out of every count.

in the writing

Live values and open loose ends come from the notes you write.

An instrument shows a live value inside a note, and the loose ends view lists work that was opened but never closed. You can also read hourly log summaries and hand selected blocks to someone else as one file.

01 · instruments

A statement in braces shows its current value.

Write {{ count ticket:INC-9021 in 30d }} or {{ latest p95 }} inside a note and it shows the current value, which opens onto the blocks behind it. The ticket type and the p95 metric have to be ones you track. Three forms return a set: {{ timeline ticket:INC-9021 }} opens into the days a ticket came up with the days you wrote nothing marked apart, and {{ open ticket:* }} lists tickets with an open loose end, up to 20 subjects. {{ rows #release show version, shipped }} builds a table from the lines you already start with version: or shipped:, and a block without one reads not written.

{{ latest p95 }}480 ms
02 · loose ends

Work with no closing note stays on a list.

A loose end starts with a phrase such as TODO or temporary next to a subject you track. It closes when a note dated later names that subject with a phrase such as done or resolved, or when you dismiss it. You can edit both lists of phrases, and a fix described in other words stays on the list. The note has to name a subject, the page says which rule it applied and how many recent blocks it read, and each item quotes the block that opened it.

temporary retry on prod since 22 Sep
03 · logs

Logs are summarised by the hour.

Each hour opens onto its raw lines while they are kept, and the summaries stay after the lines are removed. A source with no lines in the window you choose shows the date of its latest line.

Log lines per hour. 2312 log lines from 08:00 to 20:00 on Tue 22 Sep 2026. The busiest hour began at 11:00, with 412 lines. The counts are sample data. The bars show how many lines arrived, not what the lines said. 412 0 08 09 10 11 12 13 14 15 16 17 18 19 08:00: 120 log lines 09:00: 180 log lines 10:00: 320 log lines 11:00: 412 log lines 12:00: 250 log lines 13:00: 140 log lines 14:00: 90 log lines 15:00: 200 log lines 16:00: 280 log lines 17:00: 160 log lines 18:00: 100 log lines 19:00: 60 log lines
2312 log lines from 08:00 to 20:00 on Tue 22 Sep 2026. The busiest hour began at 11:00, with 412 lines. The counts are sample data. The bars show how many lines arrived, not what the lines said.
The numbers
HourLog lines
08:00 120
09:00 180
10:00 320
11:00 412
12:00 250
13:00 140
14:00 90
15:00 200
16:00 280
17:00 160
18:00 100
19:00 60
Total2312
04 · files

Selected blocks can be shared as one offline file.

Choose unlocked blocks and download one file that anyone can read without an account. Instrument values are frozen when you build it, and their links work when every supporting block is included.

the letter

A letter in the app reports what changed in your notes.

Each period's letter names what went quiet, what appeared for the first time, which numbers moved, and which loose ends opened, with a link from each item to the notes behind it.

letter · week 3921 to 27 September
went quietINC-714 last mentioned 26 Aug5
first seen#checkout on 22 Sep3
numbers movedp95 from 310 ms to 480 ms over 4 readings4
loose endstemporary retry on prod1
A sample letter for one week. Each of its four lines links to the blocks it was taken from: five for the quiet ticket, three for the new tag, four readings, and one open loose end.

A quiet subject is reported once.

By default a subject counts as quiet after 30 days without a mention. The letter names it in the period it first crosses that line and leaves it out while it stays quiet.

Saved letters keep their figures.

The archive lists the newest period first and keeps the figures saved for each one. Locking a source block removes its material from saved letters.

Listing things together makes no causal claim.

Subjects in one letter share a window, and the letter never says one thing caused another.

the lens

Follow a subject from one note to every note it shares.

Follow a tracked subject or a date to its related notes, or open a metric's readings. The value history shows the latest recorded reading and the changes before it. A line that starts with addresses:, reverses:, follows: or led to: and names a ticket records that relation as you wrote it, shown apart from notes that only mention the same ticket, which are labelled as not a cause. The file format page has the rule. In the app, every figure opens the blocks it counts and carries a caption, a table of its numbers, CSV and SVG export, and print and e-ink styles.

activity heatmap

How many blocks you recorded each day.

Blocks per day. 438 blocks from Mon 30 Mar 2026 to Sun 27 Sep 2026. The busiest week began Mon 22 Jun 2026, with 29 blocks. The counts are sample data. A square counts blocks rather than words, so a day with one long note fills the same as a day with one short note. In the app, every square opens the blocks it counts. Apr May Jun Jul Aug Sep Mon Wed Fri Mon 30 Mar 2026: 3 blocks Tue 31 Mar 2026: 2 blocks Wed 1 Apr 2026: 2 blocks Thu 2 Apr 2026: 4 blocks Fri 3 Apr 2026: 8 blocks Sat 4 Apr 2026: 0 blocks Sun 5 Apr 2026: 2 blocks Mon 6 Apr 2026: 8 blocks Tue 7 Apr 2026: 1 block Wed 8 Apr 2026: 2 blocks Thu 9 Apr 2026: 2 blocks Fri 10 Apr 2026: 5 blocks Sat 11 Apr 2026: 2 blocks Sun 12 Apr 2026: 1 block Mon 13 Apr 2026: 0 blocks Tue 14 Apr 2026: 0 blocks Wed 15 Apr 2026: 2 blocks Thu 16 Apr 2026: 4 blocks Fri 17 Apr 2026: 3 blocks Sat 18 Apr 2026: 0 blocks Sun 19 Apr 2026: 0 blocks Mon 20 Apr 2026: 3 blocks Tue 21 Apr 2026: 1 block Wed 22 Apr 2026: 6 blocks Thu 23 Apr 2026: 3 blocks Fri 24 Apr 2026: 2 blocks Sat 25 Apr 2026: 2 blocks Sun 26 Apr 2026: 0 blocks Mon 27 Apr 2026: 5 blocks Tue 28 Apr 2026: 3 blocks Wed 29 Apr 2026: 2 blocks Thu 30 Apr 2026: 2 blocks Fri 1 May 2026: 6 blocks Sat 2 May 2026: 0 blocks Sun 3 May 2026: 2 blocks Mon 4 May 2026: 5 blocks Tue 5 May 2026: 3 blocks Wed 6 May 2026: 1 block Thu 7 May 2026: 2 blocks Fri 8 May 2026: 8 blocks Sat 9 May 2026: 1 block Sun 10 May 2026: 0 blocks Mon 11 May 2026: 0 blocks Tue 12 May 2026: 6 blocks Wed 13 May 2026: 1 block Thu 14 May 2026: 3 blocks Fri 15 May 2026: 2 blocks Sat 16 May 2026: 0 blocks Sun 17 May 2026: 0 blocks Mon 18 May 2026: 1 block Tue 19 May 2026: 2 blocks Wed 20 May 2026: 5 blocks Thu 21 May 2026: 1 block Fri 22 May 2026: 3 blocks Sat 23 May 2026: 1 block Sun 24 May 2026: 2 blocks Mon 25 May 2026: 4 blocks Tue 26 May 2026: 2 blocks Wed 27 May 2026: 0 blocks Thu 28 May 2026: 3 blocks Fri 29 May 2026: 1 block Sat 30 May 2026: 2 blocks Sun 31 May 2026: 0 blocks Mon 1 Jun 2026: 4 blocks Tue 2 Jun 2026: 3 blocks Wed 3 Jun 2026: 3 blocks Thu 4 Jun 2026: 3 blocks Fri 5 Jun 2026: 2 blocks Sat 6 Jun 2026: 1 block Sun 7 Jun 2026: 0 blocks Mon 8 Jun 2026: 1 block Tue 9 Jun 2026: 4 blocks Wed 10 Jun 2026: 5 blocks Thu 11 Jun 2026: 0 blocks Fri 12 Jun 2026: 3 blocks Sat 13 Jun 2026: 0 blocks Sun 14 Jun 2026: 0 blocks Mon 15 Jun 2026: 5 blocks Tue 16 Jun 2026: 8 blocks Wed 17 Jun 2026: 6 blocks Thu 18 Jun 2026: 2 blocks Fri 19 Jun 2026: 1 block Sat 20 Jun 2026: 0 blocks Sun 21 Jun 2026: 1 block Mon 22 Jun 2026: 8 blocks Tue 23 Jun 2026: 8 blocks Wed 24 Jun 2026: 6 blocks Thu 25 Jun 2026: 2 blocks Fri 26 Jun 2026: 2 blocks Sat 27 Jun 2026: 2 blocks Sun 28 Jun 2026: 1 block Mon 29 Jun 2026: 0 blocks Tue 30 Jun 2026: 2 blocks Wed 1 Jul 2026: 1 block Thu 2 Jul 2026: 0 blocks Fri 3 Jul 2026: 6 blocks Sat 4 Jul 2026: 2 blocks Sun 5 Jul 2026: 0 blocks Mon 6 Jul 2026: 3 blocks Tue 7 Jul 2026: 4 blocks Wed 8 Jul 2026: 1 block Thu 9 Jul 2026: 2 blocks Fri 10 Jul 2026: 8 blocks Sat 11 Jul 2026: 0 blocks Sun 12 Jul 2026: 0 blocks Mon 13 Jul 2026: 4 blocks Tue 14 Jul 2026: 4 blocks Wed 15 Jul 2026: 2 blocks Thu 16 Jul 2026: 1 block Fri 17 Jul 2026: 0 blocks Sat 18 Jul 2026: 1 block Sun 19 Jul 2026: 0 blocks Mon 20 Jul 2026: 1 block Tue 21 Jul 2026: 6 blocks Wed 22 Jul 2026: 1 block Thu 23 Jul 2026: 5 blocks Fri 24 Jul 2026: 8 blocks Sat 25 Jul 2026: 0 blocks Sun 26 Jul 2026: 2 blocks Mon 27 Jul 2026: 8 blocks Tue 28 Jul 2026: 1 block Wed 29 Jul 2026: 5 blocks Thu 30 Jul 2026: 3 blocks Fri 31 Jul 2026: 3 blocks Sat 1 Aug 2026: 0 blocks Sun 2 Aug 2026: 0 blocks Mon 3 Aug 2026: 3 blocks Tue 4 Aug 2026: 4 blocks Wed 5 Aug 2026: 2 blocks Thu 6 Aug 2026: 2 blocks Fri 7 Aug 2026: 0 blocks Sat 8 Aug 2026: 1 block Sun 9 Aug 2026: 0 blocks Mon 10 Aug 2026: 4 blocks Tue 11 Aug 2026: 8 blocks Wed 12 Aug 2026: 1 block Thu 13 Aug 2026: 6 blocks Fri 14 Aug 2026: 3 blocks Sat 15 Aug 2026: 0 blocks Sun 16 Aug 2026: 0 blocks Mon 17 Aug 2026: 3 blocks Tue 18 Aug 2026: 8 blocks Wed 19 Aug 2026: 2 blocks Thu 20 Aug 2026: 5 blocks Fri 21 Aug 2026: 1 block Sat 22 Aug 2026: 0 blocks Sun 23 Aug 2026: 1 block Mon 24 Aug 2026: 3 blocks Tue 25 Aug 2026: 6 blocks Wed 26 Aug 2026: 0 blocks Thu 27 Aug 2026: 1 block Fri 28 Aug 2026: 1 block Sat 29 Aug 2026: 2 blocks Sun 30 Aug 2026: 0 blocks Mon 31 Aug 2026: 4 blocks Tue 1 Sep 2026: 2 blocks Wed 2 Sep 2026: 2 blocks Thu 3 Sep 2026: 3 blocks Fri 4 Sep 2026: 5 blocks Sat 5 Sep 2026: 1 block Sun 6 Sep 2026: 1 block Mon 7 Sep 2026: 4 blocks Tue 8 Sep 2026: 2 blocks Wed 9 Sep 2026: 1 block Thu 10 Sep 2026: 2 blocks Fri 11 Sep 2026: 2 blocks Sat 12 Sep 2026: 1 block Sun 13 Sep 2026: 0 blocks Mon 14 Sep 2026: 2 blocks Tue 15 Sep 2026: 8 blocks Wed 16 Sep 2026: 1 block Thu 17 Sep 2026: 2 blocks Fri 18 Sep 2026: 1 block Sat 19 Sep 2026: 1 block Sun 20 Sep 2026: 0 blocks Mon 21 Sep 2026: 2 blocks Tue 22 Sep 2026: 4 blocks Wed 23 Sep 2026: 3 blocks Thu 24 Sep 2026: 1 block Fri 25 Sep 2026: 4 blocks Sat 26 Sep 2026: 0 blocks Sun 27 Sep 2026: 0 blocks
438 blocks from Mon 30 Mar 2026 to Sun 27 Sep 2026. The busiest week began Mon 22 Jun 2026, with 29 blocks. The counts are sample data. A square counts blocks rather than words, so a day with one long note fills the same as a day with one short note. In the app, every square opens the blocks it counts.
  • no blocks
  • 1 block
  • 2 to 3 blocks
  • 4 to 6 blocks
  • 7 or more blocks
The numbers, by week
Week ofBlocksBusiest day
Mon 30 Mar 202621Fri 3 Apr 2026, 8
Mon 6 Apr 202621Mon 6 Apr 2026, 8
Mon 13 Apr 20269Thu 16 Apr 2026, 4
Mon 20 Apr 202617Wed 22 Apr 2026, 6
Mon 27 Apr 202620Fri 1 May 2026, 6
Mon 4 May 202620Fri 8 May 2026, 8
Mon 11 May 202612Tue 12 May 2026, 6
Mon 18 May 202615Wed 20 May 2026, 5
Mon 25 May 202612Mon 25 May 2026, 4
Mon 1 Jun 202616Mon 1 Jun 2026, 4
Mon 8 Jun 202613Wed 10 Jun 2026, 5
Mon 15 Jun 202623Tue 16 Jun 2026, 8
Mon 22 Jun 202629Mon 22 Jun 2026, 8
Mon 29 Jun 202611Fri 3 Jul 2026, 6
Mon 6 Jul 202618Fri 10 Jul 2026, 8
Mon 13 Jul 202612Mon 13 Jul 2026, 4
Mon 20 Jul 202623Fri 24 Jul 2026, 8
Mon 27 Jul 202620Mon 27 Jul 2026, 8
Mon 3 Aug 202612Tue 4 Aug 2026, 4
Mon 10 Aug 202622Tue 11 Aug 2026, 8
Mon 17 Aug 202620Tue 18 Aug 2026, 8
Mon 24 Aug 202613Tue 25 Aug 2026, 6
Mon 31 Aug 202618Fri 4 Sep 2026, 5
Mon 7 Sep 202612Mon 7 Sep 2026, 4
Mon 14 Sep 202615Tue 15 Sep 2026, 8
Mon 21 Sep 202614Tue 22 Sep 2026, 4
Total438
entity timeline

When TICK-1842 appears across three weeks.

Mentions of TICK-1842. TICK-1842 was mentioned in 10 blocks on 6 days, from Thu 2 Jul 2026 to the latest recorded mention on Sun 19 Jul 2026. The longest quiet stretch ran 4 days, from Sun 12 Jul 2026 to Wed 15 Jul 2026, and 3 of them had nothing written. The dates are sample data. In the app, each tick opens the blocks from that day that mention TICK-1842, and the hatched runs are days with nothing written at all. 2 Jul 2026 19 Jul 2026 nothing written, 2 days, Sat 4 Jul 2026 to Sun 5 Jul 2026 written, no mention of TICK-1842, 1 day, Mon 6 Jul 2026 written, no mention of TICK-1842, 3 days, Wed 8 Jul 2026 to Fri 10 Jul 2026 nothing written, 3 days, Sun 12 Jul 2026 to Tue 14 Jul 2026 written, no mention of TICK-1842, 1 day, Wed 15 Jul 2026 written, no mention of TICK-1842, 1 day, Fri 17 Jul 2026 nothing written, 1 day, Sat 18 Jul 2026 Thu 2 Jul 2026: 2 blocks Fri 3 Jul 2026: 1 block Tue 7 Jul 2026: 1 block Sat 11 Jul 2026: 2 blocks Thu 16 Jul 2026: 1 block Sun 19 Jul 2026: 3 blocks
TICK-1842 was mentioned in 10 blocks on 6 days, from Thu 2 Jul 2026 to the latest recorded mention on Sun 19 Jul 2026. The longest quiet stretch ran 4 days, from Sun 12 Jul 2026 to Wed 15 Jul 2026, and 3 of them had nothing written. The dates are sample data. In the app, each tick opens the blocks from that day that mention TICK-1842, and the hatched runs are days with nothing written at all.
  • a day with a mention
  • nothing written
  • written, no mention
The numbers
DayBlocks
Thu 2 Jul 2026 2
Fri 3 Jul 2026 1
Tue 7 Jul 2026 1
Sat 11 Jul 2026 2
Thu 16 Jul 2026 1
Sun 19 Jul 2026 3
Total10
metric · p95 latency

The latest recorded value and its recent changes.

480 ms, latest recorded
p95 value history. Latest recorded 480 ms on Tue 22 Sep 2026. The value changed 3 times since Wed 2 Sep 2026 and moved up overall. The readings are sample data. The line steps instead of sloping, because a value holds until a later reading differs. In the app, each point opens the day its reading was recorded. 480 310 2 Sep 2026 22 Sep 2026 310 ms on Wed 2 Sep 2026: 1 reading 340 ms on Tue 8 Sep 2026: 1 reading 420 ms on Tue 15 Sep 2026: 1 reading 480 ms on Tue 22 Sep 2026: 1 reading
Latest recorded 480 ms on Tue 22 Sep 2026. The value changed 3 times since Wed 2 Sep 2026 and moved up overall. The readings are sample data. The line steps instead of sloping, because a value holds until a later reading differs. In the app, each point opens the day its reading was recorded.
The numbers
DayReadings
310 ms on Wed 2 Sep 2026 1
340 ms on Tue 8 Sep 2026 1
420 ms on Tue 15 Sep 2026 1
480 ms on Tue 22 Sep 2026 1
Total4
the contract

You can leave at any time with everything you wrote.

  1. Your text is the source of truth.

    You can export your notes as JSON, CSV, or Markdown at any time, including after your plan ends, and a Markdown export imports back in as dated notes. Open your vault first if you want locked text included. A Markdown export also carries your manual links and the labels and dismissals you confirmed, keyed by date and text code, and importing re-attaches them only to blocks that import added and lists the rest as unmatched.

  2. Your tools can write to it.

    Send notes from another machine with an account token, through the JSON API. They go through your account's rules and join its blocks.

  3. Each account is private.

    Your notes are kept apart from every other account's notes. The trial needs no login and expires after 48 hours without activity.

  4. Every answer is a query you can run again.

    blk/txt does not use a language model to read or analyse your notes. Every answer the app gives is a query you can run again yourself, and the optional analysis that suggests key terms and similar notes runs where your notes already live and never changes the source text.

Paste some notes and open the blocks they make.

Paste text or drop a file to see its blocks, the identifiers it recognised, and any metrics you configured. You can also open a set of sample notes as a letter or as a view of what changed.