at main
8 folders
4 files
refactor(web): migrate onto @atradio/sdk
The web now consumes the official TypeScript SDK for all record I/O:
- Add an agentAtom that wraps the OAuth-authenticated atcute client via
AtradioAgent.fromClient(client, did) — the single entry point for reads/writes.
- lib/atproto/records.ts becomes a thin facade delegating to the agent, keeping
its (client, did, …) signatures so no consumer changed; favoriteRkey and
StoredStation are re-exported from the SDK.
- favorites.ts uses agent.favorite/unfavorite directly (the SDK bundles the
idempotent write + stationId reconcile), dropping the local putFavorite +
pruneFavoriteDuplicates.
- Extend @atradio/sdk with the verbs the web needs: reaction, updateComment,
deleteComment, generic deleteRecord, listFavorites/listStations (+ StoredStation),
getAudioSettingsRecord.
The favorite record-key logic now has one source of truth (the SDK) shared by
web, CLI (Rust), and the Go/TS SDKs. Web typecheck + all 29 tests pass.
feat(social): comments, mentions, notifications, live reactions
Add a full social layer on top of the AppView + PDS + Jetstream stack.
Lexicons
- fm.atradio.comment (station snapshot, text, mention facets, optional GIF)
- fm.atradio.reaction (ephemeral emoji reaction)
- defs: commentView, notificationView, comment#gif, comment#mention
- queries getComments/getNotifications, procedure updateSeen
- TS types, zod schemas, buildComment/buildReaction mappers, LiveEvent types
API
- comments, reactions, notifications, notification_seen tables (+migration)
- Jetstream consumer indexes comments/reactions and fans out notifications
(mentions -> mentioned actors; comments -> custom-station owner)
- Redis-pub/sub-or-in-process live bus + SSE GET /live/:stationId
- XRPC getComments, getNotifications (unread count), POST updateSeen
Web
- putComment/putReaction to PDS; appview clients + SSE subscribe
- Klipy media client (GIFs / stickers / clips) for comment embeds
- mention richtext: facet resolution, segment rendering, live @-typeahead
- CommentComposer, CommentsPanel (live + optimistic), CommentsModal
- NotificationBell with floating unread badge that resets on open
- StationReactions: macOS-dock emoji picker (hover/click, login-gated)
- PlayerReactionRain: full-screen bottom->top emoji rain, real time
- wired into Player (mini + fullscreen), StationCard, Navbar, Layout
- OAuth scope adds repo:fm.atradio.comment + repo:fm.atradio.reaction
refactor(web): migrate onto @atradio/sdk
The web now consumes the official TypeScript SDK for all record I/O:
- Add an agentAtom that wraps the OAuth-authenticated atcute client via
AtradioAgent.fromClient(client, did) — the single entry point for reads/writes.
- lib/atproto/records.ts becomes a thin facade delegating to the agent, keeping
its (client, did, …) signatures so no consumer changed; favoriteRkey and
StoredStation are re-exported from the SDK.
- favorites.ts uses agent.favorite/unfavorite directly (the SDK bundles the
idempotent write + stationId reconcile), dropping the local putFavorite +
pruneFavoriteDuplicates.
- Extend @atradio/sdk with the verbs the web needs: reaction, updateComment,
deleteComment, generic deleteRecord, listFavorites/listStations (+ StoredStation),
getAudioSettingsRecord.
The favorite record-key logic now has one source of truth (the SDK) shared by
web, CLI (Rust), and the Go/TS SDKs. Web typecheck + all 29 tests pass.