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
- Build your project inside a workspace (e.g.
npm run build) - Create a page via the dashboard or API — your build output is exported to the edge
- 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:
- Add a CNAME record pointing your domain to the edge (e.g.
edge.oblien.com) - Add a TXT record for ownership verification
- 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
| Status | Edge route | Files on disk |
|---|---|---|
active | Yes — serving traffic | Yes |
disabled | No — route removed | Yes — 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.icoMost 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.
| Framework | Typical 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
- Go to Dashboard → Pages
- Click Create Page
- Select the workspace to export from
- Enter the export path (e.g.
/app/dist), name, and optional slug - 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:
- Open Dashboard → Pages
- Click the redeploy button (↻) on the page card, or open Edit and expand the Redeploy section
- 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
| Limit | Value |
|---|---|
| Pages per user | 50 |
| Slug length | 3–48 characters |
| Domain length | Max 253 characters |
| Slug format | Lowercase alphanumeric + hyphens, no leading/trailing hyphens |
API reference
See the Pages API for the full REST endpoint reference.