Chiyogami is a sleek, modern pastebin with encryption, customizable expiry, private pastes, user accounts and an API for developers.
✨ Features
- ✔ Beautiful & Responsive UI — Built with TailwindCSS & DaisyUI for a clean and modern look.
- 🖍 Syntax Highlighting — Automatic formatting with HighlightJS.
- 📝 Markdown Rendering — Automatic formatting with Marked.
- ⏳ Configurable Expiry — Set custom expiration times with API.
- 🔒 Secure & Private — Client-side encryption with WebCryptoAPI for encrypted pastes. No password saved in server.
- 📡 Powerful API — Create and fetch pastes without leaving the terminal.
- 🔍 Public Pastes — List & search all public pastes.
- 🔑 Private Pastes — Only accessible via a unique, unguessable link for enhanced privacy (use encryption on web UI for ultimate privacy).
- 🗄 Local Storage — Uses SQLite for a lightweight, self-hostable database.
- 👤 User Accounts — Create & manage your pastes with authentication.
- 🔗 Easy Sharing — Share paste links or scan a QR code for instant access.
- 🛡 Built-in Rate Limiting — Protects against spam and abuse with smart request throttling.
- 🐳 Easy self-host with docker.
Docker. Build it or check docker-compose file for example with pre-built images.
docker run -d \
-v "$(pwd)/pastes:/pastes" \
-p 127.0.0.1:8000:8000 \
--restart unless-stopped \
ghcr.io/rhee876527/chiyogami:latest
Env | Default value | Note |
---|---|---|
SECRET_KEY | None | Session key. Keep secure and unique. Recommended example: openssl rand -base64 32. |
PASTE_DEFAULT_EXPIRATION | 24h | Valid time units are “ns”, “us” (or “µs”), “ms”, “s”, “m”, “h” or "Never" |
MAX_CHAR_CONTENT | 50000 | Maximum characters allowed in content body. Larger limits may offer reduced performance |
DISABLE_RATE_LIMIT | None | Use 1 to disable rate limit |
CREATE_PER_MIN | 5 | No of paste creation requests allowed per minute |
DATABASE_PATH | None | For local development use. Conflicts with docker volume paths. |
Web UI is simple & straightforward. Or use the API
.
FILE
curl http://localhost:8000/paste -T sample.txt
or JSON
curl -X POST \
http://localhost:8000/paste \
-H 'Content-Type: application/json' \
-d '{"content":"Test paste"}'
response: {"title":"OkxI"}
Note: Pastes are created by default with Public
visibility
. They can be accessed from api or website.
Change this to Private
or Unlisted
to make the paste undiscoverable. Pastes are also set to expire within 24hrs if expiry is not specified.
You can set a default expiry for new pastes with PASTE_DEFAULT_EXPIRATION
.
curl -X POST \
http://localhost:8000/paste \
-H 'Content-Type: application/json' \
-d '{"content":"Test", "visibility":"Private", "expiration":"48h"}'
response: {"title":"euVa"}
curl -X GET http://localhost:8000/paste/bZTR -H "Accept: application/json"
response:
{"ID":22,"CreatedAt":"2025-02-04T19:48:06.747679947Z","UpdatedAt":"2025-02-04T19:48:06.747679947Z","DeletedAt":null,"Title":"bZTR","Content":"test private","Visibility":"Private","expiration":"2025-02-05T19:48:06.747635027Z","IsEncrypted":false,"UserID":0,"IsUserPaste":false}
curl -X POST \
http://localhost:8000/register \
-H 'Content-Type: application/json' \
-d '{"username":"test", "Password":"test"}'
response: {"message":"User registered successfully"}
curl -X DELETE http://localhost:8000/paste/EIKq \
-b "session=MTczNzA2NDI5NXxEWDhFQVFMX2dBQUJFQUVRQUFBZl80QUFBUVp6ZEhKcGJtY01DUUFIZFhObGNsOXBaQVIxYVc1MEJnSUFEQT09fLnhi2OxsN6coY5ZmmBeA0tPXUcsKiii6ECOoJ7yrqNC"
response: {"message":"Paste deleted successfully"}
This software is free to use in accordance with the license.