Status: Locked (Jul 2026)
Target release: Online SCF-ready demo (v0.1)
Working style: One outcome per commit; local smoke must pass after each commit.
This document is not a menu of options. Positioning, scope, and ship order are fixed here.
Keep the repo lean:
README.md— overview and how to runPLAN.md/ROADMAP.md— ship planEVIDENCE.md— demo URL and testnet proof for reviewers- Env examples — configuration
Do not add overlapping how-to guides. Link official Freighter docs when needed.
Quittance produces payment proof (a quittance) for invoices a freelancer issues on Stellar.
Create invoice → Pay via link / QR → Verify on-chain → Download or email proof → View history
Settlement stays on-chain. Quittance matches amount + memo and gives the owner written proof. Inferring who owns another wallet is not part of the product.
SCF rejection mapped to this plan:
| # | Feedback | Response in this plan |
|---|---|---|
| 1 | Site must be online | Phase D: public frontend + API |
| 2 | Testnet evidence + clearer tech | Real Horizon verify + tx hashes + video |
| 3 | Delivery confidence | Narrow scope, working demo, readable tech note |
| 4 | Tighten scope | One user: freelancer → client, XLM first (then USDC) |
Codebase is an Oct 2025 MVP + Quittance rebrand. Not deployed yet. The professional path is not a feature pile — it is shipping one unbroken invoice loop online.
User: Freelancer (or solo merchant) receiving XLM (MVP priority) / USDC on Stellar testnet/public.
Job:
- Invoice a client
- Get paid via Freighter or QR
- Auto / semi-auto verification
- Proof for self and/or client (PDF or email)
- See invoice history scoped to their wallet
Not: SustainOpen/Stellink-style payment-link / escrow product. Quittance = invoice + proof.
A separate marketplace product may call Quittance for payments later; it is out of scope for this repo’s v0.1.
| Layer | Decision |
|---|---|
| Identity | Freighter wallet |
| Create invoice | Wallet must be connected |
| Pay (Freighter) | Wallet must be connected |
| Google login | Not required for create/pay; not used as a gate |
Rationale: Stellar-native UX, frictionless SCF demo, mock Google is not professional.
| Layer | Decision |
|---|---|
| Role | Delivery channel (send invoice link / payment proof) |
| Required | Optional |
| MVP | customerEmail on form + Send invoice / Send proof → mailto: |
| Later | SMTP or Gmail API — still not a login gate |
Rationale: Email was meant for sending, not identity. Clients can also receive the link via chat. Email = convenience.
| Layer | Decision |
|---|---|
| Backend | server-mvp.ts (in-memory) |
| Frontend | Next.js 14 |
| DB / Redis | Not for demo |
| Verify | Horizon on MVP (memo + amount + destination) |
| Simulate payment | Hidden from demo UI (optional dev flag only) |
Document in-memory data loss in README. Postgres comes after the demo.
Primary CTA after paid: Download Proof (PDF).
Secondary: Email proof (mailto when email exists).
Content: amount, asset, memo, tx hash, explorer link, parties when available.
- Open site → connect Freighter
- Amount, asset, description, optional client name/email
- Create invoice → payment URL + QR
- Copy link or Send invoice (if email present)
- See own invoices on dashboard
- When paid → Download Proof / Email proof
- Open
/pay/[id](no Google) - Pay via QR / manual / Freighter
- Backend verifies via Horizon → PAID
- Receipt + Download Proof
Dashboard and stats use only the connected sellerPublicKey. Other sellers’ invoices are never listed.
[Next.js :3000] --API--> [Express MVP :3001] --Horizon--> [Stellar Testnet]
| |
Freighter In-memory invoices
Client PDF / mailto POST /verify (chain check)
Deploy target: Frontend on Vercel + Backend MVP on Render / Railway / Fly.
CORS: FRONTEND_URL = public frontend origin.
Full server.ts + Postgres is not part of this release. Static env seller vs dynamic wallet mismatch is fixed after the demo.
- Quittance branding (favicon, copy, footer)
- Wallet-only create / pay
- Optional customer email + mailto send
- Horizon-backed verify
- Wallet-scoped dashboard
- Download Proof + email proof CTAs
- Remove simulate / broken sync from demo UI
- Online deploy + testnet evidence pack
- Google required login / OAuth gate
- Production Gmail API / SMTP
- Postgres, Redis, Bull
- Escrow, payment-link marketplace, multi-tenant orgs
- Mainnet requirement (testnet is enough)
- Unrelated surfaces (chat, subscriptions, job boards)
All of the following must be true:
- Public URL loads (frontend + API health)
- Invoice created with Freighter (no Google)
- Testnet payment works on
/pay/[id] - Verify rejects fake hashes; real tx → PAID
- PDF proof downloads; mailto send works when email is set
- Dashboard shows only the connected wallet’s invoices
- README has demo URL + ≥1 testnet tx hash + short tech note
- 2–3 minute screen recording exists
Each row = one commit. You create the commits; agent supplies the message.
| ID | Commit | Acceptance |
|---|---|---|
| A1 | fix: Quittance favicon and current footer year |
Favicon shows Q; year is current |
| A2 | fix: invoice and proof copy across landing and forms |
Invoice/proof language; not generic “payment links” as the product claim |
| A3 | feat: require wallet only for create and pay |
Google gates removed from create/pay |
| A4 | feat: optional customer email with mailto send actions |
Send invoice/proof when email exists; otherwise disabled/hidden |
| A5 | fix: customer fields are client data not seller profile |
No seller→customer auto-fill |
| ID | Commit | Acceptance |
|---|---|---|
| B1 | feat: scope dashboard and stats to connected seller wallet |
No cross-wallet leak |
| B2 | feat: Horizon-backed verify on MVP server |
Memo + amount + destination check |
| B3 | fix: remove demo simulate and broken sync from pay UI |
Clean pay page |
| B4 | feat: store seller and payer metadata on memory invoices |
Parties present on proof |
| B5 | fix: invoice detail layout and AssetLogo prop usage |
Layout + logos OK |
Order: A1→A5, then B1→B5 (B1 and B2 are independent).
| ID | Commit | Acceptance |
|---|---|---|
| C1 | feat: primary Download Proof CTA after payment |
Proof is primary after paid |
| C2 | chore: align README with shipped proof and wallet-only auth |
Docs match reality |
| ID | Commit / task | Acceptance |
|---|---|---|
| D1 | chore: frontend production deploy config and env docs |
Frontend deployable |
| D2 | chore: MVP backend production deploy config |
Public API + CORS |
| D3 | docs: public demo URL and testnet evidence |
Reviewer one-pager |
| D4 | (ops) Deploy + env + smoke | Health + create + pay path |
| D5 | (ops) Testnet tx + video + tech note | SCF #2 pack |
- Postgres + dynamic
sellerPublicKey(align full server) - Per-seller payment monitor
- SMTP / Gmail API (still optional send)
- Server-side PDF
- CI
- Wire or remove Redis/Bull
A1 → A2 → A3 → A4 → A5 → B1 → B2 → B3 → C1 → D1 → D2 → D3 → D4 → D5
Insert B4, B5, C2 as needed before going online. Finish Phase D for the public demo.
- Connect Freighter (testnet)
- Create a 10 XLM invoice; optional client email
- Copy link / send via mailto
- Pay on
/pay/[id] - PAID + Download Proof
- Show record on dashboard
- Open tx on explorer
Target length: ≤ 3 minutes.
| Risk | Control |
|---|---|
| API restart clears invoices | Short demo; document in README; Postgres in v0.2 |
| USDC trustlines | Prove XLM first |
| Freighter is browser-only | Record on desktop |
| Full server vs MVP mix-up | Demo uses only dev:mvp / start:mvp |
Wallet is identity; email is delivery; proof is the product; the online demo is the delivery — nothing else enters v0.1.