at main
2 folders
6 files
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
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
feat: AT Proto social platform — OAuth, PDS-backed data, Jetstream AppView
Turn atradio.fm into a social, AT-Protocol-native app.
Web (apps/web):
- Browser OAuth login (@atcute/oauth-browser-client), Atmosphere login modal
- Gate favoriting/add/remove behind login; public browse/search/playback
- Favorites + user stations stored as fm.atradio.* records in the user's PDS
(optimistic writes, loaded on login)
- Profile shows real display name/handle/avatar; public /profile/:did|:handle
Lexicons (packages/lexicons):
- fm.atradio.{station,favorite,getFavorites,getStations} authored in Pkl
(pkl eval -> JSON) + TS types/zod/mappers
API (apps/api) — Express + Drizzle + Postgres AppView:
- Jetstream consumer across all 4 official hosts, idempotent upserts, cursor
- XRPC getFavorites/getStations (+ discovery), open CORS
- Production TuneIn + ICY media proxies (moved off Vite dev middleware)
Ops & tooling:
- systemd units (api + jetstream)
- tools/console: Babashka + Clojure + rebel REPL command hub, root ./console
- mise pins java/clojure/babashka; consola logging throughout
feat: AT Proto social platform — OAuth, PDS-backed data, Jetstream AppView
Turn atradio.fm into a social, AT-Protocol-native app.
Web (apps/web):
- Browser OAuth login (@atcute/oauth-browser-client), Atmosphere login modal
- Gate favoriting/add/remove behind login; public browse/search/playback
- Favorites + user stations stored as fm.atradio.* records in the user's PDS
(optimistic writes, loaded on login)
- Profile shows real display name/handle/avatar; public /profile/:did|:handle
Lexicons (packages/lexicons):
- fm.atradio.{station,favorite,getFavorites,getStations} authored in Pkl
(pkl eval -> JSON) + TS types/zod/mappers
API (apps/api) — Express + Drizzle + Postgres AppView:
- Jetstream consumer across all 4 official hosts, idempotent upserts, cursor
- XRPC getFavorites/getStations (+ discovery), open CORS
- Production TuneIn + ICY media proxies (moved off Vite dev middleware)
Ops & tooling:
- systemd units (api + jetstream)
- tools/console: Babashka + Clojure + rebel REPL command hub, root ./console
- mise pins java/clojure/babashka; consola logging throughout
feat: AT Proto social platform — OAuth, PDS-backed data, Jetstream AppView
Turn atradio.fm into a social, AT-Protocol-native app.
Web (apps/web):
- Browser OAuth login (@atcute/oauth-browser-client), Atmosphere login modal
- Gate favoriting/add/remove behind login; public browse/search/playback
- Favorites + user stations stored as fm.atradio.* records in the user's PDS
(optimistic writes, loaded on login)
- Profile shows real display name/handle/avatar; public /profile/:did|:handle
Lexicons (packages/lexicons):
- fm.atradio.{station,favorite,getFavorites,getStations} authored in Pkl
(pkl eval -> JSON) + TS types/zod/mappers
API (apps/api) — Express + Drizzle + Postgres AppView:
- Jetstream consumer across all 4 official hosts, idempotent upserts, cursor
- XRPC getFavorites/getStations (+ discovery), open CORS
- Production TuneIn + ICY media proxies (moved off Vite dev middleware)
Ops & tooling:
- systemd units (api + jetstream)
- tools/console: Babashka + Clojure + rebel REPL command hub, root ./console
- mise pins java/clojure/babashka; consola logging throughout