Host ai workflow runner with Echo: worker execution and job state | Ample

INFRASTRUCTURE

What it needs

Before you start

Exactly what was tested

How to do it

  1. 1

Plan the topology

Run the planner once. It discovers the web and worker services, infers kind = "worker" for the process without a port, declares the database each service needs, and writes ample.toml. Exit 2 means it left questions in the manifest; answer them with --answer or by editing the file.

ample plan --write .
  1. 2

Share one database

Keep a single [databases.main] with engine = "postgres", drop any per-service database the planner added, and set DATABASE_URL = { database = "main" } under both [services.web.env] and [services.worker.env].

ample plan --offline .
  1. 3

Apply

Reconcile the whole manifest in dependency order: the database first, then both services. It is idempotent and never destructive; exit 0 means everything applied, 2 needs input, 1 a failed resource (independent siblings still proceed and re-running resumes).

ample up .
  1. 4

Verify

Fetch the web service URL and its worker status route (/p/worker-queue/status in the example) and confirm the worker processed the enqueued job; on failure read the worker service's runtime logs.

ample logs <deployment_id> --kind runtime

Tested examples

How to know it worked

Know the limits

Cost estimate

Estimated 15.00 USD per month (size prices from pricing.toml at build revision a1b8c38919e59cd035ebabaced73cf84ece24371).

Always-on monthly price of the tested sizes for the web service, the worker service and the database; apps auto-pause when idle.

Verification evidence

Execution binding

MCP tool ample_up (registry mcp:ample_up), schema hash db7ca0facfe2cd28 observed 2026-09-21T03:19:59.525781+00:00 at revision 49962bcade4f. Binding state at export: current. Required scopes: servers:write, databases:write.