Lock down your data. Send it securely.
Cryptex is a self-hosted platform for sharing text and files securely.
- Self-hosted — deploy with a single Docker command. Your data stays on your server.
- Simple secure sharing — share text and files with optional password protection.
- Password protection — protect access with a password, or generate one automatically.
- Self-destruct — optionally destroy a cryptex automatically after it's been opened.
- Expiration — set a time limit (minutes, hours, or days) after which the cryptex is permanently deleted.
- Public / Private mode — run open to anyone, or require an invite link to create a cryptex.
- Invite links — create shareable invite links that allow others to create Cryptexs, even in private mode.
- Admin panel — monitor active Cryptexs, manage invite links, configure limits, and enable two-factor authentication.
- Multipart file uploads — large files are uploaded in chunks for reliability.
- QR code sharing — generate a QR code for easy mobile access.
- API support — fully documented API with API key authentication for programmatic access.
docker run -d \
--name cryptex \
-p 80:80 \
-v ./data:/cryptex/data \
--restart unless-stopped \
poliuscorp/cryptexservices:
cryptex:
image: poliuscorp/cryptex
container_name: cryptex
restart: unless-stopped
ports:
- "80:80"
volumes:
- ./data:/cryptex/dataThen open http://localhost.
The
./datavolume persists the database and uploaded files across container restarts. Replace it with any host path you prefer.
| Variable | Default | Description |
|---|---|---|
MODE |
public |
public allows anyone to create a cryptex. private restricts creation to authenticated users or valid invite links |
ADMIN_PASSWORD |
— | Bcrypt hash used to override the default admin password (admin) |
MAX_MESSAGE_LENGTH |
1000 |
Max characters per cryptex |
MAX_FILE_COUNT |
3 |
Max file attachments per cryptex |
MAX_FILE_SIZE |
100mb (100 MB) |
Max size per file (500kb, 10mb, 1gb) |
MAX_EXPIRATION |
1d (1 day) |
Max expiration time (30m, 24h, 30d) |
RATE_LIMIT |
30 |
Max requests per minute per IP for create/open endpoints |
Manage Cryptexs, invite links, settings, and 2FA at http://localhost/login.
Default password: admin — change it in production.
Generate a custom password hash:
pip install bcrypt
python3 -c "import bcrypt, getpass; p = getpass.getpass('Enter password: '); print(bcrypt.hashpw(p.encode(), bcrypt.gensalt()).decode())"Then set ADMIN_PASSWORD in your environment:
environment:
- ADMIN_PASSWORD=$2b$12$LJ3m4ys3uz0Cb6PEhV7hXOBFg7b6I1MeZaYvLYEPYj5KzKIO/3CxmNote: If you're using the Docker CLI (-e flag), wrap the hash in single quotes:
-e ADMIN_PASSWORD='$2b$12$LJ3m4ys3uz0Cb6PEhV7hXOBFg7b6I1MeZaYvLYEPYj5KzKIO/3Cxm'docker pull poliuscorp/cryptex
docker stop cryptex && docker rm cryptex
docker run -d \
--name cryptex \
-p 80:80 \
-v ./data:/cryptex/data \
--restart unless-stopped \
poliuscorp/cryptexdocker compose pull
docker compose up -dThe ./data volume preserves your database and files across upgrades.
This project is licensed under the MIT License.
