Waitlist open — cohort 01

Real codebases.Real tickets.Real engineering.

Groundwork drops you into a repository you've never seen, with a real ticket, a browser IDE and a terminal. You make the fix; hidden checks decide whether it holds.

5K+ people have visitedLive · updated every 2 min

TypeScript & PythonIsolated sandboxNothing to install

The Groundwork workspace: a dark browser IDE with the ticket panel open, and Run, Run all cases and Submit along the top.
A Groundwork ticket header: a parser bug report with its summary, difficulty and a forty-minute time budget.
Time budget
31:48
paused while Pair explains

A ticket, not a puzzle.

No reversing linked lists on a whiteboard. Every task is a bug report, a failing suite or a small feature inside a repository that exists, adapted from real open-source projects, with reproduction steps and the actual broken output.

Bug fixesFailing suitesRegressionsSmall features

A ticket's reproduction steps: three parse calls that trigger the bug, and the expected behaviour.
The ticket's actual-behaviour section, showing the real parser error and stack trace.

fig. 02 — an actual Groundwork ticket

Everything you need to investigate and ship.

A browser IDE, a terminal, the full repository and its test suite, provisioned on an isolated machine, on the clock. Stuck? Pair, the built-in assistant, explains the codebase without solving the ticket for you.

This one runs — try it below

split-bill-loses-a-centsample

split.ts
1import { assertCents } from './cents'
2
3// Split an amount (in cents) into `parts` shares.
4// Shares should differ by at most one cent and
5// always add back up to the original amount.
6export function splitAmount(totalCents: number, parts: number) {
7 assertCents(totalCents)
8 if (!Number.isInteger(parts) || parts < 1) {
9 throw new RangeError('parts must be a positive integer')
10 }
11
12 const share = Math.round(totalCents / parts)
13 const shares: number[] = []
14
15 for (let i = 0; i < parts; i++) {
16 shares.push(share)
17 }
18
19 return shares
20}

terminal — node 20

● sandbox ready — repo pinned @ 3f9a2c1

Splitting a bill three ways loses a cent

bug fix · medium · 30 min · sample ticket

splitAmount(1000, 3) returns three shares of 333. They add up to 999, so every uneven split quietly loses money.

AssertionError: expected 999 to be 1000

$ npx vitest run

● sandbox readyno internet · isolated

fig. 03 — a working copy of the workspace on a sample ticket · run the tests, ask Pair, apply the fix, submit

Browser IDETerminalReal repoExisting testsPair

Run #1842 — summarysaved
existing tests3/3 pass
hidden checks8/8 pass
session transcriptkept
pair questions2 asked
time budget31:48 left
evidence pack → shared with you
The workspace side panel with Ticket, Pair, Tests and Diff tabs; every attempt keeps its submitted diff.

fig. 04 — evaluation & the diff you leave behind

A record of how you actually engineer.

Submitting runs hidden checks and the repository's own test suite in a separate environment. Groundwork keeps the diff, the outcomes and the time it took: a body of work you can point to, not just a score.

Hidden checksSubmitted diffDurationAttempt history

How Groundwork works

  1. 01

    Pick a ticket

    A real bug report in a repo you don't know.

  2. 02

    Work the repo

    Investigate, edit, run the tests. Ask Pair if stuck.

  3. 03

    Submit the fix

    Hidden checks and the existing suite run in isolation.

  4. 04

    See what held up

    Keep the evidence: diff, outcomes, time.

Want to try Groundwork?

We're opening Groundwork to a small group of engineers. Join the early cohort and help shape what we build next.

NO SPAM — ONE EMAIL WHEN YOUR COHORT OPENS