← Projects / Career intelligence

Private tool · built during my job search

A job search is
a stateful system.

When job searching was my job, I was juggling a huge volume of applications. I built JobArchivist to keep the roles, recruiter conversations, interviews, documents, and follow-ups together. It helped me keep track of the work; it’s no longer a daily driver.

// operating posture

ACCESS
Private + allowlisted
STATE
Supabase / Postgres
AI
Grounded + tool-driven
STATUS
No longer a daily driver

These figures describe the version covered in this case study. They aren’t live counters.

16

records in this case study

Used

during my search

01 — The actual problem

The spreadsheet remembered rows. It forgot the search.

A serious job search produces more state than a spreadsheet can hold: role versions, recruiter context, tailored documents, interview logistics, outcomes, follow-ups, and lessons that should change the next application. The real problem was not tracking rows. It was preserving context and turning it into better decisions.

Architecture / 04System view · simplified
01Capture
◆Jobs + feeds
◆Notes + interviews
02Normalize
◆Companies + contacts
◆Lifecycle events
03Remember
◆Documents + profile
◆RAG knowledge base
04Act
◆Pipeline + calendar
◆Grounded assistant
Messy job-search signals become normalized records, retrievable history, and actions that survive the browser tab where they began.

02 — The operating loop

Every signal should leave the system smarter than it found it.

See the signal01

A posting, recruiter message, interview invite, rejection, or follow-up enters the system.

Attach context02

The signal is connected to the company, role, people, documents, and application history it belongs to.

Change the state03

An explicit lifecycle transition updates the pipeline, calendar, next action, and durable event record.

Learn forward04

Outcomes and documents become retrievable context for the next conversation, draft, and decision.

03 — Domain boundaries

Connected records, not another pile of notes.

A self-hosted Next.js and Supabase application organized around companies, roles, applications, contacts, documents, interviews, and append-only activity. RSS and Atom ingestion discovers opportunities; structured lifecycle state drives the pipeline and calendar; private document storage and profile data ground retrieval; and an approval-aware assistant operates through typed tools instead of editing data invisibly.

Companies

The organizational memory: roles, contacts, applications, notes, and history.

Applications

Lifecycle state, next action, deadline, referral, and the documents actually submitted.

Interviews

Schedule, format, people, preparation, logistics, and outcomes captured together.

Documents

Private files, working drafts, extracted text, secure downloads, and role-specific versions.

Discovery

Enabled RSS / Atom sources flow through parsing, normalization, deduplication, and review.

Assistant

Typed tools retrieve and propose changes; consequential writes remain visible and approval-aware.

04 — What shipped

When job searching was my job, this kept track of the work.

  • ▹Application pipeline with explicit lifecycle states, next actions, deadlines, and outcome history
  • ▹Structured interview scheduling and outcome capture linked to each application
  • ▹Private résumé and cover-letter storage with extraction, secure downloads, drafts, and application-level version linking
  • ▹Company, recruiter, contact, job, and referral records connected instead of duplicated across notes
  • ▹Server-side RSS / Atom ingestion with deduplication, source controls, and a discovered-jobs inbox
  • ▹RAG ingestion across profile, documents, roles, companies, events, and messages
  • ▹Approval-aware AI tools for recall, drafting, updates, archival, and deletion
  • ▹An authenticated deployment used as the operating record during my job search

The numbers below are snapshots from this write-up. They aren’t updated automatically as the project changes.

Constraints / Evidence

The conditions shaped the system.

  • ◆Career history, documents, contacts, and interview links are private by default
  • ◆Imports must preserve messy source evidence without multiplying companies, jobs, or applications
  • ◆AI assistance must be grounded in durable records and require approval for consequential changes
  • ◆It had to keep up with the search while I was still changing the schema and workflows

16

records in this case study

16 real application and outcome records captured for this write-up. This is a snapshot of the search, not a current pipeline count.

Used

during my search

It helped me keep track of a huge volume of applications when job searching was my job. It’s no longer a daily driver.

The through-line

A career is not a sequence of applications. It is a learning system with memory, state, feedback, and compounding context.