This repo is intentionally structured for multi-agent development:
packages/shareddefines the contracts (WebSocket protocol + provider interfaces + segmentation state).- Agents implement isolated modules under
apps/webandapps/serverand integrate only viapackages/shared.
Start here for product context: docs/PRODUCT.md.
- Node.js 20+
- pnpm (enable via Corepack, see below)
If pnpm is not found, enable it first (Node.js 20+ ships with Corepack):
corepack enableThen install dependencies:
pnpm installpnpm -C apps/server devpnpm -C apps/web devOr run both (pnpm will run dev in all apps):
pnpm dev| Environment | Run | Env file |
|---|---|---|
| Dev | pnpm dev |
.env.development (create from .env.example.development) |
| Test | pnpm test:docker |
.env.test (create from .env.example.test). Access at http://localhost:4181. Use --profile funnel to include Tailscale. |
| Prod | See docs/deploy-nas.md |
.env on NAS (create from .env.example.production) |
See docs/ENVIRONMENTS.md for full setup and usage.
The containerized stack uses:
-
oauth2-proxyfor Google SSO + email allowlist -
caddyto serve the web app and proxy/ws -
serverfor WebSocket + STT/translation -
tailscalesidecar to expose the stack via Funnel -
Test (local Docker):
pnpm test:docker— uses.env.test, access at http://localhost:4181 -
Prod (NAS): Follow
docs/deploy-nas.md— uses.envon the NAS
Quick start for test (after configuring .env.test and ops/oauth2-proxy/emails.test.yaml):
docker compose build
pnpm test:dockerapps/web and apps/server consume packages/shared from dist/. If that build is stale,
fields like specialWords can get dropped by the server schema. During dev, always run the
shared watch build (included in pnpm dev) so packages/shared/dist stays current.
This PoC starts with microphone capture (works even for Zoom/Teams desktop apps):
- It will prompt for mic permission (
getUserMedia({ audio: true })). - On macOS with built-in speakers+mic, some setups capture meeting audio “cleanly” through the mic input; do not treat this as guaranteed behavior across all devices/headphones.
Optional later: add tab-audio (getDisplayMedia({ audio: true })) and/or multi-source mixing if needed.
- Read the contracts:
packages/shared/src/protocol.tspackages/shared/src/providers.tspackages/shared/src/segmentation.ts
- Pick a work package from
docs/WORKPACKAGES.md - Open the corresponding prompt in
docs/AGENT_PROMPTS/ - Spawn a new Cursor agent chat and paste the prompt file contents.
- In that agent chat, only attach/mention the assigned folder:
- Web agents:
@apps/web/ - Server agents:
@apps/server/
- Web agents:
- Do not share this chat’s history with feature agents—treat
packages/shared+docs/*as their “spec”. Agents must not modify contracts unless the gatekeeper instructs it.