Changelog
What shipped, and when.
Short, blunt notes. Anti-features stay on purpose; everything else is a delta.
- v0.3.92026-05-12
Twitter env detection + dev probe
- Trim TWITTER_* values; single isTwitterOAuthConfigured() helper for Sources / X start / token calls.
- GET /api/integrations/x/debug-env (development only) returns whether the process sees Twitter credentials — no secrets.
- v0.3.82026-05-12
Email URLs, weight slider, X copy
- Sign-up / magic-link emailRedirectTo uses NEXT_PUBLIC_SITE_URL when set so confirmation links match one dev port.
- Intent graph weight: controlled client slider updates the label while dragging.
- Sources: clarify X keys are operator-only; users never paste client id/secret.
- v0.3.72026-05-12
Sign-in: fix NEXT_REDIRECT shown as error
- Server actions used try/catch around redirect(); Next throws NEXT_REDIRECT — rethrow with isRedirectError so success redirects work.
- v0.3.62026-05-10
Local dev fixes — site origin + watchers
- Dev: OAuth callback + magic-link URLs use request host/port (trusted localhost only); production still uses NEXT_PUBLIC_SITE_URL.
- Sign-up / sign-in / OTP: clearer message when Supabase is unreachable (fetch failed).
- npm run dev:poll + WATCHPACK_POLLING webpack option to reduce EMFILE; docs updated.
- v0.3.52026-05-10
Playtest hygiene
- `npm run dev:clean` — delete `.next` then start dev (fixes ChunkLoadError / bogus 404s after stale builds).
- Run only one `next dev` for this repo: multiple ports sharing one `.next` folder corrupt chunks.
- Middleware: preserved query string when redirecting unauthenticated users to sign-in (e.g. X OAuth `?next=`).
- v0.3.42026-05-10
Sync errors + sign-in redirect safety
- Bookmark sync failures set SourceConnection syncState to error (visible on Sources) until the next successful sync.
- Sign-in `next` parameter restricted to same-origin paths to avoid open redirects.
- docs/integrations/x.md: credits note, verification checklist, OAuth next= allowlist.
- v0.3.32026-05-10
X integration — onboarding + robustness
- Ensure a Twitter SourceConnection row exists before Sources / OAuth / sync (no more missing-row callback errors).
- OAuth return path: `/api/integrations/x/start?next=/onboarding/finish` returns to step 4 after connect; allowlist is `/sources` and `/onboarding/finish`.
- Onboarding finish step: same Connect / Sync / Disconnect controls as Sources.
- v0.3.22026-05-10
Supabase DB + docs
- Unique index on (userId, url) for CandidateItem — dedupe enforced in Postgres.
- Added supabase/migrations + docs/supabase-production-checklist.md (Site URL / redirect URLs for scrollcut.com).
- v0.3.12026-05-10
Supabase credentials server-only
- Replaced NEXT_PUBLIC_SUPABASE_* with SUPABASE_URL + SUPABASE_PUBLISHABLE_KEY (anon key) so project URL and anon key are not bundled into client JavaScript.
- Removed unused browser Supabase client. See docs/environment.md for Vercel variable names.
- v0.3.02026-05-10
X (Twitter) — OAuth + bookmark sync
- Connect X from Sources via OAuth 2.0 (PKCE); tokens stored server-side in SourceConnection.
- Sync now uses bookmarked posts as personalization signals; Disconnect clears tokens.
- Setup: docs/integrations/x.md — TWITTER_CLIENT_ID / SECRET, NEXT_PUBLIC_SITE_URL callback, optional SUPABASE_SERVICE_ROLE_KEY for flaky session cookies.
- v0.2.02026-05-06
Editorial redesign + multi-step onboarding
- Reframed the entire UI around an editorial brief — paper background, ink type, clay accent, Newsreader serif headlines.
- Onboarding split into four routed steps: identity, context, confirm graph, sources & first brief.
- Brief detail page (/brief/[id]) added with a sticky source rail and a per-component score breakdown.
- Past briefs page redesigned as an inline-expandable archive with month grouping.
- Apply queue moved to a 3-lane board with editable due-by and notes.
- Why-now copy rewritten so reasons read as journalist-grade sentences.
- v0.1.02026-04-30
First MVP
- Onboarding parses a context dump into editable interest nodes.
- Daily brief composes opportunities first, with a capped resource lane.
- Manual URL paste + Notion-preview signal staging working end to end.
- SQLite + Prisma data model covering UserProfile, IntentNode, SignalEvent, CandidateItem, Recommendation, QueueItem, Digest.