Send one link. Your client approves each line and signs. Every extra ask becomes a priced change they approve in one tap. Free during the beta.
BusinessTypeScript · JavaScriptGitHub @tahmidbintaslimOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Scope disputes usually come down to one sentence: "I thought that was included." A PDF and an email that says "looks good" do not settle it, and every "one small change" after that is a discount nobody agreed to. SignedScope records what was shown, what was approved or rejected, who signed and when, in a form neither side can edit without verification failing.
| 1. Agency creates a sign-off | 2. Client reviews and signs |
|---|---|
| 3. Signed receipt with evidence | 4. Change request shown as a diff |
| 5. Anyone can verify a link | 6. An edited link fails verification |
POST /api/seal returns v1.<base64url(json)>.<hmac>. That token is the whole document./sign#<token>. The data sits in the URL fragment, so it is not part of the page request. The page then sends it in the body of an API call that checks the signature and stores nothing. They accept or reject each item (a rejection needs a comment), acknowledge the exclusions and sign. POST /api/sign checks the token and returns a signed receipt that embeds the document, its SHA-256, the decisions, the signer, a timestamp, the country and a UA hash./verify (or POST /api/verify) recomputes the HMAC. If the document changed, verification fails.POST /api/draft turns a pasted client message or brief into draft lines. With ANTHROPIC_API_KEY set it uses Claude; otherwise a rule-based splitter. Nothing is sealed until the agency reviews it.| Free (this repo) | Pro, planned, $19/mo flat | Agency, planned, $49/mo flat | |
|---|---|---|---|
| Unlimited sign-offs, receipts, priced change requests, your own Pay link | Yes | Yes | Yes |
| Saved workspace, email notifications, branding, PDF, invoices and tax via Stripe Connect | No | Yes | Yes |
| 5 seats, custom domain, API/webhooks | No | No | Yes |
SIGNING_SECRET.v2.<kid>.…) would fix that, and they are on the roadmap.textContent, under a strict CSP.git clone https://github.com/tahmidbintaslim/signedscope && cd signedscope
npm install && npm test
# Vercel: set SIGNING_SECRET (32+ random chars); optional ANTHROPIC_API_KEY for AI drafts, BLOB_READ_WRITE_TOKEN for the waitlist,
# STRIPE_LINK_PRO / STRIPE_LINK_AGENCY for checkout redirects
# Accounts and the /app workspace: SUPABASE_URL, SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY (see docs/SETUP-ACCOUNTS.md)
npx vercel deploy
No framework and no build step: static files in public/ plus Node functions in api/. Accounts use Supabase (Postgres with Row Level Security); the schema is in supabase/migrations/, and the browser client is vendored in public/vendor/ so the CSP can stay script-src 'self'. Fonts (Plus Jakarta Sans, JetBrains Mono; OFL) are self-hosted under public/fonts/.
SIGNING_SECRET=$(openssl rand -base64 32) npm run dev # http://localhost:3000, no Vercel CLI needed
Tests: npm test runs unit and server tests; set PGTEST_URL to a Postgres URL to also run the Row Level Security tests (CI does). node test/browser/app.e2e.js drives the workspace in a browser against an in-memory Supabase.
scripts/capture-screenshots.js regenerates the app screenshots in docs/img/, and scripts/capture-demo.js records docs/img/demo.gif and public/og.png, both from a real run against the dev server (BASE=http://localhost:3000).
Payments: Pro and Agency are not built yet, so the landing page links to the waitlist. The /api/checkout route and the Stripe test-mode links stay in place for when live mode is approved.
Tahmid Rafi, Lead Full Stack Software Engineer & Solutions Architect, Bangkok.
MIT