Your product's rules, written once. Readable by anything.

Dynz turns validation, conditions, and flow into a single contract — one definition your interface, your server, and your AI agents all read from. What headless did for content, Dynz does for interaction logic.

contact.schema.ts
const schema = d.object({
  email: d.string().email(),
  topic: d.options(["demo"]),
});
compiles to
contract.jsonsource of truth
{ "email": { "type": "email" },
  "topic": { "type": "enum" } }
Web form
API
AI agent
One definition. Every surface reads it. See it live on the contact page.

Dynz creates a single contract that can be shared.

What it changes

One source of truth, three consequences

01
Rules stop drifting

The friendly nudge in the browser and the hard stop at the API come from one definition, evaluated by one engine. There is nothing to keep in sync — so nothing drifts, and nothing slips through.

02
Change lands everywhere at once

A rule changes in the contract and every consumer follows — no coordinated releases across teams, no redeploy to tighten a validation. The logic can even be generated per request, per role, per tenant.

03
Every channel is a reader

Because the contract is data, it isn't reserved for your UI. An AI agent, a partner integration, a voice interface — anything that parses JSON can know exactly what's required, and why.

How it works

Define once, in TypeScript. Ship as data.

You describe fields, validation, conditions, and mutability in a fluent, Zod-like schema language. The result isn't a component tree or a function — it's a plain, serializable object. Build it on the server, send it over the wire, and evaluate it with the same engine on every side.

Cross-field conditions, role-based mutability, and state-machine rules are first-class — not bolted on.

Explore Dynz for developers
onboarding.schema.ts
const schema = d.object({
  accountType: d.options(["personal", "business"]),
  companyName: d.string().min(2)
    .setIncluded(d.eq(d.ref("accountType"), "business")),
});

// It's data — ship it anywhere
return Response.json(schema);

// …and enforce it everywhere with one call
const result = d.validate(schema, undefined, values);
Ready for the agent era

An agent can't fully understand your interface. It can read a contract.

The same schema that drives your web form drives your MCP integration, without modification. Agents fetch it, see exactly which fields are required under the current answers, fill them correctly — and get structured errors when they don't.

Humans get a UI. Agents get the contract. Both get the same truth.

The idea behind it

"Headless content sounded like over-engineering until it was obviously the only way to do it. We think interaction logic is at the same inflection point."

Read the Dynz philosophy

Write the contract once.
Let everything read it.

Read the docspnpm install dynz
Dynz.

Headless interaction logic. Written once, structured, readable by anything.