Sign inSign up

sathvikrao/stackresume

By sathvikrao

Updated 3 months ago

Self-hosted, open-source AI resume builder for software developers.

Image
Machine learning & AI
0

4.4K

sathvikrao/stackresume repository overview

StackResume

Self-hosted, AI-powered resume builder for software developers. One sentence in → polished, ATS-optimised resume out — running entirely on your own machine.

Self-hosted Open Source Multi-arch

Source · Issues · Full docs → github.com/Sathvik-Rao/StackResume


What it does

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.


Why self-host?

  • Your data stays put — single SQLite file in a bind-mounted ./data directory.
  • No SaaS, no telemetry — the container only talks to the LLM provider you configure.
  • BYO key or fully offline — pair with a local Ollama install for zero-cost, network-free inference.
  • GPL-3.0, audit-friendly — every prompt, agent, and renderer is in the source repo.

Quick start

Minimal (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_URL at a host-installed Ollama server. Free, fully offline.


Docker Compose (all options)
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.


Configuration

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.

VariableDefaultDescription
LLM_PROVIDERgoogleopenai / anthropic / google / ollama / custom
LLM_MODELgemini-2.5-flashModel name for the selected provider
LLM_TEMPERATURE0.70 = deterministic, 1 = creative
OPENAI_API_KEYOpenAI key
ANTHROPIC_API_KEYAnthropic key
GOOGLE_API_KEYGoogle AI Studio key
OPENAI_BASE_URLCustom OpenAI-compatible endpoint (LLM_PROVIDER=custom only)
OLLAMA_BASE_URLhttp://host.docker.internal:11434Host-installed Ollama server
MAX_REVIEW_ITERATIONS3Max Reviewer→Enhancer refinement loops
MIN_QUALITY_SCORE82.0Stop refining once the resume reaches this score (0–100)
DATABASE_URLsqlite+aiosqlite:////data/resume_builder.dbSQLAlchemy async URL
AUTH_ENABLEDfalseRequire login on every /api/* route
AUTH_USERNAMEadminAdmin username
AUTH_PASSWORDMust 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_KEYLangSmith tracing key
LANGSMITH_PROJECTstackresumeLangSmith project name
LANGSMITH_TRACINGfalseEnable LangSmith tracing
DEBUGfalseFastAPI debug mode + SQL echo

Image tags

TagWhat it points at
latestDefault branch (main), built on every push
vX.Y.Z / vX.Y / vXReleased 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.


Ports, volumes, health

  • Port: 8000 — FastAPI serves both the API and the frontend from the same port.
  • Volume: /data — holds resume_builder.db (sessions, profile, master resumes, app settings). Bind-mount it to persist across restarts.
  • Healthcheck: GET /api/health every 30s after a 20s grace period.

Using a local Ollama instance

# 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.


Enabling auth

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.


Full documentation

Architecture diagram, feature tour, pipeline tuning details, testing, contributing guide, and source code:

github.com/Sathvik-Rao/StackResume


License

GPL-3.0 — free to run, study, modify, and redistribute. Derived works must remain GPL-3.0. See LICENSE.

Tag summary

Content type

Image

Digest

sha256:b87bc3a34

Size

111.9 MB

Last updated

3 months ago

docker pull sathvikrao/stackresume