LaunchPilot is a hackathon-focused MVP for supervised, multi-agent product launches.
This repo is intentionally streamlined for a 36-hour delivery window:
- Next.js frontend (
apps/web) - FastAPI backend (
apps/api) - Postgres for app state
- Synchronous execution flow (no worker queue)
- Backboard-backed agent reasoning + memory threads
The shipped slice is:
- Create project
- Run research
- Run positioning
- Generate execution plan + assets
- Prepare outreach batch
- Approve send
- Send emails (real Resend if configured, mock otherwise)
apps/web: Next.js App Router UIapps/api: FastAPI API, SQLAlchemy models, Alembic migrationsinfra/docker: local Docker Compose for DB + migrate + APIinfra/scripts: utility scripts
- Node.js 20+
- npm 10+
- Python 3.12+
- Postgres 15+ (or Docker)
- Copy
.env.exampleto.env - Choose auth mode:
AUTH_MODE=dev(recommended for hackathon speed)AUTH_MODE=auth0(strict JWT validation)
- Configure Backboard:
- Set
BACKBOARD_API_KEYfor the full multi-step agent pipeline. - API startup fails if
BACKBOARD_API_KEYis missing.
- Set
npm run install:webcd apps/api
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements-dev.txtFrom apps/api:
alembic upgrade headFrom repo root:
uvicorn app.main:app --reload --app-dir apps/apiFrom repo root:
npm run devdocker compose -f infra/docker/docker-compose.yml up --buildThis starts:
- Postgres
- Migration job
- API
Note: frontend is not run by Docker Compose in this repo.
Set:
AUTH_MODE=devBackend uses a local fallback user/scopes. No Auth0 API token verification is required.
Set:
AUTH_MODE=auth0
AUTH0_ISSUER=https://YOUR_TENANT.us.auth0.com/
AUTH0_AUDIENCE=YOUR_API_IDENTIFIERBackend fails fast on startup if these are missing.
Set:
BACKBOARD_API_KEY=your_backboard_api_keyOptional:
BACKBOARD_BASE_URL=https://app.backboard.io/api
BACKBOARD_LLM_PROVIDER=openai
BACKBOARD_MODEL_NAME=gpt-4o
BACKBOARD_MEMORY_MODE=OnMemory mode options are On, Auto, Readonly, Off. For this pipeline, On is the default to maximize persistent context retention across stage runs.
Backboard stage sessions are persisted per project and stage using project memory keys:
backboard_research_assistant/backboard_research_threadbackboard_positioning_assistant/backboard_positioning_threadbackboard_execution_assistant/backboard_execution_thread
Each successful stage run also writes a structured stage snapshot into Backboard Memories (POST /assistants/{assistant_id}/memories) so future runs can retrieve richer context.
When a system prompt changes, the API automatically rotates the stored stage assistant/thread using a prompt fingerprint so new runs use the updated prompt.
All agent system prompts are stored in apps/api/app/prompts:
apps/api/app/prompts/research_prompt.py(Research Agent system prompt)apps/api/app/prompts/positioning_prompt.py(Positioning Agent system prompt)apps/api/app/prompts/execution_prompt.py(Execution Agent system prompt)
These prompt constants are passed into Backboard assistant creation via:
apps/api/app/agents/research_agent.pyapps/api/app/agents/positioning_agent.pyapps/api/app/agents/execution_agent.py
Base URL: http://localhost:8000/v1
GET /me
GET /projectsPOST /projectsGET /projects/{project_id}POST /projects/{project_id}/briefPOST /projects/{project_id}/sourcesGET /projects/{project_id}/memoryGET /projects/{project_id}/activity
POST /projects/{project_id}/research/run(synchronous)POST /projects/{project_id}/research/advise(interactive follow-up on same stage thread)GET /projects/{project_id}/research
POST /projects/{project_id}/positioning/run(synchronous)POST /projects/{project_id}/positioning/advise(interactive follow-up on same stage thread)GET /projects/{project_id}/positioningPOST /projects/{project_id}/positioning/select/{version_id}
POST /projects/{project_id}/execution/plan(synchronous)POST /projects/{project_id}/execution/plan/advise(interactive follow-up)POST /projects/{project_id}/execution/assets(synchronous)POST /projects/{project_id}/execution/assets/advise(interactive follow-up)POST /projects/{project_id}/execution/contactsPOST /projects/{project_id}/execution/email-batch/prepare(synchronous)POST /projects/{project_id}/execution/email-batch/prepare/advise(interactive follow-up)POST /projects/{project_id}/execution/email-batch/{batch_id}/send(requires approval)GET /projects/{project_id}/execution/state
GET /projects/{project_id}/approvalsPOST /approvals/{approval_id}/approvePOST /approvals/{approval_id}/reject
//login/app/app/projects/app/projects/new/app/projects/[projectSlug]/app/projects/[projectSlug]/research/app/projects/[projectSlug]/positioning/app/projects/[projectSlug]/execution/app/projects/[projectSlug]/approvals/app/projects/[projectSlug]/memory/app/projects/[projectSlug]/settings/app/settings/security
Legacy workspace routes still exist as redirects for compatibility.