Module 6 — Application Workflow & Settings
Contents
Application Workflow
- User selects a posting from the ranked job board view
- Hits Tailor Resume — triggers the full resume engine pipeline for that job description (via IPC to main process)
- PDF renders in-app via Electron’s native Chromium PDF renderer
- User reviews, optionally requests re-tailor, hits Apply
- App opens the posting URL in the default browser via
shell.openExternal job_postings.statusupdated toapplied; anApplicationartifact record (tex path, JSON snapshot) is written to SQLite
Auto-filling application forms via Playwright is explicitly deferred to a future version.
Tracker View (Tracker.tsx)
Sortable, filterable table view.
| Column | Notes |
|---|---|
| Company | |
| Role | |
| Date applied | Derived from Application.applied_at |
| Status | Inline dropdown — editable from applied onward |
| Source | Adapter mod id |
| Link | Opens posting URL in default browser |
Statuses available from applied onward: interviewing, offer, rejected, ghosted. Page-number-based pagination with a configurable page size (default: 50).
Settings Module (Settings.tsx + electron/settings.ts)
API Key Storage
The Anthropic API key is stored in the OS keychain via keytar (Windows Credential Manager, macOS Keychain, Linux Secret Service). It is never written to disk as plaintext, never stored in SQLite, and accessed exclusively from the main process — the renderer requests it via IPC.
// electron/settings.ts
import keytar from 'keytar';
const SERVICE = 'jobhunt';
export const saveApiKey = (key: string) =>
keytar.setPassword(SERVICE, 'anthropic_api_key', key);
export const getApiKey = () =>
keytar.getPassword(SERVICE, 'anthropic_api_key');
Other Settings
Non-sensitive settings are stored in a single-row settings table in SQLite:
Settings
id INTEGER PRIMARY KEY (always 1)
tex_binary_path TEXT | NULL -- path to xelatex executable
pdf_export_path TEXT | NULL -- default save location for exported PDFs
crawl_delay_ms INTEGER -- default: 3000
posting_retention_days INTEGER -- default: 14
profile_entry_word_limit INTEGER -- default: 200
log_retention_days INTEGER -- default: 30
parse_error_abort_threshold INTEGER -- consecutive parse failures before mod abort; default: 5
affinity_token_budget INTEGER -- max input tokens per affinity scoring batch; default: 80000
log_level TEXT -- 'error'|'warn'|'info'|'debug'; default: 'info'
One-Click Backup
Settings → Backup exports the SQLite file, browser contexts, and resume files as a single archive to a user-chosen location via dialog.showSaveDialog. This is a raw binary backup, distinct from the structured JSON export.