Self-hosted, open-source AI resume builder for software developers.
4.4K
Self-hosted, AI-powered resume builder for software developers. One sentence in → polished, ATS-optimised resume out — running entirely on your own machine.
Source · Issues · Full docs → github.com/Sathvik-Rao/StackResume
A multi-agent LangGraph pipeline (Intent Guard → Parser → optional JD Analyzer → Generator → Reviewer ⇄ Enhancer loop → Finalizer → optional Cover Letter + Outreach) turns a single sentence into a polished, interview-ready resume. Outputs PDF, Word (.docx), and OpenDocument (.odt) across four visual templates.
Wrapped in a chat-style web UI with persistent sessions, profile memory, master resumes, JD tailoring (0–100 intensity), an application tracker, and a live LLM activity log.
Plugs into OpenAI · Anthropic · Google Gemini · Ollama (fully offline) · any OpenAI-compatible endpoint.
./data directory.docker run)docker run -d \
--name stackresume \
-p 8000:8000 \
-v ./data:/data \
--restart unless-stopped \
sathvikrao/stackresume:latest
Open http://localhost:8000 and configure your LLM provider + API key from the in-app ⚙️ Settings → API Keys / AI Models modal.
No API key? Switch the provider to Ollama in Settings and point
OLLAMA_BASE_URLat a host-installed Ollama server. Free, fully offline.
services:
stackresume:
image: sathvikrao/stackresume:latest
container_name: stackresume
ports:
- "8000:8000"
volumes:
- ./data:/data
environment:
# ── LLM provider ────────────────────────────────────────────────────────
- LLM_PROVIDER=google # openai | anthropic | google | ollama | custom
- LLM_MODEL=gemini-2.5-flash
- LLM_TEMPERATURE=0.7 # 0 = deterministic, 1 = creative
# ── Provider API keys (set the one matching LLM_PROVIDER) ───────────────
- OPENAI_API_KEY=
- ANTHROPIC_API_KEY=
- GOOGLE_API_KEY=
- OPENAI_BASE_URL= # only when LLM_PROVIDER=custom
# ── Ollama (local inference, no key needed) ─────────────────────────────
- OLLAMA_BASE_URL=http://host.docker.internal:11434
# ── Pipeline tuning ─────────────────────────────────────────────────────
- MAX_REVIEW_ITERATIONS=3 # max Reviewer→Enhancer loops
- MIN_QUALITY_SCORE=82.0 # stop early once score crosses this (0–100)
# ── Optional single-user auth (off by default) ──────────────────────────
- AUTH_ENABLED=false
- AUTH_USERNAME=admin
- AUTH_PASSWORD= # required when AUTH_ENABLED=true
# ── LangSmith tracing (optional) ────────────────────────────────────────
- LANGSMITH_API_KEY=
- LANGSMITH_PROJECT=stackresume
- LANGSMITH_TRACING=false
# ── Misc ────────────────────────────────────────────────────────────────
- CORS_ORIGINS=* # collapses to same-origin when AUTH_ENABLED=true
- DATABASE_URL=sqlite+aiosqlite:////data/resume_builder.db
- DEBUG=false
extra_hosts:
- "host.docker.internal:host-gateway" # needed for Ollama on the host
restart: unless-stopped
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
Save as docker-compose.yml, then:
docker compose up -d
Open http://localhost:8000.
Every variable below can be set either as an environment variable or live from the in-app Settings UI (the DB overlay overrides the env baseline). The container survives restarts with whichever value you set last.
| Variable | Default | Description |
|---|---|---|
LLM_PROVIDER | google | openai / anthropic / google / ollama / custom |
LLM_MODEL | gemini-2.5-flash | Model name for the selected provider |
LLM_TEMPERATURE | 0.7 | 0 = deterministic, 1 = creative |
OPENAI_API_KEY | — | OpenAI key |
ANTHROPIC_API_KEY | — | Anthropic key |
GOOGLE_API_KEY | — | Google AI Studio key |
OPENAI_BASE_URL | — | Custom OpenAI-compatible endpoint (LLM_PROVIDER=custom only) |
OLLAMA_BASE_URL | http://host.docker.internal:11434 | Host-installed Ollama server |
MAX_REVIEW_ITERATIONS | 3 | Max Reviewer→Enhancer refinement loops |
MIN_QUALITY_SCORE | 82.0 | Stop refining once the resume reaches this score (0–100) |
DATABASE_URL | sqlite+aiosqlite:////data/resume_builder.db | SQLAlchemy async URL |
AUTH_ENABLED | false | Require login on every /api/* route |
AUTH_USERNAME | admin | Admin username |
AUTH_PASSWORD | — | Must be set when AUTH_ENABLED=true (or login returns 503) |
CORS_ORIGINS | * | Comma-separated origins; collapses to same-origin when AUTH_ENABLED=true and * |
LANGSMITH_API_KEY | — | LangSmith tracing key |
LANGSMITH_PROJECT | stackresume | LangSmith project name |
LANGSMITH_TRACING | false | Enable LangSmith tracing |
DEBUG | false | FastAPI debug mode + SQL echo |
| Tag | What it points at |
|---|---|
latest | Default branch (main), built on every push |
vX.Y.Z / vX.Y / vX | Released semver tags — auto-bumped from Conventional Commits |
sha-<short> | Immutable per-commit tag — pin in production |
Supported platforms: linux/amd64, linux/arm64/v8 — runs on a Raspberry Pi just as happily as on a bare-metal server.
8000 — FastAPI serves both the API and the frontend from the same port./data — holds resume_builder.db (sessions, profile, master resumes, app settings). Bind-mount it to persist across restarts.GET /api/health every 30s after a 20s grace period.# On the host:
ollama pull llama3.1
ollama serve # already running as a service on most installs
# Set in Docker Compose (or the Settings UI):
LLM_PROVIDER=ollama
LLM_MODEL=llama3.1
OLLAMA_BASE_URL=http://host.docker.internal:11434
extra_hosts: ["host.docker.internal:host-gateway"] is already wired in the compose snippet above so the container can reach Ollama on the host.
If you expose StackResume on a LAN or behind a tunnel, flip on the built-in single-user auth:
- AUTH_ENABLED=true
- AUTH_USERNAME=admin
- AUTH_PASSWORD=<your-strong-password>
Passwords are SHA-512 hashed client-side; the server compares with secrets.compare_digest and issues a UUID session token valid for 24 hours.
Architecture diagram, feature tour, pipeline tuning details, testing, contributing guide, and source code:
→ github.com/Sathvik-Rao/StackResume
GPL-3.0 — free to run, study, modify, and redistribute. Derived works must remain GPL-3.0. See LICENSE.
Content type
Image
Digest
sha256:b87bc3a34…
Size
111.9 MB
Last updated
3 months ago
docker pull sathvikrao/stackresume