Ephemeral environments
with a real kernel boundary.
Run a complete dev or test environment inside its own microVM, with its own guest kernel. Your image, unchanged. An HTTPS URL the moment you ask for one — and a TTL that throws the whole thing away.
boundaryA separate guest kernel, so a container escape lands the attacker inside their own kernel, not on the host.
Diagram: an Orkastor environment. Inside one microVM sit three services — web on port 8080, api on port 3000, and an internal-only postgres — above a guest kernel belonging to that environment alone. Below the microVM boundary is the bare-metal host and its own separate host kernel, on a node pool tainted for tenant work.
Every environment gets its own kernel.
Most platforms in this space put your code in a container next to everyone else's, sharing one host kernel. That is a namespace, and a namespace is a scheduling construct — it was never designed to hold against code that is actively trying to leave.
Two guest kernels, independent of each other and of the host's. Each environment's system calls are served by a kernel that only that environment is running in.
Diagram: two environments side by side. Each contains its application and its own guest kernel inside its own microVM. Both sit above bare metal whose host kernel neither of them reaches.
Kata Containers, on metal we operate
A microVM with its own guest kernel, scheduled onto a dedicated, tainted bare-metal node pool. A platform pod cannot land on a tenant node and a tenant workload cannot land beside a platform pod.
Trial and Dev plans use gVisor
Those two plans run under gVisor — a userspace kernel on ordinary compute. A real boundary, and a weaker one than a separate guest kernel. We would rather name that difference than average it away into one word.
Everything else follows from that line. An ephemeral Postgres is isolated by the same boundary as the web process in front of it — not by a second mechanism bolted on for databases.
A whole environment, not a container.
A frontend, an API and a real datastore, started together, addressed on one hostname and thrown away together. The Console is where they live.
| Environment | Tier | Status | TTL | URL |
|---|---|---|---|---|
| pr-482-acme | standard | Running | 08:00:00 | pr-482-acme-7f3a9c21.orkastor.cloud |
| pr-479-acme | preemptible | Provisioning | — | pr-479-acme-c0d41e77.orkastor.cloud |
| nightly-e2e | standard | Expiring | 00:10:02 | nightly-e2e-acme-2b41f8d0.orkastor.cloud |
| agent-sandbox-3 | preemptible | Suspended | paused |
A provisioning environment already has its URL — the hostname is issued when you ask for the environment, not when it finishes starting. Until the first deploy succeeds it serves a holding page, which is exactly why it can go on the pull request straight away.
Multi-service, one hostname
Paths route to services on a single host, so the frontend calls /api
relative. No CORS, no build-time API URL, and the same bundle in every
environment.
Datastores inside the boundary
Run Postgres or Redis as a service of the environment. A service on a well-known datastore port cannot be given a public route at all — that is refused, not discouraged.
Services find each other
Ordinary DNS inside the environment, plus injected
ORKASTOR_SERVICE_<NAME>_URL variables. Your own
PORT always wins over ours.
One hostname. Relative /api. No CORS.
A single-page app learns its API address at build time. Give each service its own subdomain and the frontend bundle becomes environment-specific — which is exactly what breaks promoting one image through several environments.
Diagram: one HTTPS hostname splits into two path rules. Requests to /api reach the api service; everything else reaches the web service. The api service in turn reaches postgres, which is internal-only and has no route of its own.
stripPrefix: false keeps /api on the request, so the
backend sees the same path here that it sees on your laptop.
Describe it once. Get a URL immediately.
Bring the image your CI already builds, or connect a repository and let Orkastor build it. Either way the environment is described by one file, and the URL is minted before anything has booted.
# orkastor.yaml version: 1 ttl: 8h tier: standard routes: # first match wins - path: /api service: api stripPrefix: false # backend keeps /api - path: / service: web services: web: image: ghcr.io/acme/web:9f2c1ab port: 8080 size: s access: unlisted api: image: ghcr.io/acme/api:9f2c1ab port: 3000 size: s access: unlisted postgres: image: postgres:16 port: 5432 size: s access: internal ephemeral: true # dies with the environment
Describe
Services, ports, a TTL and where each one is reachable. One file, or the create form.
Allocate
A microVM is scheduled onto the tenant node pool and its guest kernel boots.
Run
Services start, routes attach, TLS is terminated at the gateway.
Reclaim
The TTL expires, you get a grace window, then the whole environment goes.
Ready before the build is.
The hostname is minted when you ask for the environment, not when it starts. It serves a holding page until the first deploy succeeds — so it can go on the pull request immediately.
https://pr-482-acme-7f3a9c21.orkastor.cloud
- pr-482
- the environment's name, yours
- acme
- the workspace slug
- 7f3a9c21
- 32 bits of hash, so two environments never collide
Unlisted is the default; password, workspace SSO, an IP allowlist and internal-only are the alternatives. The hash makes the name unguessable, and unguessable is not an access control — if the environment holds anything you would mind a stranger seeing, pick one of the other four.
Built to be thrown away, on purpose.
An environment that never expires becomes infrastructure, and infrastructure needs an owner. Every environment here has an end date from the moment it exists.
A visible countdown
Warnings at 24 hours, 1 hour and 10 minutes. Extend in one click, up to your plan's ceiling — the refusal names the ceiling.
A grace window
Expiring is not deleted. Inside the grace window, undo puts the environment back to Running. After reclaim starts, it cannot.
Stop without losing it
Suspend releases the microVM's memory and stops the compute charge. Resume is explicit — a request cannot wake a suspended environment.
Business hours
Up to fourteen start/stop windows per environment, so a test estate is not running all weekend for nobody.
Storage is ephemeral throughout. Reclaim takes the microVM and everything in it, including the datastore. Anything you need to keep, keep elsewhere.
Environments that shouldn't become infrastructure projects.
Pull request environments
Give every PR its own complete environment, with a URL you can paste into the description before CI has finished.
Integration testing
Frontend, API and a real database together, seeded and torn down per run, instead of one shared staging everybody queues for.
Agent-generated code
Somewhere for a coding agent to actually run what it wrote. The boundary matters more when nobody read the code first.
Development sandboxes
A temporary environment for a spike or a demo that does not leave anything behind in shared infrastructure.
A different boundary.
Not a scorecard against a named competitor — a comparison of two architectures, either of which can be the right one.
| Property | Container environment | Orkastor environment |
|---|---|---|
| Isolation | Namespace on a shared kernel | microVM |
| Kernel | Shared with the host | Its own guest kernel |
| Unit | A container | The whole environment |
| Datastore | External, or an add-on | A service inside the boundary |
| HTTPS URL | Usually configured | Minted on request |
| Lifetime | Persistent, or varies | Ephemeral, on a TTL |
Designed with boundaries.
These are decisions, not gaps waiting to be filled. Knowing them now is worth more than discovering them at the wrong moment.
- Environments expire
- A TTL, a grace window, then reclaim. That is the product, not a limitation of it.
- Storage is ephemeral
- Nothing survives reclaim, including the datastore. There are no backups to restore from.
- Use synthetic data
- Seed with fixtures or scrubbed extracts. Nothing here is scoped for personal or regulated records.
- One region
eu-north-1. There is no region picker, and no multi-region replication.- No custom domains
- Environments live on
orkastor.cloudsubdomains, with certificates we issue. - No GPU
- Not in the first version. Nor multi-AZ HA per environment, nor cross-environment networking.
- No privileged or host access
- Refused at admission: no
privileged,hostPath,hostNetworkorCAP_SYS_ADMIN. Instance metadata is unreachable, and tenant code carries no cloud identity. - A cold first start
- The metal pool scales to zero, so the first environment after an idle period can take five to twenty minutes. Later ones do not.
Being built in the open.
We would rather publish the right number once than publish one twice, so there is no rate card here yet. When there is, it will be because it was measured.
Give every environment
a real boundary.
Build it.
Test it.
Throw it away.