Skip to content

Payouts-first pivot: marketing rebuild + API/dashboard fixes + on-chain payout#166

Merged
0xdevcollins merged 6 commits into
mainfrom
feat/www-payouts-landing
Jul 12, 2026
Merged

Payouts-first pivot: marketing rebuild + API/dashboard fixes + on-chain payout#166
0xdevcollins merged 6 commits into
mainfrom
feat/www-payouts-landing

Conversation

@0xdevcollins

Copy link
Copy Markdown
Owner

Repositions the product around payouts-first, Stellar-settled and gets the repo to a fully green typecheck with a real on-chain payout proven on testnet.

What's in here

1. Marketing site rebuild (apps/www)

  • Stripped ~28 routes down to a minimalist Home + Pricing (plus terms/privacy). Removed old five-product/multi-chain pages, orphaned components, and dead libs.
  • Rewrote all copy to the payouts-first positioning ("Payouts that arrive in minutes, not days"); stage-honest throughout (design-partner CTAs, delivery-time targets).
  • New payout-status hero visual; nav reduced to How it works / Pricing / Docs / Become a design partner.

2. API fixes (apps/api) — includes a real on-chain payout

  • Restore Recipient model + Payout.recipientId to the Prisma schema (dropped in a prior merge while the migration, code, and relations still referenced it). This unblocked prisma generate and the API typecheck.
  • Fix same-asset Stellar payouts: added StellarService.sendPayment() and branched processStellarPayout to use a direct payment when source == destination asset (Horizon rejects a strict-send path query for identical assets). Verified end-to-end on testnet — a real settled payout transaction.

3. Dashboard type cleanup (apps/dashboard) — 61 → 0

  • Root cause: the shared @useroutr/types Payout type was stale (missing destinationType, failureReason, createdAt, batchId, stellarTxHash). Aligned it with the API/Prisma model; added PaymentLink.qrCodeUrl.
  • Fixed call-site issues surfaced once tsc could proceed: recipients dialog props (onCloseopen/onOpenChange), Badge variants, toast message field, DateRangePicker props, a missing icon import, and renamed a JSX-containing .ts test to .tsx.

4. Monorepo dedupe (apps/www)

  • Aligned www's next/eslint-config-next to 16.2.1 (matching root) to remove a nested next install and its conflicting NextConfig types.

Verification

Full typecheck sweep — api, dashboard, checkout, www all 0 errors. API booted locally against Stellar testnet + Circle; merchant → recipient → payout round-trip works, and a Stellar-wallet payout settled on-chain (confirmed on Horizon).

Notes

  • The strategy/SCF/webcopy docs live in an untracked docs/ dir and are intentionally not included in this PR.
  • Some commits bundle pre-existing WIP that was already dirty in the working tree (intermingled in the same files).
  • .env.example (template only) is included; real .env stays gitignored.

🤖 Generated with Claude Code

0xdevcollins and others added 5 commits July 12, 2026 08:23
Strip the marketing site from ~28 routes to a minimalist Home + Pricing
(plus terms/privacy utility), and rewrite all copy to the new payouts-first,
Stellar-settled positioning.

- Home: 7-section flow — Hero, ProblemStrip, HowItWorks, Features
  ("what you get"), Developers (single TS payout snippet), Trust, FinalCTA
- Replace hero visual with a self-contained NGN payout-status board
- Nav reduced to How it works / Pricing / Docs / Become a design partner
- Pricing: published rate card + mid-market promise + FAQ
- Stage-honest throughout (design-partner CTAs, delivery-time targets)
- Remove old product/blog/use-cases/etc. routes, orphaned components,
  and dead libs; update metadata, StructuredData, and sitemap

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Restore Recipient model + Payout.recipientId to schema.prisma (dropped in a
  prior merge; the migration, code, and Merchant/Payout relations still
  referenced it), unblocking prisma generate and the API typecheck.
- Add StellarService.sendPayment() and branch processStellarPayout to use a
  direct payment for same-asset transfers (e.g. XLM->XLM); Horizon rejects a
  strict-send path query when source and destination asset are identical.
  Verified end-to-end on testnet (real settled payout tx).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rename usePayouts.test.ts -> .tsx (file contains JSX). Note: this surfaces
pre-existing type errors in dashboard payout components that were previously
masked by the parse error halting tsc — those are not addressed here.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Root cause: the shared @useroutr/types Payout type was stale — missing
destinationType, failureReason, createdAt, batchId, stellarTxHash and using
loose optionals. Aligned Payout with the API/Prisma model (matching what the
component code and test fixtures already expected), and added PaymentLink.qrCodeUrl.

Also fixed unrelated call-site issues surfaced once tsc could proceed:
- recipients dialogs: onClose -> open/onOpenChange; wire CreateRecipientDialog
  open state on the settings/recipients page
- Badge: replace unsupported secondary/outline variants with supported ones
- toast: use ToastInput's `message` field instead of `description`/`variant`
- PayoutFilterBar: adapt DateRangePicker to its startDate/endDate API
- settings: import missing Radio icon

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
www pinned next@16.1.6 while the rest of the monorepo (root) resolves
next@16.2.1, producing a nested apps/www/node_modules/next and two
incompatible NextConfig types (tsc error in next.config.ts). Align www's
next and eslint-config-next to 16.2.1 so a single copy hoists.

Full monorepo typecheck now clean: api, dashboard, checkout, www all 0 errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
useroutr-www Ready Ready Preview, Comment Jul 12, 2026 12:04pm

Replaces the mocked recipients UI with a working feature backed by the
existing API:
- Implement Edit and Delete dialogs (were "TODO: implement" stubs)
- Extract a shared RecipientDetailsFields component (all 4 destination
  types, correctly bound incl. the discriminated inner `type` the API needs)
- Wire Create/Edit/Delete and the list through the real `api` client
  (was a raw fetch to a non-existent /api proxy); render real recipient
  details in the table instead of hardcoded placeholders

Also fixes two real bugs found while wiring it up:
- api: recipients controller was @controller('v1/recipients') under the
  global 'v1' prefix → routes served at /v1/v1/recipients. Corrected to
  match every other resource (/v1/recipients).
- dashboard: NotificationsProvider was never mounted though SiteHeader's
  NotificationBell consumes useNotifications — every authenticated
  dashboard route threw at runtime. Mounted it in the (dashboard) layout.

Verified end-to-end in the browser: recipients list renders real data,
Edit opens a pre-filled form, and POST/PATCH/DELETE round-trip against the
API on Stellar testnet config.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@0xdevcollins
0xdevcollins merged commit 535da4f into main Jul 12, 2026
3 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant