AniBrief
HomeDaily BriefNewsAiringSeasonalAnimeMangaMusicPeopleCalendarDiscoverMy ListAlertsProfileSettings
What's New / Patch notes

Independent discovery & tracking service. Not affiliated with AniList, MyAnimeList, or Crunchyroll.

HomeDaily BriefAiringMy ListCalendar

What's New

Release notes for AniBrief, generated from CHANGELOG.md.

Unreleased

### Added - **Third AI provider: `goat-ai`** — a new `GoatAIProvider` (`src/lib/ai/goat-ai.ts`) implementing the same `AIProvider` interface as `AnthropicProvider`/`OpenAIProvider`, backed by a self-hosted, OpenAI-compatible inference platform, reached via the official `openai` npm package pointed at a custom `baseURL`. Selectable via `AI_PROVIDER=goat-ai` + `AI_PLATFORM_API_KEY` (+ optional `AI_PLATFORM_BASE_URL`, defaults to `https://api.gariyuuu.com/v1`); the existing `anthropic`/`openai` providers and the zero-key template fallback are unchanged. **Not activated anywhere by default** — `AI_PROVIDER` still defaults to `"anthropic"`, and no production env var was changed. Functionally verified against the real platform (see `SESSION_LOG.md`'s newest entry).

0.2.1

Fix Spotify's "no playlist found" and get real popular tracks
### Fixed - **Spotify feeds on the Music page showed "no playlist found."** Two real, separate bugs: 1. Spotify's playlist search response names its track-count field `items`, not `tracks` — the mapping code read the wrong field name, threw, and got silently caught as an empty result. 2. Spotify's Web API restricts unapproved apps ("Client Credentials," not "Extended Quota Mode") to a maximum `limit` of 10 per search request — not the documented 50 — and blocks reading a playlist's actual track listing entirely (`403`, confirmed even against Spotify's own official playlists, so it's a blanket policy, not specific to any one playlist). - **Rebuilt around what's actually available**: real anime tracks now come from direct Spotify track search (paginated properly at 10 per request), ranked by Spotify's own search relevance. Each section also links out to a real, well-followed matching playlist (ranked by actual follower count, shown in the UI) for browsing the full thing on Spotify. Verified live: real hits like YOASOBI's "IDOL," real cover art, real follower counts.

0.2.0

Spotify sync, live music charts, and a full People & Characters directory
### Added - **Patch notes are now linked from the sidebar** ("What's New / Patch notes", bottom of the left nav on every page) — previously `/whats-new` existed but wasn't linked from anywhere. - **Real Spotify integration.** Connect your own Spotify account (Settings → Connected Accounts, or from the Music page) via a real OAuth flow, then select tracks on the Music page and save them as an actual playlist on your Spotify account — not a link-out, a real API call that creates the playlist and adds the tracks. Requires `SPOTIFY_CLIENT_ID`/ `SPOTIFY_CLIENT_SECRET` (see `ENVIRONMENT_VARIABLES.md`); shows an honest "not configured" state until then. - **Live "New this season" and "Trending" music feeds** on the Music page — real YouTube searches (Music category, sorted by upload date or view count) plus, once Spotify is configured, the live tracklist of a real, well-followed curator playlist (e.g. "Anime Openings & Endings"), clearly labeled as coming from that playlist rather than an AniBrief-computed chart. The old hand-curated OP/ED credits stay as a fallback section. - **Multi-source playlist builder**: check tracks across the New/Trending/curated sections (works across both YouTube and Spotify results), then either open a real YouTube multi-video queue, get a combined Spotify search link, or (if connected) save straight to Spotify. - **People section is now a full, paginated, searchable directory** covering both AniList staff (voice actors, directors, authors, composers) and, new, **characters** — tabs for People and Characters, search or browse-all-by-popularity with real pagination, and a new character detail page (`/characters/[id]`) showing bio, favourites, birthday (or "Unknown" — AniList rarely has real birth dates for fictional characters, and this never guesses one), and every anime/manga they appear in. Character links are wired in from birthday strips and every anime/manga's Characters tab. You can now follow characters, not just people. - Global search (`⌘K` and `/api/search`) now also returns matching people and characters alongside anime/manga.

0.1.2

Sign-up CAPTCHA fix
### Fixed - **Sign-up failed with "The CAPTCHA failed to load"** for every visitor, not just a specific browser. Clerk's bot-protection CAPTCHA (Cloudflare Turnstile) loads its script/iframe from `challenges.cloudflare.com`, which the Content-Security-Policy added in 0.1.1 didn't allowlist — so the browser silently blocked it. Added `challenges.cloudflare.com` to `script-src`, `frame-src`, and `connect-src` in `next.config.ts`.

0.1.1

Security fix + deployment
### Fixed - **Admin dashboard was readable while signed out.** `/admin` relied on a `redirect()` inside its layout to send non-admins away, but in this Next.js version a sibling page render could still be serialized into the response before the redirect took effect — a signed-out request could receive the full dashboard (provider health, job logs) with a `200` instead of being redirected. Fixed by blocking `/admin` in `src/proxy.ts` (Clerk middleware), which runs before any rendering starts; the layout-level check remains as defense-in-depth for client-side navigations. Verified: a signed-out request now gets a clean `307 → /` with no content sent. - **Daily Brief page crashed in production builds.** `DailyBriefView` (a Server Component) was passing a render-prop function into a Client Component — functions can't cross that boundary in React Server Components. Restructured so all section data flows down as plain serializable props instead (`src/components/briefing/BriefModeToggle.tsx`). ### Changed - Deployed to Vercel with Clerk + Neon wired up; see `DEPLOYMENT.md` for the live setup.

0.1.0

Initial release
First release of AniBrief: a daily briefing terminal for anime, manga, Japanese music, and voice-actor news, built on the architecture of the sibling MarketBrief project, with Clerk + Neon/Drizzle in place of Supabase and AniList's public GraphQL API as the primary live data source. ### Added - **Home dashboard** — hero "Today in Anime" brief with real stats, today's episode timeline (local-timezone converted, with streaming links), top stories, trending titles, and a real-person/character birthday strip. - **Daily Brief** — full briefing with Quick/Standard/Deep modes, listen-aloud (browser speech synthesis), copy-summary/copy-link/email sharing, and a persisted daily archive (`/daily-brief/archive`). - **News terminal** (`/news`) — Latest/Top/Following/Anime/Manga/Music/Industry/Streaming/ Games/Movies/People/Rumors tabs, reliability labeling, rumor detection, and duplicate-story clustering across sources. - **Airing schedule** (`/airing`) — Today/Tomorrow/This week views, grouped by local day. - **Seasonal browser** (`/seasonal`) — season navigation, sort, format filter, and a live genre/studio mix computed from the fetched page. - **Anime & Manga** (`/anime`, `/manga`) — search/browse plus detail pages with tabs (Overview, Characters, Staff*, Relations, News, Music*, Statistics* — *anime only). - **Music hub** (`/music`) — curated OP/ED reference set grouped by theme, with playlist-style YouTube-search link-outs. - **People directory** (`/people`) — search, "Born Today," and an honestly-scoped "Upcoming Birthdays" (computed from AniList's most-favorited staff, since AniList has no birthday date-range query). - **Calendar** (`/calendar`) — unified agenda of episodes, birthdays, and user reminders, with toggleable filters and `.ics` export. - **Discover** (`/discover`) — mood, genre, studio, decade, hidden-gems, and short-anime explorers, each backed by live AniList queries. - **My List, Profile, Settings** — Clerk-authenticated watch/read lists with status/progress/ favorite management, a favorites+following profile view, and a full settings surface (appearance, content prefs, streaming services, spoilers, brief preferences, timezone, notifications, connected accounts via Clerk's `<UserProfile />`, privacy). - **Alerts & notifications** (`/alerts`) — alert creation/management and a deduplicated in-app notification feed. - **List import** (`/settings/import`) — CSV import with AniList-backed best-effort title matching and a mapping preview before commit. - **Admin dashboard** (`/admin`, env-gated) — live provider health, sync-job log, data-source registry, announcement banner editor, feature flags, and a notification test button. - **Scheduled jobs** — airing/news/seasonal cache refresh, birthday pre-warming, trend-snapshot collection, daily-brief pre-generation, and deduplicated notification dispatch, all idempotent via a shared `sync_jobs` lock. - **PWA support** — installable manifest, generated icons, and a hand-written service worker caching the app shell and recently-visited pages for offline use. - Full documentation set: `README.md`, `ARCHITECTURE.md`, `DATA_SOURCES.md`, `DATABASE.md`, `DEPLOYMENT.md`, `ENVIRONMENT_VARIABLES.md`, `CONTRIBUTING.md`. ### Known limitations - Trend-delta percentages aren't shown anywhere — snapshots are collected (`trend_snapshots`) but there isn't enough historical depth yet to display an honest change figure. - MyAnimeList's official API (ranking sync, two-way list sync) isn't implemented — the provider interface exists and degrades cleanly; it needs a registered OAuth client to activate. - Browser push notifications aren't wired up (the DB column for a subscription exists; the subscribe flow doesn't yet) — in-app notifications and email-link sharing work today. - Email-digest *sending* isn't implemented (the `resend` dependency is present but unused); the Daily Brief's "Email" share action uses a client-side `mailto:` link instead. - Music and trailer data depend on optional API keys (Spotify/MusicBrainz-equivalent, YouTube) that aren't configured in this deployment — both surfaces show an honest "not configured" state alongside a small curated reference set where applicable, rather than fabricating data.