[**0.11.2** · Apache-2.0 · for Claude Desktop, Claude Code and Cursor](https://oods-foundry.com/start)

**One object. Every screen. On the record.**

# Your product is made of objects. Your UI should be too.

You've already defined them in your database, your API or your GraphQL schema. Bring in their schema files, keep what's right, and map the components you already own, [starting with shadcn/ui on Radix or Base UI](https://oods-foundry.com/shadcn). Your assistant builds their list, detail, form and timeline screens in React or Vue, in your brand.

[Get started](https://oods-foundry.com/start) [See one change across screens](https://oods-foundry.com/demos/trait-change)

Every app comes with a receipt: what was built, what was checked, and what wasn't.

`npx -y @oods/foundry`

Registered as `oods-foundry` · Node.js 22.0.0 or newer · macOS or Linux · Apache-2.0: free for any use, including at work. What it generates for you is yours.

[Subscription detail screen generated by OODS Foundry in React](https://oods-foundry.com/objects/subscription/screens/detail-react)

**Subscription** detail React `sha256:7af8e7c5f3…` [Open](https://oods-foundry.com/objects/subscription)

[Transaction list screen generated by OODS Foundry in Vue](https://oods-foundry.com/objects/transaction/screens/list-vue)

**Transaction** list Vue `sha256:4e8b74f23c…` [Open](https://oods-foundry.com/objects/transaction)

[Usage detail screen generated by OODS Foundry in React](https://oods-foundry.com/objects/usage/screens/detail-react)

**Usage** detail React `sha256:c0a349a344…` [Open](https://oods-foundry.com/objects/usage)

[User list screen generated by OODS Foundry in Vue](https://oods-foundry.com/objects/user/screens/list-vue)

**User** list Vue `sha256:8094ca55c6…` [Open](https://oods-foundry.com/objects/user)

[Relationship detail screen generated by OODS Foundry in React](https://oods-foundry.com/objects/relationship/screens/detail-react)

**Relationship** detail React `sha256:0568dd72e7…` [Open](https://oods-foundry.com/objects/relationship)

[Plan form screen generated by OODS Foundry in Vue](https://oods-foundry.com/objects/plan/screens/form-vue)

**Plan** form Vue `sha256:90b1ac217f…` [Open](https://oods-foundry.com/objects/plan)

[Invoice detail screen generated by OODS Foundry in React](https://oods-foundry.com/objects/invoice/screens/detail-react)

**Invoice** detail React `sha256:361579e6b6…` [Open](https://oods-foundry.com/objects/invoice)

Every screen here runs live. OODS Foundry 0.11.2 generated each one from a shipped object and the sample records in its file, in this site's brand; the hash is the app's content hash as generated. Charts are drawn when a screen is generated, and they follow the theme you choose.

Design systems settled into the same set of components, and that was the right bet while the industry was scaling. It's how we kept up. It's also why you can't tell one company's system from another's past the colours. What makes a product its own, the things it's made of and the rules they follow, lives everywhere except the system.

OODS Foundry starts there. An object is a thing your product is made of, like a subscription. A trait is a capability objects share, like a lifecycle that runs from active to cancelled. A context is where the object shows up, like a detail page or a list. Put a rule on the trait once, and every screen that shows the object is built from it. Change the trait, and the screens it reaches change on the next build.

Agents can build screens faster than a team can review them. Screens built from the objects can be checked against them, and the receipt says what was checked and what wasn't. It runs the same for one person with an assistant and for a design-system team with many products, and it works with the components and brand you already have.

How it works

## From one object file to every screen

### Bring in the object

An object is a thing your product is made of, like a Subscription or a Warehouse. Point OODS Foundry at a local schema file you already have, from Postgres, Prisma, dbt, OpenAPI, GraphQL or OData, and it drafts the objects and proposes the traits it found evidence for. Nothing is registered until you accept it. Each object is one YAML file you can read and edit, and a trait defined once reaches every object that has it.

```
object:
  name: Subscription
  version: 2.0.0
  domain: core.billing
  description: Canonical subscription record composing lifecycle, billing, and cancellation semantics.
  tags:
    - billing
    - lifecycle
    - monetization

traits:
  - name: lifecycle/Stateful
    alias: SubscriptionLifecycle
    parameters:
```

### Pick a context

OODS Foundry composes the object by rule for each context and generates a running React or Vue app.

- [detail](https://oods-foundry.com/contexts/detail)
- [list](https://oods-foundry.com/contexts/list)
- [form](https://oods-foundry.com/contexts/form)
- [timeline](https://oods-foundry.com/contexts/timeline)
- [card](https://oods-foundry.com/contexts/card)
- [inline](https://oods-foundry.com/contexts/inline)
- [workflow](https://oods-foundry.com/contexts/workflow)

The same call gives the same bytes, and every app comes back with its content hash and a receipt of the checks that ran and the ones that didn't.

### Describe it once. Every screen follows.

Change a trait, rebuild, and the screens that edit reaches change, on every object that has the trait. One edit to the Stockable trait reaches the Warehouse and the cold room; the before and after, with their receipts and hashes, are in the demo.

[See one change across screens](https://oods-foundry.com/demos/trait-change)

[See a schema become a Membership workspace](https://oods-foundry.com/demos/membership)

## Try it on your own schema

Point it at one local schema file your product already has. Keep the objects that are right, build their screens, and read the receipt. Install it, then follow the guide to importing objects.

`npx -y @oods/foundry` [Read the importing guide](https://oods-foundry.com/guides/importing-objects)
