Skip to main content
This guide walks you through configuring your development environment for each Soundcheck component.

Mobile App Environment

Environment Variables

Create a .env file in the repository root:
Required variables:

Expo Configuration

The mobile app uses app.config.js for configuration:
Stack: Expo SDK 57, React Native 0.86, React 19, Expo Router. In-app UI styling is NativeWind v4 (the brand primary is now an indigo token, not the #9b87f5 purple above — see Mobile Architecture).

Physical device on a different VLAN

If a connected Android device can’t reach the Expo dev server over LAN, tunnel Metro (keep the subdomain to letters, numbers, and hyphens — Android rejects underscores in TLS hostnames):
To load the JS bundle in Expo Go instead of the custom development client or TestFlight app, start with --go (same Wi-Fi, then scan the QR from Expo Go):
npm run start:go is the same command. A start without --go still uses the soundcheck scheme and can open TestFlight or the installed dev client.

Native Project Generation

The ios/ and android/ directories are gitignored and generated from app.config.js:
Never commit changes to ios/ or android/ directories. They are ephemeral build artifacts.

Web App Environment

Environment Variables

Create a .env.local file in the web/ directory:
Required variables:
The /api-proxy rewrite (defined in web/next.config.mjs) is dev-only — it returns no rewrites unless NODE_ENV === "development", forwarding /api-proxy/* to BACKEND_API_URL. A production build cannot use it; point NEXT_PUBLIC_API_URL at the real API origin there. NEXT_PUBLIC_* vars are baked in at compile time, so clear .next/ after changing them.

Development Server

The web app runs at http://localhost:3000. npm run dev runs a predev hook that regenerates the typed API client from the OpenAPI spec (web/src/lib/generated/api-client/, gitignored).

Shared infrastructure & api-events

api-events (Encore.ts on :4000) is the system of record — HTTP API, DDL, direct Pub/Sub publication, and notification fan-out. Local Postgres, fake-gcs-server (app file storage), and the Clerk emulator come from shared compose:

Database migrations & seed

Canonical schema + migrations: api-events/src/db/. Migrations apply on api-events boot; explicit apply:
(Via MCP: db_migrate then db_seed with mode=demo-full.)

Run api-events locally

Requires the Encore CLI (installed in the devcontainer).
OpenAPI contract checks: npm run openapi:emit, npm run openapi:parity (TS self-check — not schema:parity).

Access Points

Multi-user event chat demo

With shared infrastructure, api-events, and the demo-full personas ready, start the Next.js console with cd web && npm run dev:emulator. This enables event chats unless explicitly overridden and selects the server-backed chat transport on :4013. Open a seeded gig’s Chats tab, then click Open another demo user to sign in as another persona. Select Seed Demo Band in each session if its personal workspace is active. Every click opens a fresh demo-<random-id>.localhost origin on this web server’s port. The launcher supplies that port even when the current page uses a named portless URL, so demo tabs reach the same worktree. Separate hostnames isolate Clerk sessions, workspace selection, browser storage, and sign-out while sharing the API and chat history. Ordinary tabs on the same hostname share auth; changing only the port or a query parameter does not isolate cookies. The launcher and additional Next development origins are enabled only for explicit local Clerk-emulator development. The chat adapter polls messages, typing, and unread counts once per second; chat-list discovery and metadata refresh every three seconds, including background tabs. Compose retains provider history in twilio_emulator_data. No carrier SMS is sent by this in-app demo, and the emulator does not implement the proprietary Twilio SDK WebSocket protocol. Production continues to use the real SDK. See local provider emulators for provider setup and the emulator README for failure injection and webhook retries.
Blake Admin and Avery Owner exchanging messages through independently signed-in local demo sessions

MCP (api-events /mcp)

Streamable HTTP MCP is hosted on api-events (http://localhost:4000/mcp). mcp-ts/ is the @soundcheck/mcp SDK, not a standalone listener.

CheckAI (eve agent)

checkai/ is the AI agent, built on Vercel’s eve framework. It requires Node 24.

Fresh worktree / clean checkout

Several build inputs are gitignored generated artifacts. A clean checkout must regenerate them before builds pass. In a git worktree, run npm run worktree:setup from the worktree root: it installs each package for real and generates the clients. Do not symlink them from the main checkout, because install and codegen hooks write through the links. See Pitfalls for the worktree-artifacts gotcha in more detail.

Infrastructure Environment

Azure Authentication

Terraform Initialization

VPN Configuration

For accessing protected resources in dev environment:
  1. Download Azure VPN Client
  2. Import azurevpnconfig.xml from 1Password
  3. Connect using Azure AD authentication

Shared Configuration

Git Configuration

Ensure your Git is configured with your identity:

SSH Keys

Generate an SSH key for GitHub access:
Add the public key to your GitHub account.

Editor Setup

VS Code / Cursor

Recommended extensions:
  • TypeScript and JavaScript Language Features
  • Oxc / oxlint
  • Expo Tools
  • Tailwind CSS IntelliSense
  • Go (for api-events / web TypeScript work, Node tooling is sufficient)
The repository includes .vscode/ settings for consistent configuration.

Verification

Mobile App

Web App

api-events


Troubleshooting

Common Issues

Clear the npm cache and try again:
Ensure Docker Desktop is running, then restart the containers while preserving the database and chat-history volumes:
Verify your environment variables are set correctly:
  • Mobile: EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY in .env
  • Web: Both NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY and CLERK_SECRET_KEY in .env.local
  • api-events: Clerk secrets via npm run dev:emulator or env; local emulator on :4711 after npm run dev:infra
Clerk delivers user and org data via webhooks; locally, prefer the Clerk emulator + db:seed:demo-full:
Sign-in lists demo personas for one-click auth.

Next Steps

Engineering Overview

Architecture, services, and dev workflows

Troubleshooting

Common issues and solutions