Find collaborators who actually build what you build. CoFoundry connects your GitHub profile, builds a project knowledge graph, and matches you with founders on overlapping repos, stacks, and ideas — with AI-generated collaboration insights.
- GitHub-powered onboarding — Import repos; your graph is built from real projects, not manual tags.
- Interactive knowledge graph — Explore projects as a force-directed bubble map on the dashboard.
- Smart matching — Semantic similarity over project nodes (OpenAI embeddings) plus cached AI insights (Claude).
- Integrations — GitHub OAuth for import/sync; LinkedIn OAuth scaffold for future profile enrichment.
- Match cache — Fingerprints and TTLs reduce repeat LLM calls for matches and insights.
| Layer | Stack |
|---|---|
| Frontend | React 18, Vite, Tailwind CSS, Zustand, react-force-graph-2d |
| Backend | Node.js, Express, TypeScript |
| Database | Supabase (Postgres + Auth) |
| AI | Anthropic Claude (insights), OpenAI (embeddings) |
plugandplay/
├── frontend/ # React app (port 5173 dev / nginx in Docker)
├── backend/ # Express API (port 3001)
├── supabase/
│ └── migrations/ # SQL schema
├── docker-compose.yml # Run full stack in containers
├── migrate.js # Run migrations against Supabase
├── .env.example # Root env reference
└── package.json # Dev scripts (concurrently)
- Node.js 18+ (local dev) or Docker (containerized)
- A Supabase project
- Anthropic API key (match insights)
- OpenAI API key (embeddings — required for matching)
- GitHub OAuth App (repo import)
git clone <your-repo-url>cd plugandplay
npm run install:allCopy the example files and fill in your values:
cp .env.example backend/.env
cp frontend/.env.example frontend/.envBackend (backend/.env):
| Variable | Description |
|---|---|
SUPABASE_ENV | TEST (local) or PROD (production/GCP); defaults to TEST unless NODE_ENV=production |
SUPABASE_URL_PROD | Supabase project URL (production) |
SUPABASE_ANON_KEY_PROD | Anon/public key (production) |
SUPABASE_SERVICE_ROLE_KEY_PROD | Service role key (server only, production) |
SUPABASE_URL_TEST / SUPABASE_ANON_KEY_TEST / SUPABASE_SERVICE_ROLE_KEY_TEST | Test project (optional; leave empty) |
SUPABASE_DATABASE_URL_PROD | Full Postgres URI for npm run db:migrate (Session pooler from Supabase → Database) |
SUPABASE_DATABASE_URL_TEST | Test DB URI (optional; leave empty) |
SUPABASE_DB_PROD_PASSWORD | Legacy fallback if URL is not set (optional) |
SUPABASE_DB_TEST_PASSWORD | Test DB password legacy fallback (optional) |
ANTHROPIC_API_KEY | Claude API key |
OPENAI_API_KEY | Embeddings for matching |
GITHUB_CLIENT_ID_PROD / GITHUB_CLIENT_SECRET_PROD | GitHub OAuth (production) |
GITHUB_CLIENT_ID_TEST / GITHUB_CLIENT_SECRET_TEST | GitHub OAuth (local / SUPABASE_ENV=TEST) |
SENDGRID_API_KEY / SENDGRID_FROM_EMAIL | Email invites for external GitHub users |
FRONTEND_URL | e.g. http://localhost:5173 |
APP_URL | e.g. http://localhost:3001 |
Frontend (frontend/.env):
| Variable | Description |
|---|---|
VITE_SUPABASE_ENV | TEST (local) or PROD (production build); defaults to TEST in dev, PROD in Vite production builds |
VITE_SUPABASE_URL_PROD | Same as backend SUPABASE_URL_PROD |
VITE_SUPABASE_ANON_KEY_PROD | Same as backend SUPABASE_ANON_KEY_PROD |
VITE_SUPABASE_URL_TEST / VITE_SUPABASE_ANON_KEY_TEST | Test project (optional; leave empty) |
VITE_API_URL | Backend URL, e.g. http://localhost:3001 |
VITE_AUTH_REDIRECT_URL | Optional; default {origin}/auth/callback |
VITE_WS_BASE_URL | Optional WS base URL override for project chat |
VITE_PROD_WS_BASE_URL | Production WebSocket base URL for project chat, e.g. wss://api.cofoundry.app (dev defaults to ws://localhost:3001) |
Sign in / sign up with GitHub (Supabase Auth)
- Supabase → Authentication → Providers → enable GitHub and paste your GitHub OAuth app Client ID & Secret.
- GitHub OAuth app → Authorization callback URL:
https://voxxnyznweutlmrlgqmy.supabase.co/auth/v1/callback - Supabase → Authentication → URL Configuration → add redirect URLs, e.g.
http://localhost:5173/auth/callback(and your production URL when deployed).
GitHub OAuth (repo import — separate app or same app with a second callback):http://localhost:3001/api/integrations/github/callback
Never commit .env files — they are listed in .gitignore.
npm run db:migratenpm run devThe stack runs as two containers: backend (Node API) and frontend (nginx serving the Vite build and proxying /api to the backend).
cp backend/.env.example backend/.env
# Fill in Supabase, Anthropic, OpenAI, GitHub OAuth, etc.
cp docker-compose.env.example .env
# Set VITE_SUPABASE_URL_PROD and VITE_SUPABASE_ANON_KEY_PROD (same values as frontend/.env)For Docker, set OAuth URLs in backend/.env:
| Variable | Docker local value |
|---|---|
FRONTEND_URL | http://localhost:8080 |
APP_URL | http://localhost:3001 |
GitHub OAuth callback (unchanged — hits the API directly):http://localhost:3001/api/integrations/github/callback
Docker does not run migrations. Apply schema once against Supabase:
npm run db:migratenpm run docker:up
# or: docker compose up --build- App: http://localhost:8080
- API: http://localhost:3001
- Health: http://localhost:3001/health
Stop: npm run docker:down
GitHub Actions deploys to Cloud Run on every push to main (project cofoundry-497002).
One-time setup:
./infra/gcp/setup.sh # APIs, Artifact Registry, Secret Manager
./infra/gcp/sync-secrets.sh # upload local .env → Secret Manager
./infra/gcp/setup-github-actions.sh # create SA → add GCP_SA_KEY in GitHub repo secretsSee infra/gcp/GITHUB_ACTIONS.md. Manual deploy: gcloud builds submit --config=cloudbuild.yaml --project=cofoundry-497002 .
Deploy runs DB migrations via SUPABASE_DATABASE_URL_PROD (full Session pooler URI from Supabase → Database → Connection string). Add it to backend/.env, then run ./infra/gcp/sync-secrets.sh.
Full docs: infra/gcp/README.md · Domain: cofoundry.app — infra/gcp/DOMAIN.md
| Command | Description |
|---|---|
npm run dev | Start frontend + backend |
npm run dev:frontend | Vite dev server only |
npm run dev:backend | API with hot reload |
npm run build | Production build |
npm run db:migrate | Apply Supabase SQL migrations |
npm run docker:up | Build and start Docker Compose stack |
npm run docker:down | Stop containers |
npm run docker:build | Build images without starting |
- Keep
SUPABASE_SERVICE_ROLE_KEY_PROD, OAuth secrets, and API keys only in local.envfiles or your deployment platform’s secret store. - Use
.env.examplefiles as templates; do not put real secrets in the repo. - The service role key must never be exposed to the browser — only
VITE_*public Supabase keys belong in the frontend.
Private — all rights reserved unless otherwise specified.