Get Started

Architecture

Tech stack by layer

LayerTechnologyRole
FrontendNext.js (App Router)Web2 UI — no crypto terminology
Backend / APINestJSOrchestrates the complete flow
DatabaseSupabase (PostgreSQL) + RLSPayment metadata, users, projects
Invisible walletsPrivy (embedded wallets)Wallet per coordinator — email login
DisbursementsStellar Disbursement Platform (SDP)USDC disbursements to area wallets
Key custodyAWS KMSEncrypted private keys — never in plain text
BlockchainStellarImmutable transaction record
IndexerHorizon API (polling every 30s)Syncs on-chain data with Supabase
Fiat off-rampBitso (CO/CR) · Belo / Lemon Cash (AR)USDC to local currency
File storageSupabase StorageAttachments (invoices, photos) — off-chain
Frontend deployVercel
API / workers deployRailway
Cloud DBNeon (Postgres) + Upstash (Redis)

System layers

+------------------------------------------+
| FRONTEND (Next.js) | <- User sees: accounts, payments, reports
+------------------------------------------+
| API (NestJS) | <- Orchestrates: SDP, Privy, off-ramp, KMS
+------------+----------+------------------+
| Supabase | AWS KMS | Horizon Indexer | <- Data + Keys + On-chain sync
| (off-chain | (private| (every 30 sec) |
| metadata) | keys) | |
+------------+----------+------------------+
| STELLAR NETWORK | <- Immutable txHash record
| SDP · Privy Wallets · Soroban |
+------------------------------------------+
| OFF-RAMP (Bitso / Belo) | <- USDC -> COP / CRC / ARS
+------------------------------------------+

Multi-tenant data isolation

  • Row Level Security (RLS) in Supabase — every query is automatically filtered by foundation
  • Independent Stellar wallets per foundation
  • Middleware validates the user token before any query
  • A user from one foundation cannot access data from another under any circumstance