Local development
Requirements
- Node.js and a package manager compatible with the app's
package.json - A PostgreSQL database
- A Stellar wallet browser extension (Freighter is what the end-to-end tests drive) if you want to test the sign-in and signing flow by hand
Environment variables
Copy .env.example to .env and fill in:
| Variable | Purpose |
|---|---|
DATABASE_URL | PostgreSQL connection string. |
SESSION_SECRET | Signs both the session JWT and the SEP-53 login challenge token. Generate one with openssl rand -base64 32. |
NEXT_PUBLIC_HOME_DOMAIN | The domain embedded in the sign-in message a wallet is asked to sign; binds a signature to this specific deployment. |
NEXT_PUBLIC_DEFAULT_NETWORK | TESTNET or PUBLIC, the network selected on first load. |
NEXT_PUBLIC_MAINNET_RPC_URL | Only needed for PUBLIC network use. Stellar's own foundation doesn't run a free public Mainnet RPC; the Stellar RPC providers list has options. |
Running it
npm install
npx prisma migrate deploy
npm run dev
npm run build runs prisma generate and prisma migrate deploy before next build, so a fresh clone's first build also brings the database schema up to date.
Testing
npm run testruns the Vitest suite: unit tests for CSV parsing, address/amount validation, and transaction chunking, plus integration tests against a real Stellar RPC endpoint for balance checking and the full prepare-sign-submit engine.npm run test:e2eruns Playwright against a real Freighter build, downloaded first bye2e/scripts/download-freighter.sh, so the end-to-end suite exercises an actual wallet extension rather than a mock.
Linting
npm run lint runs ESLint with the Next.js config. There's no separate formatting step beyond what ESLint enforces.