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's data ("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, immutable
  • schema_id — which schema it belongs to
  • data — 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.