Tracking Replies
Seekter's job application tracker in plain markdown: log rejections, interviews and offers with /seekter-log, sweep your inbox, or import a spreadsheet.
Seekter's job application tracker is plain markdown: every posting it touches is recorded once in applications/, applied or skipped, with its status. You can read it, grep it and diff it. /seekter-log keeps it true after the run, as rejections, interviews and offers come in.
The Job Application Tracker
applications/
README.md ← generated: needs you, in progress, last 30 days, one row per month
2026-10/
README.md ← generated: that month's applications with status
2026-10-22--acme--senior-product-designer.md
skipped.md ← one row per posting passed over, with the reason
- Applications and hand-offs are files. The status (
pending,applied,interviewing,offer,rejected,closed) is in the file's front matter. Files never move: a rejection a month later edits one line and adds a log entry. - Skips are rows. Most skips have a one-line reason, so each month keeps them in one table. Dedup reads it too, so a skipped posting is never weighed twice.
- Read the generated pages, not the folders.
applications/README.mdis rebuilt after every change.
Each application file keeps the answers that were submitted, so no sentence goes to two companies.
Telling Seekter What Happened
Run /seekter-log and say it in a sentence:
| You say | What happens |
|---|---|
| "Acme rejected me" | Moved to rejected, with the date and a line from the mail |
| "I have a call with Globex on Thursday" | Moved to interviewing, and you're offered interview prep |
| "Got an offer from Initech" | Moved to offer, with the amount and deadline |
| "I applied to Umbrella myself" | Checked against the tracker, then added as a manual application |
| "Don't apply to Hooli again" | Moved to skipped and added to your blacklist |
When a company has several roles in the tracker, it asks which one.
Sweeping Your Inbox
Ask for a sweep ("check my inbox for replies") with your webmail open in Chrome. Seekter reads every folder your profile lists and reads each message body, because subjects are unreliable: many rejections are titled just "Your application with X".
- Each reply is matched to its application and moved to
rejected,interviewingoroffer. - A reply from a company with no record is added as a new one.
- Anything that asks you to act, such as a scheduling link or a take-home, is listed for you and moved to your Action Required folder. Seekter never answers an email.
- Your junk folder is read row by row, not skimmed: employer replies and recruiters' messages land there often. A recruiter reaching out is shown to you and moved to Action Required; when Seekter moves a mail out of junk, it does not mark the sender as safe for you.
Any webmail you can read in Chrome works.
The Tracker Commands
Seekter runs these for you. They're also there when you want to look yourself.
Everything waiting on you:
node scripts/seekter.mjs list --status pending
Counts by status since a date:
node scripts/seekter.mjs stats --since 2026-10-01
Whether a posting is already tracked. It answers 1 when it is, and 2 when the company is on hold:
node scripts/seekter.mjs check <url> --company Acme
Tidy the values after you've edited files by hand. --dry-run shows what would change:
node scripts/seekter.mjs normalize --dry-run
Importing an Existing Tracker
If you already track applications in Notion, Airtable or Google Sheets, export it as CSV. See what would be created first:
node scripts/import_csv.mjs export.csv --dry-run
Then import it:
node scripts/import_csv.mjs export.csv
Column names are matched loosely (Position, Role, Title, Company, Status, Job URL, Applied on…). Rows that point to the same posting are merged. Fill in URLs where you can: a row without one can only be matched by company name later.
/seekter-init offers the import during setup, so nothing you've already applied to is applied to again.