Skip to main content

Hand-drawn asset kit

Notebook marginalia, as components

Arrows, circled numbers, magnitude badges, boxes and numerals — scanned from the notebook, traced, and sliced into 153 named pieces. Each one renders inline and inherits currentColor, so it adapts to dark mode and sits in a sentence like a letter. Below: a few ways they could live in posts and across the design.

1

Footnote & sidenote markers

Swap the plain superscript ¹²³ in the sidenotes system for your own circled numbers — unmistakably yours.

Delete-driven development is the house style and the sidenotes plugin is only 75 lines because complexity is the enemy .

2

A marked-up draft

Point at the phrase, circle it, underline the word that matters. The red pen, used sparingly.

We moved the whole site to one node process under pm2 — a git pull and a reload, no containers, no orchestration. It is gloriously boring .

3

Inline annotation

Circle the thing that matters. Point at the next thing. The marks actually hug the words now.

When it hangs, delete code until it works — no clever fixes.

simple beats complex, working beats perfect

4

A number worth circling

A stat reads like it was written, not dashboarded — when only the number that matters gets the pen.

The blog has published 81,667 words , across 142 posts.

5

Numbered steps

Circled numbers as bullets turn a dry ordered list into something that reads like a marked-up page.

  1. Write in Obsidian with YAML frontmatter and tags.
  2. Process with yarn blog:process into structured JSON.
  3. Serve through dynamic routes that consume the JSON.
  4. Push to main — GitHub Actions builds and deploys.
6

A little flow diagram

Circled numbers and arrows compose into a hand-sketched pipeline — the kind you'd draw on a whiteboard.

writeprocessservedeploy
7

Hand-drawn callout frames

A traced box around a pull-quote feels handmade in a way a CSS border never will.

“When the system hangs, delete code until it works. Simple beats complex. Working beats perfect.”

8

Hand-drawn unit charts

Your real notebook stipple dots, duped and rotated into a 10×10 grid. Fill as many as the number says — isotype, by hand.

One video made last year — out of the 100 I want to make this year. my notes · 2024-01

Weaving them in

The point isn't a gallery — it's that they disappear into the writing, the UI, and the charts. Three hooks do that: an :hd{} directive for prose, automatic upgrades of existing markup (footnotes, dividers), and a <HandDrawnAnnotation> for dataviz.

A

Dataviz annotations

Point, circle, label — anchored to coordinates over any chart (SVG or canvas). The vocabulary of a marked-up printout.

all-time high
B

Automatic — no new syntax

A client plugin upgrades existing markup inside posts: footnote markers become circled numbers, <hr> becomes a hand-drawn rule. Old posts get it for free.

Boring infra wins — pm2, a single node process, read-the-logs-and-reload .

…and the divider above was just a plain ---.

C

Intentional — the :hd directive

Drop a specific mark exactly where you want it, right in the markdown. Mirrors your :prediction / ::gear directives.

The deploy is just pm2 reload :hd{name="arrow-right-long"}
then read the logs and move on.

The deploy is just pm2 reload then read the logs and move on.

In the wild

Dropped into the kind of UI they'd actually live in. Every number, prediction, and changelog entry below is real — pulled straight from the site and the archive.

Stats dashboard

blog posts published
142

81,667 words published in all.

Analytics annotation

shipped tv-station

Prediction

Prediction · resolves 2026

AI-generated code tops 30% of commits in the 50 biggest GitHub repos.

confidence/ 10

Changelog

  1. Photo backup
    Electron + Chrome bloat a Tauri / Rust app
  2. systemd, the hard way
    Restart=on-failure Restart=always
  3. Where I post
    Twitter Mastodon
  4. MCP meta-map
    4,096 dimensions 2

Straight from the archive

Not lorem ipsum — actual lines from real posts, marked up the way you might in the margin. Each one notes where it came from.

Last year I made a grand total of one video. This year I want to make 100.

my notes · 2024-01

Seeing my step count drop below 5,000 for days running is a clear sign I need to touch grass .

Personal APIs

If you're going to spend half your life in a terminal, it might as well feel like a cyberpunk movie.

CLI tools

I built a network of 29,915 officer nodes and 159,671 relationships in Neo4j, then let the clusters surface .

CCRB officer clusters
Instead of avoiding hard work or hard problems, we should make hard work fun .
Joy-Driven Development

If you can reliably discover the magic words you need, you can teach yourself almost anything.

Everyone Should Code

The complete kit, in use

Every mark in the set doing a real job — captioned with real numbers, projects, and lines from the archive. Repeats are fine; the point is that nothing's left sitting in the drawer.

Arrows · pointed the way they point

Dockerpm2
TwitterMastodon
ElectronTauri
Flickrself-host
cloudlocal-first
800 lines75
4,096-D2-D
downward · resolves to  ·  upward · grew to
writeship
deploydone
commitpush
draftpost
ideatool
photobackup
one repotwo apps
Watch Latertv-station
it hangsdelete code
1001 video
best weeklast week
touch grass< 5,000 steps
loops, turns & sketchbook studies
left
uturn
bend-corner
bend-zigzag
rule-return
compass
study-horizontal
study-vertical
study-rays
study-maze

Numerals · real figures, hand-set

officer nodes mapped (CCRB)
relationships in the graph
GitHub contributions
screenshots in the atlas
photographs shared
hours of looping runtime
alive videos from Watch Later
active days in the last 52
~10 years posting photos to Flickr 11 tools shipped, numbered below a 12-entry changelog knives forged since the 13th century a 10-week writing streak

Number words · counts, spelled out

video made last year
days in the studio
spliffs in, on a beach
rules for the backup tool
phases in the design process
songs to polish in Logic
services humming on the VPS
thousand Pinboard bookmarks
-to-five I walked away from
years of blog posts

Circled · 11 tools shipped

  1. dockrune
  2. exif-printer
  3. git-status-dash
  4. ascii_webcam
  5. Dataproofer
  6. smallbot-mcp
  7. tv-station
  8. scrapbook-cli
  9. MorningRadio
  10. music-cli
  11. NBC Big Board

Bold circled · the changelog

  1. Flickr → Instagram → self-hosted photos
  2. Twitter → Mastodon
  3. 800-line sidenotes → 75-line plugin
  4. Docker → pm2, one node process
  5. Electron → Tauri for the backup tool
  6. CCRB: 29,915-node officer graph
  7. 1,554-screenshot embeddings atlas
  8. tv-station: public-access from Watch Later
  9. personal APIs → "touch grass" alerts
  10. the hand-drawn kit, 153 marks
  11. 100 videos — the goal for this year

Letters · labels, grades, nodes

Dataprooferdockruneexif-printergit-status-dashascii_webcam
writeprocessservedeploydone
the full set, traced from the notebook

Magnitudes & badges · real orders of magnitude

~100 photos on the photo site
1,189 GitHub contributions
22,380 hours tracked in 14 years
159,671 graph edges
~1k commits a year
1.5M messages in the archive
1,554 screenshots
100k+ runtime seconds

Frames · a real line in every box

Make hard work fun.
You can’t improve what you don’t measure.
Simple beats complex. Working beats perfect.
Restart=always everywhere.
Delete code until it works.
Touch grass.
The world is very changeable.
pm2
ship
fun
boring
logs
100
!

Textures & marks · marginalia

shipped tv-station
100 videos goal
best week this month
all-time high
note to future me

We moved the whole site to one node process under pm2 — no containers no orchestration.

Restart=on-failure → Restart=always
Electron bloat → Tauri / Rust
  • Rip everything from Cloudinary's API
  • Handle the rate limits without exploding
  • Resume incomplete downloads after a hiccup
  • Work while I'm three spliffs in on a beach
rings, to lasso a stat:
stipple field blob cluster marks study 6 of 10 — a confidence

The library

Click any asset to copy its <HandDrawn> tag.

Arrows · 29

Straight
Curved
Bent
Special
Studies

Circled numbers · 22

Thin
Bold

Numerals · 24

Display
Script
Teens
punct

Magnitudes & badges · 10

Written
Badges

Boxes & frames · 14

Rectangles
Squares

Circles & dots · 6

Rings
Dots

Letters · 11

Alphabet
Circled
Boxed

Number words · 10

Textures & marks · 27

Stars
Fills
Dividers
Marks
unit