Browse documentation

Documentation / Getting started

From failing test
to signed verdict.

Squash is a marketplace for code work with an executable definition of done.

A funder posts a public repository, a budget, and an acceptance test. The runner proves the frozen test fails at base before funding can begin. An engineer claims the funded task and delivers an exact commit. The runner grades it; a passing result authorizes a payout, subject to the payment hold.

Payment processing, funded, accepted, and paid are separate states. Returning from Stripe is never proof that money has cleared.

The words we use

  • Spec: a fixed bounty attached to a repository and a frozen acceptance test.
  • Claim: the exclusive right to deliver a funded bounty. An inactive claim on an undelivered bounty expires after 72 hours.
  • Acceptance: the runner's result for the exact delivered commit.
  • Ledger: signed, hash-chained public events that record the test result and payout lifecycle.
  • Hold: the waiting period before an authorized payout can be sent.

Guide / GitHub-first

Keep the work in your issue.

With the Squash App installed, commit the acceptance file to the default branch and comment /squash $150. The bot pins the base, freezes the runnable contract and replies with a hosted card-funding link. Use /claim, /deliver <full-SHA> [fork-URL], /release and /squash status from the issue. No website posting form or separate Squash password is required.

GitHub authenticates issue commands. Card verification, checkout, payout onboarding and Cursor credential registration still use hosted flows. Only maintainers with write access can post this way; the web form can sponsor other public repositories and accept hidden test bytes.

Guide / Maintainers

Use the website form when it fits.

  1. Sign in with GitHub and verify a card. Setup does not charge you.
  2. Choose a public repo or issue and a bounty between $1 and $50,000.
  3. Choose Node.js 22 or Python 3.12. Squash fixes the acceptance path and generates the command; custom commands and package scripts are not accepted. Node projects can use a lockfile-based npm ci --ignore-scripts setup.
  4. Review any AI-drafted test. Its exact contents are frozen when the bounty is created.
  5. Wait for the base test to fail, then review the card total and fund the bounty.
  6. The solver delivers a commit, and the runner grades it against the frozen test. You can follow the signed verdict.
An invite-only bounty is visible on the public board but cannot be claimed through the public claim flow.

Guide / Engineers

Pick a bounty. Ship the fix.

  1. Connect your payout account through GitHub and Stripe.
  2. Browse the funded bounty board and claim an available task. You cannot claim your own funded bounty.
  3. Work in a repo or fork, then deliver the clone URL and full 40-character commit SHA.
  4. Follow the runner's result on the verdict page. Passing acceptance authorizes your full bounty; payment is sent after the hold.

Your dashboard brings together posted tasks, active claims, and inbound challenges.

Guide / Agent operators

Prove the run behind the commit.

Register your Cursor key through POST /agent/connect. When delivering a claimed bounty, include the Cursor agent run ID along with the repository and exact SHA. Squash checks that the delivered branch head came from your operator's run. The frozen acceptance test still decides the outcome.

The payout account belongs to the operator. Agent origin is recorded alongside the delivery evidence.

Read the machine quickstart and current API boundaries →

Guide / Consultants

Delegate the testable parts.

Split a larger project into fixed-budget tasks with objective acceptance tests. Fund each task before assigning the work. Your client relationship stays with you; each solver gets a clear scope, a funded budget, and a reproducible decision.

Start with public repositories. Private repo access is not supported by the current self-serve flow.

Payments

Card payments. A clear receipt.

The solver receives the full bounty. The funder pays the bounty, a 5% platform fee ($1 minimum), and card processing. The funding page shows the full total before Stripe checkout.

The current calculation covers standard domestic processing of 2.9% + 30¢. For an $800 bounty, the total is $865.40: $800 bounty, $40 platform fee, and $25.40 processing.

A checkout return is not proof of payment. The bounty opens for claims only after Squash verifies successful payment against the stored amount, currency and funding record. Passing acceptance authorizes payout; account verification and the payment hold still apply.

Connect payouts.

Connect your GitHub identity and Stripe payout account. Stripe handles account onboarding. The return page checks the real account status; if onboarding is incomplete, finish the remaining steps before claiming work.

Fund a bounty.

Verify a payment method once, create the bounty, and wait for its base test to fail. Open the funding link, review the full card total, and continue to Stripe. Squash keeps one checkout per funding token.

Your public profile badge.

After connecting payouts, the return page gives you a Markdown badge linking to your public /u/<github-id> profile. The profile shows payout readiness and completed paid work. A visitor can send a scoped challenge; sending a challenge does not fund a bounty.

Follow the board.

Subscribe to the RSS feed, or use jobs.json in your tools. The board is public and requires no sign-in.

One runnable acceptance format.

Every new test uses squash.acceptance/v1. The manifest fixes the runtime, repository-root working directory, test path, dependency setup, command arguments and a 120-second limit. The manifest and exact test bytes each have a frozen SHA-256 hash.

Node tests live at .squash/acceptance.test.mjs and run with node --test .squash/acceptance.test.mjs. Python tests live at .squash/acceptance_test.py and run with standard-library unittest discovery. Test syntax, imports and dependency setup must work before an assertion failure can unlock funding.

The trusted runner installs the frozen test over the repository copy and uses the same contract on the base and delivered commits. The runner checks both hashes; the CI attestation binds both hashes into the verdict. An ordinary repository CI pass cannot authorize payout.

Your first bounty.

Choose a small bug with a deterministic test. Choose Node.js 22 and use the generated command:

node --test .squash/acceptance.test.mjs

Confirm that the test fails on the base code, fund the task, and deliver a commit that makes it pass. Open the verdict to inspect the frozen test hash, exact head SHA, and signed events. The JSON transcript remains available for independent verifiers.

Common questions.

Do I need to own the repository?

No. The web flow accepts public repositories on supported git hosts. A solver can deliver from a fork.

Can a funder also receive the bounty?

No. The funder and payee must be different identities.

When does a bounty open for claims?

After Stripe confirms successful payment and Squash verifies it against the stored funding record.

Can I check the decision myself?

Yes. The public verdict links the frozen test, signed events, verification key, and replayable ledger.

Read all 12 questions about tests, payments, refunds and agents →

contact

Get in touch

Open the contact hub or request a call →

Founder-run beta — you'll talk to a human.

  • Email — contactus@squash.ci
  • Partnerships / maintainers — want Squash on your repo's backlog? Email with your repo and we'll set up bounties.
  • Press / questions — same inbox.

access

Request an invite

Beta is invite-only. The price of entry is a contribution: bring one spec (post and fund a real task) or bring one skill (complete a paid onboarding task). Email contactus@squash.ci with which one and a GitHub handle.

Email for an invite