Joblyser is an AI-powered job application platform for resume-assisted analysis and content generation (reviews, cover letters, cold emails, and LinkedIn notes).
This repository is a monorepo containing all runtime services and shared migration assets.
| Path | Service | Purpose |
|---|---|---|
joblyser-web |
Next.js | User-facing web application |
joblyser-api |
Go | Auth, user/resume APIs, and dispatch proxy |
joblyser-dispatch |
FastAPI (Python) | Session/task API and Celery task producer |
joblyser-worker |
Celery (Python) | Asynchronous task consumer |
joblyser-ai |
FastAPI (Python) | Agent execution, job-description extraction, and RAG |
migrations |
SQL | Shared Postgres schema migrations |
docs |
Markdown | Workspace documentation |
- The web app uses
joblyser-apifor auth, user, resume, and API-proxied agent requests, and callsjoblyser-dispatchfor streamed agent runs and job-description extraction. joblyser-dispatchcreates and tracks tasks, then publishesworker.tasks.agentto RabbitMQ'sagent-queue.joblyser-workerconsumes the task and invokesjoblyser-aiwith a worker service token.joblyser-aiexecutes the agent workflow; the worker persists task/chat updates for dispatch to stream back to the web app.
- JD analysis: Skill matching, strengths/gaps, and fit summary.
- Generated assets: Cover letter, cold email, and LinkedIn note generation.
- Session history: Multi-run chat history per server-generated session.
- Resume workflow:
- upload resume documents
- select profile primary resume
- use profile or ad-hoc resume in session
- Editable outputs:
cover_letter,linkedin_note,cold_mailsupport editing- edits are persisted via orchestrated API routes with debounced autosave.
- Bun 1.2.18
- Go 1.25+
- Python 3.13+
- PostgreSQL
- MongoDB
- RabbitMQ
- Chroma and Redis-compatible storage for AI/dispatch/worker flows
- Copy
.env.exampleto.envat the repository root. - Copy each
env/.env.{ai,api,dispatch,worker}.exampleto its non-example counterpart and set the required values. - Resolve the current Compose service-name mismatch (
worker.depends_on.agentshould refer toai) before runningdocker compose up --build.
By default, host port bindings in docker-compose.yml are restricted to 127.0.0.1 for safer local usage. Only set a *_BIND_HOST variable to 0.0.0.0 when you intentionally want external access.
- Start infrastructure dependencies:
- PostgreSQL
- MongoDB
- RabbitMQ
- Apply SQL migrations from
migrations/. - Start services in this order:
joblyser-aijoblyser-workerjoblyser-dispatchjoblyser-apijoblyser-web
For service-specific commands and environment variables, see each service README.
- Session IDs are server-generated.
- Agent runs are streamed from dispatch as server-sent events.
- Task and chat state are stored outside Postgres by dispatch and worker.
- Treat services as independent deployable units.
- The web app uses
/api/v1on both the Go API and dispatch; AI routes are mounted under/api. - Prefer server-owned identifiers for persistent entities (sessions/chats/jobs).
- Avoid committing secrets; use local env files and templates.
- Workspace docs index:
docs/README.md - Developer workflow guide:
docs/development-workflow.md