Inspiration

I'm a freelance designer. Every freelancer knows the standoff: you won't send the final files until you're paid, and the client won't pay until they've seen the work. Someone has to go first, and whoever does carries all the risk. Invoicing tools stop at "invoice sent". After that you're chasing, and the client already has the files. In a 2022 survey by the Freelancers Union and partners, 62% of New York freelancers said a client had refused to pay them at least once (Authors Guild).

I wanted a way where neither side has to take that risk: the client sees the real work before paying out, and the freelancer knows the money is already there.

What it does

Sealed is a payments workspace for freelancers and their clients, built on PayPal and AI.

  1. Brief to plan (AI). The freelancer drops in the client's brief (a PDF, Word file, link or pasted DM). AI turns it into paid stages, each with deliverables, a price and a due date, fitted to the client's budget and deadline. Everything stays editable.
  2. The client approves the plan. The client opens a private link (no account, no app) and approves the stages and prices, or asks for changes. Checkout is blocked until the plan is agreed, and any later change goes back for approval.
  3. Deliver it sealed. The freelancer uploads the work. Each file is fingerprinted, and an AI delivery check compares it against what was agreed (Gemini looks at the images; rules check counts, formats and sizes). In the demo it catches a missing logo concept before the client does.
  4. Pay into a PayPal hold. The client sees watermarked previews and pays with PayPal Checkout using intent: AUTHORIZE. PayPal reserves the money, but it isn't the freelancer's yet. The server verifies the authorization before anything changes.
  5. Review the real work, protected. While the money is held, the client can inspect every detail at full resolution in a protected viewer. The original file never reaches their browser before approval.
  6. Approve and get paid. Approving captures the hold, the original files unlock, and both sides get a receipt. Sealed then sends the freelancer's share straight to their own PayPal with Payouts. If the client goes silent for 3 days, payment releases automatically. If a revision is never delivered, the hold is voided and the client is never charged.
  7. Ledger and assistant. An AG Grid ledger reconciles every stage against PayPal captures, with quick filters, live totals and one-click PayPal invoice reminders. A money assistant built on the PayPal Agent Toolkit answers "who owes me money?" and drafts reminders, but asks before it sends anything.
  8. Verified reviews. Only clients who actually paid through Sealed can rate a freelancer, so every review on a public profile is real.

How I built it

  • Next.js 16 (App Router), React 19 and TypeScript, deployed on Render with a Blueprint (render.yaml).
  • PayPal: JS SDK Buttons and Orders v2 (authorize), Payments v2 (capture, void, refund), Payouts v1, Invoicing v2, and the Agent Toolkit (@paypal/agent-toolkit/ai-sdk). Every money call uses PayPal-Request-Id idempotency keys.
  • AI through the Vercel AI SDK: Groq (GPT-OSS 120B) for planning, reminders and the assistant, and Gemini for the vision-based delivery check. generateObject with Zod schemas keeps the plans typed. A rule-based fallback keeps the app working if a free-tier quota runs out.
  • AG Grid Community for the ledger: editable cells saved to the server, quick filters and a totals row that follows every filter.
  • Protected review copies: sharp builds a watermarked copy for each viewing session, sent as shuffled, XOR-keyed blocks and rebuilt only inside a canvas. PDFs are rendered page by page on the server with pdf.js.
  • Supabase Storage as an off-server backup, because Render's free plan wipes the disk on restart.

Challenges I ran into

  • Showing work without giving it away. No website can stop a screenshot, so the guarantee had to be that the original file is never sent before capture. Everything else (watermarks, session keys, blocked replays) makes copies hard and traceable.
  • Fair rules for both sides. A hold that never releases hurts the freelancer, and one that releases too easily hurts the client. Auto-release after 3 days, revision deadlines and voids took several rounds to get right.
  • Plans change. Clients rarely accept the first price, so I added plan approval with versions and a clear "what changed" view.
  • Free hosting. Render's free disk resets on every restart, so I built a backup and restore to Supabase that runs before the server starts.

Accomplishments that I'm proud of

  • The full loop works live in the PayPal sandbox: plan, approve, hold, review, capture, then a Payout to the freelancer's own PayPal (net of PayPal's fee).
  • The AI does real work at both ends: it writes the plan and checks the delivery, so problems surface before money moves.
  • It feels like a finished product, with a full brand, receipts for both sides, a public profile, and a design that works on phones.

What I learned

Authorize-then-capture is the right tool for trust between strangers. It gives the client control without the freelancer carrying the risk. I also learned that an AI assistant handling money should always show its work and ask before it acts.

What's next for Sealed

  • Disputes with evidence: the fingerprints and review logs are already recorded.
  • Holds for longer projects (re-authorizing or vaulting the client's payment).
  • Support for video and code deliverables in the protected viewer.
  • A pilot with freelancers in my own network.

Built With

Share this project:

Updates

Submission history