paperless-gpt
paperless-gpt is a companion to paperless-ngx. An LLM suggests titles, tags, correspondents and document types, and a vision model can run OCR.
Upstream: source.
Plugboard options
Give paperless-gpt its own key. vision handles OCR and must accept images. Docker needs a reachable address (Serving other machines).
jsonc
{
"options": {
"listen": { "host": "0.0.0.0", "port": 4010 },
"keys": { "paperless-gpt": "{env:PLUGBOARD_KEY_PAPERLESS_GPT}" },
"models": ["opencode-go/glm-5.3-flash", "anthropic/claude-sonnet-4-6"],
"aliases": {
"text": "opencode-go/glm-5.3-flash",
"vision": "anthropic/claude-sonnet-4-6"
},
"apps": { "paperless-gpt": { "allowedModels": ["text", "vision"] } }
}
}Connect
ini
PAPERLESS_BASE_URL=http://paperless-ngx:8000
PAPERLESS_API_TOKEN=<your paperless-ngx API token>
LLM_PROVIDER=openai
LLM_MODEL=text
LLM_LANGUAGE=English
# The plugboard app key, not an OpenAI key.
OPENAI_API_KEY=<the paperless-gpt app key>
OPENAI_BASE_URL=http://host.docker.internal:4010/v1
# LLM OCR, if you use it. The model must accept images.
VISION_LLM_PROVIDER=openai
VISION_LLM_MODEL=vision
LOG_LEVEL=infoOPENAI_API_KEY takes the plugboard key. OPENAI_BASE_URL ends in /v1.
The .env and a compose file are in examples/self-hosted/paperless-gpt/.
What works
- Suggestions for title, tags, correspondent and document type, through
LLM_MODEL. - LLM OCR, through
VISION_LLM_PROVIDERandVISION_LLM_MODEL. Set the OCR provider tollmto use it.
Limits
- paperless-gpt has no login. Anyone who can reach its port can use the UI and
/api/*. Publish the port on loopback or a trusted network. - Keep the paperless-ngx API token in an env file, not in the compose file.