Product / Changelog
What shipped, and why
Every notable change to the arena, the question bank, and the Ninja AI layer — newest first. Fixes get the same billing as features: on a rated ladder, a quiet correctness bug is the more expensive of the two.
For how any of it actually works, read the architecture docs.
Pricing, in the house style
- ChangedPricing page adopts the landing aesthetic
The pricing page now runs the same near-black violet field and animated gradient layer as the landing page, with mint as its only call-to-action colour. It used to sit on a standalone green background with gold buttons, which read as a different product.
Settings polish
- FixedSettings nav highlights the section you clicked
Scroll-spy alone fought your click near the bottom of the page, where short sections can never reach the top of the viewport. A click now wins until you scroll again.
Motion, settings, and a leaner surface
- AddedOne motion vocabulary across every screen
Results stamp in, lists rise on a shared easing curve, and page transitions are consistent app-wide. Everything respects prefers-reduced-motion: the animation is skipped, never the content.
- AddedCard-based settings with local preference toggles
Display name, password, and avatar sit in their own cards alongside preferences that stay on your device.
- AddedPractice history and drill-your-misses
Every solo drill is archived, and questions you got wrong can be re-served as a targeted set. Season resets are marked on the rating graph so a soft reset never reads as a collapse.
- AddedExam picker after login
New accounts choose their target exam before landing in the lobby.
- FixedFriend challenges work end to end
Accepting an invite link now carries you through sign-in, the host is notified without waiting on a realtime channel that never carried challenges, and a challenge code can be joined directly.
- FixedMatches recover from a dropped submit
A retry after a lost connection re-derives your true position instead of resubmitting a stale question index, so a flaky network can no longer strand you mid-match.
- FixedBot matches start from the lobby
Playing the bot no longer requires an existing queue row.
- RemovedAdmin console
The in-app admin console and its API routes are gone. Question-bank work moved to the ingest scripts, shrinking the authenticated attack surface.
Self-paced matches
- ChangedEach player runs their own clock
Matches were lockstep: both players waited on the slower one at every question. Now each player traverses their own nine questions at their own pace, and the match is decided once both have finished. Bot matches deliberately stay lockstep.
- AddedDILR bank with diagrams and shared caselets
Data-interpretation sets are served whole — the caselet and its sub-questions together — with the reading window added to the first question's clock instead of being charged against your speed bonus.
- AddedNinja learns from every match
A rolling profile of your accuracy by section, question type, and difficulty band feeds the coach with no extra model call per match.
- FixedA match can never be short of nine questions
If one section is thin, its slots are redistributed rather than producing a truncated match that could run past its own question list.
Ninja AI, TITA, and practice drills
- AddedNinja coach chat, PDF solver, and study plans
Three modes on one route: stat-grounded Q&A, a Socratic buddy that gives hints rather than solutions, and a seven-day plan. Plus a PDF solver that reads a question paper you upload.
- AddedType-in-the-answer questions
TITA questions ship across matches and solo drills. The answer box accepts numbers only — the same constraint the real exam interface applies — because a lenient matcher would turn a correct answer with a unit attached into a wrong one.
- AddedSolo practice drills with explanations
Weakest-section-first question selection, unrated, with the worked explanation revealed the moment you lock an answer. Practice never moves your rating and never touches question difficulty.
- ChangedNo AI of any kind while you are in a match
Every Ninja route refuses to answer while the caller has a live match — including questions aimed at an older, finished match from a second tab. The rule keys on you, not on the match you name.
- AddedSemantic search over the question bank
Questions carry embeddings, refreshed automatically whenever a question body changes. The search primitive returns identifiers and similarity only, never question text.
Ladder integrity
- FixedYour opponent's answer stays private until you have answered
Answer rows are readable only by their own author. Previously a typed answer could be read by the other player while the question was still open — with type-in answers stored as plain text, that handed over the answer.
- FixedThe bot is excluded from both leaderboards
Ninja Bot no longer appears on the global ladder or in season results.
- ChangedQuestion difficulty only learns from rated and bot matches
Unrated player-versus-player matches no longer nudge a question's difficulty rating — uncapped private challenges were a way for two accounts to distort the bank together.
Ninjatest opened its repository on 2026-07-16. Anything before that predates version control on this codebase.