Notices
Public posts with image or .txt attachments, optional countdown timers, draft and hide controls.
A minimal, JavaScript-free self-hosted app. Post notices and files, and let visitors send anonymous messages with no account, e-mail or name. One Python file, built on Flask and SQLite.
Public posts with image or .txt attachments, optional countdown timers, draft and hide controls.
Visitors get a Ticket and Key. No account, e-mail or name. Messages are stored AES-256-GCM encrypted.
Server-rendered pages with a strict Content-Security-Policy. Threads refresh through a meta-refresh iframe.
Operator-uploaded files of any type, served as attachments.
CSRF tokens on every POST, Argon2 admin password, short-lived admin sessions, request size limits, rate limits, magic-byte checks on attachments.
Storage quotas, retention-based purge, orphan file sweep, and a check command for missing or stale files.
You need Python 3.10+, a non-root user, and Tor if you want to publish it as an onion service.
git clone https://github.com/Sheikhlipu123/tinydesk.git
cd tinydesk
pip install -r requirements.txt
export ONION_SECRETS=/etc/tinydesk
export ONION_DATA=/var/lib/tinydesk
export ADMIN_PREFIX=$(python3 -c "import secrets;print(secrets.token_hex(8))")
python app.py init
python app.py setpass
python app.py status
gunicorn -w 1 --threads 4 -b 127.0.0.1:8000 --access-logfile /dev/null app:app
torrc, restarting Tor, and reading your address from the hostname file:
HiddenServiceDir /var/lib/tor/tinydesk/
HiddenServiceVersion 3
HiddenServicePort 80 127.0.0.1:8000
| Variable | Default | Meaning |
|---|---|---|
ONION_SECRETS | /etc/onionsite | Keys and admin hash |
ONION_DATA | /var/lib/onionsite | Database and uploaded files |
ADMIN_PREFIX | admin | URL prefix of the admin area. Set your own. |
MAX_FILE_MB | 25 | Largest upload |
QUOTA_MB | 500 | Total space for files and attachments |
CONV_QUOTA_MB | 200 | Total space for messages |
RETENTION_DAYS | 30 | Delete idle threads on purge. 0 keeps everything. |
Tiny Desk is honest about what it does and does not protect:
msg.key makes stored messages unreadable.Tiny Desk is a minimal, JavaScript-free notice board and anonymous message desk for Tor onion services, built with Flask and SQLite in a single Python file.
No. Pages are server-rendered. Message threads refresh through a meta-refresh iframe.
No. Messages are encrypted at rest with AES-256-GCM, but the operator can read them. Tor protects the transport.
No. Visitors receive a Ticket and Key after sending a message. No account, e-mail or name is required.
Yes, for local or internal use. Set COOKIE_SECURE=1 only when you serve it behind HTTPS.
If Tiny Desk helps you, star the repository, open an issue with your use case, or send a pull request. Source code: github.com/Sheikhlipu123/tinydesk.