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%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-29 08:18:52 +00:00
.claude notes: multi-line composer for interview write-ups 2026-06-11 08:52:45 -04:00
.forgejo/workflows ci: install OTP and Elixir from builds.hex.pm instead of setup-beam 2026-09-29 04:12:59 -04:00
assets launchpad: networking help — who to reach + how to find + draft outreach 2026-06-18 09:03:59 -04:00
config ci: build on Forgejo Actions, push to the Forgejo registry, pin the sha tag 2026-09-29 04:09:16 -04:00
k8s deploy: pin image sha-b8f8a35 2026-09-29 08:18:52 +00:00
lib api: publish /llms.txt so assistants can discover the yeet endpoint 2026-07-06 20:32:04 -04:00
priv api: publish /llms.txt so assistants can discover the yeet endpoint 2026-07-06 20:32:04 -04:00
test networking: explicit, runnable searches per target 2026-06-19 13:27:55 -04:00
.formatter.exs jobban: job-search kanban on Phoenix LiveView 2026-06-11 08:11:29 -04:00
.gitignore jobban: job-search kanban on Phoenix LiveView 2026-06-11 08:11:29 -04:00
.sops.yaml jobban: job-search kanban on Phoenix LiveView 2026-06-11 08:11:29 -04:00
AGENTS.md jobban: job-search kanban on Phoenix LiveView 2026-06-11 08:11:29 -04:00
CLAUDE.md networking: explicit, runnable searches per target 2026-06-19 13:27:55 -04:00
Dockerfile launchpad: listings count in header; cache asset-tool install 2026-06-18 08:22:28 -04:00
mix.exs import: create a job card from a pasted ATS link 2026-06-11 17:52:31 -04:00
mix.lock import: create a job card from a pasted ATS link 2026-06-11 17:52:31 -04:00
README.md docs: project CLAUDE.md (architecture, ops runbook, roadmap) + README import feature 2026-06-11 20:20:59 -04:00

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 to ghcr.io/jhgaylor/jobban
  • Flux watches this repo and applies k8s/ (Deployment, CNPG Postgres, Traefik IngressRoute, cert-manager Certificate)
  • SECRET_KEY_BASE is SOPS-encrypted in k8s/jobban-secrets.enc.yaml, decrypted in-cluster by Flux; DATABASE_URL comes from the CNPG-generated jobban-pg-app Secret
  • Migrations + idempotent stage seeds run on container boot