Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cursor/environment.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
"agentCanUpdateSnapshot": true,
"install": "pnpm install",
"start": "pnpm dev:start"
}
}
4 changes: 1 addition & 3 deletions .cursor/worktrees.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
{
"setup-worktree": [
"pnpm install"
]
"setup-worktree": ["pnpm install"]
}
24 changes: 13 additions & 11 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

title: ""
labels: ""
assignees: ""
---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:

1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
Expand All @@ -24,15 +24,17 @@ A clear and concise description of what you expected to happen.
If applicable, add screenshots to help explain your problem.

**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]

- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]

**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]

- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]

**Additional context**
Add any other context about the problem here.
7 changes: 3 additions & 4 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''

title: ""
labels: ""
assignees: ""
---

**Is your feature request related to a problem? Please describe.**
Expand Down
2 changes: 1 addition & 1 deletion .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Describe the change and why it is needed.

## Changes

-
-

## Test Plan

Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/build-js.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Build JS

on:
push:
branches: [ main ]
branches: [main]
pull_request:
branches: [ main ]
branches: [main]

jobs:
build:
Expand All @@ -20,7 +20,7 @@ jobs:
with:
node-version: 20
cache: pnpm
cache-dependency-path: 'pnpm-lock.yaml'
cache-dependency-path: "pnpm-lock.yaml"

- name: Install dependencies
run: pnpm install --frozen-lockfile
Expand Down
2 changes: 1 addition & 1 deletion .prettierrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
"printWidth": 100,
"tabWidth": 2,
"plugins": ["prettier-plugin-organize-imports"]
}
}
21 changes: 10 additions & 11 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

# Contributor Covenant Code of Conduct

## Our Pledge
Expand All @@ -18,23 +17,23 @@ diverse, inclusive, and healthy community.
Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
- Focusing on what is best not just for us as individuals, but for the overall
community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or advances of
- The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email address,
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
- Other conduct which could reasonably be considered inappropriate in a
professional setting

## Enforcement Responsibilities
Expand Down
22 changes: 6 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,12 @@

</div>


OpenUI is a full-stack Generative UI framework — a compact streaming-first language, a React runtime with built-in component libraries, and ready-to-use chat interfaces — that is up to 67% more token-efficient than JSON.



---



[Docs](https://openui.com) · [Playground](https://www.openui.com/playground) · [Sample Chat App](./examples/openui-chat) · [Discord](https://discord.com/invite/Pbv5PsqUSv) · [Contributing](./CONTRIBUTING.md) · [Code of Conduct](./CODE_OF_CONDUCT.md) · [Security](./SECURITY.md) · [License](./LICENSE)


---

## What is OpenUI
Expand All @@ -43,7 +37,6 @@ At the center of OpenUI is **OpenUI Lang**: a compact, streaming-first language
- **Streaming renderer** — Parse and render model output progressively in React as tokens arrive.
- **Chat and app surfaces** - Use the same foundation for assistants, copilots, and broader interactive product flows.


## Quick Start

```bash
Expand All @@ -62,8 +55,6 @@ What this gives you:
- **Streaming support** - Update the UI progressively as output arrives.
- **Working app foundation** - Start from a ready-to-run example instead of wiring everything manually.



## How it works

Your components define what the model can generate.
Expand All @@ -87,12 +78,12 @@ Try it yourself in the [Playground](https://www.openui.com/playground) — gener

## Packages

| Package | Description |
| :--- | :--- |
| [`@openuidev/react-lang`](./packages/react-lang) | Core runtime — component definitions, parser, renderer, prompt generation |
| [`@openuidev/react-headless`](./packages/react-headless) | Headless chat state, streaming adapters, message format converters |
| [`@openuidev/react-ui`](./packages/react-ui) | Prebuilt chat layouts and two built-in component libraries |
| [`@openuidev/cli`](./packages/openui-cli) | CLI for scaffolding apps and generating system prompts |
| Package | Description |
| :------------------------------------------------------- | :------------------------------------------------------------------------ |
| [`@openuidev/react-lang`](./packages/react-lang) | Core runtime — component definitions, parser, renderer, prompt generation |
| [`@openuidev/react-headless`](./packages/react-headless) | Headless chat state, streaming adapters, message format converters |
| [`@openuidev/react-ui`](./packages/react-ui) | Prebuilt chat layouts and two built-in component libraries |
| [`@openuidev/cli`](./packages/openui-cli) | CLI for scaffolding apps and generating system prompts |

```bash
npm install @openuidev/react-lang @openuidev/react-ui
Expand Down Expand Up @@ -154,7 +145,6 @@ Good places to start:
- [Discord](https://discord.com/invite/Pbv5PsqUSv) — Ask questions, share what you're building
- [GitHub Issues](https://github.com/thesysdev/openui/issues) — Report bugs or request features


## Contributing

Contributions are welcome. See [`CONTRIBUTING.md`](./CONTRIBUTING.md) for contribution guidelines and ways to get involved.
Expand Down
2 changes: 0 additions & 2 deletions benchmarks/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ Measured with `tiktoken` (`gpt-5` model encoder). Generated by GPT-5.2 at temper
| e-commerce-product | 2145 | 2449 | 2381 | 1166 | -45.6% | -52.4% | -51.0% |
| **TOTAL** | **9122** | **10180** | **9948** | **4800** | **-47.4%** | **-52.8%** | **-51.7%** |


## Running

### Prerequisites
Expand All @@ -55,7 +54,6 @@ Export `OPENAI_API_KEY` in your shell:
export OPENAI_API_KEY=sk-...
```


### 1. Generate samples (calls OpenAI)

```bash
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,17 +54,9 @@ function Chip({ item }: { item: CompatibilityItem }) {
style={{ backgroundColor: item.badgeBg }}
>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src={imgSrc}
alt={item.name}
width={14}
height={14}
className={styles.badgeImage}
/>
<img src={imgSrc} alt={item.name} width={14} height={14} className={styles.badgeImage} />
</div>
<span className={styles.chipLabel}>
{item.name}
</span>
<span className={styles.chipLabel}>{item.name}</span>
</div>
);
}
Expand All @@ -80,16 +72,12 @@ export function CompatibilitySection() {
<div className={styles.stack}>
{/* LLMs row */}
<div className={styles.row}>
<span className={styles.label}>
Any LLM
</span>
<span className={styles.label}>Any LLM</span>
<div className={styles.chips}>
{LLMS.map((item) => (
<Chip key={item.name} item={item} />
))}
<span className={styles.more}>
+ more
</span>
<span className={styles.more}>+ more</span>
</div>
</div>

Expand All @@ -98,16 +86,12 @@ export function CompatibilitySection() {

{/* Frameworks row */}
<div className={styles.row}>
<span className={styles.label}>
Any Framework
</span>
<span className={styles.label}>Any Framework</span>
<div className={styles.chips}>
{FRAMEWORKS.map((item) => (
<Chip key={item.name} item={item} />
))}
<span className={styles.more}>
+ more
</span>
<span className={styles.more}>+ more</span>
</div>
</div>
</div>
Expand Down
6 changes: 1 addition & 5 deletions docs/app/(home)/components/FadeInSection/FadeInSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,5 @@ interface FadeInSectionProps {
}

export function FadeInSection({ children, className = "" }: FadeInSectionProps) {
return (
<div className={`${styles.root} ${className}`.trim()}>
{children}
</div>
);
return <div className={`${styles.root} ${className}`.trim()}>{children}</div>;
}
16 changes: 4 additions & 12 deletions docs/app/(home)/components/FeaturesSection/FeaturesSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,9 @@ function DesktopFeatureRow({ feature, index }: { feature: Feature; index: number
<div>
<FeatureIcon path={feature.iconPath} index={index} />
</div>
<span className={styles.desktopTitle}>
{feature.title}
</span>
<span className={styles.desktopTitle}>{feature.title}</span>
</div>
<span className={styles.desktopDescription}>
{feature.description}
</span>
<span className={styles.desktopDescription}>{feature.description}</span>
</div>
);
}
Expand All @@ -103,12 +99,8 @@ function MobileFeatureRow({ feature, index }: { feature: Feature; index: number
return (
<div className={styles.mobileRow}>
<div className={styles.mobileCopy}>
<span className={styles.mobileTitle}>
{feature.title}
</span>
<span className={styles.mobileDescription}>
{feature.description}
</span>
<span className={styles.mobileTitle}>{feature.title}</span>
<span className={styles.mobileDescription}>{feature.description}</span>
</div>
<div>
<FeatureIcon path={feature.iconPath} index={index + FEATURES.length} />
Expand Down
14 changes: 4 additions & 10 deletions docs/app/(home)/components/Footer/Footer.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
"use client";

import type { CSSProperties } from "react";
import svgPaths from "@/imports/svg-urruvoh2be";
import mascotSvgPaths from "@/imports/svg-xeurqn3j1r";
import type { CSSProperties } from "react";
import styles from "./Footer.module.css";

// ---------------------------------------------------------------------------
Expand Down Expand Up @@ -158,9 +158,7 @@ export function Footer() {
<path d={mascotSvgPaths.p4076200} fill="black" stroke="black" strokeWidth="0.6" />
</svg>
</div>
<p className={styles.handcraftedCopy}>
Handcrafted with a lot of love.
</p>
<p className={styles.handcraftedCopy}>Handcrafted with a lot of love.</p>
</div>
</div>

Expand All @@ -179,9 +177,7 @@ export function Footer() {
{/* Bottom bar */}
<div className={styles.bottomBar}>
<div className={styles.desktopBottomBar}>
<p className={styles.desktopMetaLeft}>
355 Bryant St, San Francisco, CA 94107
</p>
<p className={styles.desktopMetaLeft}>355 Bryant St, San Francisco, CA 94107</p>
<SocialIcons />
<p className={styles.desktopMetaRight}>
© {new Date().getFullYear()} Thesys Inc. All Rights Reserved
Expand All @@ -194,9 +190,7 @@ export function Footer() {
<p className={styles.mobileMetaText}>
© {new Date().getFullYear()} Thesys Inc. All Rights Reserved
</p>
<p className={styles.mobileMetaText}>
355 Bryant St, San Francisco, CA 94107
</p>
<p className={styles.mobileMetaText}>355 Bryant St, San Francisco, CA 94107</p>
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -429,4 +429,4 @@
.taglineBreak {
display: inline;
}
}
}
Loading