1. Clone and install
apps/web, packages/*).
2. Start PostgreSQL and MinIO
From the repository root:payoes-postgres and payoes-minio running. The minio-init job creates the payoes-uploads bucket automatically.
3. Create your environment file
apps/web/.env.local and set the minimum required values below.
Minimum config for first run
4. Run database migrations
migrations applied successfully. This creates all tables (organizations, payments, team invites, verification, and more).
5. Start the web app
6. Sign in and complete onboarding
- Go to http://localhost:3000/register and create an account, or sign in with Google at http://localhost:3000/login
- Verify your email if you registered with email/password
- Complete onboarding:
- Create an organization (name + logo)
- Connect a testnet settlement wallet (use Stellar Laboratory to generate and fund one)
7. Deploy the Soroban escrow contract
Payments require a deployed contract. From the repository root:CONTRACT_ID and OPERATOR_SECRET from the output into apps/web/.env.local, then restart npm run dev.
See Soroban escrow setup for separate funder accounts, other networks, and troubleshooting.
8. Verify the setup works
Run a quick smoke test:
If payment status becomes
completed, your local stack is working.
9. Preview the docs site
In a second terminal, from the repository root:Common issues
Database connection refused
Database connection refused
- Ensure Docker is running:
docker compose ps - Restart services:
npm run docker:down && npm run docker:up - Confirm
DATABASE_URLmatchesdocker-compose.ymlcredentials
Migration errors
Migration errors
- Make sure PostgreSQL is up before running
npm run db:migrate - If you changed schema locally, run
npm run db:generateonly when intentionally creating new migrations
Cannot sign in
Cannot sign in
- Check
AUTH_SECRETis set (not empty) - For Google sign-in, confirm
AUTH_GOOGLE_IDandAUTH_GOOGLE_SECRETare set - For email/password, register at
/registerand verify your email first - Restart the dev server after changing
.env.local
Logo upload fails
Logo upload fails
- Confirm MinIO is running on port 9000
- Check
S3_*variables matchdocker-compose.yml - Open http://localhost:9001 and verify bucket
payoes-uploadsexists
Payment or checkout setup errors
Payment or checkout setup errors
- Run the Soroban deploy script: Soroban escrow setup
- Confirm
STELLAR_TESTNET_OPERATOR_SECRETandSOROBAN_TESTNET_CONTRACT_IDare set in.env.local - Restart the dev server after changing env vars
Build fails
Build fails
Useful commands
| Command | Description |
|---|---|
npm run dev | Start web app on port 3000 |
npm run build | Production build |
npm run docker:up | Start PostgreSQL + MinIO |
npm run docker:down | Stop Docker services |
npm run db:migrate | Apply database migrations |
npm run db:studio | Open Drizzle Studio (database GUI) |
npm run soroban:deploy | Deploy and initialize the Soroban escrow contract |
npm run docs:dev | Preview Mintlify docs on port 3001 |
npm run lint | Lint apps/web |
Next steps
Soroban escrow setup
Deploy the contract and configure checkout payments.
Environment variables
Full reference for OAuth, SMTP, Stellar, and Persona KYC settings.
KYC verification
Persona identity verification for production mode.