.-.
(o o) GHOSTED
| O | job application tracker
| | for the perpetually ghosted
'~~~'
A terminal-based job application tracker for those of us who know the void all too well.
Built with Go and Charm libraries.
Navigate, search, filter, and manage your job applications from the terminal.
Drop a job posting into local/postings/ and let an AI agent (like Claude Code) extract the details and add it to your tracker.
Review and update the status of AI-created entries directly from the TUI.
- Interactive TUI - Full keyboard-driven interface with vim-style navigation
- CLI Commands - Script-friendly commands for automation and AI agents
- JSON Storage - Human-readable data format, easy to backup and version control
- Status Pipeline - Track applications from saved → applied → ghosted into oblivion
- Search & Filter - Quickly find applications by company, position, or status
- Quick Actions - Change status with single keystrokes (1-8)
- Fetch Command - Auto-fetch job postings from Lever, Greenhouse, LinkedIn, and more
- Agent Pipeline - Multi-agent system for automated resume and cover letter generation
git clone https://github.com/celloopa/ghosted.git
cd ghosted
make installThis installs ghosted to your Go bin directory (~/go/bin by default).
Make sure it's in your PATH:
export PATH="$HOME/go/bin:$PATH"go install github.com/celloopa/ghosted@latestghostedKeyboard Shortcuts:
| Key | Action |
|---|---|
j/k or arrows |
Navigate up/down |
a |
Add new application |
e |
Edit selected |
d |
Delete selected |
Enter |
View details |
1-8 |
Quick status change |
/ |
Search |
s |
Filter by status |
f |
Fetch job posting or CV |
c |
Clear filters |
? |
Toggle help |
q |
Quit |
Status Keys:
- Saved
- Applied
- Screening
- Interview
- Offer
- Accepted
- Rejected
- Withdrawn
# Add new application
ghosted add --json '{"company":"Acme","position":"Engineer","salary_min":150000}'
# List all applications
ghosted list
ghosted list --json
# Get single application (supports partial ID)
ghosted get abc123
ghosted get abc123 --json
# Update application
ghosted update abc123 --json '{"status":"interview","notes":"Phone screen scheduled"}'
# Delete application
ghosted delete abc123
# Fetch job posting or CV (auto-detects)
ghosted fetch https://jobs.lever.co/company/job-id
ghosted fetch cello.design # Fetches CV from domain/cv.json
ghosted fetch --output acme-swe.md https://example.com/job
# Help
ghosted helpFetch job postings or CVs with auto-detection:
# Job postings (any URL with a path)
ghosted fetch https://jobs.lever.co/company/job-id
ghosted fetch https://boards.greenhouse.io/company/jobs/123
# CV/Resume (bare domain or /cv.json path)
ghosted fetch cello.design # Fetches domain/cv.json
ghosted fetch https://example.com/cv.json # Explicit CV URLSupported job boards:
- Lever (
jobs.lever.co) - Greenhouse (
boards.greenhouse.io) - Microsoft Careers (
careers.microsoft.com) - Workday
- LinkedIn Jobs
- Ashby
- Generic HTML pages
CV fetching:
- Fetches JSON Resume format from
{domain}/cv.json - Saves to
local/cv.json
Job postings are converted to markdown and saved to local/postings/.
You can also fetch from within the TUI by pressing f.
By default, data is stored at:
~/.local/share/ghosted/applications.json
Override with environment variable:
export GHOSTED_DATA=/path/to/your/applications.jsonNew installations are seeded with 3 sample applications to help you get started. Delete them with d in the TUI or start fresh:
rm ~/.local/share/ghosted/applications.json{
"company": "string (required)",
"position": "string (required)",
"status": "saved|applied|screening|interview|offer|accepted|rejected|withdrawn",
"date_applied": "2025-01-15T00:00:00Z",
"salary_min": 150000,
"salary_max": 200000,
"job_url": "https://...",
"location": "City, State",
"remote": true,
"contact_name": "string",
"contact_email": "string",
"resume_version": "string",
"cover_letter": "string",
"notes": "string",
"interviews": [
{
"date": "2025-01-20T14:00:00Z",
"type": "phone|video|onsite|technical",
"notes": "string",
"with_whom": "string"
}
]
}See schema.json for the complete JSON Schema specification.
For organizing job-related documents, create a local/ directory:
local/
├── postings/ # Job posting files (txt, md, png)
├── resumes/ # Resume versions
└── cover-letters/ # Cover letter templates
This directory is gitignored by default.
Ghosted includes a multi-agent document generation pipeline for automating job applications:
| Agent | Purpose |
|---|---|
| Parser | Extracts structured JSON from job postings |
| Resume Generator | Creates tailored Typst resumes with skill matching |
| Cover Letter Generator | Generates personalized cover letters |
| Reviewer | Scores documents like a hiring manager (70+ to pass) |
| Tracker Integration | Generates CLI commands to add applications |
Prompt templates are in internal/agent/prompts/. See CLAUDE.md for integration details.
├── main.go # Entry point, CLI commands
├── internal/
│ ├── agent/ # Agent pipeline implementation
│ │ ├── prompts/ # Agent prompt templates (parser, resume, cover, reviewer, tracker)
│ │ ├── resume.go # Resume generator agent
│ │ ├── cover.go # Cover letter generator agent
│ │ ├── reviewer.go # Hiring manager review agent
│ │ └── tracker.go # Tracker integration agent
│ ├── fetch/ # URL fetching and job board parsing
│ ├── model/
│ │ └── application.go # Data structures, status constants
│ ├── store/
│ │ └── json.go # JSON persistence, CRUD operations
│ └── tui/
│ ├── app.go # Main TUI controller
│ ├── list.go # List view
│ ├── detail.go # Detail view
│ ├── form.go # Add/edit form
│ ├── fetch.go # Fetch URL view
│ ├── styles.go # Lip Gloss styling
│ └── keys.go # Key bindings
├── samples/
│ └── applications.json # Sample data for new users
└── schema.json # JSON Schema specification
make build # Build binary locally
make install # Build and install to ~/go/bin
make clean # Remove local binary- Bubble Tea - TUI framework
- Bubbles - TUI components
- Lip Gloss - Styling
See CHANGELOG.md for recent updates.
MIT License - see LICENSE for details.
Contributions welcome! Please feel free to submit a Pull Request.
Built with tears and mass rejection emails 💀


