No description
- Rust 55.6%
- TypeScript 37.5%
- CSS 6.7%
- HTML 0.1%
- JavaScript 0.1%
| .cursor/rules | ||
| .github/workflows | ||
| apps/web | ||
| config | ||
| crates | ||
| docs | ||
| migrations | ||
| security_reviews | ||
| sprints | ||
| .env.example | ||
| .gitignore | ||
| .gitleaks.toml | ||
| .pre-commit-config.yaml | ||
| Cargo.toml | ||
| CODEOWNERS | ||
| LICENSE | ||
| PLAN.md | ||
| README.md | ||
| render.yaml | ||
Dev PM Agent
Remote Cursor CLI controller — run development tasks from your phone via web chat.
See PLAN.md for the full project design and implementation plan.
Quick start
# 1. Copy .env.example, generate secrets
# Required: JWT_SECRET, EXECUTOR_API_KEY, PASSWORD_SALT, CLIENT_SALT (CLIENT_SALT = VITE_CLIENT_SALT in apps/web/.env)
# Generate each: openssl rand -hex 32 (min 32 bytes = 64 hex chars)
# Rotate: set new env vars, restart relayer; JWTs expire by TTL; users re-login
# 2. Run relayer (backend)
source .env && cargo run -p relayer
# 3. Run executor (in another terminal; requires Cursor CLI)
source .env && cargo run -p executor
# 4. Frontend
cd apps/web
cp .env.example .env # set VITE_CLIENT_SALT (same value as root CLIENT_SALT)
npm install && npm run dev
Then open http://localhost:5173. First-run setup:
- Get device key (CLI):
source .env && cargo run -p executor -- bootstrap-device - Web Setup: paste device key → verify → create account (username, password)
- Add TOTP to authenticator, then Login with device key + password + TOTP
The device key is never stored in the browser — enter it at each login.
Deploy to Render
- Create a Blueprint in Render (New → Blueprint → connect repo → Apply).
- Set env vars for
dev-pm-relayer:JWT_SECRET,EXECUTOR_API_KEY,PASSWORD_SALT(generate withopenssl rand -hex 32). - After relayer deploys, set
VITE_RELAYER_URLfordev-pm-webapptohttps://<relayer-service>.onrender.com, then redeploy. - Run executor locally with:
export EXECUTOR_API_KEY=<same-as-relayer> export RELAYER_WS_URL=wss://<relayer-service>.onrender.com/ws cargo run -p executor
See sprints/SPRINT_004.md for the full deployment checklist and local test flow.
Secrets
- Length: Use at least 32 bytes (64 hex characters). Generate:
openssl rand -hex 32 - Rotation: Set new values in env, restart the relayer. Existing JWTs expire per
JWT_TTL_SECS; users must re-login. Device API keys remain valid until devices are re-registered.
Executor subcommands
cargo run -p executor— run daemon (default)cargo run -p executor -- bootstrap-device— get device key for first-run setup (relayer must be running)cargo run -p executor -- register-device <word-code> <password>— register new webapp device
License
Licensed under the AGPL-3.0 License. See LICENSE for details.