hacking.tilde.style

IOSP 2026, Leiden — ATScience workshop, "Resilient Data & Sovereign Infrastructure" track.

Get set up

One identity gets you into every station below — pick one:

  1. 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.
  2. Aster — the new science PDS, via invite code. Good if you want this to still exist after today.
  3. 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.