Skip to main content
Back to work

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.

Role

Founder | Full-Stack Product & Data Platform Architect

Timeframe

Nov 2025 - Aug 2026

Stack / Domain

React 19TypeScriptSupabasePostgreSQLpgvectorVercelLovable AI GatewayBrowserbaseStagehand v3Stripe

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 Notes

Engineering 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 Intelligence

AI 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 Discipline

Reliability 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 Ledger

Shipped / 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

Next Step

Discuss similar work.

Contact Frank