Apex — TUI-First AI Job Search Platform
A Go-based terminal UI application for intelligent job search, evaluation, and application tracking using Claude AI.
License
This project is free for non-commercial use under the PolyForm Noncommercial License 1.0.0. Commercial use (inside a business, or to provide a paid product/service) requires a separate commercial license — see LICENSE-COMMERCIAL.md. Full details in LEGAL.md. Third-party font licenses are in ATTRIBUTION.md.
Overview
Apex is a native terminal UI for job search, built with Bubble Tea and Lipgloss. It integrates Claude AI for job offer evaluation (A-G scoring), supports DOCX intake with voice extraction, and provides three-tier job portal scraping (JSON APIs, static HTML, authenticated browser).
Features
- TUI Interface: Tab-based Bubble Tea UI (Intake, Scan, Pipeline, Reports, Settings)
- Intake System: 8-phase interview flow, DOCX CV upload, voice sample extraction
- Portal Scanning: Tier 1 (JSON APIs: Greenhouse, Ashby, Lever), Tier 2 (static: Indeed, Built In, RemoteOK), Tier 3 (browser: LinkedIn, Glassdoor, Workday)
- Evaluation Pipeline: Claude A-G scoring with real-time streaming
- CV Generation: PDF and DOCX output, tailored per job description
- Tracker: Application status machine (Evaluated → Applied → Offer → Rejected)
- Follow-ups: Cadence tracking and pattern analysis
Architecture
internal/
├── tui/ Bubble Tea interface + tab models
├── intake/ 8-phase interview state machine
├── docx/ Parser + voice extraction + DOCX generation
├── scan/ Tier-1/2/3 scrapers + adapters
├── eval/ Claude CLI subprocess wrapper
├── cv/ PDF + DOCX generation
├── tracker/ Applications CRUD + status machine
└── store/ SQLite schema + queries
migrations/ SQL schema definitions
modes/ Claude prompt files
Building
Prerequisites
- Go 1.22+
- SQLite (included via modernc.org/sqlite, pure Go, no CGO required)
- Claude CLI (
claudecommand in PATH)
Quick Start
git clone <this-repo>
cd apex-public
make build
./apex
Testing
make test # Run all tests
make lint # Run go vet + fmt
make clean # Remove binaries
Configuration
Place a config.yml in the project root:
profile:
name: Your Name
email: you@example.com
location: US
timezone: America/New_York
salary_target:
min: 150000
max: 250000
claude:
model: claude-opus-4-1-20250805
temperature: 0.7
API keys and other secrets are read from environment variables at runtime — never committed to config files.
Database
SQLite database auto-initializes at ~/.apex/apex.db on first run. Schema includes:
- profile: User info and targets
- jobs: Job postings (URL, company, title, raw HTML)
- applications: Tracker (status, score, PDF link)
- reports: A-G evaluation reports (markdown + HTML)
- scan_history: Dedup for portal scans
- voice_samples: DOCX intake + transcription
- follow_ups: Cadence tracking
All queries use parameterized statements (no SQL injection risk).
Security
- No secrets in source code; all API keys read from environment at runtime
- Claude subprocess uses argument arrays only (never
bash -c) - SQLite queries parameterized
- No
.envfiles committed
Contributing
See CONTRIBUTING.md.