Phase 1: Goals and Integrations (Jira + Trello) with FastAPI, React + Vite, and Firestore.
AI-powered scope implementation is planned for a later phase and is not included here.
| Layer | Technology |
|---|---|
| Backend | FastAPI |
| Frontend | React + Vite + TypeScript |
| Database | Google Cloud Firestore |
| Auth | X-User-Id header (temporary) |
| Jira | Atlassian OAuth 2.0 (3-legged) |
| Trello | OAuth 1.0a (Trello’s user-auth API) |
AID/
├── backend/ # FastAPI API
├── frontend/ # React app
└── README.md
- Python 3.11+
- Node.js 18+
- GCP project with Firestore enabled
- Service account JSON with Firestore access (or Application Default Credentials)
- Enable Firestore in Native mode in your GCP project.
- Set
GOOGLE_APPLICATION_CREDENTIALSto your service account key path, or usegcloud auth application-default login. - Set
FIRESTORE_PROJECT_IDinbackend/.env.
Create a composite index for goals listing (Firestore will also prompt via error link on first run):
- Collection:
goals - Fields:
user_idAscending,created_atDescending
After one-time setup below:
npm install # root (concurrently) + installs dev runner only
cd frontend && npm install && cd ..
cd backend && python -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt && cd ..
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env
npm run dev # starts backend :8000 and frontend :5173The Vite dev server proxies /api to the backend.
Use Python 3.11–3.13. The default python3 on Homebrew may be 3.14, which fails to build older pydantic-core wheels.
From the repo root (recommended):
npm run setup:backend
cp backend/.env.example backend/.envOr manually:
cd backend
python3.13 -m venv .venv # or python3.12 / python3.11
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
uvicorn app.main:app --reload --port 8000If you already created a .venv with Python 3.14, delete it and re-run npm run setup:backend.
cd frontend
npm install
cp .env.example .env
npm run dev- Create an OAuth 2.0 (3LO) app at Atlassian Developer Console.
- Set callback URL:
http://localhost:8000/api/integrations/jira/callback - Add scopes:
read:jira-work,write:jira-work,offline_access - Set
JIRA_CLIENT_IDandJIRA_CLIENT_SECRETinbackend/.env
- Get API key and secret from Trello Power-Ups admin.
- Set OAuth callback URL:
http://localhost:8000/api/integrations/trello/callback - Set
TRELLO_API_KEYandTRELLO_API_SECRETinbackend/.env
- Create an OAuth App at GitHub Developer settings (OAuth Apps → New).
- Set Authorization callback URL:
http://localhost:8000/api/integrations/github/callback - Set
GITHUB_CLIENT_IDandGITHUB_CLIENT_SECRETinbackend/.env - In the app, open Harness → Integrations and connect GitHub. Then link a repository on an application.
| Method | Path | Description |
|---|---|---|
| GET | /api/goals |
List goals |
| POST | /api/goals |
Create manual goal |
| POST | /api/goals/from/jira |
Create from Jira issue |
| POST | /api/goals/from/trello |
Create from Trello card |
| PATCH | /api/goals/{id} |
Update goal |
| DELETE | /api/goals/{id} |
Delete goal |
All routes require header: X-User-Id: <stable-user-id> (the frontend generates one in localStorage).
| Method | Path | Description |
|---|---|---|
| GET | /api/integrations |
List status |
| GET | /api/integrations/jira/authorize |
Start Jira OAuth |
| GET | /api/integrations/trello/authorize |
Start Trello OAuth |
| GET | /api/integrations/jira/issues |
Browse Jira issues |
| GET | /api/integrations/trello/cards |
Browse Trello cards |
| GET | /api/integrations/github/authorize |
Start GitHub OAuth |
| GET | /api/integrations/github/repos |
List accessible repos |
| DELETE | /api/integrations/{provider} |
Disconnect |
There is no full login yet. The frontend stores a random UUID in localStorage and sends it as X-User-Id. Replace this with real authentication in a later phase.
- User authentication (replace
X-User-Id) - AI tool to implement goal scope
- Redis for OAuth state in production