Currently in alpha

Declare an agent.
We run it.

The fastest way to spin up a custom AI agent or workflow. Write some .swirls files and deploy.

acme · concierge
agent.swirls
concierge › agent.swirls
secret provider_keys {
  label: "Provider keys"
  vars: [OPENROUTER_API_KEY]
}

agent concierge {
  label: "Concierge"
  secrets: provider_keys
  provider: openrouter
  model: "openai/gpt-4o-mini"
  // See tools.swirls for workflow definitions.
  tools: [search_orders]
  system: @ts {
    return "Help customers with orders, returns, and shipping updates."
  }
}
terminal
~/acme $swirls doctor
✓ 1 agent · 1 workflow · 2 triggers
Step 1

An agent in a dozen lines.

Reasoning layer — a few lines, no boilerplate.

concierge › agent.swirls
secret provider_keys {
  label: "Provider keys"
  vars: [OPENROUTER_API_KEY]
}

agent concierge {
  label: "Concierge"
  secrets: provider_keys
  provider: openrouter
  model: "openai/gpt-4o-mini"
  // See tools.swirls for workflow definitions.
  tools: [search_orders]
  system: @ts {
    return "Answer order and return questions."
  }
}
preview › chat
Concierge
openrouter · live preview
Can you check order 1042?
Order 1042 shipped yesterday. It should arrive tomorrow.
Step 2

Give it deterministic tools.

Workflows the agent can call — scoped, auditable execution.

concierge › tools.swirls
schema order_query {
  label: "Order query"
  schema: @json {
    {
      "type": "object",
      "required": ["email"],
      "properties": { "email": { "type": "string" } }
    }
  }
}

schema order_status {
  label: "Order status"
  schema: @json {
    {
      "type": "object",
      "required": ["status"],
      "properties": { "status": { "type": "string" } }
    }
  }
}

workflow search_orders {
  label: "Search orders"
  description: "Find the latest order status for a customer email."

  root {
    type: code
    label: "Email"
    inputSchema: order_query
    outputSchema: order_query
    code: @ts {
      return {
        email: context.nodes.root.input.email.trim().toLowerCase(),
      }
    }
  }

  node lookup {
    type: code
    label: "Lookup"
    schema: order_status
    code: @ts {
      return { status: "shipped" }
    }
  }

  flow {
    root -> lookup
  }
}
preview › workflow
Step 3

Trigger it from anywhere.

Webhooks, schedules — anything can start a run.

concierge › triggers.swirls
webhook support_inbox {
  label: "Support inbox"
  enabled: true
}

schedule daily_digest {
  label: "Daily digest"
  cron: "0 9 * * *"
}

workflow run_concierge {
  label: "Run concierge"
  root {
    type: agent
    label: "Ask concierge"
    agent: concierge
    prompt: @ts {
      return "Help support with the latest order questions."
    }
  }
}

trigger from_webhook {
  webhook:support_inbox -> run_concierge
}

trigger from_schedule {
  schedule:daily_digest -> run_concierge
}
preview › triggers
Webhook
Schedule
Workflow
Step 4

Deploy.

Deploy the project and run the compiled agents and workflows.

acme › terminal
terminal
~/acme $swirls deploy
◆ Parsing 3 files · agent, tools, triggers
◆ Building deployment snapshot
✓ concierge · live at https://acme.swirls.ai
→ webhook inbound_support · listening
→ schedule daily_digest · registered
preview › hosted
Local project
.swirls files
deploy
Hosted agent
acme.swirls.ai
Live endpoints
deployment snapshot
webhook online
schedule registered

Declare it. Ship it.

Write .swirls files locally. Deploy for free to inspect the project in Swirls Cloud.