back to work
Case Study · Multi-tenant SaaS

JONA

A multi-tenant job-aggregation platform — nine production scrapers, AI skill matching against a user's resume, and Stripe-billed organization tiers.

Role
Primary builder / maintainer
Type
Web SaaS · multi-tenant orgs
Status
Staging deployments active
Scrapers
9 production sources
JONA

Job hunting is a multi-tab, multi-hour treadmill.

Job seekers cycle through Indeed, Dice, Monster, ZipRecruiter, CareerBuilder, TekSystems, SnagAJob, and Glassdoor — manually filtering, copying, tracking. Recruiting agencies and bootcamps that want to centralize that for a cohort have nothing off-the-shelf that matches roles to a specific resume.

Aggregate, normalize, match, bill.

JONA scrapes nine boards on a schedule, normalizes the postings, parses uploaded resumes, and uses a sentence-transformer-based skill matcher to surface the best fits. Multi-tenant from day one — orgs invite members, admins see scraper telemetry, billing flows through Stripe with plan-based feature gates.

The architecture is three-tier: a Next.js 14 App Router frontend acts as a thin BFF, a FastAPI backend owns scrapers and matching, and Supabase Postgres holds the data with RLS scoping every query to the calling org.

End-to-end as primary maintainer.

  • Nine production web scrapers using Playwright and Selenium with undetected-chromedriver to handle anti-bot pressure.
  • Custom Windows asyncio runner that solves Playwright's incompatibility with uvicorn's reloader by setting WindowsProactorEventLoopPolicy before boot and using watchdog-based dev restart.
  • AI skill-matching engine — sentence-transformers, OpenAI, Anthropic, and AWS Bedrock — with PDF/DOCX resume parsing and embedding-based search.
  • Migrated authentication from the deprecated @supabase/auth-helpers-nextjs to @supabase/ssr with proper Server Component cookie handling.
  • Stripe subscription billing with plan-based feature gating, admin dashboard with scraper-tab control, and live scraper telemetry over WebSockets.
  • Authored the 1,300+ line README documenting architecture, the Playwright/Windows debugging story, and the Supabase SSR migration.

What it's built on.

Frontend
Next.js 14 · React 18 · TypeScript · Tailwind · MUI
Backend
FastAPI · Python 3.11 · Playwright · Selenium
Database
Supabase Postgres · RLS · pgbouncer
AI
sentence-transformers · OpenAI · Anthropic · Bedrock
Auth & billing
Supabase Auth · Clerk · Stripe
Infra
Docker Compose (5 envs) · n8n workflows

A real customer-facing SaaS, not a prototype.

JONA serves organization-scoped job boards with Stripe-billed subscription tiers and Supabase RLS isolating tenant data. The PR-driven workflow covers subscription pricing, settings tabs, dark mode, admin dashboard typing — i.e., the boring billing and admin polish that makes a SaaS actually shippable.