Deployments
A deployment is an immutable snapshot of static files. Once created, its contents never change.
Every deployment gets a unique ID (e.g. happy-cat-abc1234) and an instant preview URL.
Available via Web, CLI, SDK, MCP, Action, and API.
Properties
| Property | Description |
|---|---|
deployment |
Unique identifier |
url |
Preview URL, immediately accessible |
files |
Number of files |
size |
Total size in bytes |
status |
Lifecycle state (see below) |
labels |
Mutable tags for organization |
password |
true if the deployment is password-protected |
via |
Origin tag — see Origin tags below |
created |
Creation timestamp |
claim |
Claim URL — present only on response of public (unauthenticated) deploys |
expires |
Expiration timestamp for unclaimed public deployments (3 days from creation; absent for owned deployments) |
Status
pending → success → deleting
→ failed → deleting
A deployment starts as pending during upload. On success, the preview URL goes live. Deletion is asynchronous from any terminal state — the status transitions to deleting while files are cleaned up.
Behaviors
Immutable. After creation, only labels can be modified. To change content, create a new deployment.
Path optimization. When all files share a common root directory (e.g. dist/), the platform flattens it automatically - dist/index.html becomes index.html.
SPA detection. The platform analyzes your index.html for single-page app patterns (React Router, Vue Router, etc.) and configures client-side routing fallbacks automatically.
Public Deployments
Deploys without authentication go to the public account and expire 3 days from creation. The response includes a claim URL — visit it while signed in at my.shipstatic.com to transfer the deployment to your account.
$ npx -y @shipstatic/ship ./dist --json
{
"deployment": "happy-cat-abc1234",
"url": "https://happy-cat-abc1234.shipstatic.com",
"claim": "https://my.shipstatic.com/claim/...",
"expires": "..."
}
Once claimed, the deployment is yours, never expires, and the claim URL stops working. Until claimed, anyone with the claim URL can take ownership — treat it like a one-time token.
Custom domains, password rotation, and listing/management operations require an API Key. The deploy itself doesn't.
Password Protection
Deployments can be locked behind a password set at upload time. Visitors see an unlock page until they enter the correct value. The plaintext is hashed with SHA-256 before storage — only the hash is kept, never the password.
Length: 6 to 128 characters. There is no edit-in-place — to change or remove a password, redeploy.
ship ./dist --password 'hunter2!'
Labels
Labels organize and filter deployments. Each label is 3–63 lowercase alphanumeric characters with ., -, or _ separators. Maximum 10 per deployment.
production
v1.0.3
staging.preview
Origin tags
The via field records which interface created the deployment, useful for filtering listings by origin.
| Value | Origin |
|---|---|
web |
Web console (drag-drop or upload) |
cli |
CLI |
sdk |
SDK used directly |
mcp |
MCP server (AI agents) |
git |
Action (GitHub Actions) |
n8n |
n8n community node |
gpt |
GPT Action (custom GPT integration) |
vsc |
VS Code extension |
Operations
| Operation | Description |
|---|---|
| Upload | Create a new deployment from files |
| List | All deployments on your account |
| Get | Details of a specific deployment |
| Set | Update labels |
| Remove | Delete a deployment and its files |