Zeyn

Alpha. Not on crates.io yet.

The AI-native Rust framework for data-heavy business apps

AI agents write the code. People review it. The framework keeps it safe.

Read the docs See every component

What AI-native means here

Every action is a typed tool

Each #[action] is an API endpoint and a tool for AI agents. Its JSON schema comes from the input type, its description from the doc comment.

Models stay inside your permissions

Agents act as the signed in user. ai = false hides an action from models, confirm makes the user approve it first, and every agent call is audited.

Compiler errors written for agents

A missing permission, a missing translation or a wrong field type fails at compile time, with a message that says what to change.

An MCP server for your project

zeyn mcp gives coding agents the docs, a structural check of the app and its tests as tools.

Built on axum, not instead of it

axum handles HTTP. Zeyn adds what a business app needs on top of it, the way Django sits on WSGI.

You getaxumZeyn
Routing, middleware, async HTTPYesYes (it is axum)
Models, validation on deserialize, row versionsNoYes
Server rendered screens, DataGrid, forms, pickersNoYes
Permissions on every action, CSRF, strict CSP, audit, maskingNoYes
Translations checked at compile time, time zones, moneyNoYes
API with OpenAPI, MCP tools, embedded assistantNoYes

A list, an editor and an API

#[action(permission = "sales.order.read")]
pub async fn search_orders(q: DataQuery, store: OrderStore) -> Result<Page<Order>> {
    Ok(q.apply(store.all()?))
}

#[screen(route = "/", permission = "sales.order.read")]
pub fn order_list() -> Screen {
    Screen::new(t!("orders.title")).body(
        DataGrid::of(search_orders).column(Order::code).filter().column(Order::total).sum(),
    )
}

No HTML, CSS or JavaScript to write. The grid pages, filters and sums on the server, and the same action answers the API and AI agents.

In the box