v0.3.0ten languages, and LeetCode

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

A Spar challenge open: the problem statement and sample cases on the left, the file being repaired in the editor, and the declared test cases below it.

Challenges are set in

TypeScriptJavaScriptPythonJavaC++CGoRustSwiftRuby

[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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

An ability page: the claim, its status, evidence counts, the concepts it covers and the challenges that earned it.

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.

A hover card over a concept tag showing a Steady verdict with four passed, one failed and three open.

Nothing is thrown away.

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

The challenges page: every generated challenge with its status, session, concepts, test-run counts and a preview of the file.

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 key

Why 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.

Challenge #5Developing

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

LeetCodeSubmit and run, both on their judge
CodeforcesSubmit to their judge; examples run here
HackerRankShown in the app as planned

↓ 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.

OpenAI CodexSubscription
Claude CodeSubscription
GitHub CopilotSubscription
OpenAIAPI key
AnthropicAPI key
GoogleAPI key
xAIAPI key
DeepSeekAPI key
MoonshotAPI key
Z.aiAPI key
MiniMaxAPI key
OpenRouterAPI key
Vercel AI GatewayAPI key
Cloudflare GatewayAPI key
ClineAPI key
OllamaLocal
LM StudioLocal

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

macOS

Apple silicon · M1 and later

Windows

x64 installer

Linux

AppImage, x86_64

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.