A Python pastebin that tries to keep it simple.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Simon de Vlieger 1865742894 doc: fix path hack 1 day ago
.github/workflows ci: add vulnerability scanners 1 day ago
doc doc: fix path hack 1 day ago
etc move config examples into `etc/` 1 day ago
src lint: lie to mypy 1 day ago
test ci: make linters run green in ci 5 months ago
.dockerignore container: add .dockerignore 1 day ago
.gitignore Correctly ignore documentation build folder. 2 years ago
.pre-commit-config.yaml lint: add bandit and pip-audit 1 day ago
AUTHORS.rst chore: update AUTHORS/pyproject.toml with realname 7 months ago
CHANGELOG.rst release: set date 1 day ago
Containerfile package: change to src-layout 1 day ago
LICENSE MIT license. 3 years ago
README.md docs: correctly format code block 4 months ago
poetry.lock lint: add bandit and pip-audit 1 day ago
pyproject.toml lint: add bandit and pip-audit 1 day ago
requirements.txt deps: tomli only < 3.11 1 day ago


pinnwand logo, a rabbit



pinnwand is Python pastebin software that tried to keep it simple but got a little more complex.


  • Python >= 3.7
  • Tornado
  • sqlalchemy
  • click
  • docutils
  • tomli
  • pygments-better-html
  • a database driver



Enter text, click "Paste", easy enough.


steck is a command line client to pinnwand instances:

€ pip install --user steck
€ steck paste *
You are about to paste the following 7 files. Do you want to continue?
- mypy.ini
- poetry.lock
- pyproject.toml
- README.rst
- requirements.txt
- steck.py

Continue? [y/N] y

Completed paste.
View link:    https://localhost:8000/W5
Removal link: https://localhost:8000/remove/TS2AFFIEHEWUBUV5HLKNAUZFEI


pinnwand has a direct endpoint for curl users:

€ echo "foo" | curl -X POST http://localhost:8000/curl -F 'raw=<-'
Paste URL:   http://localhost:8000/OE
Raw URL:     http://localhost:8000/raw/GU
Removal URL: http://localhost:8000/remove/GQBHGJYKRWIS34D6FNU6CJ3B5M
€ curl http://localhost:8000/raw/GU

This will preselect the lexer and expiry arguments to be text and 1day respectively. You can provide those to change them.


pinnwand provides a straight forward JSON API, here's an example using the common requests library:

>>> requests.post(
...     "http://localhost:8000/api/v1/paste",
...     json={
...             "expiry": "1day",
...             "files": [
...                     {"name": "spam", "lexer": "python", "content": "eggs"},
...             ],
...     }
... ).json()
{'link': 'http://localhost:8000/74', 'removal': 'http://localhost:8000/remove/KYXQLPZQEWV2L4YZM7NYGTR7TY'}

More information about this API is available in the documentation.

More ways to use pinnwand

Various deprecated ways of posting are still supported, don't implement these for any new software but if you are maintaining old software and want to know how they used to work you can read our documentation_.

If you do use a deprecated endpoint to post a warning will be shown below any pastes that are created this way.

Reporting bugs

Bugs are reported best at pinnwand's project page on github. If you just want to hang out and chat about pinnwand then I'm available in the #pinnwand channel on Freenode IRC.


pinnwand is distributed under the MIT license. See LICENSE for details.


This pastebin has quite a long history which isn't reflected entirely in its repository.