Build & Run Declarative UI Apps. OpenAPI is your foundation.
|
|
| Meeting Minutes (FastAPI) | ESP32 Hardware (simulator) |
# Initialize a new UIGen project
npx @uigen-dev/cli@latest init my-app
cd my-app
# Start the development server
npx @uigen-dev/cli@latest serve openapi.yaml
Visit http://localhost:4400 to see your app.
UIGen scaffolds a complete project with configuration files (.uigen/config.yaml, .uigen/theme.css), AI agent skills (.agents/skills/), and an example spec if needed. The serve command renders a complete UI from your OpenAPI spec at runtime. When your API changes, the UI updates automatically with no regeneration or code maintenance required.
${VAR_NAME} syntaxlibrary:iconName syntaxhasMany, belongsTo, manyToMany from path patterns/pricing route automaticallyuigen buildFull-stack web app with auth, file uploads, and relationships.
git clone https://github.com/darula-hpp/uigen
cd uigen/examples/apps/fastapi/meeting-minutes
# Setup backend (FastAPI + PostgreSQL)
docker compose up -d
docker compose exec app alembic upgrade head
# Initialize and start
npx @uigen-dev/cli@latest init --spec openapi.yaml
npx @uigen-dev/cli@latest serve openapi.yaml --proxy-base http://localhost:8000
Visit http://localhost:4400 to explore a full meeting minutes application with CRUD operations, authentication, file uploads, and relationships.
For embedded and IoT workflows, see examples/apps/cpp/esp32-simulator. A C++ REST API simulates an ESP32-DevKitC with GPIO, sensors, telemetry, and device actions. The same contract-first openapi.yaml drives a generated admin UI — no RainMaker, no hand-built React.
Visual demo (C++ serves the page) UIGen admin UI (from openapi.yaml)
http://localhost:8080 http://localhost:4400
| |
+-------- same REST API ----------------+
cd uigen/examples/apps/cpp/esp32-simulator
docker compose up --build
# In another terminal — run UIGen from UI/ so .uigen/config.yaml is picked up
cd uigen/examples/apps/cpp/esp32-simulator/UI
npx @uigen-dev/cli@latest serve openapi.yaml --proxy-base http://localhost:8080
| URL | What you get |
|---|---|
http://localhost:8080 |
Interactive board diagram, live GPIO/sensor cards, event log |
http://localhost:4400 |
Generated control panel: pin config, settings forms, telemetry table + charts, blink/reset actions |
The simulator serves GET /openapi.yaml on the wire. UIGen config in UI/.uigen/config.yaml adds charts (x-uigen-chart), sensor filters, and layout. If you only have curl output or C struct headers, use the Generate Device OpenAPI agent skill (SKILLS/generate-device-openapi.md) to draft the spec, then Auto-Annotate for config.
See the ESP32 example README for API endpoints, local build, and tests.
For professional embedded workflows, see examples/apps/cpp/stm32-nucleo-simulator. A C++ REST API simulates a NUCLEO-F411RE with Arduino header pins, I2C sensors, 4-20mA analog input, and ST-Link status. Same contract-first OpenAPI pattern as the ESP32 example.
cd uigen/examples/apps/cpp/stm32-nucleo-simulator
docker compose up --build
# In another terminal — run UIGen from UI/ so .uigen/config.yaml is picked up
cd uigen/examples/apps/cpp/stm32-nucleo-simulator/UI
npx @uigen-dev/cli@latest serve openapi.yaml --proxy-base http://localhost:8081 --port 4401
| URL | What you get |
|---|---|
http://localhost:8081 |
Nucleo board diagram, LD2 blink, live sensor cards, event log |
http://localhost:4401 |
Generated control panel: pin CRUD, config forms, telemetry charts, blink/reset actions |
See the STM32 Nucleo example README for API endpoints, local build, and tests.
UIGen includes AI agent skills that automate configuration through intelligent analysis of your OpenAPI spec. Skills work with any AI coding assistant (Cursor, Windsurf, Cline, GitHub Copilot).
openapi.yaml from curl, Postman, C structs, or route tables (embedded/IoT)Reference skills with your AI assistant:
npx @uigen-dev/cli@latest init my-app --spec openapi.yaml
# Ask AI: "Use the auto-annotate skill to configure my spec"
# Ask AI: "Use the configure-oauth skill to add Google login"
# Ask AI: "Use the configure-icons skill to add professional icons"
# Ask AI: "Use the applying-styles skill to create a professional theme"
npx @uigen-dev/cli@latest serve openapi.yaml
Environment Variables: Keep sensitive values secure by using ${ENV_VAR_NAME} syntax in your config file. UIGen automatically loads .env files from your spec directory. See the Environment Variables Guide for details.
UIGen uses runtime rendering to transform your OpenAPI spec into a complete, interactive frontend. Unlike code generators, UIGen interprets your spec at runtime, keeping your UI automatically in sync with API changes.
CLI Command
|
v
+----------------+ +----------------+ +----------+ +------+ +--------+ +--------------+
| API Document |---->| Reconciler |---->| Adapter |---->| IR |---->| Engine |---->| React SPA |
| (YAML/JSON) | | (Config Merge) | | (Parser) | | | | | | (served) |
+----------------+ +----------------+ +----------+ +------+ +--------+ +--------------+
| ^ |
| | +---------+
| +----------------+ v
| | Config File | +-----------+
| | (.uigen/ | | API Proxy |---> Real API
| | config.yaml) | +-----------+
| +----------------+
|
+---> (Source spec unchanged on disk)
UIGen reconciles your config with the spec, then parses it into a framework-agnostic Intermediate Representation (IR) containing resources, operations, schemas, authentication flows, and pagination strategies.
The React renderer interprets this IR at runtime and creates table views, forms, detail views, search interfaces, authentication flows, wizards, custom actions, dashboards, and theme support.
Key advantage: Runtime rendering means no regeneration step, no code to maintain, no drift between spec and UI. Because the IR is framework-agnostic, you can swap renderers. The same spec works with @uigen-dev/react, @uigen-dev/svelte, or @uigen-dev/vue (coming soon).
Customize any view while keeping the rest auto-generated. UIGen provides escape hatches at three levels:
Component Mode - Full control over data fetching and rendering:
// src/overrides/custom-profile.tsx
import type { OverrideDefinition } from '@uigen-dev/react';
function CustomProfile() {
return
My Custom Profile View
;
}
const override: OverrideDefinition = {
targetId: 'me',
component: CustomProfile,
};
export default override;
Render Mode - UIGen fetches data, you control the UI:
// src/overrides/users-list.tsx
import type { OverrideDefinition, ListRenderProps } from '@uigen-dev/react';
const override: OverrideDefinition = {
targetId: 'users.list',
render: ({ data, isLoading }: ListRenderProps) => {
if (isLoading) return
Loading...
;
return
{/* your custom UI */}
;
},
};
export default override;
UseHooks Mode - Side effects only (analytics, tracking):
// src/overrides/analytics.tsx
import { useEffect } from 'react';
import type { OverrideDefinition } from '@uigen-dev/react';
const override: OverrideDefinition = {
targetId: 'users.list',
useHooks: ({ resource }) => {
useEffect(() => {
analytics.track('page_view', { resource: resource.name });
}, [resource]);
},
};
export default override;
Add x-uigen-override annotation to .uigen/config.yaml:
annotations:
GET:/api/v1/auth/me:
x-uigen-override:
id: me
The CLI automatically discovers, transpiles, and injects your overrides. See packages/react/src/overrides/README.md for complete documentation.
MIT
$ claude mcp add uigen \
-- python -m otcore.mcp_server <graph>