Archived / Nov 2025 - Aug 2026
Rack & Role
A two-sided AI hiring platform for the data center industry, built and operated solo from November 2025 to August 2026: product, schema, ingestion, AI surfaces, agent workflow, admin tooling, deployment, and live operations.
Context
Rack & Role was a two-sided hiring platform for the data center industry. I designed it, built it, ran it in production, and archived it in August 2026. It is the deepest software proof point in this portfolio because it connects product judgment, data modeling, AI workflow design, and live operations inside one system that one person owned completely.
The signal is not that the product used AI. The signal is that the AI surface was structured, typed, and bounded by operational controls, the same way a critical facility bounds a power path.
Over the nine months it was active, the platform ingested, normalized, and pushed more than 500,000 job rows through its pipelines. Of those, roughly 475,000 cleared the quality gates and reached the public surface, spanning 13,827 distinct companies pulled from 8 concurrent sources. The platform ran on 212 database tables and views, 93 edge functions, and 397 applied migrations across 34 feature modules.
The architecture worked as four planes. Data intelligence handled ingestion, dedupe, quarantine, enrichment, and expiry. Career intelligence carried the candidate AI surfaces. Hiring operations covered employer verification, posting, pipeline, and billing. Operational intelligence covered admin consoles, source health, audit logging, and KPI snapshots.
Every exposed table enforced row-level security in Postgres, with roles kept in a separate table behind a security-definer check so no client could escalate its own privileges.
The Apply Agent was treated as production infrastructure, not a magic button. It ran in an isolated Browserbase and Stagehand worker, streamed a live browser session back to the candidate, and stripped EEO and protected fields before worker handoff, with a manual fallback whenever confidence dropped.
Archiving was a decision, not a failure. The platform proved the architecture, the data pipeline, and the AI patterns I now bring to production work elsewhere. A full technical breakdown is in progress and will replace this abbreviated study.
Constraints
- Single-operator production ownership across product, platform, and live ops
- Hiring data requires strict privacy boundaries around candidate and protected fields
- AI workflows had to reason over structured context, not raw text blobs
- Ingestion had to dedupe, quarantine, enrich, serve, and expire without poisoning public search
Outcomes
- Four operating planes shipped: data intelligence, career intelligence, hiring operations, and operational intelligence
- AI surface spans resume parsing and tailoring, cover letters, interview prep, skills-gap analysis, and job description formatting, all on typed schemas
- Apply Agent isolated browser automation in a worker and removed protected fields before execution
- Reliability controls: dedupe with replay logs, quarantine queue, three-layer expiry, source health monitoring, append-only audit log, manual fallback
- Archived in August 2026 with the corpus, schema, and architecture documented rather than left to rot in production
Production Scoreboard
500K+
Job rows ingested
475K+
Quality-cleared rows
13,827
Distinct companies
8
Ingestion sources
212
Tables and views
34
Feature modules
93
Edge functions
397
Migrations
Architecture Layers
Frontend
React 19 · Vite 7 · TypeScript 5.9 / Tailwind 4 · shadcn/ui · TanStack Query 5
Backend
Postgres · row-level security on every exposed table / Typed RPCs · 93 Edge Functions (Deno)
Ingestion
8 concurrent sources · dedupe · quarantine / 3-layer expiry · zero-cost salary estimation
AI tooling
Lovable AI Gateway · Gemini 3.7 Flash / Gemini 3.1 Pro / Parse · tailor · cover · interview prep · skills-gap
Apply Agent
Browserbase + Stagehand v3 worker / Live browser panel · EEO-safe identity mapping
Admin / Ops
16-surface operator console · realtime ingest · audit log / Cron jobs · security monitor · self-heal
Lifecycle
Ingest
Scheduled pulls from 8 concurrent sources, normalized into a unified schema
Dedupe
Cross-source matching with persisted decision logs for audit and replay
Quarantine
Ambiguous listings held for review instead of polluting search
Enrich
Classification, salary estimation, and role-family tagging
Serve
Indexed search with role-category filters and 0 to 100 match scoring
Expire
Three-layer expiry across source heartbeat, last-seen window, and manual close
D01Deep System NotesEngineering Decisions
10 entries
01
Schema before screens
Normalized job, employer, candidate, and certification models with row-level security were designed before a single component shipped.
02
Aggregation pipeline with dedup
Jobs pulled from 8 concurrent sources, deduplicated against persisted decision logs, normalized, quarantined when ambiguous, and auto-expired across three layers when source listings closed. Listings move through ingest, dedupe, quarantine, enrich, serve, and expire on a continuous cycle, with per-source run history retained for replay.
03
RLS enforced at the row
Auth boundaries enforced in Postgres policies on every exposed table, with no reliance on middleware checks. Employer and candidate data isolated at the database layer.
04
Verified employer workflow
Posting access is gated behind a verification step. Audit logging on every employer action protects candidates from fraudulent listings.
05
AI built on structured outputs
Resume tailoring, cover letter generation, interview prep, and skills-gap analysis run through the Lovable AI Gateway with typed schemas. No provider lock-in on the frontend.
06
One-Click Apply runs as a real worker
A Browserbase + Stagehand v3 agent runs in an isolated context, with a live browser panel streamed back to the candidate over Supabase Realtime. EEO fields are stripped before they ever reach the worker.
07
Salary estimation without a paid API
Statistical engine derives p25/p50/p75 from in-corpus comparable jobs, backfilled nightly. Estimates computed at zero recurring cost.
08
Roles in a separate table
user_roles + has_role() SECURITY DEFINER pattern prevents the client-side privilege-escalation that breaks most Supabase apps.
09
Ingestion as a state machine
Per-source runs, dedupe decisions, quarantine, and rejected-key memory all persisted. Self-healing cron detects stuck runs and replays them. At peak, 66K+ live listings were the visible surface of a much larger flow that had been deduped, quarantined, or expired out of view.
10
Architecture enforced by lint
Strict feature-module pattern (34 modules under src/features/), single Supabase client façade, per-feature query-key factories, ESLint rules block cross-feature imports and direct client usage from components.
D02Product IntelligenceAI Surface
07 entries
Resume parsing
Reads an uploaded resume and pulls out roles, dates, skills, and certifications into a structured profile
Resume tailor
Rewrites a candidate's resume against a specific job posting, with each revision saved so they can compare versions
Cover letter
Drafts a cover letter from the candidate's profile and the target role; any paragraph can be regenerated on its own
Interview prep
Generates likely interview questions for the role, with suggested talking points drawn from the candidate's background
Skills gap
Compares the candidate's experience to the job requirements and surfaces the specific gaps worth closing
JD formatter
Cleans up employer paste-ins into a consistent posting layout: summary, responsibilities, requirements, benefits
Classification
Tags each incoming listing by facility type and role family so search and filters stay accurate
D03Operating DisciplineReliability Controls
07 entries
Dedupe with replay
Cross-source matching writes persisted decision logs so any merge can be audited or rolled back.
Quarantine queue
Ambiguous listings hold for review instead of polluting search; reviewers approve, reject, or merge with one action.
Three-layer expiry
Source heartbeat, last-seen window, and manual close keep stale listings off the board without dropping good ones early.
Source health monitor
Per-source ingest stats, error rates, and stuck-run detection feed a self-healing cron that replays interrupted pulls.
Audit log on writes
Employer actions, AI-assisted edits, and admin overrides write to an append-only log with operator + timestamp.
Manual fallback for the agent
If the Apply Agent stalls, the candidate sees a clearly labeled hand-off card with the prefilled data ready to paste.
Row-level security everywhere
Auth boundaries enforced in Postgres policies on every exposed table; nothing trusts the client to scope reads.
D04Delivery LedgerShipped / In Flight at Archive
12 entries
Shipped
- Public job search with role-category filters, 0–100 match scoring, and saved alerts
- Candidate dashboard: profile, resume builder + AI tailor, cover letters, interview prep, skills-gap, applications, messaging
- Employer dashboard: company verification, job posting, 28-stage pipeline, screening questions, background checks, document assignments, offer flow, partner access
- One-Click Apply Agent (BETA) with live browser session and manual-fallback card
- Admin: feature map (2D + 3D), ingestion console, security monitoring, audit log, KPI snapshots, bug reports, ideas/voting
- Stripe billing for employers (checkout, webhook, portal)
- Signal: scraped industry news feed with bookmarks, comments, reactions, regional and state-level digests
- Data Center hubs (regional + state) with job density maps
In Flight at Archive
- Apply Agent reliability: aggregator pre-resolution and social-login takeover remained the hard problems at archive
- Mobile: Capacitor Android shell scaffolded but not yet building from this repo
- Data modeling cleanup: work / education history duplicated between JSONB and normalized tables
- Public-facing throughput metrics: surfacing lifetime ingested, deduped, and expired counts on the platform itself, alongside the existing admin telemetry