If you’ve ever wanted a private file hosting service that works seamlessly with ShareX, Flameshot, or any screenshot tool — Zipline is exactly what you need. It’s fast, modern, and packed with features that make Imgur uploads feel prehistoric.
What is Zipline?
Zipline is a self-hosted file hosting server built with Next.js. It handles image uploads, file sharing, URL shortening, and text pastes — all through a clean web dashboard or API. The killer feature? Native ShareX and Flameshot integration, so your screenshots go straight to your own server instead of some third-party service.
Why Self-Host Your File Uploads?
- Privacy: Your screenshots and files stay on your hardware
- No size limits: Upload whatever your disk can handle
- No expiration: Files stay forever (or until you delete them)
- Custom domain: Share links from your own URL
- API access: Automate uploads from scripts, bots, or CI/CD pipelines
- Zero ads: No watermarks, no signup walls, no tracking
Prerequisites
Before starting, you’ll need:
- A Linux server (Ubuntu 22.04+ or Debian 12+ recommended)
- Docker and Docker Compose installed
- A domain name pointed at your server (optional but recommended)
- A reverse proxy like Nginx Proxy Manager, Traefik, or Caddy
- At least 1GB RAM and whatever disk space you want for uploads
Step 1: Create the Project Directory
mkdir -p ~/zipline && cd ~/zipline
Step 2: Create the Docker Compose File
Create docker-compose.yml:
version: "3.7"
services:
zipline:
image: ghcr.io/diced/zipline
container_name: zipline
restart: unless-stopped
ports:
- "3000:3000"
environment:
- CORE_SECRET=your-super-secret-key-change-this
- CORE_DATABASE_URL=postgresql://zipline:zipline@postgres:5432/zipline
- CORE_RETURN_HTTPS=true
- CORE_HOST=0.0.0.0
- CORE_PORT=3000
volumes:
- ./uploads:/zipline/uploads
- ./public:/zipline/public
depends_on:
- postgres
postgres:
image: postgres:16-alpine
container_name: zipline-db
restart: unless-stopped
environment:
- POSTGRES_USER=zipline
- POSTGRES_PASSWORD=zipline
- POSTGRES_DB=zipline
volumes:
- ./postgres-data:/var/lib/postgresql/data
Important: Change CORE_SECRET to a random string. Generate one with:
openssl rand -hex 32
Step 3: Start Zipline
docker compose up -d
Wait about 30 seconds for the database to initialize, then check the logs:
docker compose logs -f zipline
You should see Zipline starting on port 3000.
Step 4: Initial Setup
Open your browser and navigate to http://your-server-ip:3000. You’ll see the login page.
Default credentials:
- Username:
administrator - Password:
password
Change these immediately after logging in. Go to Settings → Account and update your password.
Step 5: Configure ShareX Integration
This is where Zipline really shines. In the Zipline dashboard:
- Go to Settings → Upload
- Click Generate ShareX Config
- Download the
.sxcufile - Double-click it to import into ShareX
Now every screenshot you take with ShareX automatically uploads to your Zipline instance. The URL is copied to your clipboard instantly.
Flameshot Integration
For Linux users with Flameshot, create a script:
#!/bin/bash
# ~/bin/zipline-upload.sh
ZIPLINE_URL="https://your-zipline-domain.com"
ZIPLINE_TOKEN="your-api-token-here"
flameshot gui --raw | curl -s \
-H "Authorization: $ZIPLINE_TOKEN" \
-H "Content-Type: image/png" \
-H "Format: random" \
--data-binary @- \
"$ZIPLINE_URL/api/upload" | jq -r '.files[0]' | xclip -selection clipboard
notify-send "Zipline" "Screenshot uploaded and URL copied!"
Make it executable and bind it to a keyboard shortcut:
chmod +x ~/bin/zipline-upload.sh
Step 6: Set Up a Reverse Proxy
For HTTPS access with a custom domain, add Zipline to your reverse proxy. Here’s a Caddy example:
Or with Nginx:
server {
listen 443 ssl http2;
server_name zipline.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: Set client_max_body_size to whatever maximum upload size you want. The default Nginx limit of 1MB will block most file uploads.
Step 7: Configure Upload Settings
In the Zipline dashboard under Settings, configure:
- Max file size: Set based on your available disk space
- Allowed file types: Restrict to images only, or allow everything
- URL format: Random strings, dates, emoji, or UUIDs
- Expiration: Auto-delete files after X days (optional)
- Compression: Enable image compression to save disk space
Features Worth Exploring
URL Shortener
Zipline includes a built-in URL shortener. Go to URLs in the dashboard to create short links from your domain. Great for sharing long URLs without relying on bit.ly or similar services.
Text Pastes
Need to share a code snippet? Zipline has a paste bin built in with syntax highlighting. Go to Text to create pastes with optional expiration.
Folders and Organization
Organize your uploads into folders directly from the dashboard. Useful when you’re hosting screenshots for multiple projects.
Invites and Multi-User
Want to let friends or team members upload to your instance? Generate invite codes under Settings → Invites. Each user gets their own dashboard, API token, and upload history.
Embed Customization
Customize how your links appear when shared on Discord, Twitter, or other platforms. Set custom titles, descriptions, colors, and author text for the OpenGraph embeds.
Troubleshooting
Uploads failing with 413 error
Your reverse proxy is blocking large files. Increase client_max_body_size in Nginx or the equivalent in your proxy.
Database connection errors
Make sure PostgreSQL is fully started before Zipline tries to connect:
docker compose restart zipline
ShareX config not working
Verify your API token is correct and your domain is accessible from your local machine. Test with curl:
curl -H "Authorization: your-token" https://your-zipline-domain.com/api/user
High memory usage
Zipline runs on Next.js which can be memory-hungry. If you’re on a small server, set a memory limit:
services:
zipline:
mem_limit: 512m
Backup Strategy
Your important data lives in two places:
# Uploads directory
~/zipline/uploads/
# Database
~/zipline/postgres-data/
Back up both regularly. For the database, you can also use pg_dump:
docker exec zipline-db pg_dump -U zipline zipline > zipline-backup.sql
Conclusion
Zipline is one of those self-hosted tools that you don’t realize you need until you have it. The ShareX integration alone makes it worth setting up — there’s nothing faster than taking a screenshot and having the URL on your clipboard a second later, hosted on your own infrastructure.
Combined with URL shortening and paste bin features, it replaces three separate services with one clean dashboard. And since it’s all on your hardware, there are no upload limits, no expiration, and no privacy concerns.
The entire setup takes about 10 minutes with Docker. Give it a try and you’ll never go back to Imgur.