LibreChat + Fable 5: Show It a Screenshot or a PDF
Run a private, self-hosted ChatGPT-style app where you drop in an image or document and let Claude Fable 5 read it.
Run this workflow
CI-verified, 3/3 fixtures passing.
Build this with your agent
One copy-paste hands Claude Code, Codex, or Cursor the full recipe, steps included, nothing to fetch.
Intended Use
Anyone who wants to drop a screenshot, chart, or scanned page into a private chat UI and have Fable 5 read it. CI verifies the deterministic spine: the LibreChat config is valid and names the model claude-fable-5, no key required. Fable actually reading the image is the thinking part and is fenced.
Not for
- Anyone who won't run Docker (LibreChat's one-time dependency)
- Feeding it anything you wouldn't want retained per the model's data policy
- Expecting CI to verify Fable's reading; that's the fenced model step
The Stack
Tested Against
librechat@latestclaude-fable-5Side effects & data flow
- Network
- none, local only
- Writes
- ./.env, ./checklibrechat.mjs
- Credentials
- none required
Prerequisites
- Docker (LibreChat runs via docker compose)
- An Anthropic API key (Claude API) for claude-fable-5
Steps
- 1
Self-host LibreChat and point it at Fable
git clone the repo, cp .env.example .env and paste your ANTHROPIC_API_KEY, then docker compose up -d. Because Fable is new you add claude-fable-5 to the Anthropic model list yourself (ANTHROPIC_MODELS in .env). Then open it, pick Claude, choose claude-fable-5, and drag in a screenshot.
- 2
What CI checks: the config is valid and names Fable
CI confirms the .env carries an ANTHROPIC_API_KEY line and the Anthropic model list names claude-fable-5. That's the deterministic precondition for the right model being used, no key needed. Fable reading the image is fenced.
cat > .env <<'EOF' ANTHROPIC_API_KEY=sk-ant-REPLACE_ME ANTHROPIC_MODELS=claude-fable-5 EOF cat > checklibrechat.mjs <<'EOF' import { readFileSync } from 'node:fs'; const env = readFileSync('.env', 'utf8'); let ok = true; function check(label, cond){ console.log(label + ': ' + (cond ? 'yes' : 'NO')); if(!cond) ok=false; } check('ANTHROPIC_API_KEY line present', env.includes('ANTHROPIC_API_KEY=')); check('Anthropic model list present', env.includes('ANTHROPIC_MODELS=')); check('model list names claude-fable-5', env.includes('claude-fable-5')); if(!ok){ console.log('librechat config check FAILED'); process.exit(1); } console.log('librechat config check OK: names claude-fable-5'); EOF node checklibrechat.mjs - 3
Drop in an image and ask (the model step, not checked by CI)
Upload a screenshot or PDF and ask Fable about it. That call runs the model and is non-deterministic, so CI never claims it. The badge covers the config, not the reading.
Eval, 3 fixtures
Last passed: verified todaynames-fablecontainstimeout 30s · max $0Expected:
model list names claude-fable-5: yescheck-okcontainstimeout 30s · max $0Expected:
librechat config check OK: names claude-fable-5clean-exitexit_codetimeout 30s · max $0Expected:
0
Results
~37,000 stars; the friendliest way to use Fable's best-in-class vision on your own machine.
Did this work for you?
Our CI checks the setup runs. You tell us if the whole thing worked. Tell us straight.
Liked this workflow?
Get new verified workflows in WebAfterAI, three issues a week (Tue, Thu, Sat).