zipline is a free, open source file management & sync project written in TypeScript and released under MIT. It has 3,430 GitHub stars, 256 forks and 6 open issues, and was last pushed 5 days ago. On this registry it ranks #26 of 36 tracked projects in File Management & Sync, with 5 head-to-head comparisons available.

What is zipline?

Zipline is a self-hosted ShareX and general file upload server, written in TypeScript and released under the MIT licence, for individuals and teams who want their own destination for screenshots, files and shortened links instead of uploading to somebody else's service.

What it is

Zipline belongs to the ShareX ecosystem. Its topics list sharex, sharex-server and sharex-uploader next to screenshot, file-upload, file-sharing, file-server and gallery, making it the server half of that pairing rather than a desktop client. It exposes the upload endpoint, keeps the files, and returns the resulting links, while a React and Mantine interface provides the browsable gallery. The repository is written in TypeScript, licensed MIT, and carries 3430 stars, 256 forks and 6 open issues, with the last push on 19 September 2026.

The thing it replaces is pointing ShareX at somebody else's upload destination. Instead of screenshots going to a third-party host, an operator runs Zipline on their own infrastructure, sets their own CORE_HOSTNAME and CORE_PORT, and decides where bytes live through DATASOURCE_LOCAL_DIRECTORY or S3. In doing so it also replaces a bare static file directory with a managed service: folders, tags, quotas, invites and authentication are handled by the server rather than by the filesystem.

Key capabilities

  • Accepts any file type and organises uploads with folders and tags, with a gallery for browsing what has been stored.
  • Generates URL shortlinks and embeds for uploaded content alongside the upload itself.
  • Fires notifications through Discord webhooks and generic HTTP webhooks, and exposes an API for further integration.
  • Secures access with OAuth2 login, two-factor authentication, passkeys and per-upload password protection.
  • Processes media server-side with image compression and video thumbnails.
  • Supports multiple users through invites and quotas, allowing an operator to admit and limit accounts.
  • Ships as an installable PWA with custom themes, and runs from the ghcr.io/diced/zipline image against PostgreSQL, with storage on the local filesystem or S3.

Who uses it and how

  • Individual ShareX users who want screenshots to land in their own ./uploads directory and be served from their own domain, with a Discord webhook posting each resulting link into a channel.
  • Operators running the recommended Docker Compose stack: a postgres:16 service with a pgdata volume beside a Zipline service published on port 3000, with ./uploads, ./public and ./themes mounted into /zipline.
  • Small multi-user instances that use invites, quotas, OAuth2, two-factor authentication and passkeys rather than open registration.
  • Deployments that move uploads off the container host, either by repointing DATASOURCE_LOCAL_DIRECTORY or by switching to S3.
  • Administrators who need their own look and feel, which custom themes under /zipline/themes provide.

Getting started

The recommended installation is Docker: a Compose file that pairs postgres:16 with ghcr.io/diced/zipline, requiring POSTGRESQL_PASSWORD and a CORE_SECRET generated with openssl — Zipline will not start without CORE_SECRET. The full step-by-step guide lives at zipline.diced.sh.

How it compares

ShareX itself appears in these facts as the client this server serves, not as a competing upload server, and no other comparable self-hosted file upload server is named. On this registry, Zipline stands alone as the ShareX-oriented upload server entry.

When to use it — and when not to

Self-hosting means operating a PostgreSQL 16 database, a container runtime, persistent volumes for uploads, public assets and themes, and secrets held in a .env file. Zipline requires a CPU with AVX support, and no binaries or images are provided for non-AVX CPUs, so older or low-power hardware is ruled out. It is also the wrong choice for anyone who wants a managed service with nothing to run, and the repository README is largely a feature list that defers practical detail to the external documentation.

project readme (upstream, from github) — read inline

The next generation ShareX / File upload server

Stars Version GitHub last commit (branch) Discord

Build

Documentation: zipline.diced.sh

Features

  • Setup Quickly: Get Started with Docker
  • Configure
  • Upload any file
  • Folders
  • Tags
  • URL shortening
  • Embeds
  • Discord Webhooks
  • HTTP Webhooks
  • OAuth2
  • 2FA
  • Passkeys
  • Password Protection
  • Image Compression
  • Video Thumbnails
  • API
  • PWA
  • Partial Uploads
  • Invites
  • Quotas
  • Custom Themes
  • ... and more!

Usage

Visit the docs for a more in-depth guide on how to get started.

Install and Run with Docker

This is the recommended way to run Zipline:

services:
  postgresql:
    image: postgres:16
    restart: unless-stopped
    env_file:
      - .env
    environment:
      POSTGRES_USER: ${POSTGRESQL_USER:-zipline}
      POSTGRES_PASSWORD: ${POSTGRESQL_PASSWORD:?POSTGRESQL_PASSWORD is required}
      POSTGRES_DB: ${POSTGRESQL_DB:-zipline}
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'zipline']
      interval: 10s
      timeout: 5s
      retries: 5

  zipline:
    image: ghcr.io/diced/zipline
    ports:
      - '3000:3000'
    env_file:
      - .env
    environment:
      - DATABASE_URL=postgres://${POSTGRESQL_USER:-zipline}:${POSTGRESQL_PASSWORD}@postgresql:5432/${POSTGRESQL_DB:-zipline}
    depends_on:
      postgresql:
        condition: service_healthy
    volumes:
      - './uploads:/zipline/uploads'
      - './public:/zipline/public'
      - './themes:/zipline/themes'
    healthcheck:
      test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3000/api/healthcheck']
      interval: 15s
      timeout: 2s
      retries: 2

volumes:
  pgdata:

[!WARNING] Zipline requires a cpu with AVX support. We don't provide binaries or images that have support for non-AVX cpus

Volumes

  • ./uploads - The folder where all the user uploads are stored (the default is ./uploads)
  • ./public - The folder where all the public assets are stored (must mount to /zipline/public)
  • ./themes - The folder where all the custom themes are stored (must mount to /zipline/themes)

Temporary files default to ./uploads/.tmp. Setting CORE_TEMP_DIRECTORY to another filesystem, such as tmpfs, can reduce local upload performance.

Generating Secrets

echo "POSTGRESQL_PASSWORD=$(openssl rand -base64 42 | tr -dc A-Za-z0-9 | cut -c -32 | tr -d '\n')" > .env
echo "CORE_SECRET=$(openssl rand -base64 42 | tr -dc A-Za-z0-9 | cut -c -32 | tr -d '\n')" >> .env

Without the CORE_SECRET environment variable, Zipline will not start.

Changing where uploads are stored

By default, Zipline will default to the ./uploads folder, which is also reflected in the docker-compose.yml above. If you want to change this, you can set the DATASOURCE_LOCAL_DIRECTORY environment variable to a different path.

DATASOURCE_LOCAL_DIRECTORY=/path/to/your/local/files
# or relative to the working directory
DATASOURCE_LOCAL_DIRECTORY=./relative/path/to/files

[!NOTE]
Remember to change volume mappings in the docker-compose.yml file if you change this.

Changing the port and hostname

By default, Zipline binds to 0.0.0.0:3000, which is also reflected in the docker-compose.yml above. If you want to change this, you can set the CORE_PORT and CORE_HOSTNAME environment variables to a different port and hostname.

CORE_PORT=80
CORE_HOSTNAME=localhost

[!NOTE] If you change the port, you will need to update the ports section in the docker-compose.yml file.

Using S3

If you want to use S3 instead of the local filesystem, you can set the following environment variables:

DATASOURCE_TYPE=s3

DATASOURCE_S3_ACCESS_KEY_ID=access_key_id
DATASOURCE_S3_SECRET_ACCESS_KEY=secret
DATASOURCE_S3_BUCKET=zipline
DATASOURCE_S3_REGION=us-west-2

For more information, like other providers, see the docs.

Starting Zipline

Simply run the following command to start the server:

docker compose up -d

You should be able to access the website at http://localhost:3000 or the port you specified.

Manual Install

See docs for more information.

Migrating from v3

Zipline v4 was a complete rewrite, and as such, there is no upgrade path from v3 to v4. You will need to export your data from v3 and import it into v4. This process is made easier by the fact that v4 has a built-in importer to import data from v3.

See migration for more information.

Contributing

Contributions of any kind are welcome, whether they are bug reports, pull requests, or feature requests.

Bug Reports

Create an issue on GitHub and use the template, please include the following (if one of them is not applicable to the issue then it's not needed):

  • The steps to reproduce the bug
  • Logs of Zipline
  • The version of Zipline, and whether or not you are using Docker (include the image digest/tag if possible)
  • Your OS & Browser including server OS
  • What you were expecting to see
  • How it can be fixed (if you know)

Feature Requests

Create a discussion on GitHub, and please include the following:

  • Brief explanation of your feature in the title (very brief)
  • How it would work (be detailed)

Pull Requests

Create a pull request on GitHub. If your PR does not pass the action checks, then please fix the errors. If your PR was submitted before a release, and I have pushed a new release, please make sure to update your PR to reflect any changes, usually this is handled by GitHub.

Development

Here's how to setup Zipline for development

Nix

If you have Nix and direnv installed, you can simply cd into the cloned directory and run the following command:

direnv allow

After doing so, your shell will be setup for development.

If you aren't using direnv, you can run the following command to enter the nix shell:

nix develop --no-pure-eval

Useful commands regarding the postgres server:

Command Description
pgup Starts the postgres server in the background.
pg_ctl status See if the postgres server is running
minioup Start a Minio server for testing S3
downall Stops any running postgres or minio service.

After familiarizing yourself with the environment, you can continue below (skipping the prerequisites since they are already installed).

Prerequisites
  • Node.js (22 or newer; Node.js 24 recommended)
  • pnpm (11.x)
  • a postgresql server
Setup

You should probably use a .env file to manage your environment variables, here is an example .env file with every available environment variable:

DEBUG=zipline

# required
CORE_SECRET="a secret that is 32 characters long"

# required
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/zipline?schema=public"

# these are optional
CORE_PORT=3000
CORE_HOSTNAME=0.0.0.0

# one of these is required
DATASOURCE_TYPE="local"
# DATASOURCE_TYPE="s3"

# if DATASOURCE_TYPE=local
DATASOURCE_LOCAL_DIRECTORY="/path/to/your/local/files"

# if DATASOURCE_TYPE=s3
# DATASOURCE_S3_ACCESS_KEY_ID="your-access-key-id"
# DATASOURCE_S3_SECRET_ACCESS_KEY="your-secret-access-key"
# DATASOURCE_S3_REGION="your-region"
# DATASOURCE_S3_BUCKET="your-bucket"
# DATASOURCE_S3_ENDPOINT="your-endpoint"
# ^ if using a custom endpoint other than aws s3

Install dependencies:

pnpm install

Finally you may start the development server:

pnpm dev

If you wish to build the production version of Zipline, you can run the following command:

pnpm build

And to run the production version of Zipline:

pnpm start
Making changes to the database schema

Zipline uses Drizzle ORM for its database schema and queries.

After changing src/lib/db/schema.ts, generate a migration with Drizzle Kit. Zipline applies committed migrations automatically on startup.

pnpm db:migrate

This command only creates a migration file; Zipline applies committed migrations when it starts. If you wish to push schema changes directly without generating a migration file, use db:prototype; this is only recommended for local prototyping and should not be used in production.

pnpm db:prototype
Linting and Formatting

Zipline will fail to build unless the code is properly formatted and linted. To format the code, you can run the following command:

pnpm validate
Testing zipline-ctl

To build the ctl, you can run the following command:

pnpm build

then run any command you want

pnpm ctl help

Documentation

Documentation is located at zipline.diced.sh and the source is located at github.com/diced/zipline-docs.

Security

Security issues are taken seriously, and should be reported via GitHub Advisories. For more information see the security policy.

Frequently asked questions

Is zipline free to use?

zipline is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does zipline do?

A ShareX/file upload server that is easy to use, packed with features, and with an easy setup!

What is zipline written in?

zipline is primarily written in TypeScript. Its source is publicly available at https://github.com/diced/zipline, and it has 3,430 GitHub stars.