Every Yale startup and every opportunity to fund it, in one verified, searchable place.
found. combines the Yale Startup Directory (122 startups) and the Tsai CITY Yale Startup Opportunities board (130 programs, grants, competitions, perks and asks) into one site, verifies members with their Yale email, lets founders prove and claim their listing, and uses two small AI agents (gpt-6-luna):
Report: open in browser (file) · Slides: open in browser (file). Both files also open by double-clicking after download.
Needs Python 3.11+. No Node.js needed (the web apps are prebuilt in frontend/dist and admin/dist).
.env, in this folder or the folder above it:
PORTKEY_API_KEY=your-key
Install and start (from this folder):
Mac / Linux
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python run.py
Windows (PowerShell)
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt
.venv\Scripts\python run.py
The database is created from the included data on first start. Stop with Ctrl+C. The test accounts below (and the demo listing “Bulldog Test Co.”) exist only in local mode and are clearly marked as fake.
| Where | Password | |
|---|---|---|
| Public site | demo@yale.edu (verified member) |
found2026 |
| Public site | test.founder@yale.edu (fake founder of the demo listing “Bulldog Test Co.”) |
found2026 |
| Public site | dan@yale.edu (another fake member, “Handsome Dan”) |
found2026 |
Admin console /admin |
admin@yale.edu |
found2026 |
Or create your own account with any @yale.edu address. In local mode nothing is emailed: after signing up, click
“Open your email” in the yellow banner to see the verification email and click its link. Members can paste their
LinkedIn profile link on their profile (optional, shown on their founder card; not verified).
demo@yale.edu, turn on Explore’s Founder on found. filter (startups whose
founder you can message) and open Bulldog Test Co. (a demo listing, not a real company), then click Message Test.
Or go to Messages and type test in New message. Send a message. Then log in as test.founder@yale.edu in another
browser (or after logging out) to read it and reply./people: log in as test.founder@yale.edu and click Browse people open to
joining (the demo member is already opted in). Non-founders get an explanation instead./admin → New startups./admin): review claims, run Audit on a listing (e.g. Mundaly), apply or dismiss the suggestion.data/sources/ holds the data the app imports on first start (small, included):
pitchbook_startups.json, tsai_posts.json, tsai_upcoming.json, plus corrections.json (fixes applied on top).REFRESH_DAYS in
.env; 0 turns it off). The admin console’s dashboard shows the last/next refresh and has a Refresh now button.
You can also run cd backend && ../.venv/bin/python refresh.py. A refresh never removes users, claims, corrections,
events or messages; a listing that disappears from the source is hidden, not deleted, and a download that looks broken
(missing fields, or less than half the previous size) is refused..venv/bin/python backend/db.py --reset.FOUND_DB=/path/to/file.db in .env.| Part | Where |
|---|---|
| API, auth, verification, budgets, serving the web apps | backend/main.py, auth.py, verification.py, config.py, mailer.py |
| Agent 1 · Scout | backend/agent.py, backend/tools.py, backend/prompts/prompt.md |
| Agent 2 · Listing Auditor | backend/auditor.py, backend/prompts/auditor.md |
| Data model and import | backend/db.py, backend/queries.py, backend/models.py |
| Public site (React + Vite + TypeScript) | frontend/ (built into frontend/dist) |
| Admin console (React + Vite + TypeScript) | admin/ (built into admin/dist) |
| Append-only log of every agent run | output/audit_trail.json |
Model: gpt-6-luna only, through Portkey (PORTKEY_API_KEY).
| Script | Output |
|---|---|
.venv/bin/python scripts/eval_scout.py |
output/eval_scout.json: 20-question accuracy and tokens, one-call vs two-call Scout |
.venv/bin/python scripts/safety_tests.py |
output/safety_tests.json: 16 attacks on the defenses (uses a throwaway database) |
.venv/bin/python scripts/feature_tests.py |
output/feature_tests.json: founder card, messaging, LinkedIn link, joining a startup, submit → approve (throwaway database) |
.venv/bin/python scripts/audit_all.py |
output/audit_all.json: Listing Auditor run on every listing with its own website |
.venv/bin/python scripts/build_report.py |
report.html, slides.html (every number read from the files above) |
Hot-reloading dev servers instead of the prebuilt apps (needs Node 20+):
cd backend && ../.venv/bin/uvicorn main:app --reload --port 8030 # API
cd frontend && npm install && npm run dev # public site → http://localhost:5185
cd admin && npm install && npm run dev # admin → http://localhost:5186/admin/
Rebuild the prebuilt apps with npm run build in frontend/ and admin/. Optional settings (real email, budgets,
refresh interval) are listed in .env.example; none are needed to run the app.
Everything lives in one process (python run.py) and one SQLite file (data/found.db), so hosting is simple:
python run.py --no-browser
with PORT from the host. Put data/ on a persistent disk (and back it up nightly), or move to managed Postgres
once you run more than one server. The weekly data refresh runs inside the server.PORTKEY_API_KEY, FOUND_DEV_MODE=0 (no test accounts, no
email outbox), FRONTEND_URL=https://your-domain, ADMIN_EMAILS=you@yale.edu.MAIL_MODE=smtp with a Yale shared mailbox or a service such as Resend
(SMTP_HOST=smtp.resend.com, SMTP_USER=resend, SMTP_PASSWORD=<API key>, MAIL_FROM=found. <verify@your-domain>).Estimated cost: about $8/month for a club pilot, about $67/month Yale-wide (see the report’s Section 7).