Overview of OA’s intermediate code generation
OABuilder is a visual modeling environment used to define the application model. It captures domain structure, metadata, and runtime behavior, that includes:
The model is persisted in a structured format, and consumed by other generators and tools.
OACodeGen transforms the model into an Intermediate Representation (IR) that serves as a normalized, enriched view of the application model.
This process is similar to how modern compilers work: OACodeGen takes the high-level model (analogous to source code) and compiles it into a normalized, semantically rich IR. This IR is then used as the foundation for generating software artifacts.
This IR decouples the domain model from any specific technology or output format, making it reusable for multiple generators.
OACodeGen is architected as a meta-generator: a system for creating and executing custom code generators based on the IR.
This meta-generative approach enables organizations to define domain-specific output formats and enforce architectural patterns consistently across projects.
OACodeGen is a "code generator for code generators", that can transform your high-level OA Model into fully working software for any framework, backend, or frontend platform.
This enables seamless integration with your existing stack and allows you to explore new ones without rewriting your business logic. The OA Model becomes a true abstraction layer — portable, maintainable, and framework-agnostic.
There’s something uniquely powerful about designing a model in OABuilder and instantly seeing it come to life as working software — tailored to your chosen language or framework. With a single source of truth, you can watch your domain model generate and then run your model — all without writing repetitive boilerplate. It's software that is building itself, adapting to your stack while preserving the integrity of your design.
OA, OABuilder & OACodeGen make building a new generator a feasible task with high reuse and high reward. A single code generator can automate > 90% of development time and be the central control point. It's more than a 10x productivity improvement.OABuilder includes a suite of built-in generators that consume the IR and output structured code across the stack:
These generators target core OA runtime components such as:
OAObject
– base class for model entities
Hub<OAObject>
– observable, filterable object collections
OADataSource
– pluggable data access abstraction
This integration ensures that generated applications can operate as real-time object graphs — observing changes, resolving relationships, persisting state, and synchronizing across distributed environments.
A noted capability of OACodeGen is its ability to generate full-featured, commercial-grade UIs directly from the model — without relying on manual layout tools or drag-and-drop builders.
The IR for UI generation is organized in a two-stage process:
This approach allows UI generation to adapt easily across different platforms while ensuring that UI behavior and logic remain tightly coupled with the model. This is what allows OA to target any third party UI framework and component set. Examples include: React, Vue, Angular, Material UI, and others.
OACodeGen can take a full generic application project — such as OATemplate — and adapt it to any modeled domain. OATemplate includes prebuilt code, services, components, and configuration files.
OACodeGen analyzes the model and uses the IR to dynamically insert, customize, and adjust the template project to align with the target domain. This includes renaming classes, injecting model-specific logic, and configuring sync, services, and UI bindings automatically.
This enables rapid application assembly by reusing and customizing proven, production-ready project structures.
OACodeGen is designed to support iterative development. As the model evolves, developers can rerun the code generators to regenerate application code layers without affecting custom modifications.
The generated code follows a modular pattern where base classes and generated files are separated from developer-authored logic. This separation allows repeated regeneration after model changes — ensuring model-to-code alignment while preserving any custom business logic or extensions.