# Widget Party — a slog entry

You are holding one atomic unit of slop. It stands alone. Steal it.

## Who made this

Jake Simonds (jakesimonds.com · jakesimonds@gmail.com) runs **Streetlight**, a
personal agent-operating-system experiment: a vault of self-documenting HTML
"nodes" that humans and LLM agents build, garden, and retire together. The
**slog** (slop log — https://streetlight.jakesimonds.com/) is its public face:
standalone, shareable posts, each packaged as a folder like this one so anyone —
human or agent — can pick it up and keep going.

## What this entry is

Four widgets and their names. That is the whole page.

A widget, in Jake's words: *"literally a thing with sliders that you can
interact with."* Streetlight produces a lot of them as a side effect of learning
things, and they normally live inside a local viewer nobody else can open. This
entry is four of them lifted out and made to run anywhere.

**There is deliberately no prose in `index.html`** — no intro, no captions, no
"why this matters", no closing line. If you fork this and find yourself adding a
paragraph, you have made a different entry. The writing that would have gone
there is a blog post Jake writes off-site, or nowhere.

## The four

Each file is standalone: open it directly, no server, no build step, no
dependencies beyond what ships beside it.

| file | what you drag | notes |
|---|---|---|
| `bond-markets.html` | five panels of sliders — price⇄yield and duration; a yield curve built from a rate path; a Bayesian belief update; the same update at every learning rate; the debt-to-GDP recurrence | one inline `<script>`, no deps |
| `linear-algebra-quiz.html` | six draggables — the columns of a 2×2 as arrowheads you pull around, the same matrix seen as a combination, as a solve, as a projection, and Strang's cover diagram | one inline `<script>`, no deps |
| `domain-driven-design.html` | five click-through widgets — one word breaking in two rooms, entity-or-value, an aggregate boundary you draw wrong on purpose, a context map priced, and an eventual-consistency stepper | one inline `<script>`, no deps |
| `siren.html` | every electronic siren in the world is one oscillator with a slower one wired to its pitch — pick a country, then drag how fast, how far, and whether the slow one slides or alternates. Or switch to mechanical and hold the crank: no oscillators at all, a disc with holes spinning in front of an air jet, 1819 | one inline `<script>`, no deps |

`siren.html` is the odd one: it is not a whole node but **one widget of eight**
from `nodes/atmosynth-widgets-quiz`, carved out and made to stand up alone. The
quiz page around it — node header, question cards, the table of the makers'
real patch data read live off atproto — is gone, and with it every network
call. What is left runs on plain Web Audio off its own numbers.

## Internals for an agent diving in

Every one of these was a **node** in Jake's vault: an HTML page served by a
local viewer that hangs editing affordances on it and answers `/api/…` for it.
Making a node portable is a subtraction, and it is the same four cuts each time:

1. the node header (classification pills, `copyNodeContext`, `openInClaude`, and
   the `fetch("/api/node-context-files?…")` that keeps their path list honest),
2. the acceptance-criteria block,
3. the connections block plus its live-edges script — a `/xrpc` read of the
   node's own `node.meta` record, drawn through a `shared/node-ref.js` that is
   not shipping here,
4. `<script src="/api/node-asset/…">` tags, rewritten to the file beside the page.

Verified: no `/api/…` reference survives in any of the four, and no page makes a
failed or off-site request, off `file://` or off a plain static server.

Verified 2026-09-11, headless Chromium, each file and `index.html` with all four
framed: **every page loads with zero uncaught exceptions** and no console
errors. Until that morning three of the four threw once at load — each page
had kept the script of every widget that was cut out of it, and those scripts
grabbed markup that was gone. The dead widget scripts were deleted the day the
entry shipped (bond-markets: widgets 2–5, linear-algebra-quiz: widgets 2–6,
domain-driven-design: sections 2–5); only the one surviving widget's script
remains in each file.

Two of the four had been archived out of the vault and were recovered from git
history (`git show <commit>^:nodes/<slug>/<slug>.html`). Nothing here is
maintained — they are frozen copies, which is what publishing means. Fork them.

`siren.html` needed a fifth cut the others did not: the widget it was carved
from called three helpers that lived elsewhere on the quiz page (`dopplerAt`,
`intervalWords`, and the mount loop that actually constructs it). A carve that
takes the function and leaves its callers behind produces a page that loads
clean and does nothing, which is exactly what happened the first time. **If you
lift one widget out of a multi-widget page, grep the widget body for every bare
identifier it calls and check each one came with it.**

## Steal-my-slop terms

Public domain, effectively: copy, fork, rehost, resell, whatever. Attribution
appreciated, never required. Somewhere to start: every one of these is one file
and one `<script>` — take the shape and put your own arithmetic in it.
