ObjectStackObjectStack

Metadata Types Overview

A comprehensive guide to every metadata type used in ObjectStack application development

Metadata Types Overview

In ObjectStack, an application is defined entirely by metadata — declarative configurations that describe data models, user interfaces, business logic, and security rules. The Kernel interprets these metadata definitions at runtime to produce a fully functional application.

This section provides a detailed guide for each metadata type you use when building an application.

Metadata Categories

Data Layer

Define your business data model and integrity rules.

Metadata TypeDescriptionFile Convention
ObjectBusiness entity definitions — tables, fields, capabilities*.object.ts / *.object.yml
FieldIndividual property definitions within objects — 40+ typesDefined inline within Object
ValidationData integrity rules — formula, uniqueness, format, state machineDefined inline or standalone

UI Layer

Define how users interact with data.

Metadata TypeDescriptionFile Convention
ViewList views and form views — grid, kanban, calendar, gantt*.view.ts / *.view.yml
PageCustom pages with component-based layouts*.page.ts / *.page.yml
AppApplication container — navigation, branding, permissions*.app.ts / *.app.yml
DashboardAnalytics dashboards with chart widgets*.dashboard.ts / *.dashboard.yml

Automation Layer

Define business logic and process automation.

Metadata TypeDescriptionFile Convention
FlowVisual automation — decision trees, data operations, screens*.flow.ts / *.flow.yml
WorkflowEvent-triggered rules — field updates, alerts, HTTP calls*.workflow.ts / *.workflow.yml

Security Layer

Define access control and data visibility.

Metadata TypeDescriptionFile Convention
PermissionPermission sets — object CRUD, field security, tab visibility*.permission.ts / *.permission.yml

How Metadata Works Together

┌─────────────────────────────────────────────────┐
│                   App (Container)                │
│  ┌──────────┐  ┌───────────┐  ┌──────────────┐  │
│  │Navigation│  │  Branding │  │  Permissions  │  │
│  └──────────┘  └───────────┘  └──────────────┘  │
├─────────────────────────────────────────────────┤
│            Views / Pages / Dashboards            │
│  ┌─────────┐  ┌──────────┐  ┌───────────────┐   │
│  │ListView  │  │ FormView │  │   Dashboard   │   │
│  │(grid,    │  │(sections,│  │  (widgets,    │   │
│  │ kanban)  │  │ fields)  │  │   charts)     │   │
│  └─────────┘  └──────────┘  └───────────────┘   │
├─────────────────────────────────────────────────┤
│               Objects + Fields                   │
│  ┌──────────────────────────────────────────┐    │
│  │  Object: name, fields, capabilities      │    │
│  │  Fields: text, number, select, lookup ... │    │
│  │  Validations: formula, uniqueness, format │    │
│  └──────────────────────────────────────────┘    │
├─────────────────────────────────────────────────┤
│          Flows + Workflows + Permissions          │
│  ┌───────────┐  ┌───────────┐  ┌────────────┐   │
│  │   Flow    │  │ Workflow  │  │ Permission │   │
│  │(visual    │  │(event     │  │(CRUD, field│   │
│  │ logic)    │  │ triggers) │  │ security)  │   │
│  └───────────┘  └───────────┘  └────────────┘   │
└─────────────────────────────────────────────────┘

Quick Example

A minimal application requires at least an Object definition:

import { ObjectSchema, Field } from '@objectstack/spec/data';

export const Task = ObjectSchema.create({
  name: 'task',
  label: 'Task',
  fields: {
    title: Field.text({ label: 'Title', required: true }),
    status: Field.select({
      label: 'Status',
      options: [
        { label: 'To Do', value: 'todo', default: true },
        { label: 'In Progress', value: 'in_progress' },
        { label: 'Done', value: 'done' },
      ],
    }),
    assignee: Field.lookup('user', { label: 'Assignee' }),
  },
  enable: { apiEnabled: true, searchable: true },
});

From this single definition, ObjectStack automatically generates CRUD APIs, form views, and list views. As your application grows, you add Views, Flows, Permissions, and other metadata to customize behavior.

Next Steps

Start with the core building blocks:

  1. Object — Define your data entities
  2. Field — Configure field types and properties
  3. View — Customize list and form layouts
  4. Flow — Add business logic and automation

On this page