lukasmalkmus/pngx
Search, retrieve, and manage documents in Paperless-ngx
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.11.4 - 2026-10-30
Added
- Add portable Agent Plugins 1.0 packaging and an Agent Skills-compatible Paperless skill while retaining Claude Code integration.
Fixed
- Launch the bundled MCP server in Codex without unresolved Claude-specific executable or credential placeholders.
- Keep launcher helpers available when the host sanitizes PATH.
- Remove temporary download files before starting the CLI.
Security
- Update
rustls-webpkito 0.103.16 to reject distrusted certificate intermediates (RUSTSEC-2026-0382).
0.11.3 - 2026-10-19
Changed
- The x86_64 Linux binary needs glibc 2.18 or later, down from 2.39 in 0.11.2.
Security
- Refresh dependencies via
cargo update. This movesrustlsto 0.23.46, which closes RUSTSEC-2026-0346 to RUSTSEC-2026-0349. RUSTSEC-2026-0349 covers an unauthenticated ServerHello that downgrades later connections to classical key exchange.
0.11.2 - 2026-10-07
Changed
- Refresh dependencies via
cargo update, includingrmcp3.5.1. This movesrustlsto 0.23.45, which closes RUSTSEC-2026-0285, TLS 1.3 handshake messages accepted across encryption level boundaries.
Fixed
- Drop the literal
<system-reminder>tag from the skill nudge. Claude Code wraps hook context in its own reminder and, since 2.1.292, escapes tags in hook output, so Claude received an escaped tag. - Quote the plugin root in the hook commands. The hooks failed with exit 127 when the plugin directory path contained a space.
0.11.1 - 2026-08-24
Changed
- Refresh dependencies via
cargo update, includingrmcp3.1.4. This movesh2to 0.4.18, which closes RUSTSEC-2026-0258, an unbounded queue of empty HTTP/2 DATA frames.
0.11.0 - 2026-08-13
Added
- The plugin now asks for your Paperless-ngx URL and API token when you enable
it, and stores the token in your system keychain. Leave both empty to keep
using the credentials from
pngx auth login.
Changed
- The MCP server speaks protocol 2026-07-28. Older clients still negotiate 2025-06-18.
- Truncated table cells now end with
…instead of...(comfy-table 8).
Fixed
- A blank
PNGX_URLorPNGX_TOKENno longer overrides a stored login.
0.10.2 - 2026-06-17
Fixed
- Resolve the bundled MCP server via
${CLAUDE_PLUGIN_ROOT}/bin/pngxinstead of a barepngxcommand. Plugin hosts spawn the stdio MCP server without the plugin'sbin/onPATH, so the bare name failed with "Executable not found in $PATH".
0.10.1 - 2026-05-28
Changed
- Refresh transitive dependencies via
cargo update.
0.10.0 - 2026-05-26
Added
- Add Codex plugin metadata and marketplace packaging alongside the existing Claude Code plugin.
- Add bundled MCP configuration for plugin and desktop hosts using
pngx mcp.
Changed
- Flatten the MCP server command to
pngx mcp. - Make the plugin shim and binary-sync hook work with Codex plugin environment variables as well as Claude Code's variables.
0.9.1 - 2026-05-20
Security
- Bump
rustls-webpkito 0.103.13, clearing RUSTSEC-2026-0104 (a reachable panic when parsing certificate revocation lists). pngx does not parse CRLs, so it was not exploitable; the bump keepscargo auditclean.
0.9.0 - 2026-05-20
Added
- Add
pngx documents notes <id>to list a document's notes, andpngx documents add-note <id> "<text>"/pngx documents remove-note <id> <note-id>to add and remove them. - Add MCP tools
documents_notes,documents_add_note, anddocuments_delete_notemirroring the new note commands.
0.8.2 - 2026-04-21
Fixed
- Fix
pngx documents uploadfailing with{"document": ["No file was submitted."]}against Paperless-ngx served by granian (2.20.x and newer). The multipart body was sentTransfer-Encoding: chunkedviaureq::SendBody::from_reader, which granian's dechunker presented as an empty body to Django's multipart parser. Now the encoded body is buffered before send so the request advertisesContent-Length. The multipart encoder itself remains streaming. - Fix
--waitbailing withinvalid type: string "113", expected u64on some Paperless versions.Task::related_documentis now accepted as either a JSON number or the same integer as a JSON string.
0.8.1 - 2026-04-21
Fixed
- Fix public
upload_document_and_waitdocs linking to a private item (TASK_UNKNOWN_THRESHOLD).cargo doc --no-deps --allis green again underRUSTDOCFLAGS=-D warnings. - Skip the taxonomy CLI integration tests on Windows. The tests use
env_clear()when spawningpngxto control PATH, which strips essentials on Windows and causes WSAStartup to fail (os error 10106). Coverage stays on Linux and macOS runners. - Refresh transitive
rustls-webpkito 0.103.12 to clear RUSTSEC-2026-0049, RUSTSEC-2026-0098, and RUSTSEC-2026-0099.
0.8.0 - 2026-04-21
Added
-
Ship
bin/pngxshim so the Claude Code plugin works without a separately installedpngxbinary. The shim prefers any user-installedpngxonPATH; otherwise it reuses (or lazily downloads) a plugin-managed copy from GitHub releases matching the plugin's declared version. -
Add
SessionStarthook (hooks/ensure-binary.sh) that keeps the plugin-managed binary in sync in the background, never blocking session startup. -
Add
pngx tags create|update|delete,pngx correspondents create|update|delete,pngx document-types create|update|delete, and a newpngx storage-pathscategory withlist|create|update|delete. All acceptIDor exact name as input; ambiguous names surface a candidate list. -
Add
ApiError::BadRequestandApiError::ValidationErrorvariants and thread them through exit codes (both → 2) and--json-errorscodes (bad_request,validation_error). -
Add
pngx documents upload FILE [--title] [--created] [--correspondent] [--document-type] [--tags] [--storage-path] [--asn] [--wait] [--wait-timeout]. Without--wait, prints the consumption task UUID; with--wait, polls/api/tasks/until the task completes and prints the created document ID. The upload body streams directly from disk so multi-hundred-megabyte scans don't double in memory. -
Add
ApiError::TaskPending(wait timed out) andApiError::TaskUnknown(task not visible after repeated polls, likely reaped by Celery) with--json-errorscodestask_pendingandtask_unknown; both map to exit code 4. -
Add
pngx documents update IDwith--title,--created,--correspondent,--document-type,--storage-path,--tags(replace-all),--add-tag/--remove-tag(atomic viabulk_edit), and--asn. Per-tag edits route throughbulk_editto avoid the read-modify-write race that--tagsstill carries. -
Add
pngx documents delete ID...(with--yesfor non-interactive contexts),pngx documents tag IDS... TAGS...,pngx documents untag IDS... TAGS..., and a genericpngx documents bulk METHOD --ids ... --params '{...}'escape hatch. -
Mirror every new CLI write command as an MCP tool:
documents_upload,documents_update,documents_delete,documents_tag,documents_untag,documents_bulk_edit, plus{tags,correspondents, document_types,storage_paths}_{create,update,delete}and astorage_pathsread tool. Writes carryreadOnlyHint: false; every*_deletetool anddocuments_bulk_editadditionally carrydestructiveHint: true.
Changed
- Restructure the
tags,correspondents, anddocument-typescommands into subcommand groups. Barepngx tags,pngx correspondents, andpngx document-typesstill list (default action); output flags (-o,-F) now live on the explicitlistsubcommand. - Narrow the plugin's pre-allowed
settings.jsonpermissions to read verbs only. Every mutatingpngxverb now appears in theasklist — Claude Code prompts for permission on each invocation rather than pre-approving. Users may still promote commands toallowin their own runtime settings. - Tighten
skills/paperless/SKILL.mdallowed-toolsfrontmatter to an explicit list of read verbs. Writes are documented in prose and rely on theasklist for per-call approval.
0.7.1 - 2026-03-07
Fixed
- Bump Claude Code plugin version to match release
0.7.0 - 2026-03-07
Added
- Add
-F/--fieldsflag for field filtering across all output commands - Add
-o ndjsonoutput format for streamable newline-delimited JSON - Add
--json-errorsflag andPNGX_JSON_ERRORSenv var for structured error output on stderr - Add
pngx mcpcommand for MCP (Model Context Protocol) server over stdio with 9 read-only tools - Add exit code 5 for configuration errors (missing URL or token)
Fixed
- Emit structured JSON/NDJSON output for empty search and inbox results instead of a plain text message
0.6.3 - 2026-02-23
Fixed
- Use session ID instead of parent PID for nudge hook deduplication marker
0.6.2 - 2026-02-20
Added
- Auto-approve paperless skill invocation in plugin permissions
0.6.1 - 2026-02-20
Fixed
- Fix plugin version not being picked up from marketplace cache
0.6.0 - 2026-02-20
Added
- Plugin settings with default permissions for pngx commands
- Memory support for paperless skill
Changed
- Migrate nudge hook from PreToolUse workaround to PostToolUse
0.5.1 - 2026-02-09
Fixed
- Fix plugin hook using PostToolUse additionalContext which is not implemented for built-in tools
0.5.0 - 2026-02-09
Added
- Plugin hook that nudges agents to use the paperless skill when running pngx commands directly
0.4.0 - 2026-02-08
Added
auth statusshows authenticated user display name
Fixed
- Fix
versionandauth statusfailing on Paperless-ngx 2.x (nested API response)
0.3.0 - 2026-02-08
Added
inboxcommand to list unprocessed documentsversioncommand shows Paperless-ngx server version when configuredauth statusverifies server connection and shows server version
Changed
versioncommand errors (exit 4) when configured server is unreachable-o/--outputflag only shown on commands that produce formatted output
0.2.0 - 2026-02-08
Changed
- Bump MSRV to 1.93 (Rust edition 2024)
- Upgrade etcetera to 0.11
0.1.0 - 2026-02-07
Added
pngx-clientcrate: API client library for Paperless-ngxpngxcrate: CLI binary with search, list, download commands- Configuration via TOML file, environment variables, and CLI flags
- Multiple output formats: table, JSON, Markdown, plain
- CI workflow with fmt, clippy, test (stable + MSRV 1.85), and docs
- Release workflow with cross-compiled binaries
- Agent skill for Paperless-ngx document search