The protocol
behind the wink.
The rails are free. The names are the business. 0% platform fee; monetization = premium handles, private zones, and enterprise payroll. Live on mainnet.
┌────────────────────────────────────────────┐
guest / fan ───▶ │ /wink/<handle> /wall/<slug> /pay/<...> │
customer ───▶ │ public surfaces (SSR + polling) │
worker ───▶ │ /request/<handle> /payroll /dashboard │
AI agent ───▶ │ /api/mpp/* (HTTP 402 / MPP) │
└──────────────────┬─────────────────────────┘
│ prepare → sign → confirm
┌──────────────────▼─────────────────────────┐
│ Next.js 15 API routes │
│ zod validation · session HMAC · drizzle │
└───────┬───────────────────────┬────────────┘
│ │
┌───────────▼─────────┐ ┌─────────▼──────────────┐
│ Postgres (drizzle) │ │ Tempo (viem/tempo) │
│ users · handles · │ │ pathUSD TIP-20 │
│ transfers · ledger │ │ transferWithMemo │
│ events · payCodes │ │ on-chain verification │
│ payRequests │ │ faucet · explorer │
└─────────────────────┘ └────────────────────────┘prepare → sign → confirm. Resolve @handle to recipient wallet, create a pending transfer with memo, payer signs in their wallet, we verify on-chain and append to the ledger. Same loop everywhere — tips, checkout, payroll, agents.
We never trust a client-reported success. Every transfer is re-checked on Tempo before we mark anything confirmed. Keys never leave the browser.
Every transfer carries a 32-byte reconciliation memo (wk_<transferId> for wink flows, merchant + invoice for sales). The memo tells the story; the chain is the receipt.
Workers stay on their chain. We quote via Relay, accept a deposit on Base / Arbitrum / Optimism / Polygon / Ethereum, the solver fills the @handle's Tempo address, and we verify the arrival independently on-Tempo.
An IETF draft co-authored by Tempo and Stripe. WWW-Authenticate: Payment on 402, Authorization: Payment <txHash> on retry, Payment-Receipt on 200. Open standard, open simulator.
# clone & install git clone https://github.com/Arinzaay007/wink cd wink && npm install # env (DATABASE_URL, SESSION_SECRET, TEMPO_NETWORK=mainnet) cp .env.example .env # schema → postgres npm run db:push # run npm run dev # app on :3000 npm test # 60 automated tests npm run rebuild # restore the whole demo world npm run reconcile # safety net for stranded transfers npm run bot # optional: telegram "you've been winked 😉"
Same address on every chain. User sends USDC on Base, forwarder detects > $1, quotes via Relay, solver fills pathUSD on Tempo. Verified independently on both chains — chain is truth.