// share.gitpitcher.com
Git PitcherBuild Pack WebpageShared artifact
May 1, 2026
karpathy/jobs1,586HTML

Build blueprint

Build a hosted labor market analytics platform with custom LLM scoring layers, starting with BLS data and an interactive treemap UI.

Enable HR leaders and economists to explore occupation data with custom AI-generated metrics, starting with employment projections and AI exposure.

This version is optimized for builders. It breaks the product into entities, routes, modules, implementation phases, and practical first moves you can actually execute.

MVP scope

6

Entities

3

Flows

5

Phases

4

Blueprint

Product thesis and MVP scope

Enable HR leaders and economists to explore occupation data with custom AI-generated metrics, starting with employment projections and AI exposure.

Target user

HR analytics teams in large enterprises, economic research firms, and career advisors who need to assess workforce trends and risks.

MVP scope

  • Interactive treemap visualization of BLS occupations where area equals employment and color maps to a selected metric (BLS growth outlook, median pay, education requirements, or AI exposure).
  • Support for at least one custom LLM scoring layer defined by natural language prompt, with results displayed as a color overlay on the treemap.
  • User authentication system to persist and manage custom scoring layers.
  • Automated weekly data pipeline to scrape and update BLS data from the OOH website.
  • Basic admin panel to trigger data refresh and view high-level usage metrics.
  • Occupation detail page showing BLS attributes and a breakdown of all scoring results for that occupation.

System

Entities, flows, and modules

Entities

Occupation

id, title, slug, description, median_pay_annual, median_pay_hourly, employment, outlook_pct, education, work_environment, duties, scrape_timestamp — Core entity scraped from individual BLS OOH pages. Employment drives treemap area; other fields serve as default layers.

User

id, email, hashed_password, subscription_tier, created_at — Stores account info and subscription level, enabling personalization and monetization.

ScoringLayer

id, user_id, name, prompt, scores_json, created_at — Custom layer created by a user; scores_json maps occupation slug to a numeric score, used for coloring.

Flows

Treemap Dashboard

/ — Primary view showing interactive treemap with controls to toggle between default and user-created scoring layers.

Create Custom Scoring Layer

/layers/create — Form where user enters a natural language prompt and initiates LLM scoring across all occupations.

Layer Management

/layers — List of saved custom scoring layers with options to view, rename, or delete.

Occupation Detail

/occupations/{slug} — Deep-dive page for a single occupation, showing all scraped attributes and a breakdown of every saved scoring result.

User Authentication

/login, /signup, /logout — Handles sign-up, login, and session management.

Backend modules

Scraping Service

Scrape individual BLS OOH occupation pages, parse HTML to extract structured data, and upsert records into PostgreSQL. — Without reliable and repeatable data acquisition, the product has no value. This is the foundation of the entire platform.

Scoring Service

Accept a user prompt, format it with occupation context, call the LLM API, and store normalized scores. — The custom LLM scoring is the key differentiator. It must be robust, cost-optimized, and responsive.

API Service

Expose REST endpoints for treemap data, occupation details, and layer management. Handle authentication and authorization. — Separates data access from UI, enabling later scaling and potential third-party integrations.

User Service

Manage user accounts, subscription tiers, and stored custom layers. Integrate with Stripe for billing. — Needed to implement per-user customization and monetization via tiered subscriptions.

Phases

Implementation phases

Phase 1

Phase 1: Data Pipeline & Core API

Rebuild a reliable, containerized scraper for BLS OOH data and serve it via a REST API.

Deliverables

  • Playwright-based scraper targeting BLS OOH occupation listing and individual pages.
  • PostgreSQL schema with occupations table populated for all 342 categories.
  • FastAPI endpoints: GET /occupations, GET /occupations/{slug}.
  • Docker Compose setup for scraper and database.

Exit criteria

  • Scraper runs successfully in a fresh environment and populates all 342 occupations.
  • API returns correct occupation data with response time < 200ms.
  • Data can be refreshed on demand without manual intervention.
Phase 2

Phase 2: Treemap UI & Static AI Layer

Build the interactive treemap visualization and hardcode the original AI exposure layer.

Deliverables

  • React app with D3.js treemap component receiving data from API.
  • Toggle control for default layers: Growth Outlook, Median Pay, Education, AI Exposure.
  • Responsive layout adapters for mobile/tablet.
  • Pre-computed AI exposure scores migrated from repo's score.py output.

Exit criteria

  • Application matches functionality of karpathy.ai/jobs demo.
  • Layer toggling updates colors instantaneously.
  • Treemap is interactive (zoom, tooltip) and performant with 342 rectangles.
Phase 3

Phase 3: User Accounts & Custom Scoring

Add authentication, user-specific custom layers, and on-demand LLM scoring.

Deliverables

  • User sign-up/login with JWT-based sessions.
  • UI for creating a custom layer: prompt input, name, submit trigger.
  • Asynchronous scoring pipeline that calls OpenAI API for each occupation.
  • Scores stored per user; layer can be toggled on treemap.
  • Cost optimization: batched LLM calls, prompt length minimized.

Exit criteria

  • A new user can sign up, create a prompt, and see a colored treemap based on their custom metric within 5 minutes.
  • Scoring job handles all 342 occupations without timeout.
  • User's saved layers persist across sessions.
Phase 4

Phase 4: Monetization & Data Expansion

Introduce subscription plans, integrate O*NET data, and add enterprise features.

Deliverables

  • Stripe checkout integration with two tiers: Basic (3 layers) and Pro (unlimited layers).
  • O*NET scraper and merge logic to extend occupation coverage.
  • Simple analytics dashboard for admins: user count, layer usage, API costs.
  • Rate limiter on scoring to prevent abuse.
  • Enterprise readiness: SSO option, audit logs, export functionality.

Exit criteria

  • Users can upgrade from Basic to Pro via credit card.
  • O*NET data adds roughly 1000+ occupations and can be scored alongside BLS.
  • One enterprise pilot customer in trial with SSO and private deployment option.

Build first

Build first, skip first, and watchouts

First things to build

  • Initialize Python project (FastAPI) and React frontend scaffold with a shared data contract.
  • Write a Playwright/BeautifulSoup scraper for a single BLS occupation page to validate parsing logic.
  • Design PostgreSQL occupation table and run a full scrape to populate it.
  • Create a minimal treemap component in React using D3 with fake data to test rendering pipeline.
  • Implement the AI exposure scoring script using OpenAI API, replicating score.py logic.
  • Set up Docker Compose with database, backend, and frontend services for consistent local development.

Not to build yet

  • Real-time websocket updates for treemap (static refresh is sufficient).
  • Mobile native apps (focus on responsive web).
  • Public API for third-party developers until core product is stable.
  • Advanced caching with Redis before traffic proves need.
  • Collaborative workspaces or team sharing features.
  • Integration with HRIS or talent management systems.

Risks / blockers

  • LLM API cost and latency could make custom scoring prohibitive if not optimized; need model selection, batching, and prompt minimization.
  • Scraping BLS and O*NET is brittle; site changes could break data ingestion without warning, requiring ongoing maintenance.
  • Market risk: HR teams may not perceive enough value in custom scoring to pay, compared to free BLS data and existing analytics tools.
  • Data licensing (no license on repo, BLS data is public domain but O*NET may have terms) could complicate redistribution.

Builder prompts

Derived builder prompts

Master

Master context prompt

Expand prompt
You are building a fresh implementation inspired by the karpathy/jobs repository.
Treat the repository as a reverse-engineering reference, not as the default destination codebase.
Infer the product, architecture, entities, and flows from the reference repository, then rebuild the core system intentionally from scratch.
Do not blindly clone the original repo. Do not default to patching or refactoring it in place.
Build in small phases and keep the first version focused and maintainable.
Product thesis: Enable HR leaders and economists to explore occupation data with custom AI-generated metrics, starting with employment projections and AI exposure.
Commercial/product framing: Current labor market data tools are static and one-size-fits-all. By allowing users to define custom scoring dimensions via natural language prompts and visualizing them on a treemap, we provide a flexible, decision-driven analytics platform that turns BLS data into actionable insights.
Target user: HR analytics teams in large enterprises, economic research firms, and career advisors who need to assess workforce trends and risks.
MVP scope:
- Interactive treemap visualization of BLS occupations where area equals employment and color maps to a selected metric (BLS growth outlook, median pay, education requirements, or AI exposure).
- Support for at least one custom LLM scoring layer defined by natural language prompt, with results displayed as a color overlay on the treemap.
- User authentication system to persist and manage custom scoring layers.
- Automated weekly data pipeline to scrape and update BLS data from the OOH website.
- Basic admin panel to trigger data refresh and view high-level usage metrics.
- Occupation detail page showing BLS attributes and a breakdown of all scoring results for that occupation.
Stack assumptions:
- Python backend (FastAPI) for API and pipeline orchestration, mirroring the repo's Python scripting approach.
- React frontend with D3.js for treemap visualization (repo uses static HTML; a rebuild requires a proper frontend framework).
- PostgreSQL database for structured occupation data, user accounts, and scoring layers.
- LLM integration via OpenAI API (similar to score.py in the repo) for sentiment scoring.
- Playwright and BeautifulSoup for scraping, as evidenced by pyproject.toml dependencies.
- Docker for containerization to ensure consistent data pipeline execution.
- Stripe for subscription billing, assumed based on commercialization path.
Key entities:
- Occupation: id, title, slug, description, median_pay_annual
- User: id, email, hashed_password, subscription_tier, created_at
- ScoringLayer: id, user_id, name, prompt, scores_json
Core pages / routes / flows:
- Treemap Dashboard (/): Primary view showing interactive treemap with controls to toggle between default and user-created scoring layers.
- Create Custom Scoring Layer (/layers/create): Form where user enters a natural language prompt and initiates LLM scoring across all occupations.
- Layer Management (/layers): List of saved custom scoring layers with options to view, rename, or delete.
- Occupation Detail (/occupations/{slug}): Deep-dive page for a single occupation, showing all scraped attributes and a breakdown of every saved scoring result.
- User Authentication (/login, /signup, /logout): Handles sign-up, login, and session management.
Backend services / modules:
- Scraping Service: Scrape individual BLS OOH occupation pages, parse HTML to extract structured data, and upsert records into PostgreSQL.
- Scoring Service: Accept a user prompt, format it with occupation context, call the LLM API, and store normalized scores.
- API Service: Expose REST endpoints for treemap data, occupation details, and layer management. Handle authentication and authorization.
- User Service: Manage user accounts, subscription tiers, and stored custom layers. Integrate with Stripe for billing.
Do not build yet:
- Real-time websocket updates for treemap (static refresh is sufficient).
- Mobile native apps (focus on responsive web).
- Public API for third-party developers until core product is stable.
- Advanced caching with Redis before traffic proves need.
- Collaborative workspaces or team sharing features.
- Integration with HRIS or talent management systems.
Major risks / blockers:
- LLM API cost and latency could make custom scoring prohibitive if not optimized; need model selection, batching, and prompt minimization.
- Scraping BLS and O*NET is brittle; site changes could break data ingestion without warning, requiring ongoing maintenance.
- Market risk: HR teams may not perceive enough value in custom scoring to pay, compared to free BLS data and existing analytics tools.
- Data licensing (no license on repo, BLS data is public domain but O*NET may have terms) could complicate redistribution.
Work in phases. After each phase, summarize what was built, what remains, and which assumptions from the reference repo you intentionally did or did not keep.

Phase 1

Phase 1 foundation prompt

Expand prompt
Phase 1 foundation

Objective: Rebuild a reliable, containerized scraper for BLS OOH data and serve it via a REST API.

Deliverables:
- Playwright-based scraper targeting BLS OOH occupation listing and individual pages.
- PostgreSQL schema with occupations table populated for all 342 categories.
- FastAPI endpoints: GET /occupations, GET /occupations/{slug}.
- Docker Compose setup for scraper and database.
- Exit: Scraper runs successfully in a fresh environment and populates all 342 occupations.
- Exit: API returns correct occupation data with response time < 200ms.
- Exit: Data can be refreshed on demand without manual intervention.

Rules:
- Start by reverse engineering the product shape from the reference repo, then create a clean fresh project structure.
- Set up the minimum schema, services, routes, and project structure required for the MVP.
- Avoid polish work, avoid optional abstractions, and avoid copying implementation details you do not understand.

Start by reverse engineering the reference repository, then implement the fresh build in the smallest clean sequence.

Phase 2

Phase 2 core flow prompt

Expand prompt
Phase 2 core flow

Objective: Build the interactive treemap visualization and hardcode the original AI exposure layer.

Deliverables:
- React app with D3.js treemap component receiving data from API.
- Toggle control for default layers: Growth Outlook, Median Pay, Education, AI Exposure.
- Responsive layout adapters for mobile/tablet.
- Pre-computed AI exposure scores migrated from repo's score.py output.
- Exit: Application matches functionality of karpathy.ai/jobs demo.
- Exit: Layer toggling updates colors instantaneously.
- Exit: Treemap is interactive (zoom, tooltip) and performant with 342 rectangles.

Rules:
- Implement the core pages, routes, and backend modules needed for the happy path in the fresh build.
- Use the reference repo for behavior and architecture cues, not as the code target.
- Preserve maintainability and add only the minimum comments needed.

Start by reverse engineering the reference repository, then implement the fresh build in the smallest clean sequence.

Phase 3

Phase 3 polish/refactor prompt

Expand prompt
Phase 3 polish and refactor

Objective: Add authentication, user-specific custom layers, and on-demand LLM scoring.

Deliverables:
- User sign-up/login with JWT-based sessions.
- UI for creating a custom layer: prompt input, name, submit trigger.
- Asynchronous scoring pipeline that calls OpenAI API for each occupation.
- Scores stored per user; layer can be toggled on treemap.
- Cost optimization: batched LLM calls, prompt length minimized.
- Exit: A new user can sign up, create a prompt, and see a colored treemap based on their custom metric within 5 minutes.
- Exit: Scoring job handles all 342 occupations without timeout.
- Exit: User's saved layers persist across sessions.

Rules:
- Refine the fresh implementation without introducing a large refactor.
- Improve validation, edge cases, and developer ergonomics where the core flow already exists.
- Prefer targeted cleanup over architecture churn or feature creep.

Start by reverse engineering the reference repository, then implement the fresh build in the smallest clean sequence.

Deploy

Deploy/finalization prompt

Expand prompt
Deploy and finalization

Objective: Prepare the implementation for release, verification, and handoff.

Deliverables:
- Verify the main flows work.
- Check configuration, environment assumptions, and release blockers.
- Summarize remaining risks and suggested follow-up work.

Rules:
- Do not add speculative infrastructure.
- Focus on practical release readiness, tests, and explicit known gaps versus the reference repo.

Start by reverse engineering the reference repository, then implement the fresh build in the smallest clean sequence.

Bugfix

Bugfix/refinement prompt

Expand prompt
Bugfix and refinement

Objective: Fix the specific bug or implementation gap in the fresh build while preserving the established architecture.

Deliverables:
- Reproduce the issue in the rebuilt implementation.
- Patch the smallest reliable fix.
- Explain what caused it, how to verify the fix, and whether the reference repo suggests an architecture guardrail you missed.

Rules:
- Inspect the fresh implementation before editing.
- Do not rewrite working systems just to fix a localized issue.

Start by reverse engineering the reference repository, then implement the fresh build in the smallest clean sequence.
    Build Pack · karpathy/jobs