Reference
Remy Reference/Guide/Manifest Reference
Chapter 03

Manifest Reference

The manifest declares everything the platform needs to know about your app: methods, tables, roles, interfaces, scenarios. It's read on every git push to determine what to compile and deploy.


#Full Example

json
{
  "appId": "e452fcf2-06c5-49e8-b4f1-6353563f24b0",
  "name": "Procure-to-Pay",

  "roles": [
    { "id": "requester", "name": "Requester", "description": "Can submit vendor requests and purchase orders." },
    { "id": "approver", "name": "Approver", "description": "Reviews and approves purchase orders." },
    { "id": "admin", "name": "Administrator", "description": "Full access to all app functions." },
    { "id": "ap", "name": "Accounts Payable", "description": "Processes invoices and payments." }
  ],

  "tables": [
    { "name": "vendors", "path": "dist/methods/src/tables/vendors.ts", "export": "Vendors" },
    { "name": "purchase-orders", "path": "dist/methods/src/tables/purchase-orders.ts", "export": "PurchaseOrders" },
    { "name": "invoices", "path": "dist/methods/src/tables/invoices.ts", "export": "Invoices" }
  ],

  "methods": [
    {
      "id": "submit-vendor-request",
      "name": "Submit Vendor Request",
      "path": "dist/methods/src/submitVendorRequest.ts",
      "export": "submitVendorRequest"
    },
    {
      "id": "get-dashboard",
      "name": "Dashboard",
      "path": "dist/methods/src/getDashboard.ts",
      "export": "getDashboard"
    }
  ],

  "interfaces": [
    { "type": "web", "path": "dist/interfaces/web/web.json" },
    { "type": "api", "path": "dist/interfaces/api/api.json" },
    { "type": "cron", "path": "dist/interfaces/cron/interface.json" }
  ],

  "scenarios": [
    {
      "id": "ap-overdue-invoices",
      "name": "AP: Overdue Invoices",
      "description": "AP user with two invoices past due date.",
      "path": "dist/methods/.scenarios/apOverdueInvoices.ts",
      "export": "apOverdueInvoices",
      "roles": ["ap"]
    },
    {
      "id": "empty-requester",
      "name": "Empty Requester",
      "description": "Brand new user, no data.",
      "path": "dist/methods/.scenarios/emptyRequester.ts",
      "export": "emptyRequester",
      "roles": ["requester"]
    }
  ]
}

#Fields

#appId

Typestring (UUID)
RequiredYes

The app's UUID, assigned when created on the platform. Found in the git remote URL: https://git.mscdn.ai/{appId}.git.

#name

Typestring
RequiredYes

Display name. Shown in the editor, workspace listings, and session context.

#auth

Typeobject
RequiredNo (omit for an app with no user accounts)

Opts the app into managed user accounts. Without it, the app uses anonymous guest sessions: no login, no user identity, no roles.

FieldTypeRequiredDescription
enabledbooleanYestrue to enable auth
methodsstring[]YesAuth methods: "email-code", "sms-code", "api-key", "remy" (platform-delegated sign-in, org-owned apps). At least one required.
table.namestringYesName of the defineTable table holding user records
table.columns.emailstringIf email-codeColumn name for email (platform-managed, read-only from code)
table.columns.phonestringIf sms-codeColumn name for phone (platform-managed, read-only from code)
table.columns.rolesstringNoColumn name for the roles array (bidirectional sync)
table.columns.apiKeystringIf api-keyColumn name for API key (platform-managed, stores masked value)

The user table is a normal app table that you own and can extend with your own columns. See Auth & Roles for the full configuration and the frontend/backend APIs.

#roles

TypeArray<{ id, name?, description? }>
RequiredNo (defaults to [])

Defines the app's roles for access control. Each role:

FieldTypeRequiredDescription
idstringYesKebab-case identifier (used in code: auth.requireRole('admin'))
namestringNoDisplay name
descriptionstringNoWhat this role can do (shown in editor, useful context for the agent)

The platform syncs roles on deploy. Assign users to roles in the editor. See Auth & Roles.

#tables

TypeArray<{ name, path, export }>
RequiredNo (defaults to [])

Declares database tables. Each entry:

FieldTypeRequiredDescription
namestringYesTable name (matches db.defineTable('name'))
pathstringYesPath to the TypeScript file (relative to project root)
exportstringYesNamed export from the file (e.g., Vendors)

The platform parses the TypeScript to extract the schema. See Tables & Database.

#methods

TypeArray<{ id, name?, description?, path, export, ... }>
RequiredYes (at least one)

Declares backend methods. Each entry:

FieldTypeRequiredDescription
idstringYesKebab-case identifier (used in API URLs and frontend method map)
namestringNoDisplay name
descriptionstringNoWhat the method does. Used as the fallback tool description when the method is exposed to an agent.
pathstringYesPath to the TypeScript file
exportstringYesNamed export (the async function)

See Methods.

#Jewel fields

Only relevant when a method has an AI companion attached. Most methods set none of them. See Jewels.

FieldTypeRequiredDescription
autonomystringNoWhat happens to each proposal: "manual", "shadow", "approve", or "auto". "manual" records a policy of no automation.
jewel{ path, export }NoThe jewel implementation file and its export
sampleRatenumberNoFraction of eligible decision moments that get the full autonomy treatment. Default 1; validated 0 < rate <= 1 at compile. Requires autonomy.
attributionWindownumberNoHow long, in seconds, a proposal raised by jewels.propose waits for a human to act on the method so it has something to be graded against. It closes as expired if nobody does. Default 604800 (7 days), capped at 90 days. Requires autonomy.
tuningobjectNoTraining recipe for the jewel's own model (base, windowDays, epochs, rank, learningRate). Every knob optional, with platform defaults. Requires jewel.

#interfaces

TypeArray<{ type, path?, config?, enabled? }>
RequiredNo (defaults to [])

Declares how users interact with the app. Each entry:

FieldTypeRequiredDescription
typestringYesOne of: web, api, cron, webhook, email, mcp, agent, voice
pathstringNoPath to the interface config file
configobjectNoInline config (alternative to a file)
enabledbooleanNoDefault true. Set false to skip during build.

See Interfaces for the config schema for each type.

#scenarios

TypeArray<{ id, name?, description?, path, export, roles }>
RequiredNo (defaults to [])

Declares seed scripts for testing. Each entry:

FieldTypeRequiredDescription
idstringYesKebab-case identifier
namestringNoDisplay name
descriptionstringNoWhat state this scenario creates
pathstringYesPath to the TypeScript file
exportstringYesNamed export (the async function)
rolesstring[]YesRoles assigned to the dev test user after seeding

See Scenarios.