commits
Introduce Header to TopAlbums and TopTracks embeds. Render a table of
albums with artwork, artist links, and numeric ranks; use uuid v4 for
row keys. Send startDate/endDate from getLastDays(7) to the
getActorAlbums endpoint. Add small CSS utilities: .rounded-[5px] and
.opacity-60.
Add apps/embed: server-side rendered Hono + React embed app
using Bun. Includes Tailwind config and public styles, fonts and
logo, XRPC clients for profile/stats/genres/track, renderer,
routes, ProfileEmbedPage, tsconfig, package.json, lockfiles,
README, CLAUDE notes and .gitignore.
Remove axios from package.json and bun.lock. Simplify the OG API
fetch (remove custom headers) and log non-OK responses
(res.statusText and response body) before returning null.
Remove envalid.testOnly usage and provide concrete default values for
several environment variables (NODE_ENV, HOST, PORT, PUBLIC_URL,
NATS_URL, ANALYTICS, MUSICBRAINZ_URL, MEILISEARCH_URL) and drop the
unused import.
Upgrade and refactor OAuth client
Bump @atproto deps (jwk-jose, oauth-client-node). Extract OAuth
client and auth negotiation into dedicated modules and simplify
client.ts. Make app-proxy forward oauth-client-metadata.json and
jwks.json instead of serving hardcoded values. Add a Deno local
proxy script and task plus editor settings for local development.
Read prompt from the query and prefer it when redirecting from /loading,
redirecting to the API login with the prompt. Make handle and prompt
optional in route validation. Send only prompt in Main's loading URL
when present and rename onCreateAccount login action from
"create_account"
to "create"
Remove the login_hint query param when a prompt is requested and allow
onLogin to proceed with an empty handle if prompt is provided. This
supports prompt-based login flows without carrying a prefilled hint.
Support a "prompt" query param in /login and include it when
redirecting from the web client. Server uses a fallback handle when
prompt is present and forwards the prompt to the OAuth client. Remove
client-side identity resolver and oauth-browser-client usage and tidy
related dependencies in package.json and bun.lock.
Import NotNull from drizzle-orm and remove conditional checks
for profileRecord when setting avatar; set displayName to an empty
string by default.
Catch failures when retrieving app.bsky.actor.profile and return an
empty profileRecord so the actor flow doesn't throw. Use null/undefined
avatar values when no profile record exists. Add @atcute oauth and
identity-resolver dependencies and configure OAuth/identity resolver
(with DOH and DID resolvers) in the Main layout; update bun.lock.
Render ContentLoader placeholders during loading states.
Add isLoading prop to PopularSongs and import react-content-loader.
Remove @tanstack/react-router Link; use <a> with href derived from
row.uri (strip "app.rocksky." host). Uppercase table headers,
adjust opacity to 85%, and format listeners with thousand separators.
Switch top artists/tracks requests to charts XRPC endpoints
(/xrpc/app.rocksky.charts.getTopArtists and getTopTracks).
Display 7-day date range using dayjs. Add listeners column
and format listeners/scrobbles with numeral. Tweak table head/
body styles and vertical alignment.
Remove Effect Cache usage for getTopArtists/getTopTracks and call
retrieve directly. Replace SQL ANY(...) expressions with drizzle-orm
inArray for artist/track filters. Add consola.info statements to log
counts at key steps and remove now-unused imports (Cache, Duration, eq).
Add API and hook for fetching genre scrobbles charts and wire it into
ScrobblesAreaChart. Rename Track fields from snake_case to camelCase to
match app conventions and update mapping in useLibrary. Remove an
unnecessary any cast.
Add a "genre" query parameter to getScrobblesChart and propagate it
through
lexicon definitions, generated TypeScript types, XRPC handler logic, and
the
analytics backend (GetScrobblesPerDayParams).
Add infinite query hooks: useAlbumsByGenreInfiniteQuery,
useArtistsByGenreInfiniteQuery, and useTracksByGenreInfiniteQuery.
Switch pages to use useInfiniteQuery and an IntersectionObserver to
auto-fetch next pages and show a "Loading more..." indicator.
Add /genre/$id route and Genre page with Artists, Albums, and Tracks
tabs. Introduce use*ByGenre hooks and wire up get*ByGenre API calls.
Add Album and Track types. Replace tag spans with router Links so tags
navigate to genre pages and update related components and styles.
Bump @atproto deps (jwk-jose, oauth-client-node). Extract OAuth
client and auth negotiation into dedicated modules and simplify
client.ts. Make app-proxy forward oauth-client-metadata.json and
jwks.json instead of serving hardcoded values. Add a Deno local
proxy script and task plus editor settings for local development.
Support a "prompt" query param in /login and include it when
redirecting from the web client. Server uses a fallback handle when
prompt is present and forwards the prompt to the OAuth client. Remove
client-side identity resolver and oauth-browser-client usage and tidy
related dependencies in package.json and bun.lock.
Catch failures when retrieving app.bsky.actor.profile and return an
empty profileRecord so the actor flow doesn't throw. Use null/undefined
avatar values when no profile record exists. Add @atcute oauth and
identity-resolver dependencies and configure OAuth/identity resolver
(with DOH and DID resolvers) in the Main layout; update bun.lock.