Declarative
TypeScript config, not YAML. Full type safety, IDE autocomplete, and the ability to compute values like connection strings at definition time.
import { Environment, Postgres, Service, APIInterface } from "sigil";
const env = new Environment("my-app");
const db = env.add( new Postgres("db", { database: "myapp", initSql: "./schema.sql", seedSql: "./seed.sql", }));
env.add( new Service("api", { command: ["node", "server.js"], env: { DATABASE_URL: db.connectionString }, readyCheck: { url: "http://localhost:3000/health" }, }, [new APIInterface(3000)]));
export default env;$ sigil up[sigil] Starting environment "my-app"...[sigil] Starting entity: db[sigil] Pulling image postgres:16...[sigil] Container sigil-db started on port 5432[sigil] Starting entity: api[api] Server listening on port 3000[sigil] All entities started. Press Ctrl+C to stop.
$ sigil statusInstance: default (PID 42069, running, started 3m ago) Config: /app/sigil.config.ts Entities: db running api running
$ sigil down[sigil] Stopping instance "default"...[sigil] Instance stoppedDefine your stack in a sigil.config.ts — databases, services, frontends
Run sigil up — Sigil starts everything in dependency order, wires connection strings, and waits for readiness
Develop against real infrastructure — Docker Postgres, live processes, actual ports
Tear down with sigil down or Ctrl+C — clean shutdown in reverse order
Declarative
TypeScript config, not YAML. Full type safety, IDE autocomplete, and the ability to compute values like connection strings at definition time.
Docker-native
Databases run in real Docker containers. Services run as native processes with Bun.spawn. No emulation, no mocks — real infrastructure.
Agent-first
Coding agents need realistic stacks to test against. Sigil gives them Postgres with real data, APIs with health checks, and full-stack environments — not toy sandboxes.
LLM-friendly
These docs ship /llms.txt and /llms-full.txt for single-fetch ingestion. Your agent can read the entire Sigil API in one request.