AnythingLLM
Self-hosted workspace for chatting with your documents (RAG) and running AI agents, for a person or a team that brings its own LLM API key or model server. One container holds the app, a CPU embedder and the LanceDB vector store.
Resources by load level
What the app itself needs at each level, next to what we recommend for a server that runs only this app.
| Level | What it means | App requirements | Recommended |
|---|---|---|---|
| LightEstimate | Up to 5 users, up to 50 MB of extracted document text (~51,000 chunks) embedded by the built-in CPU embedder into LanceDB; LLM via an external API or server. | 2 vCPU · 2 GiB RAM · 5.2 GiB disk | 2.52 vCPU · 3.9 GiB RAM · 15.295 GiB disk |
| MediumEstimate | Up to 20 users (multi-user mode), up to 250 MB of extracted document text (~255,000 chunks) embedded by the built-in CPU embedder into LanceDB; LLM via an external API or server. | 3 vCPU · 4 GiB RAM · 7.7 GiB disk | 3.72 vCPU · 6.3 GiB RAM · 18.17 GiB disk |
| HeavyEstimate | Up to 50 users (multi-user mode), up to 1 GB of extracted document text (~1 million chunks) embedded by the built-in CPU embedder into LanceDB; LLM via an external API or server. | 4 vCPU · 8 GiB RAM · 17.7 GiB disk | 4.92 vCPU · 11.1 GiB RAM · 29.67 GiB disk |
Recommended = app requirements + system baseline + safety headroom, under sizing policy 2026.10.0. Options stay at their defaults. “Estimate” means the sources give no number for that case, so it is worked out from them by the method stated under Components. How the numbers are built
Ready-to-run files
Support level Supported
Compose template from the official sources; not yet verified by a run.
Components
What each component needs at each load level, before baseline and headroom.
| Component | Light | Medium | Heavy | Sources |
|---|---|---|---|---|
| AnythingLLM (app) | 2 / 2 / 5.2 | 3 / 4 / 7.7 | 4 / 8 / 17.7 | [1][5][13][24][25][26][27][28][31] |
How the estimates are worked out
- AnythingLLM · Light: vCPU and RAM: the documented minimum, a 2-core CPU with AVX2 and 2GB RAM (taken as 2 GiB), "enough to store some documents, send chats". Disk: image 4.2 GiB (1.027 compressed + 3.148 unpacked, both kept by the containerd store). Data per 1 MB of extracted text (~1,021 chunks of 1,000 chars, 20 overlap): document JSON 1 MB + vector-cache JSON (384 floats as text ≈7.7 KB + 1.5 KB text/metadata per chunk) 9.4 MB + LanceDB (1,536 B vector + 1.5 KB) 3.1 MB ≈ 13.5 MB, taken as ×14. 50 MB × 14 = 0.65 GiB + 23MB model + SQLite → 1 GiB + 4.2 GiB image.
- AnythingLLM · Medium: No upstream figure above the minimum. The embedder (ONNX, CPU only, 25 chunks per pass), LanceDB, the server and the collector all run in this one container; RAM 2 GiB × 2 → 4 GiB and one core added to the documented 2 (2 + 1 = 3) so embedding uploads does not stall chats. Disk: light's method (×14 per MB of text + 4.2 GiB image): 250 MB × 14 = 3.26 GiB → 3.5 + 4.2 image.
- AnythingLLM · Heavy: The documented minimum doubled again over medium for concurrent users and large embedding jobs in the same process: RAM 2 GiB × 4 = 8 GiB, vCPU 2 × 2 = 4. Upstream suggests an external embedder for large data volumes. Disk: light's method: 1,000 MB × 14 = 13.04 GiB → 13.5 + 4.2 image.
Ports
Public ports are meant to be reached from outside the stack, usually through a reverse proxy; internal ones stay on the stack's own network.
User and permissions (UID/GID)
The user each container's process runs as, and the paths it writes to. A bind mount for one of these paths must be writable by that UID:GID.
| Component | UID:GID | User | Starts as root | Writes to | Sources |
|---|---|---|---|---|---|
| AnythingLLM | 1000:1000 | anythingllm | No | /app/server/storage/app/server/.env/app/collector/hotdir | [3][9][14][27] |
- AnythingLLM: The Dockerfile creates anythingllm (1000:1000) and switches to USER anythingllm before the entrypoint, so the server and the collector never run as root. It writes the storage volume, /app/server/.env (UI settings) and /app/collector/hotdir (uploads being processed). A host folder must be owned by 1000:1000.
Storage growth
How much each component's data grows per month at each load level, on top of the disk in the profile. A value marked Assumption is ANAROQ's stated assumption, not a figure from the sources; the notes say what it rests on.
What the growth figures rest on
- AnythingLLM: Upstream gives no growth rate and keeps documents, vector-cache and vectors until they are deleted. Assumes the preset's data (1 GiB) fills over 12 months: 1 / 12 = 0.083. Chat history in SQLite is small next to it.
- AnythingLLM: Same 12-month assumption: 3.5 GiB of preset data, 3.5 / 12 = 0.292.
- AnythingLLM: Same 12-month assumption: 13.5 GiB of preset data, 13.5 / 12 = 1.125.
Upgrade and rollback
How to move to a new version safely, and how to go back if it fails.
Back up first
With the container stopped, copy the whole storage volume (anythingllm.db, documents, vector-cache, lancedb, models), plus the saved /app/server/.env and the .env of the Compose file (SIG_KEY, SIG_SALT). [8][22][27]DerivedUpstream documents keeping the storage folder and .env on the host between updates, not a backup procedure; copying them while stopped follows from SQLite and LanceDB living there.
Upgrade steps
- Read the release notes of every version between yours and the target; use a versioned tag (for example 1.18.0), not latest, which follows every commit. [17][30]
- Save the UI settings first: docker compose exec -T anythingllm cat /app/server/.env > anythingllm-settings.env (it holds API keys; keep it private). A new container starts without them. [1][9]DerivedUpstream keeps this file on the host with a bind mount; the template has no such mount, so it is copied out by hand.
- Back up the storage volume, set the new pinned tag, then docker compose pull and docker compose up -d. The entrypoint runs prisma migrate deploy on start. [5][15]
- Put the settings back: docker compose exec -T anythingllm sh -c 'cat > /app/server/.env' < anythingllm-settings.env, then docker compose restart anythingllm and check /api/ping. [4][9]DerivedThe server loads /app/server/.env with dotenv at start; values set in the Compose environment win over the file.
Roll back
Stop the container, restore the storage backup taken before the upgrade, start the previous pinned tag and put the saved settings file back. [5][15]DerivedUpstream documents no downgrade. Database migrations run forward on start, so the older tag is only safe on the data backed up before them.
Known breaking changes
Limits
- No LLM inside: the Docker build has no built-in LLM provider. Chat needs an API key or a model server of your own (for example Ollama), whose resources are not in these figures. The built-in embedder and LanceDB are included. [13][16]
- The CPU must expose AVX2: the default LanceDB crashes with Illegal instruction without it. On Proxmox/QEMU set the VM CPU type to host; generic types such as kvm64 hide AVX2. [13][14]
- Website and link imports use Chromium, which upstream runs with cap_add SYS_ADMIN. The generated file never adds it, so they fail unless the chromium-no-sandbox option is on. [6][15]
- Settings saved in the UI (LLM, embedder, API keys) live in /app/server/.env inside the container and are lost when it is recreated, e.g. on upgrade; copy the file out first. One instance only: SQLite is not for horizontal scaling. [9][15]
Security
- Without a password or multi-user mode the API and UI need no login. The template sets the instance password (AUTH_TOKEN) from .env; switch to multi-user mode for per-user roles (it cannot be reverted). [7][18]
- Do not expose port 3001 directly: serve it through a reverse proxy with HTTPS that passes WebSocket upgrades for agents (/api/agent-invocation). [15]
- The chromium-no-sandbox option runs Chromium without its sandbox on every page it scrapes; turn it on only if you need website imports, and keep anonymous telemetry in mind (DISABLE_TELEMETRY opts out). [6][15][21]
Backup
- Back up the storage volume (/app/server/storage: anythingllm.db, documents, vector-cache, lancedb, models) with the container stopped; it holds every workspace, chat, user and vector. [14][22][27]
- Also keep a copy of /app/server/.env (UI settings and API keys) and of SIG_KEY and SIG_SALT: without the same key and salt, data AnythingLLM encrypted cannot be read after a restore. [8][9]
Latest release
- This profile was checked against
AnythingLLM 1.18.0
This profile was checked against the newest release.
- Checked on
- 14 Oct 2026
- State
- Checked within the last 90 days
- Where releases are published
- GitHub Releases
Version
- Profile status
- Published
- Checked against release
- AnythingLLM 1.18.0
- Profile version
- 1.0.0
- Figures verified
- 14 Oct 2026
- Catalog release
- 2026.10.10
- Sizing policy
- 2026.10.0
- Compose file
- Unverified
Project and alternatives
- Official site
- anythingllm.com
- Source code
- github.com/Mintplex-Labs/anything-llm
- Alternatives
- Open WebUILibreChat
Sources
- docker/HOW_TO_USE_DOCKER.md at v1.18.0: docker run and Compose example (port 3001, cap_add SYS_ADMIN, STORAGE_DIR, storage volume; at least 2GB RAM, 10GB disk) (Official Compose · read 14 Oct 2026)
- docker/docker-compose.yml at v1.18.0 (build from source, user 1000:1000, .env and storage bind mounts, cap_add SYS_ADMIN) (Official Compose · read 14 Oct 2026)
- docker/Dockerfile at v1.18.0: USER anythingllm (1000:1000), HEALTHCHECK every 1m (timeout 10s, start period 1m) via docker-healthcheck.sh (Official repository · read 14 Oct 2026)
- docker/docker-healthcheck.sh at v1.18.0 (curl http://localhost:3001/api/ping, 200 = up) (Official repository · read 14 Oct 2026)
- docker/docker-entrypoint.sh at v1.18.0 (warns without STORAGE_DIR; prisma migrate deploy, then server and collector) (Official repository · read 14 Oct 2026)
- docker/.env.example at v1.18.0 (STORAGE_DIR, SIG_KEY/SIG_SALT 32+ chars, JWT_SECRET, ANYTHINGLLM_CHROMIUM_ARGS instead of SYS_ADMIN) (Official repository · read 14 Oct 2026)
- server/utils/middleware/validatedRequest.js at v1.18.0 (no auth when AUTH_TOKEN or JWT_SECRET is unset, outside multi-user mode) (Official repository · read 14 Oct 2026)
- server/utils/EncryptionManager/index.js at v1.18.0 (random SIG_KEY/SIG_SALT written to .env when unset) (Official repository · read 14 Oct 2026)
- server/utils/helpers/updateENV.js at v1.18.0 (dumpENV writes UI settings and keys to /app/server/.env) (Official repository · read 14 Oct 2026)
- server/utils/boot/markOnboarded.js at v1.18.0 (AUTH_TOKEN or JWT_SECRET set = onboarding marked complete) (Official repository · read 14 Oct 2026)
- server/utils/collectorApi/index.js at v1.18.0 (ANYTHINGLLM_CHROMIUM_ARGS passed to the collector's Chromium) (Official repository · read 14 Oct 2026)
- server/endpoints/system.js at v1.18.0 (GET /ping under /api, no auth) (Official repository · read 14 Oct 2026)
- AnythingLLM docs: System Requirements (2GB RAM, 2-core CPU with AVX2, 5GB storage; AVX2 required by LanceDB, Proxmox CPU type host) (Official docs · read 14 Oct 2026)
- AnythingLLM docs: Local Docker (storage volume required; image runs as UID/GID 1000; Illegal instruction without AVX2) (Official docs · read 14 Oct 2026)
- AnythingLLM docs: Deploy to Cloud VM (SYS_ADMIN needed to scrape web pages, SQLite not for horizontal scaling, reverse proxy with WebSocket for agents) (Official docs · read 14 Oct 2026)
- AnythingLLM docs: Docker installation overview (no built-in LLM provider on Docker; multi-user, password protection) (Official docs · read 14 Oct 2026)
- AnythingLLM docs: Docker Images (latest per commit; versioned images per release; pg image for PostgreSQL + PGVector) (Official docs · read 14 Oct 2026)
- AnythingLLM docs: Security & Access (single-user password, multi-user mode cannot be reverted, roles) (Official docs · read 14 Oct 2026)
- AnythingLLM docs: AnythingLLM Cloud (private managed instances by Mintplex Labs) (Official docs · read 14 Oct 2026)
- LICENSE at v1.18.0: MIT License, Mintplex Labs Inc. (Official repository · read 14 Oct 2026)
- README.md at v1.18.0 (telemetry on by default, DISABLE_TELEMETRY opt-out) (Official repository · read 14 Oct 2026)
- .dockerignore at v1.18.0 (server/storage data: documents, vector-cache, *.db, lancedb) (Official repository · read 14 Oct 2026)
- server/storage/models/README.md at v1.18.0 (native embedder all-MiniLM-L6-v2, 384 dimensions; local Whisper) (Official repository · read 14 Oct 2026)
- server/utils/EmbeddingEngines/native/constants.js at v1.18.0 (all-MiniLM-L6-v2: 23MB, 25 chunks per pass, 1,000-char chunks) (Official repository · read 14 Oct 2026)
- server/utils/TextSplitter/index.js at v1.18.0 (default chunkSize 1000, chunkOverlap 20, metadata header per chunk) (Official repository · read 14 Oct 2026)
- server/utils/vectorDbProviders/lance/index.js at v1.18.0 (each row: vector, chunk text and metadata; result cached to vector-cache) (Official repository · read 14 Oct 2026)
- server/utils/files/index.js at v1.18.0 (vector-cache stores each document's chunks and vectors as JSON) (Official repository · read 14 Oct 2026)
- Registry manifest of mintplexlabs/anythingllm:1.18.0 (linux/amd64): 1,102,229,449 B compressed; 20 layers decompressed and counted: 3,379,698,176 B (Measurement · read 14 Oct 2026)
- Docker Hub tags of mintplexlabs/anythingllm (1.18.0 pushed 2026-10-13, newest versioned tag on 2026-10-14) (Official repository · read 14 Oct 2026)
- GitHub releases: v1.18.0 (13 Oct, Latest), v1.17.0, v1.16.2 (agent web browsing on by default), v1.16.0 (workspace profile pictures removed) (Release notes · read 14 Oct 2026)
- Docker: containerd image store is the default on fresh Engine 29+ installs and keeps images compressed and uncompressed (Official docs · read 14 Oct 2026)