Paperless Ngx logo

Paperless Ngx

Community
jmagar
paperless-ngx

Manage documents in Paperless-ngx document management system. Use when the user asks to "upload document", "search paperless", "find document", "add to paperless", "tag document", "manage correspondents", "organize documents", "archive document", "export document", "delete document", or mentions Paperless-ngx, document management, OCR, or paperless office.

Overview

Publisherjmagar
Repositoryclaude-homelab
Skill namepaperless-ngx
Stars
87
Forks
11
Bundled files
8
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 8 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by jmagar on GitHub. Read the source before you install it.

Installation

Install the Paperless Ngx AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/jmagar/claude-homelab/tree/main/skills/paperless-ngx
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/jmagar/claude-homelab.git /tmp/claude-homelab
mkdir -p .claude/skills
cp -r /tmp/claude-homelab/skills/paperless-ngx .claude/skills/paperless-ngx
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Paperless Ngx in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Paperless Ngx on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Paperless Ngx is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Paperless-ngx Skill

⚠️ MANDATORY SKILL INVOCATION ⚠️

YOU MUST invoke this skill (NOT optional) when the user mentions ANY of these triggers:

  • "upload document", "add document to paperless", "scan to paperless"
  • "search paperless", "find document", "search documents"
  • "tag document", "add tags", "manage tags in paperless"
  • "manage correspondents", "add correspondent", "list correspondents"
  • "update document", "edit document metadata", "change document type"
  • "archive document", "export document", "download document"
  • "delete document", "remove document from paperless"
  • "list my documents", "show recent documents", "what documents do I have"
  • Any mention of Paperless-ngx, document management, OCR, or paperless office

Failure to invoke this skill when triggers occur violates your operational requirements.


Purpose

This skill provides read-write access to a self-hosted Paperless-ngx instance for document management with OCR. Paperless-ngx transforms physical documents into a searchable online archive with full-text search, tagging, and metadata management.

Core capabilities:

  • Upload documents with auto-OCR and metadata extraction
  • Search documents by content, tags, correspondent, or date
  • Manage tags, correspondents, and document types
  • Update document metadata (title, tags, correspondent, dates)
  • Archive and export operations
  • Delete documents (with confirmation)
  • Bulk operations on multiple documents

Primary use case: Maintain a searchable digital archive of all documents with powerful organization and retrieval capabilities.

Setup

Prerequisites

  • Paperless-ngx instance running and accessible
  • API token generated from Paperless-ngx UI
  • curl and jq installed

Credential Configuration

Add these variables to ~/.claude-homelab/.env:

bash
# Paperless-ngx - Document management system
PAPERLESS_URL="https://paperless.example.com"
PAPERLESS_API_TOKEN="<your_api_token>"

To generate an API token:

  1. Log into your Paperless-ngx instance
  2. Go to Settings → My Profile
  3. Click "Create Token" under "API Tokens"
  4. Copy the generated token
  5. Add to .env file as shown above

Security:

  • .env file is gitignored (never commit)
  • Set permissions: chmod 600 ~/.claude-homelab/.env
  • Token has same permissions as your user account

Commands

All commands return JSON output for LLM parsing. Scripts source credentials from .env automatically.

Document Operations

Upload a document:

bash
bash scripts/paperless-api.sh upload /path/to/document.pdf
bash scripts/paperless-api.sh upload scan.jpg --title "Receipt" --tags "expense,2024"
bash scripts/paperless-api.sh upload contract.pdf --correspondent "Acme Corp" --document-type "Contract"

Search documents:

bash
bash scripts/paperless-api.sh search "invoice"
bash scripts/paperless-api.sh search "meeting notes" --limit 10
bash scripts/paperless-api.sh search "2024" --tags "tax"
bash scripts/paperless-api.sh search --correspondent "John Doe"

List documents:

bash
bash scripts/paperless-api.sh list
bash scripts/paperless-api.sh list --limit 20
bash scripts/paperless-api.sh list --ordering "-created"

Get document details:

bash
bash scripts/paperless-api.sh get <document-id>

Download/export document:

bash
bash scripts/paperless-api.sh download <document-id>
bash scripts/paperless-api.sh download <document-id> --output /path/to/save.pdf

Update document:

bash
bash scripts/paperless-api.sh update <document-id> --title "New Title"
bash scripts/paperless-api.sh update <document-id> --add-tags "urgent,reviewed"
bash scripts/paperless-api.sh update <document-id> --correspondent "Jane Smith"
bash scripts/paperless-api.sh update <document-id> --document-type "Invoice"
bash scripts/paperless-api.sh update <document-id> --archive-serial-number "2024-001"

Delete document:

bash
bash scripts/paperless-api.sh delete <document-id>  # Prompts for confirmation

Tag Management

List tags:

bash
bash scripts/tag-api.sh list
bash scripts/tag-api.sh list --ordering "name"

Create tag:

bash
bash scripts/tag-api.sh create "project-alpha"
bash scripts/tag-api.sh create "urgent" --color "#ff0000"

Get tag details:

bash
bash scripts/tag-api.sh get <tag-id>

Update tag:

bash
bash scripts/tag-api.sh update <tag-id> --name "new-name"
bash scripts/tag-api.sh update <tag-id> --color "#00ff00"

Delete tag:

bash
bash scripts/tag-api.sh delete <tag-id>  # Prompts for confirmation

Correspondent Management

List correspondents:

bash
bash scripts/correspondent-api.sh list

Create correspondent:

bash
bash scripts/correspondent-api.sh create "Acme Corporation"

Get correspondent details:

bash
bash scripts/correspondent-api.sh get <correspondent-id>

Update correspondent:

bash
bash scripts/correspondent-api.sh update <correspondent-id> --name "New Name"

Delete correspondent:

bash
bash scripts/correspondent-api.sh delete <correspondent-id>  # Prompts for confirmation

Bulk Operations

Bulk tag documents:

bash
bash scripts/bulk-api.sh add-tag <tag-id> --documents "1,2,3"
bash scripts/bulk-api.sh remove-tag <tag-id> --documents "1,2,3"

Bulk set correspondent:

bash
bash scripts/bulk-api.sh set-correspondent <correspondent-id> --documents "1,2,3"

Bulk set document type:

bash
bash scripts/bulk-api.sh set-document-type <type-id> --documents "1,2,3"

Bulk delete documents:

bash
bash scripts/bulk-api.sh delete --documents "1,2,3"  # Prompts for confirmation

Workflow

When the user asks about Paperless-ngx:

  1. "Upload this document to Paperless"

    • Save file locally if needed
    • Use upload command with appropriate metadata
    • Optionally add tags, correspondent, document type
    • Paperless will auto-OCR and extract text
  2. "Find my 2024 tax documents"

    • Use search "tax" --tags "2024" or similar query
    • Present results with ID, title, date, tags
    • User can request full details with get <id>
  3. "Tag all invoices from Acme Corp as paid"

    • Search for documents: search "invoice" --correspondent "Acme Corp"
    • Create or find "paid" tag
    • Use bulk operation to add tag to results
  4. "Show me documents without tags"

    • Use list with filter parameter
    • Present untagged documents
    • Suggest tagging workflow
  5. "Delete this old document"

    • Confirm document ID with user
    • Ask for explicit confirmation
    • Use delete <id> command
  6. "Add a new supplier as correspondent"

    • Use correspondent-api.sh create "Supplier Name"
    • Return correspondent ID for future document uploads

Detailed Flow: Document Upload

User: "Upload this receipt to Paperless and tag it as expense"

1. Verify file path exists and is readable
2. Upload document with metadata:
   bash scripts/paperless-api.sh upload /path/to/receipt.pdf --tags "expense"
3. Paperless processes document (OCR, thumbnail generation)
4. Return document ID and success confirmation
5. Optionally ask if user wants to set correspondent or document type

Detailed Flow: Search and Organize

User: "Find all documents from last month that need review"

1. Calculate date range (last month)
2. Search documents by date range
3. Filter results by tag or keyword "review"
4. Present results with metadata
5. Offer to bulk-tag results or export list

Detailed Flow: Bulk Tagging

User: "Tag all invoices from Q1 as archived"

1. Search for invoices in Q1 date range
2. Extract document IDs from results
3. Find or create "archived" tag
4. Use bulk operation to add tag to all documents
5. Report number of documents tagged

Notes

API Details

  • Authentication: Token authentication via Authorization: Token <token> header
  • Base URL: /api/ endpoint
  • API Version: Version 5 (specify via Accept header)
  • Rate limits: No documented limits (self-hosted)
  • Pagination: Uses page and page_size parameters

Document Processing

Paperless-ngx automatically processes uploaded documents:

  • OCR extraction (if not already text-based PDF)
  • Thumbnail generation
  • Metadata extraction (date, correspondent guessing)
  • Full-text indexing for search

Search Syntax

Search supports multiple query types:

  • Full-text: search "meeting notes"
  • Tag filter: search --tags "work,urgent"
  • Correspondent: search --correspondent "John Doe"
  • Date range: search --created-after "2024-01-01"
  • Document type: search --document-type "Invoice"

Tags vs Correspondents

  • Tags: General-purpose labels (e.g., "urgent", "personal", "2024")
  • Correspondents: People or organizations (e.g., "Acme Corp", "John Smith")
  • Document Types: Categories of documents (e.g., "Invoice", "Contract", "Receipt")

All three provide different organizational axes for your documents.

Destructive Operations

Delete operations require confirmation:

  • Delete document: Permanently removes document and files
  • Delete tag: Removes tag from all documents (documents remain)
  • Delete correspondent: Removes from all documents (documents remain)

Always confirm with user before executing delete operations.

Best Practices

  1. Tag consistently: Use lowercase, hyphens for multi-word (e.g., "project-alpha")
  2. Set correspondents: Makes searching by sender/recipient easier
  3. Use document types: Categories help with organization and workflows
  4. Archive serial numbers: Track original paper document storage
  5. Search before upload: Avoid duplicates

Common Errors

401 Unauthorized:

  • Check API token in .env
  • Token may have expired (regenerate in Paperless UI)
  • Verify user permissions

404 Not Found:

  • Verify document/tag/correspondent ID exists
  • Check PAPERLESS_URL is correct

400 Bad Request:

  • Invalid metadata (e.g., non-existent tag ID)
  • Malformed file upload
  • Check script output for specific error message

Connection refused:

  • Paperless-ngx instance not running
  • Verify URL in .env

Reference

  • Official Docs: https://docs.paperless-ngx.com/
  • API Reference: See references/api-endpoints.md for complete API documentation
  • Quick Reference: See references/quick-reference.md for command examples
  • Troubleshooting: See references/troubleshooting.md for common issues
  • Scripts: skills/paperless-ngx/scripts/

🔧 Agent Tool Usage Requirements

CRITICAL: When invoking scripts from this skill via the zsh-tool, ALWAYS use pty: true.

Without PTY mode, command output will not be visible even though commands execute successfully.

Correct invocation pattern:

typescript
<invoke name="mcp__plugin_zsh-tool_zsh-tool__zsh">
<parameter name="command">./skills/paperless-ngx/scripts/paperless-api.sh [args]</parameter>
<parameter name="pty">true</parameter>
</invoke>

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Paperless Ngx AI skill do?

Manage documents in Paperless-ngx document management system. Use when the user asks to "upload document", "search paperless", "find document", "add to paperless", "tag document", "manage correspondents", "organize documents", "archive document", "export document", "delete document", or mentions Paperless-ngx, document management, OCR, or paperless office.

Why use Paperless Ngx on TypingMind?

Because you install it once and use it with any model. Paperless Ngx is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Paperless Ngx in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/jmagar/claude-homelab/tree/main/skills/paperless-ngx. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Paperless Ngx?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Paperless Ngx?

As many as you like. As long as a model supports skills, you can use Paperless Ngx with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Paperless Ngx AI skill free?

Yes. It is published on GitHub by jmagar under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇