2026-07-11

The Atmospheric Verbasizer

I’d like to show off the Atmospheric Verbasizer, a system for making cut-up poetry from the federated web.

Background

In 1995, when making the album 1. Outside, David Bowie began working with the programmer Ty Roberts to write software to help automate his writing process. The history of this software is discussed in this short clip.

This cut-up technique was initially developed by the Dadaists, rediscovered by the painter Brion Gysin, and popularized by the writer William S. Burroughs. The goal isn’t to produce coherent sentences, but to seed the creative process by bypassing the logical mind.

The Algorithm

The Verbasizer cut-up algorithm is simple:

  1. Take ~24 lines of source material.
  2. Lay each line as a row in a table, with a column per word.
  3. Jumble the cells.

Architecture

There are a few goals here:

  1. Everyone who visits the page sees the same content at the same time, like a broadcast.
  2. A simple web-app that can run in Cloudflare Pages.
  3. Powered by ATProto.
  4. ~Free to run.

Since an agent built it, I’ll let an agent explain the implementation.

ver: Can you share a diagram of the architecture we just deployed?

claude: Sure. Everything here is a record type on somebody’s PDS; the sources sit on the left, and the two things that read them on the right:

flowchart LR
  subgraph src["source lexicons"]
    post["app.bsky.feed.post"]
    doc["site.standard.document<br/>(Leaflet)"]
    ww["com.whtwnd.blog.entry<br/>(WhiteWind)"]
    corpus["ooo.ver.basizer.corpus<br/>+ .chunk (curated)"]
  end

  post -->|jetstream| agg["jetstream consumer<br/>(roygbiv)"]
  agg -->|hourly write| snap["ooo.ver.basizer.snapshot"]

  post --> vb["/verbasizer<br/>(workbench)"]
  doc --> vb
  ww --> vb
  corpus --> vb

  snap --> cutup["/cutup<br/>(broadcast)"]

ver: What do we host locally on roygbiv? Why do we need a jetstream consumer?

claude: One systemd service, and that’s all. It holds a websocket open to Jetstream, which relays every public post on the network as JSON. The service samples what flows past: strip each post to bare sentences, keep the ones short enough to cut, drop the rest. At the top of the hour it writes what it kept into a single snapshot record on the basizer account. We need it because a broadcast needs a fixed signal. If every browser drank from the firehose directly, no two visitors would ever see the same hour.

ver: What gets stored? Where?

claude: Sentences, and nothing about who said them. A snapshot keeps fragments sampled from public posts with no attribution: no author, no DID, no link back to the source. From one recent hour: 57,000 posts seen, about 10,000 sampled, 869 sentences kept, 49 KB of text. Each snapshot is an ordinary record on the basizer account’s PDS, keyed by its hour in UTC, so every hour of the network is an address: /cutup can replay any past hour from the top.

ver: Prove it.

claude: Here’s an hour of the network, as kept. There’s no API of ours to take on faith; any client that can read a PDS can read the whole corpus.

ver: Cool, so you’ve introduced a new ATProto lexicon?

claude: Three record types under the site’s reverse-DNS namespace: ooo.ver.basizer.corpus and ooo.ver.basizer.chunk hold the curated collections on ver.ooo’s repo, and ooo.ver.basizer.snapshot holds the hourly captures. We haven’t published formal schemas yet; the records are small enough to read in one look, and their shapes stay stable because every past cut depends on them.

ver: How can others use and extend this?

claude: Everything the pages read is public. The hourly snapshots live on the basizer account, the curated corpora on ver.ooo’s own repo, all under ooo.ver.basizer.* lexicons. Deal from them with your own seed, point your own client at the records, or feed the snapshots into something we didn’t plan for. The account keeps broadcasting either way.

Workbench

/verbasizer lets you build your own cut-ups from arbitrary ATProto resources: Bluesky posts and feeds, Leaflet publications (via the standard.site lexicon), and WhiteWind blogs. Try it out for yourself!

Production Notes

I developed this with Claude (Fable 5, Opus 4.8, & Sonnet 5) over a few days in July 2026. This is an experiment in using coding agents to create generative experiences that can be shared over the internet. See my last post for more context.

I hope this will inspire you to make your own perverted little ATProto apps. If you do, please drop us a line at @basizer.ver.ooo and @ver.ooo!