Job-search kanban on Phoenix LiveView — wishlist → offer, one drag at a time
- Elixir 94.7%
- CSS 2.1%
- JavaScript 2.1%
- Dockerfile 0.7%
- HTML 0.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .claude | ||
| .forgejo/workflows | ||
| assets | ||
| config | ||
| k8s | ||
| lib | ||
| priv | ||
| test | ||
| .formatter.exs | ||
| .gitignore | ||
| .sops.yaml | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| Dockerfile | ||
| mix.exs | ||
| mix.lock | ||
| README.md | ||
jobban
A kanban board purpose-built for a job search. Wishlist → Applied → Interviewing → Offer (→ Rejected), one drag at a time — with confetti when a card lands in Offer.
Built with Phoenix LiveView: every mutation broadcasts over PubSub, so the board stays live across tabs and devices with no refresh.
Features
- Five job-search stages seeded on boot; cards carry company, role, posting URL, location, salary, source, excitement (1–5 stars), and notes
- Add a job from a link — paste an ATS posting URL (Greenhouse, Lever, Ashby, …) and the card fills itself: JSON-LD first, an optional OpenRouter LLM pass for gaps, meta tags as fallback
- Drag-and-drop between and within columns (SortableJS + LiveView hook)
- Quick-add straight into any column, optimized for rapid entry
- Activity timeline per job: stage moves are logged automatically, notes are one keystroke away
- Days-in-stage aging — cards quietly turn amber after 3 days and red after 7 so follow-ups don't rot
- Stats header — tracked / in flight / interviewing / offers
- Confetti when a card enters Offer. Non-negotiable.
- Light/dark/system theme
Development
Requires Elixir ~> 1.15, Erlang/OTP 28, and a local Postgres
(postgres:postgres@localhost).
mix setup # deps, db create+migrate, seed stages, build assets
mix phx.server # http://localhost:4000
mix test
Deployment
Deployed to the home-cloud k3s
cluster at jobban.inevitable.fyi, gated behind GitHub SSO (oauth2-proxy).
- Push to
main→ GitHub Actions runs tests, then builds a multi-arch (amd64+arm64) image toghcr.io/jhgaylor/jobban - Flux watches this repo and applies
k8s/(Deployment, CNPG Postgres, Traefik IngressRoute, cert-manager Certificate) SECRET_KEY_BASEis SOPS-encrypted ink8s/jobban-secrets.enc.yaml, decrypted in-cluster by Flux;DATABASE_URLcomes from the CNPG-generatedjobban-pg-appSecret- Migrations + idempotent stage seeds run on container boot