Three steps on the surface. Underneath, Shippers validates, sandboxes, and routes your app before it ever goes live.
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.
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.
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.
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.
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.
What happens after upload differs depending on your app type — here's what each engine actually does.
Extract & validate
The archive is unpacked and checked for an index.html at its root.
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.
Swap the running container
The previous container for this app is stopped only after the new content is validated and ready to serve.
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.
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.
Confirm it actually started
Shippers waits for Tomcat's port to open and scans startup logs for severe errors before calling the deployment successful.
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.
Create a free account and get a live URL in under a minute.