Skyboard
A collaborative kanban board built on AT Protocol (Bluesky's decentralized
data layer). Each user's data lives in their own AT Protocol repository. An
appview server aggregates board data and provides real-time updates, while
writes go directly to each user's PDS.
How it works
Users sign in with their Bluesky account and create boards. Each board gets an
AT URI (e.g. at://did:plc:abc.../dev.skyboard.board/3k...) that can be shared
with collaborators. The browser fetches the full board state from the appview in
a single request and subscribes to real-time updates via WebSocket.
All data is stored locally in IndexedDB (via Dexie). Writes (creating tasks,
editing, commenting) go to Dexie first, then background sync pushes them to
the user's PDS. The appview picks up PDS commits via Jetstream and notifies
connected clients.
Architecture
The appview sits between clients and the AT Protocol network. It subscribes to
Jetstream for real-time ingestion and backfills from PDS endpoints on demand,
caching everything in SQLite. Clients read from the appview and write to their
own PDS.
┌─ Browser (per user) ────────────────────────────────────────────┐
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Svelte 5 UI │ │
│ │ Board → Columns → Cards │ │
│ └───────┬──────────────────────────────────▲───────────────┘ │
│ │ user action │ render │
│ ▼ │ │
│ ┌───────────────────┐ ┌───────────┴──────────────┐ │
│ │ Dexie (IndexedDB)│─────────▶│ materializeTasks() │ │
│ │ │ liveQuery│ │ │
│ │ boards │ │ group ops by task │ │
│ │ tasks │ │ filter by trust + │ │
│ │ ops │ │ permissions │ │
│ │ trust │ │ per-field LWW merge │ │
│ │ │ │ → MaterializedTask[] │ │
│ │ (syncStatus: │ └──────────────────────────┘ │
│ │ pending/synced) │ │
│ └──┬──────────▲─────┘ │
│ │ │ populate from appview response │
└──────┼──────────┼───────────────────────────────────────────────┘
│ │
│ background sync ┌───────────────────────┐
│ putRecord / deleteRecord │ Appview │
│ │ (Bun + SQLite) │
▼ │ │
┌──────────────────────────────┐ │ GET /board/:did/:rk │◄── REST
│ User's PDS │ │ WS /ws?boardUri=... │◄── WebSocket
│ (Personal Data Server) │ │ │
│ │ │ Jetstream consumer │
│ at://did:plc:xxx/ │ │ PDS backfill │
│ dev.skyboard.board/* │ │ SQLite cache │
│ dev.skyboard.task/* │ └───────────┬───────────┘
│ dev.skyboard.op/* │ │
│ dev.skyboard.trust/* │ │ subscribes
└──────────────┬───────────────┘ │
│ commit events │
▼ │
┌──────────────────────────────┐ │
│ Jetstream │──────────────────┘
│ (AT Protocol firehose) │
└──────────────────────────────┘
Multi-user coordination
When multiple users collaborate on a board, each writes only to their own PDS.
The appview aggregates records from all participants — the board owner's PDS
has board configuration and trust grants, while tasks and ops can live in any
participant's PDS. Ops reference tasks in any repo via AT URI.