# LibreChat sandbox — Inference Co-op customization Source of truth for the co-op's chat instance at **chat.inference.coop** (Cloudron app `4023ccbf-d57a-4500-97df-14de9cf3516e`, appstore package `ai.librechat.cloudronapp@1.4.5` — upstream LibreChat is unchanged at **v0.8.8**; the bump is uv 0.13.1 → 0.13.5 — on base image `cloudron/ai.librechat.cloudronapp:202610230221180000`). `librechat-test.inference.coop` was the pre-swap hostname (the swap to `chat.` happened 2026-10-21; the test alias is still not provisioned). The deployment has **two independent layers** — know which one you are changing: 1. **Persistent volume** (`/app/data/…`) — behavior: `librechat.yaml`, `env`, `mcp/*.py`. Survives image updates. Edited via `cloudron exec`, then mirrored into this repo (see "Volume changes" below). 2. **Overlay image** (this repo's Dockerfile) — appearance only: logo, favicons, `custom.css`, `custom2.js`, `
computes display: none.
# 5. The scheduler task's script exists in THIS image — a manifest repoint
# deployed before its image lands leaves the key seed broken on schedule:
cloudron --server my.inference.coop --token "$CLOUDRON_TOKEN" exec --app $APP \
-- test -f /app/data/sync-keys.js && echo "seed path present"
```
`./release.sh verify` runs checks 1-5 plus the seed task's own log lines and the
running script's revision hash, and exits non-zero on any failure.
### Appstore pin bumps (base image)
The overlay's `FROM` is pinned to the exact appstore image the app runs. Bumping
it is a two-line change in this repo (`Dockerfile` `FROM` + the manifest's
`version`/`changelog` copied from the official manifest) plus a rebuild, but it
re-runs every build-time patch against a new base layer, so treat the overlay as
the risk, not the bump.
```bash
# what the appstore now offers (official manifest, authoritative)
curl -s https://api.cloudron.io/api/v1/apps/ai.librechat.cloudronapp \
| python3 -c "import json,sys; m=json.load(sys.stdin)['data']['manifest']; print(m['version'], m.get('upstreamVersion'), m['changelog'].strip())"
# diff it against our copy — every field must match except dockerImage (+ scheduler)
# then: rebuild, pin, deploy, ./release.sh verify, and re-check the branding block above
```
Rollback is a one-line `dockerImage` repoint to the previous tag (built images
stay in the registry), then `./release.sh deploy`.
### `CloudronManifest.json` rules
- The **only** field you may change is `dockerImage` — it must point at the
overlay tag you want deployed.
- Everything else stays a byte-identical copy of the OFFICIAL appstore
manifest. A hand-edited manifest that omits the addons (`postgresql`,
`mongodb`, `oidc`, `sendmail`, `localstorage`) strips them from the running
app and crash-loops it (`mkdir: Read-only file system`). That broke the
sandbox on 2026-10-18 — the manifest, not the overlay, was the bug.
- When the appstore package updates, refresh the file with a new copy from
the Cloudron API (`GET /api/v1/apps/