Ignition is experimental and under active development. Follow along on GitHub.

Server Automation
in TypeScript

Write server automation recipes as functions and push them over SSH.

bun install -g @grovemotorco/ignition
import type { ExecutionContext } from "@grovemotorco/ignition"
import { createResources } from "@grovemotorco/ignition"
 
export default async function (ctx: ExecutionContext) {
const { apt, file, directory, service } = createResources(ctx)
 
await apt({ name: "nginx", state: "present" })
 
await directory({
path: "/var/www/app",
owner: "www-data",
mode: "755",
})
 
await file({
path: "/var/www/app/index.html",
content: "<h1>Hello from Ignition</h1>",
owner: "www-data",
})
 
await service({ name: "nginx", state: "started", enabled: true })
}

TypeScript Recipes

Write server automation logic in real TypeScript. No YAML, no DSL. Get full IDE autocomplete, type checking, conditionals, loops, and async/await. Import any npm package. Or use AI to write the recipe for you.

deploy.ts
import type { ExecutionContext } from "@grovemotorco/ignition"
import { createResources } from "@grovemotorco/ignition"
 
export default async function (ctx: ExecutionContext) {
const { apt, file, directory, service } = createResources(ctx)
 
await apt({ name: "nginx", state: "present" })
 
await directory({
path: "/var/www/app",
owner: "www-data",
mode: "755",
})
 
await file({
path: "/var/www/app/index.html",
content: "<h1>Hello from Ignition</h1>",
owner: "www-data",
})
 
await service({ name: "nginx", state: "started", enabled: true })
}
Terminal
$ ignition run --check deploy.ts admin@web-1
 
web-1 ▸ Checking deploy.ts
 
✓ apt nginx ok
~ dir /var/www/app would create
~ file /var/www/app/index.html would change
✓ service nginx ok
 
4 resources: 2 would change, 2 ok
dry-run complete ── no changes applied

Check Before Apply

Every resource reads actual server state before mutating anything. Run ignition check for a complete dry-run. See exactly what would change before applying.

Real-Time Dashboard

Monitor automation runs in a local, live web UI. Watch resources check and apply in real time, expand output per host, and catch failures during runs.

Why Ignition?

This is real. It works.

TypeScript Recipes

Full language power. Loops, conditionals, type safety, and IDE autocomplete. No YAML.

Check Before Apply

Every resource reads actual state before mutating. Dry-run for free with ignition run --check.

Agentless

Nothing to install on target hosts. Uses your system SSH binary directly.

Idempotent

Run recipes repeatedly. Only what needs changing gets changed. Already correct? No-op.

Real-Time Dashboard

Monitor automation runs across hosts in a live web UI. See status as it happens.

Parallel Execution

Automate multiple hosts concurrently with a bounded worker pool.

How It Compares

You should probably use Ansible.

IgnitionAnsibleChef / Puppet
Production ReadyExperimentalYesDoes anyone still use it?
LanguageTypeScriptYAMLRuby / DSL
Agent requiredNo (SSH)No (SSH)Yes
State filesNoneNoneServer-side
Dry-runBuilt-in--check flag--why-run
IDE supportFull (native TS)LimitedLimited