Skip to main content
Follow these steps in order. Each step builds on the previous one.

1. Clone and install

This installs dependencies for the monorepo (apps/web, packages/*).

2. Start PostgreSQL and MinIO

From the repository root:
Wait until both containers are healthy:
You should see payoes-postgres and payoes-minio running. The minio-init job creates the payoes-uploads bucket automatically.
To stop services later: npm run docker:down

3. Create your environment file

Open .env.local at the repository root and set the minimum required values below.

Minimum config for first run

Leave SMTP and Persona variables empty for now. You can add them later.
Payments and checkout require Soroban escrow configuration. See Soroban escrow setup before creating payments.

4. Run database migrations

You should see migrations applied successfully. This creates all tables (organizations, payments, team invites, verification, and more).
Run migrations after every git pull that adds new files under apps/web/drizzle/.

5. Start the web app

Open http://localhost:3000.

6. Sign in and complete onboarding

  1. Go to http://localhost:3000/register and create an account, or sign in with Google at http://localhost:3000/login
  2. Verify your email if you registered with email/password
  3. Complete onboarding:
    • Create an organization (name + logo)
    • Connect a testnet settlement wallet (use Stellar Laboratory to generate and fund one)
You should land on the dashboard with sandbox mode enabled.

7. Deploy the Soroban escrow contract

Payments require a deployed contract. From the repository root:
Copy CONTRACT_ID and OPERATOR_SECRET from the output into .env.local at the repository root, 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:
1

Create a sandbox API key

Dashboard → Developers → API Keys → create a key with the pk_test_ prefix.
2

Create a payment

Dashboard → Payments → create a payment, or use the API:
3

Open checkout

Open the checkout_url from the response in a browser and complete payment with a testnet wallet.
If payment status becomes completed, your local stack is working.

9. Preview the docs site

In a second terminal, from the repository root:
Open http://localhost:3001 to preview this documentation site.

Common issues

  • Ensure Docker is running: docker compose ps
  • Restart services: npm run docker:down && npm run docker:up
  • Confirm DATABASE_URL matches docker-compose.yml credentials
  • Make sure PostgreSQL is up before running npm run db:migrate
  • If you changed schema locally, run npm run db:generate only when intentionally creating new migrations
  • Check AUTH_SECRET is set (not empty)
  • For Google sign-in, confirm AUTH_GOOGLE_ID and AUTH_GOOGLE_SECRET are set
  • For email/password, register at /register and verify your email first
  • Restart the dev server after changing .env.local
  • Confirm MinIO is running on port 9000
  • Check S3_* variables match docker-compose.yml
  • Open http://localhost:9001 and verify bucket payoes-uploads exists
  • Run the Soroban deploy script: Soroban escrow setup
  • Confirm STELLAR_TESTNET_OPERATOR_SECRET and SOROBAN_TESTNET_CONTRACT_ID are set in .env.local
  • Restart the dev server after changing env vars
Fix TypeScript or lint errors reported in the output. Run from the repository root.

Useful commands

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.