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 station 2 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 station 2's continuous-write pattern — not a permanent service, workshop duration + a few days only. One-page signup 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.
The 4 stations
Self-select once you're set up. Code and full detail for stations 2 and 4 are linked; 1 and 3 are other co-organizers' territory — listed here for the full picture, not built from this page.
1. Personal Research Website
Build a personal site on the science PDS. Form-based generator, no code required.
2. Live Data Streaming
Raspberry Pi + sensor → Nebra → an ATProto record → a Matadisco-shaped viewer reading it back out.
code ready
3. BlueSky for Science
Feeds, lists, and starter packs via HappyView.
4. AI workflows over ATProto data
A bandit-driven agent that decides how to act, not just that it should — extracted from a real, working production agent. Two starting points: a chat-response bot, and a paper-connection proposer for Semble. Start here.
code ready
Start the engines
Once you know which station and which identity, here's where the code actually runs:
StackBlitz
Station 4's recommended default — Node runs entirely in your browser, no account, no install, boots in seconds. Open station 4 in StackBlitz.
live external tool
GitHub Codespaces
A full Linux VM per person if you want Python too (station 2) 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
gh codespace create --repo ATProto-Science/iosp-hacking-stations.
live external tool
Our own PDS (memo.dog) is under "Get set up" above — it's an identity, not a separate engine to start. There used to be a third option here (a self-hosted browser editor) — removed 2026-07-18 once StackBlitz/Codespaces covered the same need without the shared box's resource and security tradeoffs.
Looking around
Once you've written something, here's how to see it:
Viewer
Read station 2's live sensor readings, station 4's SAITO facts,
and who's checked in, side by side — plain fetch()
against HappyView, no separate backend.
Open the viewer.
live
Who's here
Live check-in board for the room — 🐕 memo.dog / 🌸 Aster / 🌻 Bluesky / 🏠 self-hosted, one emoji per account track, same no-separate-backend pattern as the viewer above. Open the kiosk view.
live
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
How the viewer's tables actually get their
data: 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 (science.iosp.sensor.reading,
run.saito.fact, style.tilde.hacking.checkin)
and a companion query lexicon
(science.iosp.sensor.listReadings,
run.saito.listFacts,
style.tilde.hacking.listCheckins) 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.
Mirrored to Tangled for an ATProto-native git host alongside the legacy one — clone from whichever you already have set up, same content either way.
The repo's own GETTING-STARTED.md covers the same StackBlitz/Codespaces choice above, plus current workshop-infra status.