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:

  1. Go to Settings → Upload
  2. Click Generate ShareX Config
  3. Download the .sxcu file
  4. 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:

z}iplirneev.eyrosuer_dpormoaxiyn.lcoocmal{host:3000

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.