Real-time FPV drone racing dashboard with a Go backend and a Deno + React + Vite frontend.
- Live race views, leaderboards, pilot/channel info, and lap timing
- PocketBase-backed datastore with admin UI at
/_/ - Ingest + scheduler services to reduce FPVTrackside load and improve resilience
- Single-binary deploy option with embedded frontend assets
- Deno/Vite dev workflow with tests and lint/format checks
- Deno
2.1.0+ - Go
1.21+ - Docker (optional, only needed for Playwright server/e2e runtime)
Run backend and frontend separately.
- Start backend (from
backend/):
go run main.go -fpvtrackside=http://localhost:8080 -port=3000- Create
frontend/.env:
VITE_API_URL=http://localhost:3000- Start frontend (from
frontend/):
deno task dev- Open:
- App:
http://localhost:5173 - Admin UI:
http://localhost:3000/_/
Notes:
- Vite proxies
/api/*and/direct/*toVITE_API_URL. - If
VITE_API_URLis not set,vite.config.tsfalls back tohttp://localhost:8090/.
Build frontend assets, then build/run backend as one executable.
- Build frontend (from
frontend/):
deno task buildThis writes production assets to backend/static/.
- Build backend (from
backend/):
./build.sh
# or
go build -o drone-dashboard- Run:
./drone-dashboard -fpvtrackside=http://localhost:8080 -port=3000VITE_API_URL: backend base URL (for Vite proxy target)VITE_USE_PB: prefer PocketBase collections where supportedVITE_USE_PB_RACE: subscribe to race data via PocketBaseVITE_EVENT_ID: optional event id overrideVITE_DEV_MODE: enables extra build reporting in Vite config
Run go run main.go --help (or ./drone-dashboard --help) for full usage.
--fpvtrackside: FPVTrackside API endpoint (defaulthttp://localhost:8080)--port: server port (default3000)--log-level:error|warn|info|debug|trace--ingest-enabled: enable background scheduler loops (defaulttrue)--direct-proxy: enable/direct/*proxy to FPVTrackside--cloud-url: Cloud WebSocket URL (pits mode)--auth-token: auth token for cloud/pits control link--pits-id: pits instance identifier--db-dir: SQLite data directory (empty means in-memory)--import-snapshot: path to a PocketBase snapshot JSON to import on startup--ui-title: browser tab title (defaultDrone Dashboard)
Environment variables:
AUTH_TOKEN: fallback for--auth-tokenSUPERUSER_EMAIL: PocketBase admin email (defaultadmin@example.com)SUPERUSER_PASSWORD: PocketBase admin password (auto-generated if empty)
deno task dev: start Vite dev serverdeno task build: build production assets into../backend/staticdeno task preview: preview production build with Vitedeno task serve: servedist/via std file server (only if you generateddist/manually)deno task test: run testsdeno task test:watch: run tests in watch modedeno task verify: run fmt + lint + type-check
go run main.go -fpvtrackside=http://localhost:8080 -port=3000go test ./...go vet ./..../build.sh
deno task -c e2e/deno.json preflightRuns frontend verify, e2e verify, and backend vet checks in parallel.
- Generate: use the floating
Download PB Snapshotdev tool in the running app. - Import: start backend with
--import-snapshot=/path/to/pb-snapshot.json. - Import behavior: upserts by id, preserves relationships, and marks
currentEventIdas current.
- Frontend:
frontend/(React + Vite + Deno) - Backend:
backend/(Go + PocketBase + embedded static assets) - E2E/preflight harness:
e2e/ - Docs:
docs/ARCHITECTURE.md
.
├── frontend/ # React app (Deno + Vite)
├── backend/ # Go server + PocketBase + embedded static assets
├── e2e/ # Playwright/e2e + preflight tooling
├── docs/ # Project docs
├── scripts/ # Helper scripts
└── .github/ # CI/CD config
- Frontend cannot reach API: verify backend is running and
VITE_API_URLpoints to it. - Admin login issues: set
SUPERUSER_EMAIL/SUPERUSER_PASSWORDor check backend logs for generated credentials. - Need direct FPVTrackside diagnostics: run backend with
--direct-proxyand use/direct/*.
- Follow
CONTRIBUTING.mdandCODING_STANDARDS.md. - Use Conventional Commits (for example,
feat(leaderboard): add position change tags). - Keep tests near implementation files and keep changes focused.