Skyboard plugins
npx claudepluginhub disnet/skyboardSkyboard kanban board CLI — manage boards, columns, and cards on AT Protocol
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.
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.
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) │
└──────────────────────────────┘
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.