Apply once. Send everywhere.
An AI-powered Chrome extension that auto-fills job applications across every major ATS,
drafts tailored cover letters with Claude, and tracks every application, in seconds, not minutes.
What it does · Supported ATSes · Tech stack · Install · Getting started · Privacy · Design · Roadmap
Serious job hunters fill the same 20 fields, name, email, phone, work authorisation, previous roles, EEO questions, across 10+ applications a day. Each one takes 20–40 minutes of copy-paste tedium, before writing a custom cover letter or reshaping the CV. Applying to 100 roles costs 40+ hours of pure form-filling.
A Chrome extension that knows your profile and fills any job application form on detection, plus a small sync service that keeps your profile, applications, and AI drafts in step across devices. The LLM (Claude) is grounded in your real CV — it rewrites and emphasises; it never invents.
Click once and every field on a job application populates in under a second. Three-layer detection strategy:
- ATS adapters — bespoke selectors per platform
- Generic heuristics —
autocomplete→name/id→ adjacent<label>text against the profile schema - LLM fallback — for unknown forms, serialises field labels and asks Claude for a mapping. Cached per-domain, so the model runs once per new site
| Action | Input | Output |
|---|---|---|
| Cover letter | Job description + your profile + tone | Streamed cover letter from Claude |
| Question answer | "Why this role?" + your CV | Drafted answer in your voice |
| Follow-up email | Application + days elapsed | Polished follow-up |
| CV extraction | A PDF you drop in once | Structured profile fields |
The Anthropic key lives only in chrome.storage on your device. When you trigger an AI action it's sent on a single request, used to call Anthropic on your behalf, and discarded server-side. Never logged, never persisted.
Every application logs automatically — company, role, URL, status, JD snapshot, timestamps. Sign in with a magic-link OTP and everything syncs across browsers via Postgres in the EU.
- Bring your own AI key — Emplorio never bills you, never holds it
- All data in the EU (Neon / Frankfurt) and London (Fly.io /
lhr) - No analytics, no tracking pixels, no advertising
- Scoped permissions — no
https://*/*, only the ATS sites the extension supports
9 platforms · click to expand
| ATS | Status | File |
|---|---|---|
| Greenhouse | ✅ | adapters/greenhouse.ts |
| Lever | ✅ | adapters/lever.ts |
| Workday | ✅ | adapters/workday.ts |
| Ashby | ✅ | adapters/ashby.ts |
| LinkedIn (Easy Apply + hiring) | ✅ | adapters/linkedin.ts |
| Indeed (+ smartapply) | ✅ | adapters/indeed.ts |
| Workable | ✅ | adapters/workable.ts |
| SmartRecruiters | ✅ | adapters/smartrecruiters.ts |
| iCIMS | ✅ | adapters/icims.ts |
Anything not listed falls back to generic heuristics + the Claude-driven mapper.
| Shortcut | Action |
|---|---|
| Alt + Shift + E | Open the Emplorio popup |
| Alt + Shift + F | Fill the current form |
| Alt + Shift + S | Save the current job to history |
| Layer | Choice | Why |
|---|---|---|
| Extension | TypeScript · React 18 · Vite · @crxjs/vite-plugin · Manifest V3 |
Modern MV3 DX, shared types with backend, MV3-CSP compliant (no inline scripts) |
| Web | Next.js 15 · React 18 · vanilla CSS · Radix UI | App Router, RSC where it helps, no framework bloat for a marketing site |
| API | Fastify on Node 22 · Docker | Real server (not serverless) — middleware, streaming, long-running |
| ORM | Drizzle | SQL-first, strong TS inference |
| Database | Neon Postgres (EU) | Serverless Postgres with branching |
| Auth | Magic-link OTP → JWT cookie + bearer | No third-party auth provider; user data stays here |
| Hosting | Vercel (web) · Fly.io London (API) | Persistent container for the API, edge for the marketing site |
| Resend | OTP delivery, simple SDK | |
| AI | Anthropic Claude (@anthropic-ai/sdk) |
Streaming, prompt caching for the profile half of every request |
| Tests | Vitest | Fast, native ESM, integrated with the monorepo |
emplorio/
├── apps/
│ ├── extension/ # MV3 Chrome extension
│ │ ├── src/adapters/ # 9 ATS adapters
│ │ ├── src/lib/ # autofill engine, AI client, scrape, sync, settings, theme
│ │ ├── src/popup/ # React popup UI
│ │ └── src/content/ # content script entry
│ ├── api/ # Fastify server
│ │ └── src/routes/ # /auth /profile /applications /generate /field-mappings
│ └── web/ # Next.js marketing site (emplorio.co.uk)
└── packages/
├── shared/ # Zod schemas, types, ProfileKey enum
└── db/ # Drizzle schema + migrations
┌────────────────┐ HTTPS + bearer/cookie ┌──────────────────┐
│ Chrome Ext │ ──────────────────────────▶ │ Fastify API │
│ (popup + │ │ (Fly.io / lhr) │
│ content) │ ◀────────────────────────── │ │
└───────┬────────┘ └────┬─────────────┘
│ │
│ chrome.storage (profile cache) │
▼ ▼
user's device Neon Postgres (EU)
┌────────────────┐
│ emplorio.co.uk│ Static marketing + privacy + terms (Vercel)
└────────────────┘
No build step needed, install, pin the extension, open a job application, and you're filling forms.
See releases for the full changelog, including the latest v1.1.0.
- Node.js ≥22
- pnpm 9
- A Postgres database (Neon free tier works)
- A Resend API key for OTP delivery
# 1. Install
pnpm install
# 2. Environment
# create a .env in the repo root with DATABASE_URL, JWT_SECRET, RESEND_API_KEY,
# ANTHROPIC_API_KEY, REDIS_URL, etc. See apps/api/src/env.ts for the full schema.
# 3. Database
pnpm db:migrate
# 4. Run everything in parallel
pnpm dev
# → API on :3001, web on :3000, extension watcher
# 5. Load the extension
# chrome://extensions → Developer mode → Load unpacked → apps/extension/dist# Web (Vercel auto-deploys from main)
pnpm --filter @emplorio/web build
# API (Fly.io — see apps/api/fly.toml)
cd apps/api && fly deploy
# Extension (zip apps/extension/dist for the Chrome Web Store)
VITE_API_ORIGIN=https://emplorio-api.fly.dev pnpm --filter @emplorio/extension buildpnpm typecheck # tsc --noEmit across the monorepo
pnpm test # vitest, all workspaces
pnpm db:studio # Drizzle Studio against your DATABASE_URL
pnpm db:generate # generate a new migration from schema changesEnvironment variables · click to expand
| Variable | Where | Purpose |
|---|---|---|
DATABASE_URL |
api | Neon Postgres connection string |
JWT_SECRET |
api | ≥32 chars; signs session tokens |
RESEND_API_KEY |
api | OTP email delivery |
EMAIL_FROM |
api | Sender for OTP emails |
WEB_ORIGIN |
api | CORS allow origin (e.g. https://emplorio.co.uk) |
COOKIE_DOMAIN |
api | e.g. emplorio.co.uk in prod |
ANTHROPIC_API_KEY |
api (optional) | Server-owned fallback key — users normally bring their own |
ANTHROPIC_MODEL |
api | Defaults to claude-opus-4-7 |
EMPLORIO_API_KEY |
api + extension | Optional shared secret to gate the API |
VITE_API_ORIGIN |
extension build | Production API URL baked into the bundle |
See emplorio.co.uk/privacy and emplorio.co.uk/terms for the full policy.
Short version:
| Stored | |
|---|---|
| 🇪🇺 Database (Neon, EU) | Sign-in email, profile fields, application history, generated drafts, settings |
🖥️ Your device only (chrome.storage) |
Anthropic API key, theme preference, in-progress sign-in state |
| ❌ Never collected | Payment info, location, browsing history, telemetry |
| 🤝 Third parties | Neon (database), Fly.io (API), Resend (email), Anthropic (only with your key) |
The visual language, brand mark, marketing site, and Chrome Web Store assets were built with help from:
| Tool | Used for |
|---|---|
| 21st.dev | Component patterns and React/Tailwind reference snippets |
| Midjourney | Brand exploration, concept art, illustration drafts |
| Figma | Layout, spacing, and the bento-grid feature wall |
| Heroicons · Lucide · Simple Icons | All inline SVG icons (no emoji, no icon-font weight) |
| Inter · Bricolage Grotesque | Typography pairing |
| Coolors | Indigo / purple gradient palette tuning |
| Radix UI | Accessible accordion + primitives in the marketing site |
| Vercel · Fly.io · Neon · Resend | Hosting, database, transactional email |
Brand identity: indigo #4f46e5 → violet #818cf8 gradient on a warm dark #0b0a18 canvas. Dark mode is the default; light mode is hand-tuned with warm-ink shadows rather than flat slate.
- MV1 — Greenhouse + Lever adapters, profile editor, local storage
- v1.0 — 9 ATS adapters · API + auth + cloud sync · AI cover letters / answers / follow-ups · CV extraction · application tracking · marketing site · privacy/terms · Chrome Web Store submission
- v1.1.0 — Auto-Apply mode (opt-in, rate-limited) · response-rate analytics per CV variant · additional ATS adapters
- v2 — Smart job matching (Adzuna / JSearch APIs) · tailored CV PDF export · team / agency mode
- Browser extension engineering — Manifest V3, content scripts, cross-context messaging, MV3-compliant CSP (no inline scripts)
- Real backend — hand-written Fastify on Docker, not BaaS
- LLM product thinking — streaming, prompt caching, BYO-key model that aligns incentives, grounded generation that never invents
- Privacy discipline — sensitive PII handling, scoped permissions (no
https://*/*), no logging of profile data, EU-only storage - Product sense — Co-Pilot as default, Auto-Apply as opt-in; restraint over flash
emplorio.co.uk · Privacy · Terms · Contact
Built while job hunting · used on the roles I'm interviewing for right now · saved me 40+ hours.