Headless AI engine · MIT

Every industry deserves its own engine.

Ion is the engine underneath. It talks to the AI model, runs the tools you give it, and holds still while the systems around it grow.

  • Single 13MB static binary
  • Bring your own providers
  • Hooks across the entire agent lifecycle
  • MIT license
The Ion engine: a machined hex block with a hot core

Where it runs

A stage in a pipeline

Invoked at three points in one workflow, each with its own configuration, model set and extensions.

runs, returns, exits
A sidecar beside your API

Your enterprise API calls it for the AI part of a request. Its own config, its own approved models.

one per service
A service in your cluster

Long-lived and multi-tenant, several extensions loaded, with an internal console your staff switch between.

always on

One company runs all three at once. Same binary every time, with configuration, models and extensions decided per deployment.

01 / The split

Three parts. You write two of them.

The engine is the only part we ship. Your extension defines what the model may do, and your own systems decide when to call it. Each part can be replaced without touching the other two.

Your infrastructure
What calls the engine

A step inside your own API pipeline, a scheduled job, or an internal console your operations team watches. It sits in your back end, and the people who buy from you never talk to it directly.

your service, your job, your console
Engine
What we ship

Every provider's format, auth, streaming and retries. Timers that survive a restart. An authenticated listener. History that persists and branches. Sub-agents in parallel.

one static binary
Your extension
What you write

The actions the model may take, the limits it may not cross, your prompts, and your policy. A shell script counts, and so does a forty-file TypeScript project.

runs as a separate program
Called when needed
One step in a pipeline

A browser hits your API, your service reaches the point in the job that needs a model, and it invokes the engine. The engine returns and nothing is left running between calls.

Running continuously
A service you operate

Timers that survive restarts and an authenticated listener for inbound events. Your operations team follows it through a console you built, or nobody watches it at all.

Everything the engine does is visible on one event stream. Fields get added to it; they are never renamed or removed. The contract you build against today is the one next year's release still honors.

02 / Mid-run

See every agent, tool call and dollar as it happens.

Every agent, tool call and dollar arrives on the event stream, so the people running the operation can see exactly what happened and step in when it matters. Below is an internal console for a warehouse ops command center, with two extensions running on one engine: switch tabs to see a reactive run waiting on a person and a scheduled one that started itself. Plenty of systems never need a console at all, because the engine is just as happy inside a pipeline with nobody watching.

●Illustration

an internal console you could write, not one we ship · switch tabs, and tap any part to see what the engine hands you

claude-sonnet-4-6$0.014
Pallet 4471 read short at the dock. Work out where the count went wrong and fix it before the truck leaves.

Fourteen unreconciled exceptions tonight. This one is a short count, so I am pulling the manifest and this supplier’s last ninety days before I decide anything.

Agents2 done · 1 suspended11.2s
triageqwen2.5:14b · local13 routine
root-causeclaude-sonnet-4-6cause found
carriergpt-4o-mini · azuresuspended · awaiting your answer
Needs youpermission_request

carrier wants to book a replacement load before the 06:00 cutoff. Your rule holds anything over $2,000.

Event stream
Tools available

checkStockplanPicksreadManifestsupplierHistorybookCarrier

hookbefore_prompt · dock.ts
tool_callreadManifest pallet/4471
tool_result1 record · 0.2s
hooktool_result · redacted 2 fields
agent_endtriage · 13 routine
agent_startroot-cause · claude-sonnet-4-6
tool_callsupplierHistory 90d
tool_result90 rows · 0.4s
text"pick list was off by one case"
agent_endroot-cause · cause found
permissionbookCarrier held · awaiting answer

held · nothing running

03 / Same binary

Any system you can think of. The engine underneath stays the same.

Different industries, different operations, different problems. Every one is a system a business would build to run itself, not a product it would sell. None of them ship with Ion, and yours would work the same way.

◆ Scroll for ten systems

Operations

The Warehouse Floor

Catches the problem before the truck pulls away.

Who runs itThe operations lead who gets the call when a count comes up short.What your extension does
  • Tools for checking stock, planning picks, and booking the carrier
  • Scanner events that arrive as inbound calls and get acted on immediately
  • Every exception written up with a fix already proposed
◆ See one built end to end
The Ion engine block

The constantunchanged

Nothing about the engine changed between any two of these. Same binary, same contract, same download. The only difference is the code someone wrote around it.

04 / Not tied to anyone

Any model. Including the one you run yourself.

We do not sell you a model, a server, or a subscription. Your AI spend goes straight to whichever provider you picked, at their price, with no margin added on the way through.

Pick one to see its configuration
~/.ion/engine.jsonhosted
{
  "defaultModel": "claude-sonnet-4-6",
  "providers": {
    "anthropic": {
      "apiKey": "env:ANTHROPIC_API_KEY"
    }
  }
}
One block, one key your environment already holds.
02 / Mid-run

See every agent, tool call and dollar as it happens.

Every agent, tool call and dollar arrives on the event stream, so the people running the operation can see exactly what happened and step in when it matters. Below is an internal console for a warehouse ops command center, with two extensions running on one engine: switch tabs to see a reactive run waiting on a person and a scheduled one that started itself. Plenty of systems never need a console at all, because the engine is just as happy inside a pipeline with nobody watching.

Illustrationan internal console you could write, not one we ship  ·  switch tabs, and hover any part to see what the engine hands you
claude-sonnet-4-6$0.014
Pallet 4471 read short at the dock. Work out where the count went wrong and fix it before the truck leaves.
Fourteen unreconciled exceptions tonight. This one is a short count, so I am pulling the manifest and this supplier’s last ninety days before I decide anything.
Agents2 done · 1 suspended11.2s
triageqwen2.5:14b · local13 routine
root-causeclaude-sonnet-4-6cause found
carriergpt-4o-mini · azuresuspended · awaiting your answer
Needs youpermission_request
carrier wants to book a replacement load before the 06:00 cutoff. Your rule holds anything over $2,000.
Book itShow me the quote
Event stream
Tools available
checkStockplanPicksreadManifestsupplierHistorybookCarrier
hookbefore_prompt · dock.ts
tool_callreadManifest pallet/4471
tool_result1 record · 0.2s
hooktool_result · redacted 2 fields
agent_endtriage · 13 routine
agent_startroot-cause · claude-sonnet-4-6
tool_callsupplierHistory 90d
tool_result90 rows · 0.4s
text"pick list was off by one case"
agent_endroot-cause · cause found
permissionbookCarrier held · awaiting answer
held · nothing running
03 / Same binary

Any system you can think of. The engine underneath stays the same.

Different industries, different operations, different problems. Every one is a system a business would build to run itself, not a product it would sell. None of them ship with Ion, and yours would work the same way.

Operations

The Warehouse Floor

Catches the problem before the truck pulls away.

Who runs itThe operations lead who gets the call when a count comes up short.

WHAT YOUR EXTENSION DOES
  • Tools for checking stock, planning picks, and booking the carrier
  • Scanner events that arrive as inbound calls and get acted on immediately
  • Every exception written up with a fix already proposed
◆See one built end to end
The constant
The Ion engine block
unchanged

Nothing about the engine changed between any two of these. Same binary, same contract, same download. The only difference is the code someone wrote around it.

04 / Not tied to anyone

Any model. Including the one you run yourself.

We do not sell you a model, a server, or a subscription. Your AI spend goes straight to whichever provider you picked, at their price, with no margin added on the way through.

Pick one to see its configuration

No vendor library in between

Calls go straight to the provider with your keys, resolved from your environment, keychain, or encrypted store.

Route per step

Sort on a local model, judge on a frontier model, and let the routine kinds never touch a model at all. One job.

~/.ion/engine.jsonhosted
{
"defaultModel": "claude-sonnet-4-6",
"providers": {
"anthropic": {
"apiKey": "env:ANTHROPIC_API_KEY"
}
}
}
One block, one key your environment already holds.

The core is already built. Take it from here.

Until now an industry outside software had two options: adopt a frontier lab's agent core and live inside their decisions, or build the whole thing from scratch. That work is done and the capabilities are available now, under an MIT license, and still moving forward.

Off the shelf

Run it as it ships. Your configuration, your models, your extensions, on your machines.

Or fork it

Start from where we got it and take it your own direction as an in-house engine that answers to nobody else.

Either way you begin with a working engine instead of a blank page, and neither way puts us in your path: no login, no gateway of ours, no model we resell, no endpoint collecting anything.