Concepts

Pages

Pages let you serve build artifacts, documentation, or any static files directly from the edge. Build inside a workspace VM, export the output folder, and your page is live — the workspace can be stopped or deleted without affecting the page.

How it works

  1. Build your project inside a workspace (e.g. npm run build)
  2. Create a page via the dashboard or API — your build output is exported to the edge
  3. Your page is live on the CDN with automatic TLS — the workspace can be stopped or deleted

Key concepts

Independence from workspaces

Pages are not mounted from a running VM. Files are copied out via a one-time transfer. This means:

  • No coupling to VM lifecycle — your page stays up even if the workspace is offline
  • No performance impact on the VM from serving traffic
  • No risk of filesystem corruption from concurrent access
  • You can delete the workspace and redeploy from a different one later

Slugs and domains

Every page gets a URL based on its slug and domain:

https://{slug}.{domain}
  • Slug — a URL-safe identifier (lowercase letters, numbers, hyphens). Auto-generated if not provided.
  • Domain — defaults to preview.oblien.com. Enterprise users can use their own wildcard domains.

Slugs must be unique within a domain. The system checks for collisions before creating a page.

Custom domains

Pages support fully custom domains with automatic SSL — the same flow used by workspace custom domains:

  1. Add a CNAME record pointing your domain to the edge (e.g. edge.oblien.com)
  2. Add a TXT record for ownership verification
  3. Connect via POST /pages/:slug/domain — DNS is verified and an SSL certificate is automatically issued

Certificates are auto-renewed. Custom domains use the same SSL infrastructure as workspaces.

Page status

StatusEdge routeFiles on disk
activeYes — serving trafficYes
disabledNo — route removedYes — preserved

Disabling a page removes the edge route (traffic stops immediately) but keeps the files on disk. Re-enabling restores the route without re-deploying.

File requirements

The export path must contain an index.html file at the root — this is the entry point served by the edge when visitors hit your page URL. Without it, visitors will see a 404.

A typical build output looks like this:

/app/dist/
├── index.html      ← required entry point
├── assets/
│   ├── style.css
│   └── app.js
└── favicon.ico

Most frameworks (Vite, Next.js static export, Astro, Hugo, etc.) produce this structure automatically. Point the export path to the build output folder — not the project root.

FrameworkTypical export path
Vite / React/app/dist
Next.js (static)/app/out
Astro/app/dist
Hugo/app/public
Plain HTML/app (wherever index.html lives)

Deploying a page

From the dashboard

  1. Go to Dashboard → Pages
  2. Click Create Page
  3. Select the workspace to export from
  4. Enter the export path (e.g. /app/dist), name, and optional slug
  5. Click Deploy — files are transferred and the page goes live immediately

From the API

Create a page by exporting files from a running workspace:

curl -X POST "https://api.oblien.com/pages" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"workspace_id": "ws_abc", "path": "/app/dist", "name": "my-app"}'

Re-deploying

When you redeploy, old files are deleted first and replaced with the fresh export. You can also change the export path or source workspace on redeploy.

From the dashboard:

  1. Open Dashboard → Pages
  2. Click the redeploy button (↻) on the page card, or open Edit and expand the Redeploy section
  3. Select a workspace, enter the export path, and click Redeploy

From the API:

curl -X POST "https://api.oblien.com/pages/my-app/deploy" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"workspace_id": "ws_abc", "path": "/app/dist"}'

You can use a different workspace or path than the original deployment. If the page was disabled, redeploying automatically re-enables it.

Connecting a custom domain

# 1. Check DNS first
curl -X POST "https://api.oblien.com/pages/my-app/domain/check" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domain": "docs.example.com"}'

# 2. Connect
curl -X POST "https://api.oblien.com/pages/my-app/domain" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domain": "docs.example.com"}'

Limits

LimitValue
Pages per user50
Slug length3–48 characters
Domain lengthMax 253 characters
Slug formatLowercase alphanumeric + hyphens, no leading/trailing hyphens

API reference

See the Pages API for the full REST endpoint reference.