๐Ÿ“ข At IOSP in person for Noizetoyz? This page can't reach the local synth relay over HTTPS โ€” open the local player instead (same content, works on-site).

hacking.tilde.style

IOSP 2026, Leiden โ€” ATScience workshop, "Resilient Data & Sovereign Infrastructure" track.

Get set up

One identity gets you into every station โ€” pick one:

  1. Aster โ€” the new science PDS, our main recommendation. Good if you want this account to still exist after today. Sign up with Aster, and mark your attendance, on the IOSP welcome page.
  2. memo.dog โ€” our own self-hosted test PDS, the quick option for a throwaway account: scan the QR at the station and it opens memo.dog's own sign-up page. Built and load-tested for Live Data Streaming's continuous-write pattern โ€” not a permanent service, workshop duration + a few days only.
  3. pds.rip โ€” a public test PDS, zero commitment. Good if you just want to poke around today. Heads up if you're doing Live Data Streaming specifically: it rate-limits at roughly 10 requests/24h per IP, which a continuous producer will hit fast.
  4. An account you already have โ€” the temporary account from IOSP check-in (SciOS PDS), Bluesky, Eurosky or any other Atmosphere account signs in just as well.

What's built here

The Sensors station at IOSP covers Live Data Streaming, Noizetoyz and Airglow Toons, plus breadcrumbs to mark what you did. Self-select once you're set up. The other stations (feeds, research pages, literature, institutions and more) are on the IOSP welcome page.

On site: join the noizetoyz WiFi (password synthbeep) for the boards and the local player, or ask for a LAN cable at the station.

๐Ÿ“ก๐ŸŒก๏ธ Live Data Streaming

Raspberry Pi + sensor โ†’ Nebra โ†’ an ATProto record โ†’ a Matadisco-shaped viewer reading it back out. No wiring needed: a Wemos board with an SHT30 shield (temperature and humidity) just plugs in; wiring your own DS18B20 is optional. Start here.

code ready

๐ŸŽน๐ŸŽถ Noizetoyz

An ATProto-networked Mozzi synth โ€” play a key, scrub a sample, fold a wave, or sweep a filter from a browser or a gamepad; real hardware boards play it back live in the room. Start here.

code ready

๐ŸŽช Airglow Toons

No code: build an automation on airglow.run (if this ATProto event happens, do that), point its action at style.tilde.hacking.toon, and your own emoji flies across the workshop's big-screen wall. Worksheet exercise 3.

live external tool

๐Ÿž Breadcrumbs

Take a breadcrumb (an NFC keyring, a card, a glass cabochon), tap it, and one signed record is written to your own repo. Tap a station's magnet or scan its worksheet QR when you finish, and your trail picks up that station's colour. Hand a crumb on and the next person can say "received from you". Read your trail at breadcrumbs.run/trail/<your-handle>; what it is.

Two posts on the blog: The runway to IOSP: what a breadcrumb is and From breadcrumbs to the toolcase talk: your records are the data.

live

Start the engines

Once you're set up with an identity, here's where the code actually runs:

GitHub Codespaces

A full Linux VM per person if you want Python for Live Data Streaming, or a persistent environment across sessions. Needs a GitHub account; 120 free core-hours/month, on your own account, not shared. Open from the repo's Code โ†’ Codespaces button, or from the CLI:

gh codespace create --repo ATProto-Science/iosp-hacking-stations --display-name "atscience-station-$(openssl rand -hex 3)"

Without --display-name the CLI hands back a random codespace name like bookish-yodel-9gx56g547524q โ€” fine, but no fun hunting for it later in a list of "bookish yodel"s. (Needs a reasonably current gh โ€” the flag isn't in very old installs.)

Then go in. gh codespace create only prints the new codespace's name (something like turbo-space-winner-r5x675wg4q2xp75), it doesn't open it. Pick one way in:

In your browser: gh codespace code --web

In a terminal: gh codespace ssh

In VS Code on your machine: gh codespace code

With more than one codespace, gh asks you to choose; or add --codespace <name>. No CLI handy? Open github.com/codespaces and click yours. Once inside, the two stations are the folders live-data/ and noizetoyz/; start with the README in each.

live external tool

Noizetoyz doesn't need a cloud IDE at all โ€” it's real hardware, flashed locally (noizetoyz/firmware/flash.sh) or played straight from a browser via the player, zero setup. Our own PDS (memo.dog) is under "Get set up" above โ€” it's an identity, not a separate engine to start.

Look around

Once you've written something, here's how to see it:

Viewer

Read Live Data Streaming's live sensor readings, Noizetoyz's last played note, and who's checked in โ€” ๐Ÿ• memo.dog / ๐ŸŒธ Aster, plus the "recently connected via youandme.at" feed โ€” side by side, plain fetch() against HappyView, no separate backend. Open the viewer.

live

The toon wall

The workshop's big screen, in five lanes: your Airglow automations, youandme.at connections, who has arrived (an RSVP on the welcome page, or a check-in; one emoji per sign-up origin, ๐ŸŒธ Aster, ๐Ÿ• memo.dog, ๐Ÿฆ‹ Bluesky, ๐Ÿ‡ช๐Ÿ‡บ Eurosky, ๐Ÿ”ฌ SciOS), live sensor readings and Noizetoyz notes. Open the wall.

live

Make noise

Noizetoyz โ€” an ATProto-networked Mozzi synth. Play notes, scrub samples, fold waves, sweep a filter, or FM synthesize from a browser (or a gamepad); real hardware boards play it back live on real speakers. Every interaction is a real ATProto record, shared live over the network โ€” same no-separate-backend pattern as the viewer. Open the player ยท what it does, how to connect & play, how to diagnose.

live

Going deeper

How the viewer's tables actually get their data, and how to look even further underneath them:

HappyView

The schema-driven AppView the viewer above reads through, and the feeds station uses directly for lists, feeds and starter packs. happyview.werk.museum

live

HappyView doesn't expose a list endpoint just because a record lexicon exists. Each collection needed two lexicons registered by hand in HappyView's admin UI (or its Admin API โ€” that's how the check-in lexicons below were actually registered this time, no dashboard clicking needed) โ€” the record schema itself (style.tilde.hacking.sensorReading, style.tilde.hacking.checkin, music.atproto.noizetoyz.synth.note) and a companion query lexicon (style.tilde.hacking.listSensorReadings, style.tilde.hacking.listCheckins, music.atproto.noizetoyz.synth.listNotes) whose target_collection points back at the record NSID โ€” that pairing is what actually creates the /xrpc/<query-nsid> endpoint the viewer calls. If your own idea writes a new record type, it won't show up anywhere until you register both halves the same way. HappyView also has its own Lua scripting layer for per-lexicon logic beyond a plain list query, if target_collection alone isn't enough for what you're building.

pdsls

General-purpose ATProto repo browser โ€” inspect any DID's actual records directly on their PDS, not just what HappyView has a query registered for. Useful for checking your own writes landed correctly even before you've wired up a list query. URL pattern: pdsls.dev/at://<your-handle>, or add a collection NSID to see just that one, e.g. pdsls.dev/at://<your-handle>/style.tilde.hacking.sensorReading.

pdsls.dev example repo example: sensor readings

live external tool

Code

Primary: github.com/ATProto-Science/iosp-hacking-stations, public โ€” clone freely, no invite needed. A Tangled mirror (ATProto-native git host) is planned but not confirmed live yet. The repo's own GETTING-STARTED.md has more on environment options and current workshop-infra status.