commits
Show SignInModal (with a `like` flag) when a user attempts to like
without a token. Add optimistic local state for liked and likesCount to
update UI immediately. Stop event propagation on the like button and
cover to prevent parent click handlers.
Update feed API types to include trackUri, likesCount and liked Show
like button and counts in InteractionBar and expose onLike handler Use
useLike in SongCover to call like/unlike and pass uri/liked/likesCount
Forward like state from Feed to SongCover
Attach Bearer token from localStorage to feed API calls when a token
exists
Use ctx.authVerifier and pass DID to retrieve so the handler can
determine per-track liked state. Query lovedTracks to build likes counts
and liked flags, and include likesCount and liked in the presentation.
Switch feed fetch to http://localhost:8002 when PUBLIC_URL contains
"localhost", and emit createdAt/updatedAt ISO timestamps.
Delete feed.rs and remove the "feed" subcommand from rockskyd CLI,
remove rocksky-feed from the workspace Cargo.toml, and update Cargo.lock
to drop the crate and its transitive dependencies.
feat: add rocksky feeds
Use per-feed query keys (["feed", feed]) and update invalidation to
include the feed URI. Add feedUrisAtom and feedGeneratorUriAtom and
populate feed URIs from the feed generators API; set the selected
generator URI when a category is clicked. Make feed item rendering safer
(data?.map), adjust avatar/handle layout, and add a tooltip for
formatted dates. Fix genre string to "rap metal". Bump ramda and
@types/ramda and update bun.lock accordingly.
Implement getFeed API, pass limit/cursor to backend, add feed atoms, and
update hooks and components to use the selected feed generator.
Server: add algorithm to return paginated scrobbles feed. Client: add
API endpoint, react-query hook, and FeedGenerators component (category
scroller with chevrons). Add constants and index export. Add
@tabler/icons-react dependency and small UI/style tweaks (padding,
z-index, font settings).
Introduce feedItemView and feedView schemas and switch getFeed to use a
string cursor instead of numeric offset. Update generated types,
pkl/lexicon defs, and the XRPC handler to return FeedView (and add the
hydrate step + axios import) Add feedView types and cursor pagination
Query feeds with a left join to users, limit results by params.size, and
present data as FeedGeneratorsView
- Add feedGeneratorsView and feedGeneratorView defs (JSON and pkl)
- Add app.rocksky.feed.getFeedGenerators lexicon and generated TS types
- Export new types from lexicon index
- Swap/fix album getAlbums/getAlbumTracks handlers and update schemas
- Misc: small formatting, type-only imports, and script fixes
Update Drizzle migration and snapshot Export feeds schema from index Add
seed-feed script to import generator records into the DB
Also add a missing newline at the end of README
Make ws.onmessage async, use functional setQueryData calls, and await
invalidateQueries for feed, now-playings, and scrobblesChart so
consumers receive fresh data after WebSocket updates
Remove duplicate WebSocket and heartbeat logic from NowPlayings. Feed
now opens the socket using WS_URL (without a trailing /ws), updates the
["now-playings"] and ["scrobblesChart"] query data, and includes
queryClient in the effect dependencies.
Set right pane height to calc(100vh-100px) and enable overflow-y-auto.
Change search results max height to !max-h-[400px]. Add popperOptions to
disable flip and enable preventOverflow for more stable dropdown
positioning.
Add VITE_WS_URL and WS_URL constant. Remove polling refetchInterval from
feed and now-playing queries and update React Query cache via WebSocket
messages. Implement ping/pong heartbeat and proper socket cleanup on
unmount.
Remove an unnecessary 4s delay in apps/ws/src/main.ts. Extend
Effect.timeout from 10s to 120s across actor, nowPlaying and scrobble
services to reduce premature failures
Replace per-socket 5s wait with a single 4s pause before iterating
clients to avoid per-client staggering and reduce total delay Move delay
before broadcasting to clients
Wait 4s before fetching broadcast payload and reuse the results for all
matching clients instead of delaying per-socket. This avoids redundant
data retrieval and reduces overall broadcast latency.
Wrap Effect pipelines in getScrobbles, getScrobblesChart and
getActorScrobbles with Effect.runPromise so they execute and return
promises.
Read WS_PORT environment variable and default to 8002.
Add per-endpoint Cache for scrobbles and now-playing handlers (capacity
100, TTL 30s). Lookups use retrieve->presentation with retry(3) and 10s
timeout.
Set env.PUBLIC_URL default to http://localhost:8000 and update the auth
client URL/client_id selection to prefer a real public URL unless it
points to localhost.
Only print the "Currently playing" response when the returned data does
not contain both "is_playing" and "context", reducing noisy output for
normal playback responses
Only print the "Currently playing" response when the returned data does
not contain both "is_playing" and "context", reducing noisy output for
normal playback responses
Increase find_spotify_users limit from 100 to 500. Parse token response
as text and use serde_json::from_str to improve error diagnostics; print
raw response on parse failure.
Stop reading genres from the DB row and return an empty list to avoid
deserialization errors
Introduce an optional "names" parameter and propagate it through
lexicon, pkl, TypeScript types, XRPC handler, and analytics types. Also
apply assorted formatting, trailing-comma, and import fixes.
Show SignInModal (with a `like` flag) when a user attempts to like
without a token. Add optimistic local state for liked and likesCount to
update UI immediately. Stop event propagation on the like button and
cover to prevent parent click handlers.
Use ctx.authVerifier and pass DID to retrieve so the handler can
determine per-track liked state. Query lovedTracks to build likes counts
and liked flags, and include likesCount and liked in the presentation.
Switch feed fetch to http://localhost:8002 when PUBLIC_URL contains
"localhost", and emit createdAt/updatedAt ISO timestamps.
Use per-feed query keys (["feed", feed]) and update invalidation to
include the feed URI. Add feedUrisAtom and feedGeneratorUriAtom and
populate feed URIs from the feed generators API; set the selected
generator URI when a category is clicked. Make feed item rendering safer
(data?.map), adjust avatar/handle layout, and add a tooltip for
formatted dates. Fix genre string to "rap metal". Bump ramda and
@types/ramda and update bun.lock accordingly.
- Add feedGeneratorsView and feedGeneratorView defs (JSON and pkl)
- Add app.rocksky.feed.getFeedGenerators lexicon and generated TS types
- Export new types from lexicon index
- Swap/fix album getAlbums/getAlbumTracks handlers and update schemas
- Misc: small formatting, type-only imports, and script fixes
Replace per-socket 5s wait with a single 4s pause before iterating
clients to avoid per-client staggering and reduce total delay Move delay
before broadcasting to clients
Wait 4s before fetching broadcast payload and reuse the results for all
matching clients instead of delaying per-socket. This avoids redundant
data retrieval and reduces overall broadcast latency.
Wrap Effect pipelines in getScrobbles, getScrobblesChart and
getActorScrobbles with Effect.runPromise so they execute and return
promises.
Add per-endpoint Cache for scrobbles and now-playing handlers (capacity
100, TTL 30s). Lookups use retrieve->presentation with retry(3) and 10s
timeout.
Set env.PUBLIC_URL default to http://localhost:8000 and update the auth
client URL/client_id selection to prefer a real public URL unless it
points to localhost.