Overview
Run an always-on process in each customer's environment.
Daemons run resident processes on machines or nodes. Use Daemon for endpoint agents, host bootstrap loaders, node supervisors, local connectors, telemetry collectors, command handlers, and cluster-side services that should come up with the environment and stay running.
Daemons can run anywhere Alien has a daemon controller. They are private by default and can optionally expose named HTTP public endpoints.
Platform Mapping
| Platform | Backing Runtime | Status |
|---|---|---|
| Local | Local process from a container image | Supported |
| Kubernetes / On-Prem | Kubernetes DaemonSet | Supported |
| AWS | One instance on every machine in an Alien Machines cluster | Supported |
| GCP | One instance on every machine in an Alien Machines cluster | Supported |
| Azure | One instance on every machine in an Alien Machines cluster | Supported |
When to Use
Use Daemon when the work is machine-oriented: a connector that maintains a long-lived session, a host loader that prepares the machine, a background command executor, a local/on-prem control loop, or a helper service that should restart if it exits.
Use Worker for request-response handlers. Use Container for cloud services with ports, stateful storage, GPUs, or scaling.
Quick Start
import * as alien from "@alienplatform/core"
const connector = new alien.Daemon("connector")
.code({ type: "image", image: "ghcr.io/acme/connector:2026-05-17" })
.commandsEnabled(true)
.environment({
LOG_LEVEL: "info",
})
.permissions("execution")
.build()
export default new alien.Stack("edge")
.add(connector, "live")
.platforms(["local", "kubernetes"])
.build()Public Endpoints
Daemons are private unless they declare a named HTTP endpoint:
const gateway = new alien.Daemon("gateway")
.code({ type: "image", image: "ghcr.io/acme/gateway:v1" })
.publicEndpoint("api", 8080, "http")
.healthCheck({
path: "/health",
method: "GET",
timeoutSeconds: 1,
failureThreshold: 3,
})
.permissions("execution")
.build()Host Runtime
Trusted daemon infrastructure can request host-level runtime options. Use this for loaders or node agents that intentionally need to inspect, prepare, or supervise the host:
const loader = new alien.Daemon("host-loader")
.code({ type: "image", image: "ghcr.io/acme/host-loader:v1" })
.cluster("runtime")
.runtime({
privileged: true,
pidNamespace: "host",
networkMode: "host",
mounts: [{ source: "/", target: "/host" }],
user: "0",
})
.permissions("execution")
.build()Commands
Daemons can participate in the Commands protocol. Enable commands when the process should poll the manager for work and dispatch registered command handlers.
const executor = new alien.Daemon("executor")
.code({ type: "image", image: "ghcr.io/acme/executor:v1" })
.commandsEnabled(true)
.permissions("execution")
.build()Configuration
| Method | Required | Description |
|---|---|---|
.code(code) | Yes | Container image or source build configuration. Current Local/Kubernetes controllers run image-based daemons. |
.environment(vars) | No | Environment variables injected into the daemon process. |
.link(resource) | No | Gives the daemon binding access to another resource. |
.publicEndpoint(name, port, "http") | No | Adds a named HTTP public endpoint. |
.healthCheck(config) | No | Configures HTTP health checks for public daemon endpoints. |
.cluster(clusterId) | AWS/GCP/Azure | Selects the ComputeCluster that should run the daemon. |
.cpu(value) | No | CPU requested for each daemon instance. |
.memory(size) | No | Memory requested for each daemon instance. |
.runtime(config) | No | Host runtime settings for trusted daemon infrastructure. |
.permissions(profile) | Yes | Permission profile used for linked resources and cloud access. |
.commandsEnabled(boolean) | No | Enables remote command polling. Default: false. |
Daemons do not have triggers, direct invocation, request timeouts, replica settings, or autoscaling.
See API Reference for every builder method and Behavior & Limits for supported platforms and lifecycle behavior.