Get set up
One identity gets you into every station below โ pick one:
- 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.
- Aster โ the new science PDS, via invite code. Good if you want this to still exist after today.
- memo.dog โ our own self-hosted test PDS, invite-code only (ask at the station). Built and load-tested specifically for Live Data Streaming's continuous-write pattern โ not a permanent service, workshop duration + a few days only. Sign up at kiosk.tilde.style โ one-page form, same account-creation API the Bluesky app uses, skips its multi-screen flow.
Aster signup โ coming with the launch
Aster is the ATScience PDS Hosting project, led by Emily Hunt โ not something built for this page. The link above goes live once that project launches; check back closer to October if it's not there yet.
What's built here
Torsten's own station at IOSP is Live Data Streaming + Noizetoyz โ self-select once you're set up. The full workshop has more stations run by other co-organizers (new-to-ATProto, institutions, custom feeds, personal research pages, AI workflows, and more) โ not documented on this page; ask at the event for the full station map.
๐ก๐ก๏ธ Live Data Streaming
Raspberry Pi + sensor โ Nebra โ an ATProto record โ a Matadisco-shaped viewer reading it back out.
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
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.)
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, station 4's SAITO facts,
Noizetoyz's last played note, and who's checked in โ ๐ memo.dog /
๐ธ Aster / ๐ฆ Bluesky / ๐ป BYOH / ๐ self-hosted, plus the
"recently connected via youandme.at" feed โ side by side, plain
fetch() against HappyView, no separate backend.
Open the viewer.
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
Staff
Password-protected console for whoever's staffing the desk โ logs Aster/Bluesky/self-hosted check-ins into the same feed the kiosk view above reads. Open staff console.
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 station 3 uses directly for feeds, lists, 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,
run.saito.fact, style.tilde.hacking.checkin,
music.atproto.noizetoyz.synth.note)
and a companion query lexicon
(style.tilde.hacking.listSensorReadings,
run.saito.listFacts,
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 station-4 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>/run.saito.fact.
pdsls.dev example repo example: saito facts 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.