Devlog · Nov 13
From now on, each entry is dated the day I post it, not the day the work was done. This one covers Nov 11 and 12.
1. A keyboard map for T3 Code shortcuts
The idea comes from my brother, Alex Markin. He is an artist, not a programmer, and he built Louppe, a Mac app in Swift for sorting photos and videos, for example to pick work for a gallery show. It has a keyboard view of all its shortcuts. Programmers usually skip this kind of UX. He didn't.
T3 Code's Settings > Keybindings is a list of 80+ rows. You can't see which keys are taken or free, and pressing a shortcut on the page runs it. Now a drawn keyboard sits above the list:
- ⌘ ⇧ ⌥ ⌃ switch layers, and each key shows the command bound to it
- Press a shortcut to look it up instead of running it
- Click a free key and "Assign" opens a new binding with that key filled in
- Hover a row to light up its keys
The map adds about 5–8 ms to the page switch. T3 Code doesn't take feature PRs, so this stays a draft on my fork: Mark-Life/t3code#1

2. Peektrace rewritten in Rust: 10 PRs in 2 days
Peektrace is a local inspector for Claude Code, Codex, Pi and OpenCode sessions. It was TS on Bun. Listing 700 sessions took 1.2–2.1 s and up to 1.2 GB of RAM, and the binary was 92.5 MiB. First a spike: port only sessions ls and measure. The numbers were good enough to port the rest, one PR per command group, up to the terminal UI. On a Mac M1 Max with 702 sessions (1 GB of transcripts):
sessions ls: 1228 ms → 83 ms, peak memory 1174 → 30 MiB- Startup: 129 ms → 2.1 ms
statusline, which Claude Code runs on every turn: 118 ms → 4.5 msstats, cold index: 23.4 s → 3.7 s, peak memory 1345 → 276 MiB- TUI scroll step on a 47 MiB session: 61 ms → 3.7 ms. A 4,000-turn session used to go blank. Now it opens in 213 ms.
Two things made the port safe. A parity script runs the TS and Rust CLIs with the same args and diffs stdout, stderr and exit code, on fixtures and on my real sessions. And small helpers copy JS behaviour where output depends on it: toFixed rounding, Date.parse, UTF-16 string lengths.
Not all of it is free. The cold stats run uses 7% more CPU time in Rust. It is faster because it runs on all cores, not because it does less work. All 10 PRs are open on an experimental branch. Stack: #171

3. A looping video in my site's link preview
Most people know og:image, the picture a link preview shows. Fewer know og:video: clients that support it play a video in the preview instead. My home page now has one, a 13 s loop of the hero background under the share card:
- 1200×630, H.264, 250 KB
+faststart, so playback starts before the whole file loads- The host answers range requests with
206, so players can seek and stream - The still image stays as the fallback
The card in the video uses the same renderer as the og:image, so both show the same text.
