Yournextexercise,writtenfromyourlast.
Spar watches how the attempt actually goes — what you wrote, what you ran, where you stalled — and builds the next challenge around the one thing you couldn’t do. The tests decide the verdict. Never the model.
macOS · Windows · Linux — free, and every build is here

Challenges are set in
[01]The workspace
A small project you open and work in.
Not a text box with a function signature in it. A file tree, a real editor, the problem statement, your test results and a terminal — in panes you can resize, in one window.
The panel under the editor
Testcase
What the visible suite declares — the call and the expected value — before you run anything.
Test Result
Per-case verdicts once you do, with the first failure already selected for you.
Attempt
The replay: every edit and every run, timestamped from the moment the attempt opened.
While anything runs, the app animates its own logo instead of a borrowed spinner — a diagonal wave for work being produced, a slow breath for work being read.
[02]How it works
Closer to sparring with someone who has been watching you.
Practice sites hand everyone the same ladder. Get stuck on the same thing four times and the site will happily let you get stuck a fifth.
- 01
You answer seven questions, once.
Career, goal, where you get stuck, language, model. Answer the stuck one properly — “I never know what actually needs awaiting” gives Spar somewhere to start. “I'm bad at algorithms” doesn't.
- 02
Spar makes an opening call.
No evidence about you yet, so everything you said is a hypothesis rather than a fact. It picks something to probe, and says what it is doing before it does it.
- 03
You work, and Spar watches.
Edits, runs, what the tests said, how long you sat on each part. The clock runs from the moment the attempt opens.
- 04
The tests decide. Then it tells you what it learned.
Not a score. A statement about what your attempt is evidence of, and what it wants to check next — which becomes your next challenge.
[03]What's in it
Every claim on this page has a page in the app that shows its working.
What you have proved and what it is guessing are kept strictly apart, and never drawn the same way.
Challenges proven before you ever see them.
Nobody else is getting your exercise, so you can’t look it up. And before one reaches you it has to survive a mechanical check:
- the reference solution passes every test, visible and hidden
- deliberately broken solutions pass the visible tests — proving the visible suite is genuinely incomplete
- those broken versions fail the hidden tests
- the files, commands and language all agree with each other
You will never lose twenty minutes to a broken problem.
Verdicts nothing can talk out of you.
Graded by running the committed tests and reading the exit code. No model in that path — nothing you say to the agent can turn a failing program into a passing submission, or the reverse.
A tutor that can be talked into agreeing with you is not measuring anything.
The ability ledger.
An earned ability is one your submissions have demonstrated more than once. An uncertain one is a hypothesis Spar hasn’t confirmed yet.

Concepts you can interrogate.
Hover any concept tag, anywhere in the app: passed, failed, still open, and the attempts behind each. This is how you find out whether “closures” is a real gap or one bad afternoon.

Nothing is thrown away.
Every challenge stays, filterable by open, passed or replaced. A session you abandoned is still evidence.

Real problems, when a real problem fits.
Connect LeetCode or Codeforces and the agent can set you real problems alongside the ones it invents — against the same target, in the same ledger.
Submit and it goes to that judge, against every hidden case. The verdict is theirs, and it lands on your account there.
[04]The agent
Ask it why, and it has to answer from the evidence.
Scripted, not a live model — it can't have your history from here. Try the third question.
Chat
your model, your keyWhy this challenge?
reading your last four attempts
checking what the evidence supports
Three of your last four failed on the first iteration, not on the algorithm — and both times you fixed it by flipping < to <= until it went green. That is repaired, not traced.
Trace TypeScript loop state to diagnose boundary-condition bugs
- Loop boundary tracing
- Off-by-one
- Invariants
It says what it is about to do.
Before each phase, in words. Its thinking is labelled by what it was doing, not by how long it took.
It can ask you things back.
Mid-attempt — what you were trying, where you expected the value to change. The answer is evidence too.
It is not the judge.
It proposes what you practise. It is never the authority on whether your code is correct.
[05]Practice sources
Spar writes most of your challenges. It does not have to write all of them.
Connect LeetCode or Codeforces and real problems arrive against the same target, in the same history, judged by the people who wrote them.
Sources
↓ searched first, every turn
Spar picks the target
Assign what it found, or write one for you
↓
Your attempt
Graded by the tests, never by the agent
Attempt history
Every run kept, nothing thrown away
↺ what you prove sets the next target
The agent is made to look.
On any turn that sets a challenge it searches the source first, then either assigns what it found or writes its own. That is the controller, not a line in a prompt — it cannot skip the search.
Both directions are real.
A sourced problem brings a difficulty other people calibrated. A written one brings something no library has. Spar prefers the real problem when it lands on the target — and won’t hand you a contest problem to test an off-by-one.
You sign in on their page.
Spar never sees your password. Not connected is fine too — and Spar says which is happening rather than blurring it.
[06]Bring your own model
Spar is a client for whatever model you want to drive it with.
It doesn't ship one and doesn't resell one. There is no Spar subscription — point it at a model you already pay for, or run one yourself.
Subscription
Sign in with a plan you already pay for. No key to paste.
API key
Your own key, held in the system keychain.
Local
Nothing leaves the machine.
Your challenge and your conversation with the agent go to whichever provider you picked, because that is what running a model means. Run a local one if that matters — Spar itself has no analytics and no telemetry.
Get in the ring.
Free, and the whole product is on GitHub.
v0.3.0 — free forever, no Spar subscription
Sign in, and you're going
Nothing to host, nothing to configure. Seven questions once, on your account rather than once per machine.
A model to run the agent on
The one thing Spar doesn't ship. A subscription you already have, a key, or Ollama on your own machine.
[07]Questions
The ones worth asking.
Is there anything to set up?
Download it, sign in, answer seven questions, and Spar sets your first challenge. The only thing to choose is which model the agent runs on. The repository is open source because the product is; you are not expected to assemble it.
Is there a subscription?
No. Spar is free, and it doesn't resell model access — you bring a model you already pay for or run yourself. That is the only thing you ever pay for, and a local model costs nothing.
Can the agent be talked into passing me?
No. Submissions are graded by running the committed tests and reading the exit code, with no model in that path. Nothing you say to the agent can turn a failing program into a passing one, or the reverse.
What if a generated problem is broken?
It never reaches you. Before a challenge is shown, the reference solution has to pass every test, deliberately broken versions have to pass the visible tests and fail the hidden ones, and the files and commands have to agree. Anything that fails those checks is thrown away rather than set.
Does it work with LeetCode?
Yes, and with Codeforces. You sign in on their own page, so Spar never sees your password. A sourced problem goes to that judge against every hidden case, and the verdict lands on your account there.
Where does my code go?
Challenge files, your in-flight attempt and your settings stay on your machine; keys go to the system keychain. Your account and learning history sit on Spar's backend so they survive a reinstall. The challenge and your conversation go to your model provider, because that is what running a model means — run Ollama if that matters.
Is there any telemetry?
None. Spar has no analytics and no telemetry, and this site has neither.