Skill checks · beta · product overview

Two minutes per skill, no sign-up

Your résumé says SQL. Can you show it?

SkillCompass turns each skill a résumé claims into a check of one placement question and six more. It scores the answers with Elo arithmetic, cites the source behind every question, and hands back a map of which concepts held up and which didn't. It runs for $0 a month. Before any question shipped, an independent review pass rewrote 266 of the 645 drafts.

What exists today
Questions
645
Concepts they test
230
Subtopics with a live bank
29 of 385
Fields with any live subtopic
5 of 46
Career tracks complete
4 of 117
Running cost
$0/month

At a glance, 5 November 2026

Works now
The check itself: placement, six questions, Elo scoring and the knowledge map all run in the browser with no server. The demo below is the real bank and code.
Eval set
The 645 shipped questions, each paired with its draft (650 drafted, 5 never reviewed or shipped). Banks frozen in content/.
Baseline
The drafting pass alone: in 37% of drafts (241) the right answer was the longest option.
Result
266 of 645 questions rewritten by the review pass before shipping; longest-option giveaways down to 23% (148), about chance for four options.
Cost per task
$0 on Gemini's free tier, capped at 1,200 calls a day. Per-call latency for the three model features is not measured: no Gemini key on the machine that ran the evals.
Main failure
As drafted, 415 of 645 keys (64%) were option A, and the review pass did not catch it. The app now shuffles options on every showing, and the stored bank was reordered on 5 November to 165, 164, 158 and 158 keys at A to D. Details.
Switched off
Percentiles, while the free-tier Supabase project stays paused; item recalibration (planned, not built); human sign-off (every bank still marked pending).

Try it

The check, running on this page

These are the real Model evaluation questions, with the app's own routing and scoring copied in. The first question is the placement item, the one closest to median difficulty. Get it wrong and the set comes from the easy end of the bank; get it right in under 20 seconds and it comes from the hard end; right but slower and you get the middle. Your rating then moves after each of the six answers. Nothing is stored or sent.

Model evaluation · 20 questions in the bankPlacement

Session rating

1500

Set by the placement answer: 1350, 1500 or 1650.

    Green: strong, every answer on that concept right. Amber: shaky, some right. Ink: missed. Dashed: not tested yet. These are the rules the app's knowledge map uses.

    From claim to evidence

    Paste a résumé and get a list of things to verify

    A career track is a job broken into six topics. Open one and it starts at zero: nothing assessed, and here are the six things this role wants evidence of. Paste a résumé, or photograph one, and SkillCompass reads it against that track's curriculum and badges the topics your experience claims. Each badge comes with a Verify button, because a line on a CV is still only a claim.

    The Data Analyst career track page reading 0 of 6 topics assessed, with a résumé paste box, an upload button, a privacy note, and a Your biggest gaps panel listing the six untested subtopics.
    A track opened cold: 0 of 6 assessed.
    A track page showing a parsed résumé with extracted skill chips including SQL, Tableau, Excel, Redshift and window functions, above six track subtopics each badged From resume with a Verify button.
    Ten skills read off a résumé; six topics waiting to be checked.

    The text goes to one Gemini call and is not stored. The report compares you with the track's curriculum only. There is no job-postings corpus yet, so it makes no claim about market demand or salary, and the page says so under every report.

    Where the questions come from

    Every answer names the source it was written against

    Answer a question and the explanation opens, right or wrong: which option was correct, why the tempting one isn't, and the public reference behind it. The placement question in the demo above cites Davis and Goadrich's 2006 paper on precision-recall and ROC curves.

    A multiple-choice question with a debatable key is worse than none, so the pipeline assumes its own drafts are wrong. One model pass drafts questions in difficulty bands. A second, independent pass checks each one for the usual faults (an ambiguous key, a giveaway option length, trick phrasing) and repairs or rejects it. In practice it rejected none of the 645 it saw and changed 365. The plan adds a person's sign-off before a question counts; as noted above, the banks in the repo are still marked as waiting for it.

    A revealed answer marked Right, with an explanation of why ROC-AUC stays stable across prevalence while PR-AUC drops, followed by a cited source line naming Davis and Goadrich 2006.
    The reveal step, with the source line at the bottom.

    Error analysis

    What the review pass fixed, and the bias it missed

    The drafts and the reviewed versions are both kept, so the review pass can be read as a diff. eval/review_pass.py pairs all 645 shipped questions with their drafts and sorts the changes by kind. A question can fall under more than one row.

    ChangeCountOne real case, draft to shipped
    Difficulty prior re-estimated190"What does p = 0.03 mean?": the share of professionals expected to answer right, 0.75 to 0.55. 97 priors went up, 93 down; median move 0.05.
    Correct option reworded145"The practical business impact of the effect size alongside its statistical significance" lost two words, so it no longer stood out as the longest.
    Only distractors rewritten107An off-topic wrong answer ("H0: the test result will replicate later") became a plausible one: the null and alternative swapped.
    Question stem rewritten21"whether 6 PM increases the open rate" became "changes", to match a two-sided key.
    Source replaced15A question on peeking at A/B results moved from "Sequential analysis" to "Data dredging", the page that describes the error.
    Rejected0Every reviewed question was repaired or kept. A batch of 5 drafts was never reviewed and never shipped.

    The review pass looked at one question at a time, so it could not see a pattern across a bank. As drafted, the correct option was A in 415 of 645 questions (64%), and the app showed options in the order they were stored, so always answering A got about two in three right against one in four for a random guess. In 22 of the 29 subtopics A was the key more often than not. Since 4 November the app and the demo on this page shuffle the options each time a question is shown. On 5 November scripts/rebalance_keys.py (fixed seed) reordered the stored options so that each subtopic deals its keys to A, B, C and D in turn; no letter now holds more than 28% of any subtopic's keys. Before reordering, 31 explanations named an option by letter ("Option D reverses the subtraction"). Those letters had already stopped matching once the app began shuffling, so the 31 now name the option by its content instead.

    Which letter holds the right answer, all 645 shipped questions. Bars are shares of 645. From eval/review_pass.json (verified_key_position and shipped_key_position), run 5 November 2026.

    What you get back

    A map of the topic, under the mark out of six

    The score is one line. Below it is the knowledge map: every concept in the topic, colored by how you did on the questions that touched it, with the prerequisite links drawn in. Concepts your six questions never reached stay dashed. Tap a node for what the concept is and a way back into fresh questions on it. Under the map sits a short diagnosis written by rules, not by a model.

    A finished check on Model evaluation scoring 6 out of 6, above a knowledge map of eight concepts colored strong or left dashed as not yet tested.
    Six for six, with three concepts still untested.
    The knowledge map with a concept dialog open for ROC-AUC vs PR Curve, marked strong, explaining the difference between the two curves and offering a Take it again button.
    Any node opens into a definition and a retake.

    A clean 6/6. You handled ROC-AUC vs PR Curve, the hardest idea in this set, without slipping. Take it again to cover confusion matrix; a perfect run on fresh questions is the real test.

    The diagnosis the app wrote for that run

    How difficulty is set

    Plain Elo arithmetic, and one part still to build

    Each question carries a prior p: the estimated share of median professionals who get it right, set when it is drafted and re-estimated by the review pass. That becomes an item rating. Your session rating starts at 1350, 1500 or 1650 depending on the placement answer and moves after every answer by at most 48 points.

    R_item = 1500 − 400 · log10(p / (1 − p))A question's rating from its prior. p = 0.5 gives 1500.
    E = 1 / (1 + 10^((R_item − R_you) / 400))The chance the model gives you of answering it right.
    R_you ← R_you + 48 · (correct − E)Your update after each answer. Built; it is what the demo uses.
    K_item = 32 / (1 + n/40)Planned, not built. Item ratings would move toward real answer rates, in steps that shrink as an item collects n answers. The answer log it needs was being collected until the database paused.

    A hard question pays more for a right answer and costs less for a wrong one

    Points your rating moves for one answer (up the side) against the question's rating (along the bottom, harder to the right). The grey bars are the 645 questions in the repo, placed by their priors.

    Two curves: the gain for a right answer rises from about 10 to 40 points as question rating rises from 1200 to 1700, and the loss for a wrong answer falls in size over the same range. Most of the 645 questions sit between ratings 1300 and 1650.
    Move across the chart, or focus it and use the arrow keys.

    Only first exposures would feed recalibration, so retaking a topic can't skew an item's statistics. The app's How this works page sets all of this out, formulas included.

    The number it won't invent

    No percentile until 30 people have taken the check

    A percentile here means your final rating placed against every logged session on that subtopic in a rolling 90-day window. Below 30 sessions the result says "early data" and gives no number. Your first attempt fixes the percentile, so retakes draw unseen questions without letting you shop for a better rank. The community dashboard follows the same rule and says plainly that it has nothing to show yet.

    The sessions behind all of this live in Supabase, and the free tier pauses a project after seven days without activity. A twice-weekly keep-alive job pings the API and checks the response bodies, not just the status codes, because the first version of that job passed for three weeks while the database was down. It failed, correctly, on every run from 6 August 2026, when the project paused again, until GitHub switched the schedule off for inactivity after the 19 October run. Until someone resumes the project, every subtopic stays at "early data".

    The Live dashboard page, badged beta early data, saying the community counters switch on once the beta has real traffic to report and that there are no fake numbers in the meantime.
    The dashboard says when it is empty.

    How much is live

    385 subtopics catalogued, 29 with questions

    content/catalog.json lists 385 subtopics across 46 fields and 117 career tracks. A subtopic goes live when its bank reaches 12 questions, and a build script works out field and track status from whatever banks exist, so nothing is flipped by hand. Four tracks are complete (Data Analyst, Data Scientist/ML, BI Analyst, Business/Product Analytics) and 42 more are partly covered.

    Statistics and SQL are complete; 41 of 46 fields have nothing live yet

    Each bar is a field's catalogued subtopics; the filled part is the share with a live question bank. From content/manifest.json.

    Sort:
    FieldLive of cataloguedBar
    The Explore page listing live topics grouped by field: Machine Learning and AI, SQL and Data Tools, Finance and Markets, Statistics and Experimentation, with plus-more-coming labels on the incomplete fields.
    The Explore page lists ready topics first and says how many are still coming.

    The capstone

    A mock interview that asks the second question

    Assess all six topics in a track and a mock interview unlocks: six to eight turns of text, pitched at the level your results showed rather than the one you claimed, ending in a scorecard by dimension. It follows up when an answer is thin. In testing, a deliberately vague answer was flagged and scored low across several follow-ups. The server keeps no session; the browser resends the transcript each turn. Candidate answers are wrapped in tags under a rule against prompt injection, and a backend test checks that the rule is in the prompt.

    The third model feature is a study guide: a downloadable Markdown plan for a whole track, built from your per-concept results and, where they exist, your résumé and interview. All three share one Gemini helper with a daily cap of 1,200 calls, shown on the methodology page as a capacity meter.

    The bottom of a track page showing six subtopics badged From resume with Verify buttons, and a locked Mock interview capstone panel reading unlocks when all 6 topics are assessed, marked 0 of 6.
    Locked at 0 of 6. Finishing the track opens it.

    Your data

    One browser key, an export button and an erase button

    There are no accounts. Everything you do is kept in one localStorage key (sc_v1). The Progress page lists every check with its date and score and has two buttons: take it all away as a file, or delete it. The only central record is an anonymous answer log (question, right or wrong, time taken), which is what percentiles and the planned recalibration run on.

    The Your progress page showing checks completed, topics attempted and average score, a history list with dates and scores, and Export my data and Clear everything buttons.
    "Everything below lives only in this browser."

    Smaller things: the whole check works from the keyboard (A to D, then Return); the placement can be skipped by picking a level; a résumé photo is read the same way as pasted text; and a track with only some banks ready carries a readiness badge instead of failing halfway through.

    What it runs on

    Free tiers, and a quiz loop that needs no server

    Questions ship as static JSON, and scoring, the knowledge map and the diagnosis all run in the browser. That is why the demo above works and why the app's checks keep working with the database paused: only percentiles and the model features need the backend.

    Frontend
    React, Vite and TypeScript, built to static files on GitHub Pages.
    API
    Python FastAPI on a free Hugging Face Space. Percentiles and the three model features only.
    Session store
    Supabase Postgres, free tier, reached through a 40-line standard-library PostgREST client after the official SDK misread the new key format. Paused as of this writing.
    Model features
    Gemini 2.5 Flash on the free tier over plain REST, with thinking tokens off so answers aren't cut short.
    Questions
    Drafted in difficulty bands, checked by an independent model pass, each tied to a named public source. Curricula referenced against Coursera, edX and Kaplan.

    Find out which half of the résumé holds up