Self-Hosting Zipline: A Modern File Sharing and Screenshot Server
Taking a screenshot, uploading it somewhere, and sharing the link should be a two-second operation. But most screenshot tools either compress your images, slap watermarks on them, delete files after 30 days, or wrap everything in ads. If you share files and screenshots regularly — for bug reports, documentation, quick collaboration, or just showing someone something on your screen — a self-hosted upload server eliminates all of that friction.
Zipline is a modern, self-hosted file sharing and screenshot upload server. It handles image uploads, file sharing, URL shortening, code/text paste, and more, all behind a clean dashboard with user management and a powerful API.
What Zipline Does
Zipline is designed to be the backend for your screenshot and file sharing workflow:
- File uploads — drag-and-drop or API-based uploads for any file type
- Screenshot integration — works with ShareX, Flameshot, and other screenshot tools
- URL shortening — create short links to any URL
- Text/code paste — paste bin functionality with syntax highlighting
- Gallery view — browse all your uploads in a visual gallery
- User management — multi-user with individual upload tokens and quotas
- Discord/OpenGraph embeds — customizable embed previews when links are shared
- Folders — organize uploads into folders
- Expiring uploads — set files to auto-delete after a time period
- Statistics — track upload counts, storage usage, and popular files
Why not just use Imgur or similar services
Third-party image hosts come with trade-offs:
- Compression — most services re-compress your images
- Link rot — files get deleted after inactivity periods
- Privacy — your uploads may be indexed, scraped, or used for training data
- Ads — the viewer experience is cluttered
- File type limits — many only handle images, not arbitrary files
- Size limits — free tiers restrict file size significantly
Zipline vs. Alternatives
| Feature | Zipline | Linx | XBackBone | Lsky Pro |
|---|---|---|---|---|
| Self-hosted | Yes | Yes | Yes | Yes |
| File uploads | Any type | Any type | Images | Images |
| URL shortener | Yes | No | No | No |
| Text paste | Yes | Yes | No | No |
| Multi-user | Yes | No | Yes | Yes |
| ShareX support | Excellent | Good | Good | Good |
| Gallery view | Yes | No | Yes | Yes |
| Discord embeds | Customizable | Basic | Basic | Basic |
| Folders | Yes | No | Yes | Yes |
| API | Full REST API | Yes | Basic | Yes |
| Expiring uploads | Yes | Yes | No | No |
| Syntax highlighting | Yes | Yes | N/A | N/A |
| Tech stack | Next.js | Go | PHP | PHP |
| Resource usage | Moderate | Very low | Low | Low |
| Active development | Very active | Maintained | Slow | Active |
Why Zipline
Zipline is the most feature-complete option. It combines file uploading, URL shortening, and text paste into a single application with a polished dashboard. If you only need image hosting, XBackBone is simpler. If you want minimal resource usage, Linx (written in Go) is lighter. But for a full-featured upload server, Zipline is the strongest choice.
Self-Hosting Zipline: Setup
Server requirements
- Minimum: 512 MB RAM, 1 CPU core
- Recommended: 1 GB RAM, 2 CPU cores
- Storage: depends entirely on your upload volume — plan for 10-50 GB for personal use
Docker Compose setup
services:
zipline:
container_name: zipline
image: ghcr.io/diced/zipline:latest
ports:
- "3000:3000"
environment:
CORE_SECRET: "change-me-to-a-long-random-string"
CORE_DATABASE_URL: "postgresql://zipline:zipline@postgres:5432/zipline"
CORE_RETURN_HTTPS: "true"
CORE_HOST: "0.0.0.0"
CORE_PORT: "3000"
volumes:
- zipline-uploads:/zipline/uploads
- zipline-public:/zipline/public
depends_on:
postgres:
condition: service_healthy
restart: always
postgres:
container_name: zipline-db
image: postgres:15-alpine
environment:
POSTGRES_DB: "zipline"
POSTGRES_USER: "zipline"
POSTGRES_PASSWORD: "zipline"
volumes:
- zipline-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U zipline"]
interval: 10s
timeout: 5s
retries: 5
restart: always
volumes:
zipline-uploads:
zipline-public:
zipline-db:
Generating the secret
openssl rand -hex 32
Replace change-me-to-a-long-random-string with the generated value.
Starting the service
docker compose up -d
Access Zipline at http://your-server:3000. The default administrator credentials are:
- Username: administrator
- Password: password
Change these immediately after first login.
ShareX Integration
ShareX is the most popular screenshot tool on Windows, and Zipline's integration is first-class.
Configuring ShareX
- In Zipline, go to your user settings and copy your upload token
- In ShareX, go to Destinations > Custom Uploader Settings
- Create a new uploader with these settings:
Request type: POST
Request URL: https://your-zipline-domain.com/api/upload
Headers:
Authorization: your-upload-token
Body: Form data (multipart/form-data)
File form name: file
URL: {json:files[0]}
- Set the custom uploader as your default image and file destination
- Take a screenshot — it uploads to Zipline and copies the URL to your clipboard automatically
Flameshot integration (Linux)
For Linux users using Flameshot:
#!/bin/bash
# Save screenshot and upload to Zipline
flameshot gui -r | curl -s \
-H "Authorization: your-upload-token" \
-F "file=@-;filename=screenshot.png" \
"https://your-zipline-domain.com/api/upload" | jq -r '.files[0]' | xclip -selection clipboard
Save this as a script and bind it to a keyboard shortcut.
macOS integration
Use the built-in screenshot tool with a script:
#!/bin/bash
# Take screenshot to temp file
screencapture -i /tmp/screenshot.png
# Upload to Zipline
URL=$(curl -s \
-H "Authorization: your-upload-token" \
-F "file=@/tmp/screenshot.png" \
"https://your-zipline-domain.com/api/upload" | jq -r '.files[0]')
echo "$URL" | pbcopy
rm /tmp/screenshot.png
URL Shortening
Zipline includes a built-in URL shortener:
- Go to URLs in the dashboard
- Enter the long URL and optionally set a custom slug
- Get a short URL like
https://your-domain.com/go/abc123
You can also create short URLs via the API:
curl -X POST "https://your-zipline-domain.com/api/shorten" \
-H "Authorization: your-upload-token" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/very/long/path", "vanity": "mylink"}'
Text and Code Paste
Zipline works as a paste bin with syntax highlighting:
- Go to Text in the dashboard
- Paste your code or text
- Select the language for syntax highlighting
- Get a shareable link with a clean, highlighted view
This is useful for sharing code snippets, configuration files, or log excerpts.
Discord Embed Customization
When you share a Zipline link in Discord, it generates an embed preview. You can customize this:
- Go to Settings > Embed
- Set a custom title, description, and color
- The embed will show a preview of the uploaded image or file info
Per-upload embed overrides are also available via the API, letting you set custom titles and descriptions for specific uploads.
User Management
For shared instances, Zipline supports multiple users:
- Create users in the admin panel with individual upload tokens
- Set quotas to limit storage per user
- User roles — administrators and regular users
- Per-user galleries — each user sees only their own uploads
- Invite links — generate registration links for new users
API Overview
Zipline's REST API covers all functionality:
# Upload a file
curl -X POST "https://your-domain.com/api/upload" \
-H "Authorization: your-token" \
-F "[email protected]"
# List uploads
curl "https://your-domain.com/api/user/files" \
-H "Authorization: your-token"
# Delete a file
curl -X DELETE "https://your-domain.com/api/user/files/abc123" \
-H "Authorization: your-token"
# Shorten a URL
curl -X POST "https://your-domain.com/api/shorten" \
-H "Authorization: your-token" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'
The API enables automation — automated screenshot uploads, CI/CD artifact sharing, or programmatic file distribution.
Reverse Proxy Setup
Caddy:
share.yourdomain.com {
reverse_proxy localhost:3000
}
Nginx:
server {
server_name share.yourdomain.com;
client_max_body_size 100M;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Note the client_max_body_size directive in Nginx — without it, large file uploads will fail. Set this to match the maximum file size you want to allow.
Storage Management
Over time, uploads accumulate. Manage storage with these strategies:
- Expiring uploads — set a default expiration for uploads (e.g., 30 days)
- User quotas — limit per-user storage to prevent runaway usage
- Periodic cleanup — review and delete old uploads through the dashboard
- External storage — Zipline supports S3-compatible storage backends for larger deployments
S3 storage configuration
For offloading storage to S3 or a compatible service (MinIO, Cloudflare R2):
environment:
DATASOURCE_TYPE: "s3"
DATASOURCE_S3_ACCESS_KEY_ID: "your-access-key"
DATASOURCE_S3_SECRET_ACCESS_KEY: "your-secret-key"
DATASOURCE_S3_BUCKET: "zipline-uploads"
DATASOURCE_S3_ENDPOINT: "https://s3.amazonaws.com"
DATASOURCE_S3_REGION: "us-east-1"
Honest Trade-offs
Zipline is great if you:
- Share screenshots and files frequently
- Want a polished dashboard with user management
- Use ShareX or Flameshot for screenshots
- Need URL shortening and paste bin in one tool
- Want Discord embed customization
Consider Linx instead if you:
- Want minimal resource usage
- Prefer a single static binary (Go)
- Don't need a web dashboard or user management
- Just need upload and serve
Consider XBackBone instead if you:
- Only share images (not arbitrary files)
- Want a simpler setup with PHP
- Prefer a lighter application
Consider just using a CDN/S3 bucket if you:
- Only need file hosting, not a UI
- Want to minimize moving parts
- Are comfortable with CLI-only workflows
The bottom line: Zipline is the best self-hosted option for people who share files and screenshots as part of their daily workflow. The ShareX integration makes the capture-upload-share loop nearly instant, the dashboard is genuinely well-designed, and features like URL shortening and text paste mean you get a multi-purpose sharing tool in one package. The main cost is resource usage — it runs a Next.js application with PostgreSQL, which is heavier than simpler alternatives.