Skip to content
All projects
Developer ToolsMay 2026Live

ApplyOS: A Local-First Command Center for the Job Hunt

A Local-First Command Center for the Job Hunt

Store every field, bullet and answer once, tailor in seconds, autofill any application with one click, and track every pipeline. Everything lives in your browser's IndexedDB, with no accounts, servers or telemetry, and a Chrome extension fills Greenhouse, Lever, Workday, Ashby and more.

applyos-charan.vercel.app/about-project
ApplyOS, the live site
Year
May 2026
Timeline
10 weeks
Type
Developer Tools
Status
Live
01

Overview

Applying to jobs means re-typing the same 40 fields and re-answering the same 5 questions hundreds of times, then losing track of where you applied. ApplyOS removes that loop with four local-first parts: a Vault that stores every field and snippet once (with {{company}}/{{role}} variables that resolve when you copy), a Tailor that scores a job description offline and drafts tailored bullets, a Tracker for the full pipeline, and a one-click autofill extension. Job-hunt data is sensitive, so there is no backend state at all, only local IndexedDB with JSON export.

02

The hard parts

  1. 01

    Setting input.value directly is ignored by React-controlled forms, so autofill does nothing and reports no error.

  2. 02

    Per-site scrapers break the moment an ATS changes its CSS.

  3. 03

    Auto-capturing the company and role of a job even while the app is closed.

  4. 04

    Storing passwords properly, or not claiming to store them at all.

03

The approach

Autofill is heuristic rather than per-site: every input is scored by its surrounding signals (label, placeholder, name, aria-*, autocomplete) against an ordered pattern table, so it works on ATSs it has never seen. For React-controlled forms it writes through the native prototype value setter and dispatches input/change/blur events, so frameworks register the change like a keystroke. Auto-capture parses JSON-LD JobPosting first (then URL slugs, then the <h1>) and queues captures in a chrome.storage outbox that drains into IndexedDB the next time the app opens. Passwords are encrypted with AES-256-GCM under a PBKDF2 key that is non-extractable, held in memory only, wiped after 5 idle minutes, and never synced to the extension.

04

Outcome

Fill your vault once (about 15 minutes), paste a job description for an offline match score, then fill an application in one click and have it logged to your tracker, with an amber "already applied 4 days ago" warning if you've been here before. The dashboard shows which profile and which portal convert best.

05

What I'd do differently

Long-form answers stay manual on purpose: you copy from the vault with variables resolved, and nothing is auto-submitted. Next: resume-PDF parsing to populate the vault, fuzzy dropdown filling for degree and country pickers, and a Firefox port (MV3 is nearly compatible).

06

Stack

web
Next.js 14 (App Router)TypeScriptTailwindDexie / IndexedDB
extension
Chrome Manifest V3 (vanilla JS)
crypto
AES-256-GCMPBKDF2-SHA256 (310k iterations)
ai
Anthropic (BYOK, offline-capable)

Like what you see?

Let's build the next one.

Hiring, or have a problem that needs this kind of engineering? I read every message myself.