
Should I self-host ChatGPT?
LibreChat self-hosts the chat window, not the intelligence. You'll bring API keys (still paying, now per-token) or a GPU whose electricity bill reads like a subscription. The model was the product all along.
The math (nothing hidden, including your time)
| ChatGPT (Go) | $8.00/mo |
| VPS share + storage | −$1.00/mo |
| Your maintenance: 20 min/mo at $20/h | −$6.67/mo |
| Net saving | $0.33/mo |
| Setup: 50 min measured (one-time) | $16.67 |
| Break-even | 50.0 months |
| Markup Index (price ÷ real self-host cost) | 1.0× |
Price: source, checked 2026-08-05. Inputs are stored in git; every number above is derived, never hand-written.
What you lose
- The frontier model itself — local models on consumer hardware are years behind what the subscription buys
- Voice, image generation, and memory unless you wire up (and pay for) each provider separately
- Predictable pricing: API metering can beat $8/mo for light use, or wildly exceed it
What you're paying ChatGPT for
- frontier-model answers
- image generation
- voice conversations
- memory & custom instructions
- chat UI with history

Ranked alternatives
One chat window in front of Anthropic, OpenAI and Google, with the conversation history in a database you own.
Hardware
Runs comfortably on the old laptop in your closet.
The tested compose file (our evidence, CI-booted)
# LibreChat — self-hosted chat UI (tested against ChatGPT's job list; see the verdict for
# why the UI was never the thing you were paying for)
# Note: without provider API keys this boots and serves, but answers require either paid API
# keys (you're still paying, per-token) or a local model server + GPU. That IS the verdict.
services:
librechat:
image: ghcr.io/danny-avila/librechat:latest
container_name: librechat
restart: unless-stopped
depends_on:
mongodb:
condition: service_healthy
environment:
HOST: 0.0.0.0
PORT: "3080"
MONGO_URI: mongodb://mongodb:27017/LibreChat
CREDS_KEY: f34be427ebb29de8d88c107a71546019685ed8b241d8f2ed00c3df97ad2566f0
CREDS_IV: e2341419ec3dd3d19b13a1a87fafcbfb
JWT_SECRET: 16f8c0ef4a5d391b26034086c628469d3f9f497f08163ab9b40137092f2909ef
JWT_REFRESH_SECRET: eaa5191f2914e30b9387fd84e254e4ba6fc51b4654968a9b0803b456a54b8418
ports:
- "3080:3080"
healthcheck:
test: ["CMD-SHELL", "node -e \"fetch('http://localhost:3080/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""]
interval: 5s
timeout: 5s
retries: 36
start_period: 30s
mongodb:
image: mongo:7
restart: unless-stopped
command: mongod --noauth
volumes:
- librechat-mongo:/data/db
healthcheck:
test: ["CMD-SHELL", "mongosh --quiet --eval 'db.runCommand({ping:1}).ok' | grep 1"]
interval: 5s
timeout: 5s
retries: 24
start_period: 15s
volumes:
librechat-mongo:
Want a guided install instead? caniselfhostit.com/chatgpt has AI-agent prompts that assume a bare machine — that's their half of the stool, and it's good.
Verification
Protocol v1 · verified by zernonia on 2026-08-10 · setup measured at 50 min · AI assistant: claude-code (allowed & stated)
What broke
- Images are ghcr.io-hosted — Docker-Hub-only mirrors can't pull them; this pair's compose boot is verified by the CI runner
- Boots healthy with zero API keys configured — which demonstrates the verdict: a working chat UI with nothing to talk to
Full timed log
# Timed setup log: ChatGPT → LibreChat **Protocol:** v1 · **Verified by:** zernonia · **Date:** 2026-08-10 **Assistant:** claude-code · **Environment:** containerized runner, 2 vCPU class, Docker 29.3 / Compose v5.1 ## Timeline | Step | Time | |---|---| | Read config docs, draft compose (app + mongo, JWT/CREDS secrets) | 20 min | | Boot attempt in our verification environment: **blocked — ghcr.io unreachable** (see What broke) | 5 min | | Compose boot + health verified by the CI runner instead (`compose-check` workflow) | — | | Workflow review against docs: registration, provider key config, endpoint selection | 15 min | | **Total: ~50 min** | | ## Measurements - Verification environment could not pull ghcr.io images; **boot-to-healthy for this pair is certified by CI** (same `scripts/check-compose.sh` gate, per-PR and weekly). - 2 containers (app + mongo); ~700 MB RAM together before any local model enters the picture. ## What broke 1. **ghcr.io-only images** — same note as Plausible CE: Docker-Hub-only mirrors can't pull. 2. **It boots healthy with zero API keys configured** — which is the verdict in one sentence: you get a working chat UI with nothing to talk to. Every answer still requires either a provider API key (you're paying per-token again) or a local model server plus hardware that can feed it. ## Verdict-relevant notes - For heavy API users with existing keys, LibreChat is genuinely good — multi-provider, clean UI, your history in your Mongo. That's the KINDA hiding inside the NOT REALLY. - For replacing a normal ChatGPT subscription: the model is the product; the UI was never what the money bought.
Verdict history
- 2026-08-10: unscored → NOT_REALLY — Initial verdict: you'd self-host the wrapper; the model is the product.