v2.9.0August 2026·Release notes
Closed-Beta Waitlist, Exam Prediction on Pro & the Reliability Sweep
A minor release that sets the stage for public launch. Claritii now runs a proper closed-beta waitlist with a full-screen landing-page signup experience and confirmation emails, Exam Prediction moves to Pro where it always belonged, and per-subject difficulty settings finally drive the roadmap planner. Under the hood this is the most reliability-focused release yet: rate limiting actually enforces itself in production for the first time, 40+ silent error paths now surface to the user, edge functions were security-hardened, and 75+ fixes ship across the entire stack.
Share:X (Twitter)
New Features
Closed-Beta Waitlist — The landing page now greets visitors with a full-screen waitlist overlay — pitch copy, email capture, success state, and ESC/backdrop dismissal, shown once per session. Every 'Log in' and 'Get started' call-to-action across the marketing pages routes through it. Joining upserts into a dedicated waitlist table (idempotent on email) and triggers a branded confirmation email via a new edge function. Owner login is preserved so the app stays testable during the closed beta.
Exam Prediction Now on Pro — The AI exam prediction engine was gated to Max, but the feature spec, the features page, and the pricing copy all describe it as a Pro feature. Pro subscribers no longer hit an 'Upgrade to Max' wall — tier gating, upgrade copy, and analytics messaging updated everywhere to match.
Per-Subject Difficulty Now Drives the Roadmap — The difficulty slider in each subject's AI Tutor settings was written to the profile but never read — the roadmap planner ignored it entirely. The AI session plan now receives per-subject difficulty and applies a decision rule: subjects rated 4–5 get more study time and active-retrieval methods; subjects rated 1–2 get faster foundation-building methods.
Improvements
Rate Limiting Actually Enforced — A response-envelope bug in the atomic-counter RPC meant every rate-limit check read the window as empty — abuse, load, and quota limits never triggered in production. Fixed and verified end-to-end, with a new migration so capped counter keys reset atomically once their window expires. This is the first release where the limits you configure are real limits.
Resend Webhook Signature Verification Fixed — Svix signature verification always failed — base64 signature parts were hex-parsed, the signing secret was encoded wrongly, and there was no timestamp check — so email open/click events were never recorded. Now verifies each part correctly with 5-minute freshness and replay protection.
Edge Function Security Hardening — send-release-announcement now requires the actual service-role bearer token (any Bearer string previously passed and could broadcast); marketing email jobs are claimed atomically with a status guard so overlapping cron invocations can't double-broadcast; and Stripe Customer Portal plan changes now resolve the tier correctly via price lookup instead of silently skipping the update.
Account & Auth Fixes — Delete account now removes the auth row first — a failed deletion leaves the account fully intact and retryable instead of a half-deleted broken login. Verify-email 'Continue' works without an existing session, and email verification/password reset now work for users beyond the first 50 (pagination fix in auth-actions).
Onboarding Quick Start No Longer Duplicates — The Quick Start flow called the save path twice, writing every subject and schedule block twice. Now a single write per mount, guarded against double-fires, with user-facing errors on failure.
Spaced Repetition & Mastery Integrity — Review results that failed to save no longer silently reset your cards' intervals (the read path is fail-closed now), and the Review page feeds spaced-repetition ratings into topic mastery — reviewing cards genuinely moves your mastery scores and roadmap signals.
Roadmap AI Plan Matched Per Subject — The AI's per-day plan was consumed positionally, so subject B's chosen topic could land on subject A's sessions. Plans are now matched by date/subject/assessment key, and roadmap regeneration no longer truncates completed history at 1000 rows.
No More Orphans on Delete — Deleting a subject or assessment now cleans up material chunks, generated content, and materials. Chunk storage writes inserts-first, so a failed insert can never leave your assessment's knowledge base empty.
LaTeX Instructions Actually Reach the AI — The AI's LaTeX teaching text was garbled — JavaScript string escaping ate the backslashes, so the model saw corrupted instructions like control characters instead of TeX. Now double-escaped correctly, so the model is genuinely taught $...$ / $$...$$ formatting for equations, chemical formulas, Greek letters, and scientific notation.
Silent Failure Sweep — 40+ Sites — Settings saves, onboarding inserts, dashboard dismissals, friend search, Google login, email changes, session completion, marketing checks, and dozens of other handlers that swallowed errors now log and surface them to the user instead of silently doing nothing.
Crash Guards & UI Fixes — The library page no longer crashes on orphaned content rows; diagram embeddings (PostgREST stringified vectors) now parse correctly before similarity search; warning/accent theme colors support opacity modifiers; session-type icons render their descriptions; blurting mode clears stale feedback between questions.
Repo & Engineering Hygiene — CRLF → LF line endings normalized repo-wide with .gitattributes enforcing the policy going forward, TypeScript 'any' cleanups across cron/ingest/audit, unused parameters removed, and 20+ DEV-only error logs now record in production.