Core concepts
Schemas, fields, records, packages, projects. The whole vocabulary.
Schema
A schema is a typed shape. It defines what a record of this type looks like.
name— human-readable name ("Enemy")slug— URL-safe identifier ("enemy")fields— an array of field definitions
Schemas belong to a project. You can have as many schemas as your tier allows.
Field
A field belongs to a schema. It defines one property of a record.
name— human-readable name ("Hit points")slug— JSON key on the record'sdata("hp")type— primitive type (see field types)config— type-specific config ({ min: 1, integer: true }for a number)
Record
A record is an instance of a schema. It has:
id— UUID, immutableschema_id— which schema it belongs todata— JSONB blob with the field values keyed by field slug
Records are what you create, edit, and query.
Package
A package is a folder of records inside a project. It exists for organization (and for export).
When you jaina export my-game --format zip, you get one ZIP per package containing a model.json and an assets/ folder.
A project's records can be split across many packages — main-menu, level-1, level-2, etc.
Project
A project is the top-level container. It has a slug, a set of schemas, and a set of packages. API tokens are scoped to your user, not to a single project — one token reads/writes any project you own.
How they nest
Project
├── Schemas (Enemy, Item, Level, ...)
└── Packages
├── main-menu
│ └── Records (one of each schema, optionally)
├── level-1
│ └── Records
└── level-2
└── Records
What's a "door"?
Jaina exposes three equal doors to the same data:
- GUI — the web app at
jaina.dev - API — REST endpoints at
jaina.dev/api/v1/... - MCP — Model Context Protocol server at
jaina.dev/api/mcp
Same schemas, same records, same auth. Three access paths.
