|
| 1 | +WEBVTT |
| 2 | +
|
| 3 | +00:00:00.000 --> 00:00:00.995 |
| 4 | +MetaObjects. |
| 5 | + |
| 6 | +00:00:00.995 --> 00:00:06.471 |
| 7 | +One model your database, your API, your UI, and your AI all share. |
| 8 | + |
| 9 | +00:00:06.471 --> 00:00:11.033 |
| 10 | +Here's the problem it solves — and what it actually is. |
| 11 | + |
| 12 | +00:00:11.033 --> 00:00:22.477 |
| 13 | +Today, when you build an app with AI, the AI writes every layer by hand — the database, the API, the forms, the prompts, even the docs. |
| 14 | + |
| 15 | +00:00:22.477 --> 00:00:26.037 |
| 16 | +Each one a separate, hand-shaped artifact. |
| 17 | + |
| 18 | +00:00:26.037 --> 00:00:29.767 |
| 19 | +They never quite fit, and every copy drifts. |
| 20 | + |
| 21 | +00:00:29.767 --> 00:00:31.404 |
| 22 | +MetaObjects flips that. |
| 23 | + |
| 24 | +00:00:31.404 --> 00:00:33.112 |
| 25 | +The AI writes one model. |
| 26 | + |
| 27 | +00:00:33.112 --> 00:00:40.587 |
| 28 | +From it you either generate idiomatic code, or embed the model live to drive your server and UI directly. |
| 29 | + |
| 30 | +00:00:40.587 --> 00:00:42.367 |
| 31 | +One model, the whole app. |
| 32 | + |
| 33 | +00:00:42.367 --> 00:00:44.704 |
| 34 | +Let's see that problem up close. |
| 35 | + |
| 36 | +00:00:44.704 --> 00:00:48.648 |
| 37 | +Every app defines the same domain model a dozen times. |
| 38 | + |
| 39 | +00:00:48.648 --> 00:00:50.767 |
| 40 | +It's in your database schema. |
| 41 | + |
| 42 | +00:00:50.767 --> 00:00:54.200 |
| 43 | +It's in the validators that re-list every field. |
| 44 | + |
| 45 | +00:00:54.200 --> 00:00:56.833 |
| 46 | +It's in your API routes and their types. |
| 47 | + |
| 48 | +00:00:56.833 --> 00:00:59.567 |
| 49 | +It's in the forms on the screen. |
| 50 | + |
| 51 | +00:00:59.567 --> 00:01:05.500 |
| 52 | +And now it's even hand-built into your LLM prompt — and again, in every language you ship. |
| 53 | + |
| 54 | +00:01:05.500 --> 00:01:09.376 |
| 55 | +Rename one field, and you chase it through every copy. |
| 56 | + |
| 57 | +00:01:09.376 --> 00:01:16.267 |
| 58 | +And now an AI writes all of them — faster than you ever could, and with no guarantee they agree. |
| 59 | + |
| 60 | +00:01:16.267 --> 00:01:17.511 |
| 61 | +And it's not just you. |
| 62 | + |
| 63 | +00:01:17.511 --> 00:01:24.467 |
| 64 | +Practitioners call it prompt sprawl: hundreds of prompts scattered across services, impossible to reason about as a system. |
| 65 | + |
| 66 | +00:01:24.467 --> 00:01:34.900 |
| 67 | +And the academics are converging on the cause: the software model gets lost in code generation, and has to be recovered just to make sense of what the AI wrote. |
| 68 | + |
| 69 | +00:01:34.900 --> 00:01:38.622 |
| 70 | +So here's the cure, and it's refreshingly simple. |
| 71 | + |
| 72 | +00:01:38.622 --> 00:01:48.725 |
| 73 | +You declare your domain model once, in plain, readable text — an entity called Subscriber: its fields, its identity, its constraints. |
| 74 | + |
| 75 | +00:01:48.725 --> 00:01:55.333 |
| 76 | +Not code, not a database: one model, standing in for that dozen hand-maintained copies. |
| 77 | + |
| 78 | +00:01:55.333 --> 00:01:57.284 |
| 79 | +So what is MetaObjects, exactly? |
| 80 | + |
| 81 | +00:01:57.284 --> 00:01:58.077 |
| 82 | +Three pieces. |
| 83 | + |
| 84 | +00:01:58.077 --> 00:02:00.699 |
| 85 | +One: the model — the metadata you just saw. |
| 86 | + |
| 87 | +00:02:00.699 --> 00:02:04.784 |
| 88 | +Two: codegen — idiomatic code generated from it, in every language. |
| 89 | + |
| 90 | +00:02:04.784 --> 00:02:09.296 |
| 91 | +Three: the runtime — load that same model live to drive your app directly. |
| 92 | + |
| 93 | +00:02:09.296 --> 00:02:10.089 |
| 94 | +And the name? |
| 95 | + |
| 96 | +00:02:10.089 --> 00:02:17.955 |
| 97 | +In the runtime, your metadata is made of MetaData classes — and MetaObject, the one that describes an object, is the primary one. |
| 98 | + |
| 99 | +00:02:17.955 --> 00:02:19.967 |
| 100 | +That's where the name comes from. |
| 101 | + |
| 102 | +00:02:19.967 --> 00:02:21.602 |
| 103 | +And this isn't abstract. |
| 104 | + |
| 105 | +00:02:21.602 --> 00:02:34.003 |
| 106 | +From that one model you get real artifacts — your domain objects, your database schema, your API with validation and filters, your UI forms and grids, the typed I/O for your prompts. |
| 107 | + |
| 108 | +00:02:34.003 --> 00:02:36.933 |
| 109 | +The core of every layer, in five languages. |
| 110 | + |
| 111 | +00:02:36.933 --> 00:02:38.383 |
| 112 | +And this model is no toy. |
| 113 | + |
| 114 | +00:02:38.383 --> 00:02:43.080 |
| 115 | +It's a metamodel that's been evolving for twenty years, and it's built to extend. |
| 116 | + |
| 117 | +00:02:43.080 --> 00:02:54.273 |
| 118 | +You start from abstract, core models that give you consistent behavior; your concrete entities extend those; and downstream you can overlay — augment and enhance the model — without forking it. |
| 119 | + |
| 120 | +00:02:54.273 --> 00:02:56.071 |
| 121 | +Need something it doesn't ship? |
| 122 | + |
| 123 | +00:02:56.071 --> 00:02:58.333 |
| 124 | +Register your own types and attributes. |
| 125 | + |
| 126 | +00:02:58.333 --> 00:03:00.785 |
| 127 | +Now scale that across an enterprise. |
| 128 | + |
| 129 | +00:03:00.785 --> 00:03:04.260 |
| 130 | +One app builds on a shared concrete model directly. |
| 131 | + |
| 132 | +00:03:04.260 --> 00:03:10.731 |
| 133 | +Another team expands it — adds more objects — into a second model, and more apps build on that. |
| 134 | + |
| 135 | +00:03:10.731 --> 00:03:14.887 |
| 136 | +Many apps, many languages, all sharing one lineage of models. |
| 137 | + |
| 138 | +00:03:14.887 --> 00:03:24.833 |
| 139 | +That's how a large organization stays consistent across its whole ecosystem — drift designed out, not just inside one app, but across all of them. |
| 140 | + |
| 141 | +00:03:24.833 --> 00:03:31.785 |
| 142 | +Now, two of those pieces are really two ways to ship the same model — generate the code, or drive it live. |
| 143 | + |
| 144 | +00:03:31.785 --> 00:03:33.622 |
| 145 | +Let's start with generating. |
| 146 | + |
| 147 | +00:03:33.622 --> 00:03:51.200 |
| 148 | +From that same model, MetaObjects emits idiomatic code in every language, and every line traces back to the metadata: the field's maxLength becomes the column length and a validation rule; your enum values become a database CHECK; the unique identity becomes an index. |
| 149 | + |
| 150 | +00:03:51.200 --> 00:03:53.413 |
| 151 | +The same model generates your DTOs. |
| 152 | + |
| 153 | +00:03:53.413 --> 00:04:02.200 |
| 154 | +Because this one is an object dot value — no identity, no table — you get a typed payload your code fills in, with a schema to validate it. |
| 155 | + |
| 156 | +00:04:02.200 --> 00:04:11.824 |
| 157 | +And your read-only views: an object dot projection over a database view becomes read-only code — queries, but no inserts or updates. |
| 158 | + |
| 159 | +00:04:11.824 --> 00:04:17.000 |
| 160 | +Entities, value objects, projections — every shape, from the one model. |
| 161 | + |
| 162 | +00:04:17.000 --> 00:04:21.541 |
| 163 | +Now the two modes, side by side — same model, same metadata. |
| 164 | + |
| 165 | +00:04:21.541 --> 00:04:22.677 |
| 166 | +First, codegen. |
| 167 | + |
| 168 | +00:04:22.677 --> 00:04:31.911 |
| 169 | +At build time, meta gen walks the model — its fields, their views, the grid layout — and freezes your columns into a file. |
| 170 | + |
| 171 | +00:04:31.911 --> 00:04:37.133 |
| 172 | +That file is a snapshot: when the model changes, you re-run meta gen. |
| 173 | + |
| 174 | +00:04:37.133 --> 00:04:41.564 |
| 175 | +Now the runtime way — same diagram, same metadata, but live. |
| 176 | + |
| 177 | +00:04:41.564 --> 00:04:47.398 |
| 178 | +buildGrid walks that same loaded model on every render and returns the columns. |
| 179 | + |
| 180 | +00:04:47.398 --> 00:04:51.902 |
| 181 | +Nothing's frozen: change the model and the grid just follows. |
| 182 | + |
| 183 | +00:04:51.902 --> 00:04:57.367 |
| 184 | +One model, two delivery modes — a snapshot you regenerate, or a live feed. |
| 185 | + |
| 186 | +00:04:57.367 --> 00:05:02.899 |
| 187 | +Now, that third piece — the runtime — is the half most tools miss, and it's just as big as codegen. |
| 188 | + |
| 189 | +00:05:02.899 --> 00:05:07.481 |
| 190 | +You load the same model into your running app and drive behavior straight from it. |
| 191 | + |
| 192 | +00:05:07.481 --> 00:05:18.824 |
| 193 | +It's how Salesforce runs the biggest apps in the world, and how Airbnb ships UI without an app-store release — there's no codegen path to a phone that already shipped, or an agent that connects tomorrow. |
| 194 | + |
| 195 | +00:05:18.824 --> 00:05:20.500 |
| 196 | +A live model reaches them all. |
| 197 | + |
| 198 | +00:05:20.500 --> 00:05:36.567 |
| 199 | +And the loaded model drives a lot: dynamic CRUD, validation and relationships, server-driven admin grids that re-shape when the model changes, entities as LLM tools, prompt rendering and extraction — none of it needing a rebuild or a redeploy. |
| 200 | + |
| 201 | +00:05:36.567 --> 00:05:37.834 |
| 202 | +Now the AI itself. |
| 203 | + |
| 204 | +00:05:37.834 --> 00:05:47.967 |
| 205 | +The moment your app calls an LLM, you add two surfaces nothing in your stack is checking: the prompt going in, and the messy output coming back. |
| 206 | + |
| 207 | +00:05:47.967 --> 00:05:50.476 |
| 208 | +First, the prompt — and it's part of the model. |
| 209 | + |
| 210 | +00:05:50.476 --> 00:05:58.218 |
| 211 | +You declare a typed payload, the exact fields the prompt needs, and the text lives in an external Mustache template that references those fields. |
| 212 | + |
| 213 | +00:05:58.218 --> 00:06:05.533 |
| 214 | +The template can only use fields that exist on the payload, so a renamed field breaks the build instead of silently degrading the prompt. |
| 215 | + |
| 216 | +00:06:05.533 --> 00:06:06.616 |
| 217 | +Then the output. |
| 218 | + |
| 219 | +00:06:06.616 --> 00:06:11.966 |
| 220 | +Real model output is dirty: prose wrappers, code fences, off-vocabulary values. |
| 221 | + |
| 222 | +00:06:11.966 --> 00:06:17.179 |
| 223 | +MetaObjects generates a tolerant extract function from that same declaration. |
| 224 | + |
| 225 | +00:06:17.179 --> 00:06:22.867 |
| 226 | +It returns typed data, with a report of exactly what it fixed — and it never throws. |
| 227 | + |
| 228 | +00:06:22.867 --> 00:06:27.297 |
| 229 | +Now, an honest word: does MetaObjects write your whole app? |
| 230 | + |
| 231 | +00:06:27.297 --> 00:06:27.522 |
| 232 | +No. |
| 233 | + |
| 234 | +00:06:27.522 --> 00:06:40.286 |
| 235 | +It generates the core — entities, data access, routes, validation, forms, grids, prompt I/O — often as much as eighty percent, the boilerplate that's the same everywhere. |
| 236 | + |
| 237 | +00:06:40.286 --> 00:06:53.800 |
| 238 | +The other twenty percent — your pricing rules, your workflows, the logic that makes the app yours — you still write, against the generated code: typed, and right there to build on. |
| 239 | + |
| 240 | +00:06:53.800 --> 00:06:55.568 |
| 241 | +And here's the powerful part. |
| 242 | + |
| 243 | +00:06:55.568 --> 00:07:08.433 |
| 244 | +Because your logic builds on the generated code, when you change the model and regenerate, that logic breaks exactly where the change landed — a compile error, on the precise line, not a silent runtime surprise. |
| 245 | + |
| 246 | +00:07:08.433 --> 00:07:14.774 |
| 247 | +The AI changes the model, regenerates, and the breakage points it straight at the custom code to update. |
| 248 | + |
| 249 | +00:07:14.774 --> 00:07:18.067 |
| 250 | +Drift stops being a bug hunt and becomes a to-do list. |
| 251 | + |
| 252 | +00:07:18.067 --> 00:07:20.940 |
| 253 | +And one command ties the generated side together. |
| 254 | + |
| 255 | +00:07:20.940 --> 00:07:28.385 |
| 256 | +Meta verify checks that your code, your schema, and your prompts still agree with the model, and fails the build if they don't. |
| 257 | + |
| 258 | +00:07:28.385 --> 00:07:32.900 |
| 259 | +Verify keeps the generated code honest; the compiler keeps your logic honest. |
| 260 | + |
| 261 | +00:07:32.900 --> 00:07:36.300 |
| 262 | +The AI writes the code — the model keeps all of it honest. |
| 263 | + |
| 264 | +00:07:36.300 --> 00:07:42.305 |
| 265 | +And this is where the whole industry is heading: let the AI author a model, not raw code. |
| 266 | + |
| 267 | +00:07:42.305 --> 00:07:50.063 |
| 268 | +Google's A2UI now has agents author the user interface as a declarative model — a data format, not executable code. |
| 269 | + |
| 270 | +00:07:50.063 --> 00:07:55.933 |
| 271 | +But it's only the UI, a fixed palette — and every tool out there solves just one slice. |
| 272 | + |
| 273 | +00:07:55.933 --> 00:08:05.556 |
| 274 | +MetaObjects spans it, shipping today — one typed, extensible, portable model for your database, API, UI, and AI. |
| 275 | + |
| 276 | +00:08:05.556 --> 00:08:06.758 |
| 277 | +Not a roadmap. |
| 278 | + |
| 279 | +00:08:06.758 --> 00:08:08.133 |
| 280 | +Installable now. |
| 281 | + |
| 282 | +00:08:08.133 --> 00:08:14.155 |
| 283 | +So: drive your model live at runtime, or generate the code — in any of five languages. |
| 284 | + |
| 285 | +00:08:14.155 --> 00:08:17.866 |
| 286 | +Go take a look — everything's at metaobjects dot dev. |
| 287 | + |
| 288 | +00:08:17.866 --> 00:08:19.267 |
| 289 | +Thanks for watching. |
| 290 | + |
0 commit comments