A personal album review tracker. Search MusicBrainz for a release, rate it, write what you thought, and keep a local library of reviews.
- Search albums against the
MusicBrainz release-group API,
including
Lucene
queries (
red AND taylor swift) - Cover art from the Cover Art Archive when a release is selected or when viewing saved reviews
- 1–5 star ratings and freeform remarks
- Duplicate protection so the same release group cannot be reviewed twice
- Edit and delete existing reviews
- Local persistence via
localStorage— reviews survive refreshes with no backend - Dark UI by default, with a theme provider that also supports light and system preference
/— Home; jump to create or saved reviews/create— Search MusicBrainz, pick a release, rate and submit/saved— Browse saved reviews with cover art; edit or delete
- UI — React 19, TypeScript
- Routing — React Router 8 (
createBrowserRouter, nested routes, outlet context) - Styling — Tailwind CSS 4, shadcn/ui (Base UI / nova), Geist
- State — Lifted review list in
App, shared withuseReviewContext() - Persistence —
localStorage - Data — MusicBrainz WS/2, Cover Art Archive
- Tooling — Vite 8, Oxlint, Bun
Reviews live in App and are passed to child routes through React
Router outlet context. Pages read and write that list through
useReviewContext(). A useEffect on the create and saved pages
writes the latest list back to localStorage under the reviews
key.
src/
App.tsx # Review type, lifted state, theme + toaster
reviews-context.ts # Typed outlet-context hook
pages/
Home.tsx
CreateReview.tsx # Search, select, rate, persist
SavedReviews.tsx # List, edit, delete, cover art
components/ui/ # shadcn primitives
Each review stores:
releaseGroupId— MusicBrainz MBIDreleaseGroupTitle/releaseGroupArtistrating(1–5)remarks
Needs Bun (or npm/pnpm if you prefer).
bun install
bun run devOther scripts:
bun run build # tsc -b && vite build
bun run preview # serve the production build
bun run lint # oxlintThe app talks to public MusicBrainz and Cover Art Archive endpoints from the browser. No API keys. MusicBrainz asks that clients identify themselves; if you hit rate limits, add a User-Agent on a proxy or wait and retry.
- Data never leaves the browser except the two public music APIs.
- Clearing site data wipes reviews.
- Cover art is best-effort; some release groups have none.
Private project — not licensed for redistribution unless you add a license.