Skip to content
fazare.dev

← Work

OfferTrail

Creator & sole developer · 2026

OfferTrail

A production SaaS that helps job seekers track applications end to end.

Visit offertrail.app →

Context

Past a handful of open applications, a job search stops fitting in your head. Dates slip, follow-ups get missed, and there is no honest view of which roles are actually moving. Most people fall back to a spreadsheet they stop updating within a week.

OfferTrail makes that pipeline visible: every application is a card on a drag-and-drop board, with per-application detail views, reminders when something goes stale, and an insights dashboard for the shape of the search as a whole.

Problem

A tracker is worth nothing until your applications are in it — and getting them in is the tedious part. Two things had to be true at once: someone should be able to use the product immediately, without an account, and entering an application shouldn't mean retyping a job posting by hand.

Both pull against the usual architecture. Trying before signing up means the app has to work with no server and no user, and it means solving what happens to that data the moment someone does register.

Approach

The client is local-first. Guest mode runs entirely against IndexedDB, fully offline, with no account and no network round trip. On sign-up, local records migrate automatically into the new account, so nothing a guest entered is lost at the moment they register — the point where a naive implementation quietly drops everything.

The backend is Supabase: Postgres with Row Level Security, so per-user isolation is enforced by the database rather than trusted to application code, alongside email/password auth and Deno edge functions. To kill the retyping, those functions call the Anthropic API to extract structured job postings from screenshots and raw page text, and a Manifest V3 Chrome extension scrapes postings from the page and passes them straight into the app.

Billing sits apart from the product on Cloudflare Workers — Stripe Checkout, webhooks, and the customer portal — together with transactional email. Deployment is continuous from the main branch, behind unit and component tests.

Outcome

OfferTrail is live in production at offertrail.app. I took it from scoping through architecture, implementation, billing, and deployment on my own — including the parts that aren't feature work: subscription state, webhook handling, transactional email, and keeping main deployable.

Stack

  • React 19
  • TypeScript
  • Vite
  • Tailwind CSS
  • dnd-kit
  • Recharts
  • IndexedDB
  • Supabase (Postgres, RLS, Auth, Edge Functions)
  • Deno
  • Cloudflare Workers & Pages
  • Stripe
  • Anthropic API
  • Vitest
  • Chrome Extension MV3