the agent layer for complex backend engines
This is the last settings screen.
Annotate the classes your engine already has. Push from the terminal you already use. Your users configure by conversation — and a deterministic engine hands your code back its data, in its own types.
in production with our first host since July 2026
1,700+ conversations · every write gated · nothing authored in a dashboard
fig. 00 — a settings screen, 1984–2026 · 3 tabs · 41 fields · abandoned by most users
Four steps. None of them is a form.
Cohort is a campaign engine and confiqure's demo host. Everything below is what a developer there actually does — and what their user sees.
01 / annotate — on the classes the engine already has
The class is the contract.
No schema editor, no builder. @Confiqure goes on Cohort's real Campaign class. Comments become conduct. Types become contracts. Gates are yours to declare.
@Confiqure( end = "/campaigns", type = Confiqure.Type.MULTI, callback = "https://api.cohort.io/hooks/confiqure" ) public class Campaign { /** Ask for the campaign name first — it names the * rest of the conversation. */ private String name; /** Monthly budget, USD. */ private BigDecimal monthlyBudget; /** Daily spend cap. Must fit the month — cap × 30 may not * exceed monthlyBudget; if it would, refuse and offer the ceiling. */ @Confiqure.Gate(requires = "monthlyBudget != null", message = "Set the monthly budget first — the daily cap depends on it.") private BigDecimal dailyBudgetCap; /** ESP API key. */ @Confiqure.Secret(kind = SecretKind.TOKEN) private String espApiKey; @Confiqure.Consent(id = "google-ads", text = "Cohort reads campaign performance and syncs audiences. Nothing is written to your ad account.") private boolean googleAdsConnected; }
02 / push — from the terminal, not a dashboard
One command. The diff does the paperwork.
Scan, diff, lint, compose. A renamed field becomes a migration — 214 saved configurations move over and nobody re-enters anything. A new secret gets a masked turn without a line of UI.
03 / converse — the end user never sees a form
The AI converses. The engine enforces.
Maya leads with a daily cap before there is a budget. The gate you declared refuses the write — the model doesn't get to decide the order. Then the comment on the class does its job: the cap that doesn't fit the month is turned down and the ceiling is offered.
COHORT
Before I set a daily cap I need the month's budget — what is it for April?
COHORT
$800 a day is $24,000 over April — twice the budget. $400 fits exactly. Take that, or front-load week one?
04 / observe — the dashboard is an observatory
Everything lands on the instrument.
Conversations, saves, tokens, cost — read-optimized, authored nowhere. Endpoints appear here seconds after confiqure push. Status is text, not a lamp.
| class | endpoint | rev | convs 7d | status |
|---|---|---|---|---|
| Campaign | /campaigns | 14 | 96 | LIVE |
| SendPolicy | /send-policy | 5 | 12 | COMPOSING |
| AttributionSettings | /attribution | 2 | 10 | FAILED |
Why a model is allowed near your data.
Because it never gets the last word. Every write passes a deterministic gate before it is saved, and a record is delivered only when your own class accepts it. These are the gates, and what they say when they fire.
@Confiqure.Gate(requires = "plan in {'pro','enterprise'} && seatCount >= 5")
Try it. This is a scripted preview of the widget.
Cohort's app, with confiqure embedded the way any host embeds it. Type into it — set a budget, push the cap past the gate, pause the campaign. The thread is scripted and reaches no engine; the real one runs in your sandbox after your first push.
Campaigns
April 2026 · 4 campaigns · 2 running
Pay for conversations, not seats.
A conversation is one end user configuring one thing, start to finish. Everything else — endpoints, migrations, the widget, the CLI — comes with the workspace.
| what you get | Build | Launch | Scale |
|---|---|---|---|
| $0forever | $149/ month | talk to us | |
| conversations / month | 500 | 5,000 | volume |
| endpoints | 3 | unlimited | unlimited |
| workspaces | sandbox + prod | sandbox + prod | as many as you run |
| saved-data migrations | ✓ | ✓ | ✓ |
| bring your own model keys | — | ✓ | ✓ |
| host-side tools & callbacks | ✓ | ✓ | ✓ |
| support | community | email · 1 business day | dedicated · shared channel |
| Start building | Start on Launch | Book a call |
PLACEHOLDER · tier names, limits and prices are a proposal for this round — ratified numbers replace them before the page ships.
Ten minutes to the first push.
One annotation in your code, one CLI on your machine. The widget and the dashboard need nothing from you.
Java · Spring Boot — ai.confiqure : confiqure-annotation-java : 3.0.0
@Confiqure.Setting(end = "/settings") public class StoreSettings { /** The store's display name. */ private String name; /** Where refunds are sent. */ private RefundPolicy refunds; }
The questions engineers ask first.
What has to change in my code?
What happens when the model gets something wrong?
@Confiqure.Gate predicates — and a configuration is delivered only when it deserializes into your class. A wrong answer is refused and re-asked; it is never saved. Where does the data go?
I renamed a field. Do my users re-enter everything?
How are secrets handled?
@Confiqure.Secret is collected in a masked turn of its own — never mixed into a regular question, never echoed back, encrypted at rest. The conversation history shows that a key was set, not the key.