Durian is a crypto payment platform designed for businesses and tourists in Chiang Mai, Thailand. Accept USDC payments, verify with zkTLS, and settle in Thai Baht.
- Privy Authentication - Email login with auto-generated embedded wallets
- USDC Payments - Accept stablecoin payments on Base Sepolia
- Primus zkTLS Verification - Cryptographically verify DurianBank payment data
- Business Directory - Mapbox-powered discovery of crypto-friendly businesses
- Thai Baht Settlement - Offramp USDC to local bank accounts via PromptPay
- Beautiful UI - Premium design with dark mode support
- Framework: Next.js 15 (App Router)
- Auth & Wallets: Privy SDK
- Database: Supabase (PostgreSQL)
- Payment Verification: Primus Labs zkTLS
- Maps: Mapbox GL JS
- Styling: Tailwind CSS + shadcn/ui
- Blockchain: Base Sepolia (USDC)
npm installCopy the example environment file and fill in your API keys:
cp .env.local.example .env.localRequired keys:
- Privy: Get from app.privy.io
- Supabase: Get from supabase.com
- Primus Labs: Get from developer.primuslabs.xyz
- Mapbox: Get from mapbox.com
- Create a new Supabase project
- Run the schema in
supabase/schema.sqlvia the SQL Editor - Enable Row Level Security policies
npm run devdurian/
├── app/
│ ├── (marketing)/ # Landing, directory, legal
│ ├── (auth)/ # Login, profile
│ ├── (business)/ # Dashboard, onboarding
│ ├── (pay)/ # Payment screens
│ └── api/ # API routes
├── components/
│ ├── ui/ # shadcn/ui components
│ └── ... # Custom components
├── lib/ # Utils, config, stores
├── types/ # TypeScript types
├── supabase/ # Database schema
└── public/ # Static assets
| Route | Description |
|---|---|
/ |
Landing page |
/login |
Role selection + Privy auth |
/directory |
Business directory with map |
/place/[id] |
Business profile |
/pay/[intentId] |
Payment checkout |
/business/dashboard |
Merchant dashboard |
/business/onboarding |
5-step business setup |
/profile |
Tourist profile |
- Generate QR - Business creates payment intent with amount
- Select Method - Customer chooses USDC or DurianBank
- Verify - Primus zkTLS verifies payment data
- Settle - USDC received, business can offramp to THB
POST /api/primus/verify- Verify payment with zkTLSPOST /api/durianbank/create-link- Generate DurianBank payment linkPOST /api/payment/complete- Mark payment as completed (webhook)
# Privy
NEXT_PUBLIC_PRIVY_APP_ID=
# Supabase
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
# Primus Labs
NEXT_PUBLIC_PRIMUS_APP_ID=
PRIMUS_APP_SECRET=
# Mapbox
NEXT_PUBLIC_MAPBOX_TOKEN=
# Blockchain
NEXT_PUBLIC_USDC_ADDRESS=0x036CbD53842c5426634e7929541eC2318f3dCF7e
NEXT_PUBLIC_CHAIN_ID=84532
NEXT_PUBLIC_PLATFORM_WALLET=
# DurianBank (optional)
DURIANBANK_MERCHANT_ID=
DURIANBANK_SECRET=vercel --prodMake sure to add all environment variables in Vercel dashboard.
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]- Tourist Flow: Browse directory → Select business → Pay with USDC
- Merchant Flow: Register → Complete onboarding → Generate QR → Receive payment
- zkTLS Demo: Pay via DurianBank → Primus verifies → Proof displayed
This project was built for the ETH Chiang Mai 2026 hackathon. Contributions welcome!
MIT
Built with 💚 for Chiang Mai by the Durian team
