Getting Started
How to run the full SkyTalk stack locally — server, database, mobile app, and admin portal.
This page covers running the stack on your local machine for development and testing.
Prerequisites
| Tool | Version | Notes |
|---|---|---|
| Node.js | 20+ | LTS |
| Docker | 24+ | Real Docker via get.docker.com — not snap |
| pnpm | 10.23.0 | Managed via Corepack |
| Android Studio | Latest | For mobile emulator testing |
Setup
Clone and Bootstrap
pnpm setup:local enables Corepack, pins pnpm to 10.23.0, installs all workspace dependencies, and runs Android environment checks.
Start the Server
Create packages/server/.env:
Then start Docker Compose:
Docker Compose starts Postgres 16 and the Node.js server. On first start, the server runs prisma db push to create all tables, then listens on port 3000.
Verify it's up:
Seed Development Data
Creates:
admin/admin— role: adminpilot1/test— role: user- Talkgroup: Ground Ops (both users as members)
Mobile App
The app connects to the relay server on startup. Make sure the server is running (or use the hosted instance at 134.122.32.45:3000).
Configure the server URL in packages/mobile/.env:
Admin Portal
Opens at http://localhost:5173. Requires an admin JWT in localStorage. Get one:
Then in the browser console:
Environment Variables Reference
See Environment & Config → for the full table of all variables across all packages.
Current Feature Status
| Feature | Status |
|---|---|
| PTT audio record + relay + playback | ✓ Working (Opus 16kHz CBR, two-device tested) |
| AES-GCM-256 encryption | ✓ Working (hardcoded test key) |
| Floor control (walk-on prevention) | ✓ Server-authoritative |
| Talkgroup membership | ✓ From server REST API |
| GPS signal | DLS-140 integration exists, untested on hardware |
| Presence | ✓ From server WebSocket |
| Loopback testing | ✓ Single-device (EXPO_PUBLIC_LOOPBACK=true) |
The crypto polyfill is a pass-through shim. Audio is sent with AES-GCM but the key is hardcoded. Production requires proper KDF and key rotation.