ContentOpen SourceFreeActiveMachine-verified· beginner · ~15 min setup

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.

by Shilpa Mitra· verified today· v1.0.0

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-5

Side 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. 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. 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. 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 today
  • names-fablecontainstimeout 30s · max $0

    Expected: model list names claude-fable-5: yes

  • check-okcontainstimeout 30s · max $0

    Expected: librechat config check OK: names claude-fable-5

  • clean-exitexit_codetimeout 30s · max $0

    Expected: 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).