myna/posts.ts
import { collection, field } from "@myna-sh/sdk/schema"; export default collection({ name: "posts", visibility: "public", titleField: "title", path: "/blog/{slug}", fields: { title: field.text({ required: true, maxLength: 120 }), slug: field.slug({ from: "title", required: true }), body: field.markdown({ required: true }), cover: field.asset({ allowed: ["image/*"] }), publishedAt: field.datetime(), }, });
TypeScript DSL
Your schema is a file in your repo.
Versioned in git, reviewed in pull requests, read by your agent like any other code.
The CLI shows the diff first.
A destructive change is refused unless you say so. Then generate types for your app from the same file.
One file drives the editor, the validation, and your types.
- generated editor
- The dashboard renders the editor from your schema.
- validation
- Enforced in the dashboard, API, CLI, and MCP alike.
- visibility
- Public or private. Private never reaches the public API.
- typed reads
- Entries come back typed in your app.
More of Myna.
Agent-native
Agents are first-class users.
MCP, scoped keys, and a review step before anything ships.
Read moreChange sets
Group a change, preview it, publish it at once.
Related entries and assets, one preview, one publish.
Read morePlatform
One API behind the dashboard, CLI, SDK, and MCP.
Nothing is dashboard-only.
Read more