Experiments.

Devices, prototypes and ideas being tried out with the format. Some will become reference tools and some won't. Nothing here comes with a promise, and some of it needs technical setup.

Capturing a moment

The totem working

A pocket ESP32 device (M5Stack StickS3). Hold the button to mark a moment; press together with a friend to record an encounter on both devices. No clock and no network: it counts elapsed time, and Loom turns that into real times when you plug it in.

Pocket Totem working

The totem as a phone web app. Records queue locally and go to your String, or straight to your own account if you sign in. Scanning a venue's QR code attaches that night's event.

Scrobble worker working

Turns Last.fm plays into suggested listen records, one per listening session. Suggestions stay suggestions until a person keeps them.

By hand working

scripts/mint.py on the command line, or a Claude Code skill that mints, edits and publishes from a terminal.

AR Gallery parked

Point a phone at a painting to identify it and make a note. Parked for a rethink: when it returns, matching will happen on the phone against packs published by venues, so no images leave the device.

Keeping your own records

The timeline working

The String's own day view: annotate, attach photos, keep or release suggestions, group records into strands and publish them. Runs alongside Loom while daily use decides between them.

The DataBrick spec written

A Raspberry Pi as an always-on home for a household's records and a personal sync server, so nothing depends on a laptop being awake.

AppView local only

An index of public records across the network, for questions like “which public records point at this event”. It's run locally for experiments; CultureBlocs doesn't offer it as a public service. The listings use Constellation, a third-party open index, instead.

How a moment travels

totem press ───┐ phone mint ────┤ scrobbled play ┤──> Loom (the desk: write it whole, keep proposals) ──> the String hand-written ──┘ │ (your store) │ deliberate publish ▼ your ATProto repo ──> the wall · the catalogue · the strand embed · a local index

Beads arrive from whatever had your hands at the time. Loom is where they become an entry; the String is where they stay. Publishing is a separate, deliberate press — and what leaves is decided by one strip rule, held to its Python and JavaScript implementations by shared fixtures.

Reading records back

Frieze Week report example

A page that reads back the records people kept about an example listing: where they went, what went together, and their own words, with nothing stored by us. Very few records point at the listing, so it shows the method, not results. It also explains how the whole thing was built on ATProto with no server of our own.

For venues

Doors proof of concept

A one-form venue app: a venue profile plus an event in the shared calendar format, with a printable QR code that opens Pocket with the event attached. Kept as a proof of concept; the browser tool at /start/#event is the simpler route.

Development notes

What Phase 0 changed

The foundations a local-first client needs. The lexicon validator and the publish strip were ported to the browser and are held to their Python originals by shared fixtures. Records grew an explicit state, so the dotted rail is stored rather than guessed from an app name. The change feed gained HLC stamps, device and actor. PATCH honours If-Match and removes a field sent as null; DELETE honours it too. A connector re-run can revise its own proposal and can no longer erase a person’s edits to one.

Where this goes next

Loom’s remaining phases are the plan of record. Phase 2 makes the String a personal sync server: a discovery record in your own repository so a new device finds your String by signing in rather than by typing a URL and a token; DID-scoped, NSID-scoped grants in place of one shared bearer, so a connector that may propose listen beads cannot read your identities; and a change feed that goes both ways. Phase 3 brings the vault — credentials that sync, encrypted under a passphrase the server never sees — and connectors as manifests, including the resolver that proposes refs. Phase 4 moves publishing into Loom, client-side, so a person with no String at all still has the whole loop.

Nothing is retired on argument alone. Studio went because two apps could not share one serial port; the rest waits on a season of daily use.

Retired

CultureBloc Studio retired

The first desk for pulling records off the totem over USB. Retired in September 2026 when Loom took over the serial connection; two apps couldn't share one port.