An AI-powered job application tracker that automatically processes emails and maintains a database of your application statuses — so you never lose track of the rejections you'd rather forget.
Live: https://rejectlytics.simpez.uk/
This service consumes job-related emails from a Kafka topic, uses Claude AI to classify each one, and upserts the result into PostgreSQL. It demonstrates a clean event-driven architecture with a focused use case: turning an inbox full of recruiter noise into a structured, queryable dataset.
This is a service in the "We regret" stack, a collection of services that process recruiter emails and maintain a comprehensive job application history.
The stack is as follows:
- n8n — monitors your email inbox, extracts relevant emails, and produces them to the
emailsKafka topic - we-regret-to-persist (this service) — processes application confirmations and rejections, maintains the source of truth in Postgres
- postgres — serves as the single source of truth for all application statuses and statistics (e.g. total applications, rejection rate, timeline of events)
- we-regret-to-present — serves a REST API to query your application history
| Layer | Technology |
|---|---|
| Language | Go 1.24 |
| AI | Claude Haiku 4.5 (anthropic-sdk-go) |
| Messaging | Redpanda / Kafka (segmentio/kafka-go) |
| Database | PostgreSQL (sqlx, squirrel, golang-migrate) |
| Testing | testify, testcontainers-go |
| CI/CD | GitHub Actions → GHCR |
- Go 1.24+
- Docker & Docker Compose
- An Anthropic API key
task(optional, but recommended)
1. Configure environment
cp .env.example .env
# Set CLAUDE_API_KEY and Postgres credentials2. Start infrastructure and seed sample emails
task devThis starts Redpanda and PostgreSQL, creates the Kafka topic, and produces the emails from seed.jsonl.
3. Run the service
task runThe service migrates the database on startup, then begins consuming from the emails topic.
Manual setup (without task)
docker compose up -d
go run ./cmd/statustask test # unit + integration tests (requires Docker)
task lint # golangci-lintIntegration tests use Testcontainers to spin up real Postgres and Kafka instances.
GitHub Actions runs tests and lint on every push. On version tags (v*), it builds and pushes a Docker image to GitHub Container Registry.
docker build -t we-regret-to-persist:latest .