Skip to content
All projects

01AI Product · Browser Extension

JobMate

AI Job Application Copilot

Role
Chrome MV3 side-panel architecture, browser integration, draft-state lifecycle, page context capture, cross-page state handling and regression testing.
Stack
Chrome MV3 · Local-first · LLM · Python
Proof
2059 tests passed

01

Problem

01.1Overview

A local-first AI workflow for turning resumes and live job descriptions into actionable application drafts.

01.2Context

Most AI job-search help happens in a separate chat window. The job posting lives in one tab, the resume in another file, and the model somewhere else.

JobMate moves the assistant next to the job posting, so the context is already there when the user needs it.

01.3Problem

Using a general chat assistant for applications forces constant context switching. Every posting means copying the JD out, pasting results back and editing by hand.

Each round trip loses context, and the resume has to be pasted again and again into a cloud chat.

  1. Job platform
  2. Copy JD
  3. ChatGPT
  4. Copy result
  5. Back to platform
  6. Edit
The manual loop JobMate removes

01.4My Role

Chrome MV3 side-panel architecture, browser integration, draft-state lifecycle, page context capture, cross-page state handling and regression testing.

02

Build

02.1Solution

A Chrome MV3 native side panel that stays next to the job page. It reads the current job description, combines it with a locally managed resume and generates an application draft — for example a greeting message to the recruiter.

JobMate generates and preserves the draft inside the browser workflow. The user reviews, edits and decides whether to send it on the job platform.

Features

  • 01Chrome MV3 native side panel
  • 02Reads the JD from the current job page
  • 03Local resume management
  • 04Resume × JD context assembly
  • 05AI greeting-message generation
  • 06Draft lifecycle management
  • 07Draft review & copy
  • 08State kept across page switches
  • 09Local-first privacy

02.2Architecture

  1. Job Page
  2. JD Reader
    Local Resume
  3. Context Assembly
  4. LLM
  5. Draft State
  6. User Review
fig. 01a — request path

The side panel is the only UI surface. It survives tab and page changes, so a draft in progress is not lost when the user browses to another posting.

Context is assembled per request from the live JD and locally managed resume rather than being maintained as a persistent chat transcript.

01Drafting a greeting on a job page
  1. Job Page

    Job page open — side panel docked beside it

  2. JD + Resumelocal

    Read the JD; assemble context with the local resume

  3. LLM

    Generate a greeting draft

  4. Draft

    Draft saved — it survives page switches

  5. User Review

    Waiting — the user reviews, edits and decides whether to send

One run of the pipeline, step by step.

02.3Key Decisions

  1. 01

    Native side panel, not a popup

    A popup closes when focus moves. The MV3 side panel stays open beside the page, which is where the user is actually working.

  2. 02

    Local-first by default

    The full resume is personal data. It stays on the user's machine instead of becoming a persistent cloud record.

  3. 03

    Drafts as state, not as chat

    Each draft has a lifecycle. The user can come back to it after switching pages instead of scrolling through a transcript.

  4. 04

    Human stays in the loop

    JobMate prepares the draft. The user remains in control of reviewing, editing and sending it on the job platform.

03

Engineering

03.1Engineering

  • Python + Chrome MV3 extension.
  • Tested with pytest, linted with ruff.
  • Page-switch state handling and draft lifecycle are covered by tests, not only the happy path.

03.2Privacy

The resume is managed locally. JobMate avoids storing the complete resume as persistent cloud data.

Each generation request assembles only the context needed from the current JD and locally managed resume before passing it to the model.

03.3Results

tests passed · pytest
2059

A working side-panel flow from reading a live JD to a saved draft that the user reviews in the browser.

04

Notes

04.1What I Learned

The hard part of an AI product is rarely the prompt. It is state: what survives a page switch, what is a draft, what is final.

Privacy is an architecture decision. It has to be made before the first line of storage code, not added later.

04.2Tech Stack

  • Chrome MV3
  • Browser Extension
  • Python
  • LLM
  • Local-first
  • pytest
  • ruff