How the system fits together
OODS Foundry, the object-oriented design system, builds a screen from objects, traits, contexts, components and tokens. Here's each one, using the Harbor example from the quickstart.
Generated from @oods/foundry 0.10.1
Objects: the things your product is made of
A Warehouse, a Subscription, a Quote. An object lists its own fields and the traits it's built from. OODS Foundry ships 11 business objects, and you can add your own or replace a shipped one.
quickstart/Warehouse.object.yaml# A team's own object: a storage site the team ships orders from. It composes the team's Stockable trait beside two
# shipped ones. monthly_rent is a money amount in major units (12500.50 means 12,500.50), declared by its
# semantics; nothing is inferred from its name.
object:
name: Warehouse
version: 1.0.0
domain: acme.logistics
description: A storage site the team ships orders from.
tags:
- logistics
- inventory
traits:
- name: lifecycle/Stateful
parameters:
states:
- planned
- active
- closed
initialState: planned
- name: lifecycle/Timestampable
parameters:
recordedEvents:
- opened
- restocked
- closed
timezone: UTC
- name: Stockable
parameters:
capacityUnit: pallets
schema:
# These examples describe operating sites with stock on hand. Independent enum
# rotation paired a closed site with the trait's full-stock example.
status:
type: string
required: true
description: Current operating state of the warehouse.
validation:
enum:
- planned
- active
- closed
examples:
- active
last_event:
type: string
required: false
description: Most recent recorded warehouse event.
validation:
enum:
- opened
- restocked
- closed
examples:
- restocked
last_event_at:
type: datetime
required: false
description: When the sample warehouse was last restocked.
examples:
- '2026-09-15T12:00:00Z'
# One history for every sample site: registered as planned, opened on 2 March, restocked since. The status
# timeline reads state_history, not last_event, so the example authors the transition that made each site active.
created_at:
type: datetime
required: true
description: When the site was registered.
examples:
- '2026-01-12T09:00:00Z'
updated_at:
type: datetime
required: false
description: When the site's record last changed.
examples:
- '2026-09-15T12:00:00Z'
state_history:
type: StateTransition[]
required: false
description: The site's operating-state changes, oldest first.
examples:
- - title: Opened
from: planned
to: active
at: '2026-03-02T08:00:00Z'
reason: Site opened for orders
warehouse_id:
type: uuid
required: true
description: Unique identifier for the warehouse.
name:
type: string
required: true
description: The warehouse's name.
examples:
- Lakeside Distribution
- North Yard
- Harbor Cold Store
- Prairie Crossdock
- Riverbend Fulfillment
- Summit Parts Depot
- Bayview Returns Center
- Canal Street Annex
- Maple Grove Storage
- Eastgate Freight Hub
code:
type: string
required: true
description: Short site code printed on shipping labels.
examples:
- MKE-01
- CHI-02
- DET-03
- DSM-04
- STL-05
- DEN-06
- OAK-07
- IND-08
- MSP-09
- CLE-10
city:
type: string
required: true
description: City the warehouse is in.
examples:
- Milwaukee
- Chicago
- Detroit
- Des Moines
- St. Louis
- Denver
- Oakland
- Indianapolis
- Minneapolis
- Cleveland
manager_email:
type: email
required: false
description: Who runs the site day to day.
examples:
- mke-01.manager@harbor.example
- chi-02.manager@harbor.example
- det-03.manager@harbor.example
- dsm-04.manager@harbor.example
- stl-05.manager@harbor.example
- den-06.manager@harbor.example
- oak-07.manager@harbor.example
- ind-08.manager@harbor.example
- msp-09.manager@harbor.example
- cle-10.manager@harbor.example
monthly_rent:
type: number
required: true
description: What the site costs each month, in major units of its currency.
examples:
- 12500.5
- 9800
- 15250.75
- 7400
- 11850.25
- 21000
- 18990.99
- 6250
- 9975.5
- 14300
currency:
type: string
required: true
description: Currency the rent is paid in.
validation:
enum:
- USD
- EUR
- GBP
organization_id:
type: uuid
required: false
description: The organization operating this warehouse.
examples:
- 5d0c6a2e-8f41-4b7a-9c3e-2a6f1b8d4e90
organization_name:
type: string
required: false
description: The operating organization's name, shown in place of its id.
examples:
- Harbor Logistics
relationships:
- target: Organization
via: organization_id
cardinality: many-to-one
label: Operated by
semantics:
name:
semantic_type: logistics.warehouse.name
token_mapping: tokenMap(text.primary)
monthly_rent:
semantic_type: logistics.warehouse.rent
token_mapping: tokenMap(commerce.price.primary)
ui_hints:
component: CurrencyAmount
currencyField: currency
currency:
semantic_type: logistics.warehouse.currency
token_mapping: tokenMap(commerce.currency.primary)
organization_id:
semantic_type: logistics.warehouse.operator
token_mapping: tokenMap(text.body.*)
ui_hints:
displayLabelField: organization_name
metadata:
owners:
- logistics-team
maturity: beta
Traits: capabilities objects share
Being stocked, having a price, moving through states. A trait adds fields and says what to show in each context. Define it once, and every object that has it gets it. OODS Foundry ships 49.
quickstart/Stockable.trait.yamltrait:
name: Stockable
version: 1.0.0
description: How full a storage location is, counted in the unit the team stores goods in.
category: inventory
tags:
- inventory
- capacity
parameters:
- name: capacityUnit
type: string
required: false
description: The unit capacity and stock are counted in.
default: pallets
schema:
stock_level:
type: string
required: true
description: Whether the location has room, is nearly full, or is full.
validation:
enum:
- room_available
- nearly_full
- full
capacity_units:
type: integer
required: true
description: How many units the location holds when it is full.
examples:
- 1200
- 800
- 2400
units_on_hand:
type: integer
required: true
description: How many units are stored there now.
examples:
- 640
- 760
- 2400
semantics:
stock_level:
semantic_type: inventory.stock.level
token_mapping: tokenMap(inventory.stock.*)
ui_hints:
component: StatusBadge
view_extensions:
list:
- component: StatusBadge
position: after
props:
statusField: stock_level
emphasis: subtle
showIcon: false
card:
- component: StatusBadge
position: after
props:
statusField: stock_level
emphasis: subtle
showIcon: false
detail:
- component: StatusBadge
position: main
priority: 70
props:
statusField: stock_level
emphasis: subtle
showIcon: false
# Like the shipped Supersedable trait: the fields the trait is about are placed explicitly, so the detail
# composer's field budget never leaves them out.
- component: Text
position: main
priority: 69
props:
field: units_on_hand
- component: Text
position: main
priority: 68
props:
field: capacity_units
tokens:
inventory.stock.tone: neutral
dependencies: []
Contexts: where an object shows up
The same Warehouse appears as a row in a list, a full detail page, a form, a timeline, a card, an inline mention, or a whole workflow app. There are 7 contexts.
Here is the quickstart's Warehouse, generated in each one by OODS Foundry 0.10.1 in Harbor's brand, the quickstart's example team brand, with the shipped components. Contexts
sha256:5e965cb869b5…Open full size: Warehouse detail screen generated by OODS Foundry in Reactsha256:eb3203fccd62…Open full size: Warehouse detail screen generated by OODS Foundry in Vuesha256:8dec2f275d11…Open full size: Warehouse list screen generated by OODS Foundry in Reactsha256:af573e23b40b…Open full size: Warehouse list screen generated by OODS Foundry in Vuesha256:8ae396e268b0…Open full size: Warehouse form screen generated by OODS Foundry in Reactsha256:1fc1dd6c1b78…Open full size: Warehouse form screen generated by OODS Foundry in Vuesha256:b7340d420762…Open full size: Warehouse timeline screen generated by OODS Foundry in Reactsha256:7a7a3ae90e8a…Open full size: Warehouse timeline screen generated by OODS Foundry in Vuesha256:e7ebc4613bcb…Open full size: Warehouse card screen generated by OODS Foundry in Reactsha256:3944c438e0db…Open full size: Warehouse card screen generated by OODS Foundry in Vuesha256:b03b2e4e7c22…Open full size: Warehouse inline screen generated by OODS Foundry in Reactsha256:a7dfa5ed96cf…Open full size: Warehouse inline screen generated by OODS Foundry in Vuesha256:4f27544ac326…Open full size: Warehouse workflow screen generated by OODS Foundry in Reactsha256:9c8b76ec2aeb…Open full size: Warehouse workflow screen generated by OODS Foundry in VueWhat design_compose reported for every screen here:
OODS-V121Object 'Warehouse' has maturity 'beta' — composed output may change.OODS-V117Warehouse refines 6 fields its traits define, and its own definitions are used: lifecycle/Stateful (status, state_history); lifecycle/Timestampable (last_event, last_event_at, created_at, updated_at).
The calls that made the Warehouse detail apps, in React and Vue
design_compose {
"object": "Warehouse",
"context": "detail",
"preferences": {
"brand": "Harbor",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-c5105889",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-c5105889",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:5e965cb869b59fdd48c848733e32fa7a048290638481bfdd3772344886b955d4. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-harbor.css
The Vue app's content hash: sha256:eb3203fccd62a0b1147a61d4c2fa1b44a354ff66900bf2c699bf234b38a53d5c. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-harbor.css
The calls that made the Warehouse list apps, in React and Vue
design_compose {
"object": "Warehouse",
"context": "list",
"preferences": {
"brand": "Harbor",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-37cc58fb",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-37cc58fb",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:8dec2f275d11d9bfc00c85e02d20e3ae07097fc8df24e7cc80aaf04962084080. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-harbor.css
The Vue app's content hash: sha256:af573e23b40b9573dc4a719e4bd0e84fedda38a091b8c182e23edd2c8fda3d64. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-harbor.css
The calls that made the Warehouse form apps, in React and Vue
design_compose {
"object": "Warehouse",
"context": "form",
"preferences": {
"brand": "Harbor",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-f264d3f5",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-f264d3f5",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:8ae396e268b0d57ff376273cf6b1259fc53915167911b5569d30f6aee48f877f. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-harbor.css
The Vue app's content hash: sha256:1fc1dd6c1b784ed748d60726ff33986984e542ce75ecd4953566212fe76e08dd. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-harbor.css
For this screen it also reported:
OODS-V119No view_extensions found for context "timeline" in object "Warehouse". Available contexts: list, detail, form, card
The calls that made the Warehouse timeline apps, in React and Vue
design_compose {
"object": "Warehouse",
"context": "timeline",
"preferences": {
"brand": "Harbor",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-8d1a3313",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-8d1a3313",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:b7340d420762275994440eca41abed8329251e3acb0398e921458652f6598b1e. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-harbor.css
The Vue app's content hash: sha256:7a7a3ae90e8acf0a88b1fbb256ce02df4655d4fc414696f08ae0962db925c8d9. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-harbor.css
The calls that made the Warehouse card apps, in React and Vue
design_compose {
"object": "Warehouse",
"context": "card",
"preferences": {
"brand": "Harbor",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-2b2b9dfc",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-2b2b9dfc",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:e7ebc4613bcbff3374111495a968a59c96b29c8869f09dfbef2fbbdad3c153e7. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-harbor.css
The Vue app's content hash: sha256:3944c438e0db7fa94ce8047d55e18a5726bb64ed0a881c80a8b5da1896cf56e6. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-harbor.css
For this screen it also reported:
OODS-V119No view_extensions found for context "inline" in object "Warehouse". Available contexts: list, detail, form, card
The calls that made the Warehouse inline apps, in React and Vue
design_compose {
"object": "Warehouse",
"context": "inline",
"preferences": {
"brand": "Harbor",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-cbdba88a",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-cbdba88a",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:b03b2e4e7c22b62918dc47f71da265272a83691db2fb47010e6bd8f0de2376db. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-harbor.css
The Vue app's content hash: sha256:a7dfa5ed96cfbda39b2f0d9d4e5b648098d4ed9ae84b7be2ceee06caf9a6f1ae. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-harbor.css
For this screen it also reported:
OODS-V121as above, 4 times in allOODS-V117as above, 4 times in allOODS-V119No view_extensions found for context "timeline" in object "Warehouse". Available contexts: list, detail, form, card
The calls that made the Warehouse workflow apps, in React and Vue
design_compose {
"object": "Warehouse",
"context": "workflow",
"preferences": {
"brand": "Harbor",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-3b1e22ab",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-3b1e22ab",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Harbor",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:4f27544ac3261a4d95c0f0325a283716471c3dea7a5f82b8e02ef506626fa4bf. Its src/ folder: App.tsx, actions.ts, app.css, application.ts, main.tsx, oods-brand-harbor.css, sample-data.ts, screens/, ssr.tsx, store.ts
The Vue app's content hash: sha256:9c8b76ec2aebc04a2528e1108a3d433dd9043bc94b86866968381eacb96773ae. Its src/ folder: App.vue, actions.ts, app.css, application.ts, main.ts, oods-brand-harbor.css, sample-data.ts, screens/, ssr.ts, store.ts
Components: what screens are built from
OODS Foundry picks a component for every slot, by rule, from 114 governed components in React and Vue. You can map any of them to your own component.
The components the quickstart's Warehouse detail screen imports:
Tokens and brands: how it looks
Every colour, size and space comes from a token. A brand sets the tokens for light, dark and high contrast. OODS Foundry ships 2 brands, and you can make your own from a recipe or your own colour values.
quickstart/harbor.tokens.json{
"base": {
"surface": {
"canvas": {
"$type": "color",
"$value": "oklch(1 0.000007 205)",
"$description": "Primary application canvas."
},
"raised": {
"$type": "color",
"$value": "oklch(1 0.000007 205)",
"$description": "Raised card surface."
},
"subtle": {
"$type": "color",
"$value": "oklch(0.97 0.00288 205)",
"$description": "Subtle secondary surface."
},
"disabled": {
"$type": "color",
"$value": "oklch(0.97 0.00288 205)",
"$description": "Surface colour for disabled or inactive UI."
},
"backdrop": { Your assistant makes the calls. OODS Foundry composes the screen by rule, generates the code, and hands back a receipt of what it checked.