How it works

From build folder to live URL

Three steps on the surface. Underneath, Shippers validates, sandboxes, and routes your app before it ever goes live.

1

Create an app

Name your app and pick a type — ZIP for a static React or Flutter web build, WAR for a WebforJ Java app. The name becomes part of your app's slug, validated against a reserved list so you can never accidentally claim something like www or admin.

2

Upload your build

Drag in your .zip or .war file. Shippers streams it to disk under your account's storage quota, checks the file extension matches your app's declared type, and verifies the first bytes are a real zip signature — a WAR is a zip under the hood.

3

Shippers validates and builds

The archive is safely extracted (protected against zip-slip path tricks) into a scratch directory. For a ZIP, Shippers confirms an index.html exists. For a WAR, it confirms a WEB-INF/ directory and detects which JDK version your compiled classes need.

4

A sandboxed container starts

Your content is copied into a hardened container — dropped capabilities, no host networking, hard CPU/memory/process limits — and only then does Shippers stop whatever was previously running for this app, so a bad upload never takes down a working deploy before the new one is confirmed viable to start.

5

Get a live URL

Traefik picks up the container's routing labels automatically and your app is reachable at yourapp.shippers.cloud — usually within seconds for a ZIP, or under a minute for a WAR while Tomcat boots.

Two deploy engines, one workflow

What happens after upload differs depending on your app type — here's what each engine actually does.

ZIP

Static builds (React, Flutter web)

  1. 1

    Extract & validate

    The archive is unpacked and checked for an index.html at its root.

  2. 2

    Serve from a shared nginx image

    Content is copied into a lightweight, pre-built nginx image with SPA-fallback routing — no per-deploy image build needed.

  3. 3

    Swap the running container

    The previous container for this app is stopped only after the new content is validated and ready to serve.

WAR

Java web apps (WebforJ)

  1. 1

    Detect the required JDK

    Shippers reads your compiled .class file versions to pick a Tomcat image running a compatible JDK — no pom.xml parsing required.

  2. 2

    Boot inside Tomcat

    Your WAR is deployed as the app's root context, so it's reachable at the bare subdomain rather than a sub-path.

  3. 3

    Confirm it actually started

    Shippers waits for Tomcat's port to open and scans startup logs for severe errors before calling the deployment successful.

Built for untrusted uploads

Shippers is a hosting provider for strangers' code, so isolation isn't an afterthought.

Every container runs with hard CPU, memory, and process limits, dropped Linux capabilities, and no host networking — isolated by default, not by configuration.

Archive extraction is zip-slip safe, so a crafted path inside an upload can never escape its own deployment directory.

Try it with your own build

Create a free account and get a live URL in under a minute.