Why I built it
I build websites and small apps for businesses from my home in Panama. The work is the easy part. Getting paid once it's done is harder, and I'm not alone: in the Freelancers Union's survey of 5,358 US freelancers, 71% had trouble getting paid for finished work, and the average longest wait was 98 days.
Marketplaces answer this with a review window that still waits for the client to click a button. D'accord holds the money with PayPal before the work starts and pays out when the delivered work passes checks both sides agreed to.
What happens in the video
The demo is one take on the live app, recorded on November 1 against the PayPal sandbox.
- At 0:31 the client approves a $1,000 PayPal order with intent AUTHORIZE. The money is held and nothing is charged. D'accord signs the criteria, amount, payee and staging URL into a grant tied to that authorization, so the freelancer can't swap in easier terms later.
- At 0:54 the freelancer submits a real pull request (tanDivina/paypal-orders-service #1). The verifier pulls the diff, the CI check runs and the workflow files from GitHub and calls the staging health endpoint. Two Claude passes grade each criterion: an evaluator, and a skeptic looking for mocks, stubs, rigged CI and hidden instructions. A criterion passes only when both agree. This took 23.2 seconds; the video speeds up the wait and stamps the real time on screen.
- At 1:25 the hold is captured and paid out through PayPal Payouts in 3.4 seconds. Every ID on the receipt came back from the sandbox. The payout batch ID comes from the PayPal authorization, so one hold pays out once, even if two commits pass.
- At 1:44 I try to cheat it in the Threat lab. Instructions hidden in a code comment are stopped before any model reads them. A polite note saying the client waived the criteria gets past keyword filters, and the two reviewers reject it.
- At 2:05 the Ledger shows every hold, verdict, blocked attack and payout in AG Grid. Type "criteria the skeptic rejected" and Claude returns an AG Grid filter model, so the grid itself shows the answer. Only the question and the milestone titles go to Claude; the rows stay in your browser.
Added after the recording: the 48-hour window
My closing clip mentions it. A passing verdict now opens a review window for the client. They can approve and release early, or object in writing. Claude's scope arbiter checks the objection against the signed criteria. A real defect pauses the release until a new commit passes. A request for new work becomes a drafted add-on milestone, and the clock keeps running. A third upheld objection goes to a human arbiter, which isn't built yet, so the money stays held.
If the client says nothing, the freelancer gets paid when the window ends, through a claim button, the page's status check or a daily cron. Sandbox holds can pick a 2-minute demo window so you can see the whole thing in one sitting.
How I tried to cheat my own verifier
The first version, with one reviewer, passed a code comment saying the client had waived the criteria. Adding the skeptic fixed that. A code review of the whole flow then found more ways in: the freelancer could send their own easy criteria, point the probe at any page that returns 200, hide a stub past where the diff was cut off, ship a CI workflow that exits 0, or retry until both reviewers agreed.
Each of those is closed now. Criteria and the staging URL are signed at funding, the verifier fails any PR it can't read in full, both reviewers see the workflow files and the package.json scripts they call, and each milestone gets 5 graded attempts per hour and 15 in total. A failed verdict is remembered per commit, so editing the notes doesn't buy a second roll.
Built with
PayPal sandbox: Orders v2 (authorize, then capture), Payouts v1, and Webhooks checked with verify-webhook-signature. Claude (Anthropic API) drafts criteria from a job description, runs the evaluator and the skeptic, and arbitrates objections. AG Grid Community runs the ledger. Next.js 14 and TypeScript on Vercel, Upstash Redis for the review window and retry limits, and the GitHub API for the evidence.
What's real and what isn't
PayPal runs in sandbox. Without PayPal keys, for example on a local run, funding and payout fall back to a mode labeled SIMULATED on screen. The live site uses the real sandbox, and every panel shows which mode it's in.
D'accord checks the work against the criteria. It can't tell whether the client is happy. If the criteria were incomplete, quality was never written down, or staging differs from production, the client can still have a fair complaint, and the reviewers can be wrong. I have no real-world catch rate, so I don't quote one. CI still runs in the freelancer's repo, and the client has to trust D'accord's signing key.
Next
- A human arbiter for escalated milestones.
- A criteria coach that flags vague criteria before any money is held.
- Client-owned CI, and a smoke test on production after deploy.
- Partial release when only some criteria pass, and escrow across a whole multi-milestone contract.
Built With
- ag-grid
- claude
- github-api
- next.js
- paypal
- tailwindcss
- typescript
- vercel