The public product name is intentionally provisional. The application is a mobile-first career agent focused on converting fewer, better applications into qualified interviews.
Development and production run the same authenticated product. Local development uses Clerk development keys, PostgreSQL, Ollama, and the local worker; production uses the same routes, schema, authorization, and workflows from one OCI image.
- Clerk sign-in and sign-up with configured Google, GitHub, LinkedIn, and Microsoft connections.
- Resume extraction in the browser; original PDF/DOCX bytes are not uploaded.
- Ollama-backed evidence candidate extraction with explicit verify or reject decisions.
- Persisted campaign roles, seniority, location, authorization, industry, intensity, and time constraints.
- Deterministic hard gates and versioned evidence, feasibility, preference, growth, reachability, effort, and uncertainty factors.
- Requirement-to-evidence links and user-visible recommendation explanations.
- Bounded Greenhouse, Lever, and Ashby discovery with checkpoints, retries, dead letters, expiration, and source health.
- Durable LangGraph campaign orchestration with PostgreSQL checkpoints and inspectable actions.
- Today actions with evidence, confidence, impact, effort, uncertainty, and approve, reject, or defer controls.
- Application pipeline through offer and closure, with interview and offer outcomes.
- Evidence-grounded application packets with edit, approval, and unsupported-claim blockers.
- Source-backed contact paths; guessed personal email addresses are prohibited.
- Persistent notifications, accessible toasts, theme controls, admin kill switches, and reviewed-source administration.
- Profile export/import, database backup/restore, and account deletion.
Auto-submit is deliberately disabled. Gmail and Microsoft mailbox/calendar connectors have persistence boundaries but require separate least-privilege OAuth implementation before activation.
Requirements: Docker Desktop and a free Clerk application.
cp .env.example .env.local
# Add the Clerk development keys to .env.local.
make up
make model
make doctorOpen http://127.0.0.1:1150. A new account contains no example jobs, metrics, applications, contacts, or evidence.
In Clerk Dashboard:
- Enable the required GitHub, Google, LinkedIn, and Microsoft social connections.
- Configure B2C Billing plan and feature slugs.
- Select one Organization as the platform-operator authorization realm.
- Copy its ID to
CLERK_PLATFORM_ORGANIZATION_ID. - Assign platform operators
org:admin, or configure a custom permission throughCLERK_PLATFORM_ADMIN_PERMISSION.
Copy exact Clerk slugs into CLERK_PLAN_PRIORITY and CLERK_FEATURE_SLUGS. Localhost and production differ only by Clerk instance keys and infrastructure configuration.
All host services bind to loopback and reserve ports 1150–1154:
| Service | Endpoint |
|---|---|
| Next.js | http://127.0.0.1:1150 |
| PostgreSQL | 127.0.0.1:1151 |
| Mailpit UI | http://127.0.0.1:1152 |
| Mailpit SMTP | 127.0.0.1:1153 |
| Ollama | http://127.0.0.1:1154 |
make up checks for collisions before startup. Containers use service DNS and standard internal ports.
make logs
make migrate
make verify
make evaluate
make image
make backup
make export EMAIL=you@example.com
make import FILE=exports/career-agent-TIMESTAMP.json
make delete EMAIL=you@example.com CONFIRM=1Build one vendor-neutral image:
docker build -t ai-job-search:release .Run the same image with separate commands:
docker run ... ai-job-search:release npm run migrate
docker run ... ai-job-search:release npm run web:container
docker run ... ai-job-search:release npm run worker
docker run ... ai-job-search:release npm run evaluateThe web and worker require PostgreSQL. The worker is intentionally a long-lived process; a hosting provider may run it continuously or wake it on a bounded schedule. Core execution does not require provider-specific queues, cron, AI bindings, workflows, or storage.
MONTHLY_AI_BUDGET_CENTS=0prevents construction of the billable OpenAI provider.- AI capacity failures return named states and never switch providers silently.
- Resend remains disabled until both a verified sender and API key exist.
- Original resume files remain on-device in the current workflow.
- Every protected mutation verifies Clerk and includes the authenticated user in its database predicate.
- Job descriptions are treated as untrusted data and cannot provide agent instructions.
- External side-effect tools require explicit approval and single-attempt idempotency.