Scout
AI-native startup job-search workspace. Save startups and jobs from anywhere on the web and Scout researches each company with AI, matches open roles against your CV with semantic search, and carries you from application through outreach in one place.
- 4 Apps Web, extension, API & worker
- Hybrid pgvector search + reranking
- MV3 Plasmo save-to-Scout extension
- 11 Migrations Alembic-managed Postgres schema
The Problem
Searching for a job at a startup means keeping tabs on companies you discover everywhere — LinkedIn posts, Y Combinator and Wellfound listings, Techstars batches, newsletters. Each one needs to be researched, its open roles compared against your CV, and every application chased from submission through outreach. That ends up scattered across browser tabs, spreadsheets, and half-remembered bookmarks, with no sense of which opportunities actually fit your profile.
What Was Built
Scout is being built as a pnpm-workspaces monorepo that turns discovered startups into an actionable pipeline. A React 19 web app (Vite, TanStack Router, React Query, Zustand, Tailwind) provides the workspace — dashboard, matches, application CRM, resume studio, and analytics — while a Plasmo MV3 browser extension detects job boards (LinkedIn, Y Combinator, Wellfound, Work at a Startup, and generic career pages) and quick-saves companies into the workspace. The FastAPI API under /v1 powers auth, startups, jobs, CV profiles, applications, outreach, analytics, and an AI assistant, backed by PostgreSQL 16 with pgvector embeddings, Redis, and Celery workers that enrich companies, score matches, and generate resumes and outreach in the background. LLM prompts live in versioned packages (v1/v2) with deterministic fallbacks when no AI key is configured, and shared TypeScript types are generated straight from the OpenAPI spec. So far the snapshot ships eleven Alembic migrations covering users, CV and job embeddings, source registries, application tags, email reminders, and preference tracking.
Highlights
- Save-to-Scout browser extension (Plasmo MV3) with per-board detectors for LinkedIn, YC, Wellfound, Work at a Startup and generic career sites
- AI startup enrichment — company summary, tech stack, and hiring signal pulled from job pages
- Semantic matching with pgvector embeddings, hybrid search, and reranking against your CV profiles
- Application pipeline with status tracking, tags, notes, saved startups, and per-application history
- Resume and outreach generation — tailored resumes, LinkedIn DMs, emails, and follow-ups
- Versioned LLM prompt packages (v1/v2) so behavior changes are reviewable and rollback-able
- OpenAPI-spec-driven shared TypeScript types consumed by both the web app and extension
- Idempotent, rate-limited, review-gated background jobs on Celery with deterministic AI fallbacks
Engineering Decisions
The hard part is keeping every source of truth honest across four moving parts. Startups and jobs arrive from several registries (LinkedIn, YC, Wellfound, Work at a Startup, manual adds), so a source registry tracks provenance and enrichment jobs stay idempotent and review-gated. Embedding strategy evolved as models changed — one migration re-dimensions stored embeddings to 3072 — which forced hybrid search to normalize scores across different embedding spaces and rerankers. Everything that touches an LLM (enrichment, matching, generation) must degrade cleanly to keyword-based fallbacks so the app stays usable without an API key, and the assistant needs tool-calling discipline so it never fabricates pipeline state.
Architecture
- Web app + ExtensionReact 19, TanStack Router & Plasmo MV3
- FastAPI serviceAuth, startups, jobs, CVs & /v1 routes
- Celery workersAI enrichment, matching & generation
- PostgreSQL 16 + pgvectorRelational data & embeddings






