Get set up
One identity gets you into every station โ pick one:
- 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.
- 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.
- 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.
- 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.