← Software

Project / Software

Job Application Tracker

A local-first Windows desktop workspace for organizing applications, career evidence, recruiter messages, resumes, and follow-ups.

Year
2026
Role
Design and development
Tools
Electron · React · Express · SQLite · TypeScript

Overview

I built Job Application Tracker as a private Windows desktop workspace for keeping a job search in one place. It brings application records, career evidence, imported postings, recruiter messages, resume versions, contacts, and follow-up work into a single local tool.

The application is designed to help prepare and review work, not to apply for jobs automatically. The screenshots use removable fictional demo data so the workflow can be shown without exposing a live application database.

What it does

A job search can spread details across browser tabs, documents, email drafts, and reminders. This workspace keeps the record of what was found, what was sent, and what still needs attention together, while retaining earlier drafts instead of silently replacing them.

The result is a private operating view of an application process: research can be captured, materials can be tailored against supplied evidence, and interactions can be followed through a timeline.

How it works

Electron hosts the desktop window and React/Vite renders the interface. A loopback Express API handles application operations, while SQLite stores structured records and FTS5 full-text search data. Imported documents remain local with database references to the records that use them.

Drafting works with a built-in offline provider, or with an explicitly configured OpenAI, Ollama, or compatible endpoint. The desktop app controls when selected job or career content is sent to an external provider.

Job Application Tracker dashboard showing application metrics, a due follow-up, upcoming work, and a status pipeline populated with fictional records
The dashboard brings current applications, follow-up work, interviews, and pipeline status into one daily view.

Features

Capture a posting, then review it before saving

New applications can start from a public job URL, pasted page content, or an uploaded DOCX, PDF, or text file up to 8 MB. Public pages are read through readable text and JSON-LD when available. A dedicated Electron LinkedIn browser provides the supported path for explicit LinkedIn capture, while other protected sites can fall back to paste or upload.

The review step exposes the company, role, location, work arrangement, salary, description, qualifications, responsibilities, recruiter details, and tags before a record is created. Duplicate warnings help avoid making a second record for the same opportunity.

New application dialog showing URL, paste, and upload capture modes in the Job Application Tracker
The capture dialog keeps URL, paste, and upload paths together, with the posting still subject to review before it becomes an application record.

Searchable application records and a working pipeline

The dashboard and Applications view show the current pipeline from saved research through preparation, application, and interviews. Records can be searched by company, role, location, or tag, then filtered and sorted by status or interaction. Applications can be edited, archived, reopened, or deleted, with follow-ups and activity kept alongside the record.

Applications list showing fictional roles with status, location, tags, last interaction, and next action columns
The application list makes the next action visible without opening every record.
Application detail view showing a fictional job overview, profile match panel, facts, and application timeline controls
A detail view keeps the posting snapshot, match evidence, follow-up alert, and activity history together.

A career profile that acts as source material

The Career Profile is the source of truth for the work used in tailored materials. It supports importing a resume or other document, optional structuring, and editing repeatable work history, education, certifications, projects, skills, identity details, and job-search preferences. Each application can then use that profile as an explicit input rather than relying on an untracked copy of a resume.

Versioned recruiter messages

The Messages tab supports seven message types: cold recruiter outreach, an application follow-up, a LinkedIn connection note, a LinkedIn direct message, a thank-you note, an interview follow-up, and a status check. A draft can be generated or regenerated with recipient details and instructions, edited, saved as a version, copied, or opened in a mail app. Earlier versions can be loaded or removed, and the source material remains visible for review.

The app does not send messages or synchronize an inbox. Compose links are a handoff to the user’s mail application, not a mailbox integration.

Messages workspace showing message type tabs, recipient and instruction fields, and a reviewable draft area
Message drafting keeps the intended recipient, instructions, source material, and saved versions in the same reviewable workspace.

Source-grounded resume packages

Resume work can be generated section by section or as a full package, then edited in an ATS-oriented preview. Summary, skills, experience, education, certifications, and projects can be handled independently. Selected sections, version history, deterministic DOCX output, and rename or delete controls make it possible to compare a tailored version with earlier work.

The claim review shows proposed unsupported claims alongside the reason they were blocked and the source used for comparison. Verified content is retained in the exported document, while unsupported additions are left for the user to revise. Skills use exact source matching where possible. This is a guardrail for review, not a promise that automated verification understands every nuanced paraphrase.

Contacts, notes, interviews, and timeline history

Application records have tabs for overview, messages, resume, contacts and email, and timeline. Contacts can be entered manually with notes, phone, email, and LinkedIn fields. Email can be entered manually or imported from an .eml file and kept with linked interactions. Tasks, interviews, reminders, and email compose links can be added and completed or reopened. The timeline records the activity that moves an application through its process.

Follow-up rules and a focused queue

Follow-up rules can account for application status, interaction age, weekends, and suppressed states. The queue shows due and inactive work, along with completed items and attempt counts. A follow-up can be drafted, completed, snoozed for three days, dismissed for thirty days, or archived when the record no longer needs attention.

Follow-ups queue showing due and upcoming fictional follow-up records with attempt counts and status actions
The follow-up queue turns a collection of application records into a short list of work to review today.

Local backups, exports, and provider boundaries

Settings includes full backups, JSON and CSV exports, restore, removable demo data, and a typed clear-all action. The built-in drafting provider can run without a remote service. OpenAI, Ollama, and compatible providers are opt-in, with endpoint, model, temperature, connection testing, and key removal controls.

Only stored provider keys receive separate AES-256-GCM encryption, and keys are excluded from settings and backup exports. The SQLite database and local documents are not fully encrypted, so the Windows account and its ordinary device and backup protections remain the trust boundary.

Settings page showing follow-up rules, drafting provider controls, LinkedIn capture controls, and backup and export actions
Settings makes the local data model, provider choice, LinkedIn session controls, and backup actions visible instead of hiding them behind an account service.

Desktop-specific capture and practical limits

The persistent LinkedIn browser is isolated inside the desktop app and can be reset from Settings. Capture is an explicit user action, not login automation. The app does not submit applications, bypass CAPTCHAs, send email, sync a mailbox, reconcile multiple users, or resolve network conflicts. PDFs do not receive OCR, and calendar exports or Google and Outlook links do not sync changes back into the tracker.

The current package is not code-signed and has no automatic updater. It is a single-user local application rather than a hosted service, and every generated resume or message still needs a human review before it is used.