pput
Upload documents to a paperless-ngx instance from the command line.
A single bash script over the paperless REST API. It posts each file, then polls the task queue until the document is consumed, so you get a real result per file instead of a fire-and-forget task id.
Usage
pput FILE [FILE...]
$ pput fattura.pdf
OK fattura.pdf -> doc 48
$ pput *.pdf
OK bolletta.pdf -> doc 49
FAIL vecchia.pdf: duplicate of doc 12
Exit status is 0 when every file was consumed, 1 if any failed, timed out, or was unreadable. That makes it safe to chain:
pput scan.pdf && rm scan.pdf
Paperless rejects re-uploads of identical content, reported as
duplicate of doc N.
File manager integration
pput.desktop adds an "Upload to Paperless" entry to the right-click menu for
PDFs, for file managers that read the DES-EMA actions format (pcmanfm-qt,
Caja, Nemo). It runs pput-gui, a wrapper that reports the result as a
desktop notification, since a click has no terminal to print to. One file or a
whole selection both work.
ln -s "$PWD/pput-gui" ~/bin/pput-gui
ln -s "$PWD/pput.desktop" ~/.local/share/file-manager/actions/pput.desktop
Exec= calls pput-gui by name, so it must be on the PATH your desktop
session exports; use an absolute path there instead if it is not. Restart the
file manager to pick up a new action.
Requirements
bash,curl,python3(stdlib only)passholding a paperless API token
Configuration
The API token is read from pass, never passed on the command line. Create an
entry with a token from the paperless web UI, under Settings, My Profile,
API Token:
pass insert proxmox/paperless/api
Everything else is environment, with defaults baked in for the author's setup:
| Variable | Default | Meaning |
|---|---|---|
PAPERLESS_URL |
http://paperless.lan:8000 |
base URL of the instance |
PAPERLESS_PASS_ENTRY |
proxmox/paperless/api |
pass entry with the API token |
PAPERLESS_TIMEOUT |
120 |
seconds to wait per document |
PAPERLESS_URL=https://paperless.example.org pput scan.pdf
Raise PAPERLESS_TIMEOUT if OCR of large scans outruns the default; the upload
still succeeds server-side, only the wait gives up.
Note the API token is sent as a header, so an http:// instance transmits it
in cleartext. Use it on a trusted network, or put the instance behind TLS.
Install
git clone <repo> ~/Programming/GIT/pput
ln -s ~/Programming/GIT/pput/pput ~/bin/pput
Tests
./test_status.sh
Checks the task-response parser against the shapes the paperless API returns: pending, success, duplicate, and other failures.
License
GPLv2. See LICENSE.
Development Approach
This project is developed using AI-assisted tools. Code is generated with the help of AI based on human-provided specifications, design decisions, and iterative feedback.
All contributions are reviewed, tested, and curated by the maintainer before being included in the codebase. AI is used as a productivity and exploration tool, while human oversight remains central to all decisions.
The goal is to combine the flexibility of AI-assisted development with standard open-source practices such as transparency, review, and accountability.
