원클릭으로
opentui-projects
OpenTUI project scaffolding, templates, examples, component library, and best practices.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
OpenTUI project scaffolding, templates, examples, component library, and best practices.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Create, verify, and improve AGENTS.md files. Minimal, focused, progressive disclosure. Fixes bloat, contradictions, stale info.
Audit and plan website optimisation for AI agents, AI search, LLM discoverability, llms.txt, structured data, and sitemaps.
Build distinctive, production-grade frontend interfaces (websites, components, dashboards, layouts) with polished UI design that avoids generic AI aesthetics.
Generate and validate Awesome list READMEs following sindresorhus/awesome standards.
Scaffold type-safe TypeScript projects with the Better-T-Stack CLI — new projects, features, or troubleshooting.
Build full-stack TypeScript apps with Convex — server functions, schema, auth, file storage, real-time, frontend integration, testing, deployment.
| name | opentui-projects |
| description | OpenTUI project scaffolding, templates, examples, component library, and best practices. |
Expert assistance for scaffolding OpenTUI projects and exploring examples.
The fastest way to create an OpenTUI project:
# Using create-tui (recommended)
bun create tui my-app
# Or with npm
npm create tui my-app
# Choose from available templates:
# - minimal: Minimal setup
# - basic-cli: Basic CLI tool
# - dashboard: Dashboard layout
# - form-app: Form-based application
# - editor: Text editor template
# - game: Simple game template
bun create tui my-app --template dashboard
my-opentui-app/
├── package.json
├── tsconfig.json
├── src/
│ ├── main.tsx
│ ├── components/
│ └── utils/
└── README.md
{
"name": "my-opentui-app",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "bun run src/main.tsx",
"build": "tsc",
"start": "bun run dist/main.js"
},
"dependencies": {
"@opentui/core": "latest",
"@opentui/react": "latest",
"react": "^18.3.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"typescript": "^5.3.0"
}
}
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"jsx": "react-jsx",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"types": ["node"]
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
// src/main.tsx
import { createCliRenderer } from "@opentui/core"
import { createRoot } from "@opentui/react"
function App() {
return <text>Hello, OpenTUI!</text>
}
async function main() {
const renderer = await createCliRenderer()
createRoot(renderer).render(<App />)
}
main()
Use case: Simple hello world, learning basics
import { createCliRenderer } from "@opentui/core"
import { TextRenderable } from "@opentui/core"
async function main() {
const renderer = await createCliRenderer()
const text = new TextRenderable("Hello, World!")
renderer.getRoot().add(text)
renderer.start()
}
main()
Use case: Command-line tools with menus
import { createCliRenderer } from "@opentui/core"
import { BoxRenderable, TextRenderable } from "@opentui/core"
async function main() {
const renderer = await createCliRenderer()
const container = new BoxRenderable()
container.setStyle({
borderStyle: "double",
padding: 1,
})
const title = new TextRenderable("My CLI Tool")
title.setStyle({ textDecoration: "bold" })
container.add(title)
renderer.getRoot().add(container)
renderer.start()
}
main()
Use case: Multi-panel dashboard applications
import { createCliRenderer } from "@opentui/core"
import { GroupRenderable, BoxRenderable, TextRenderable } from "@opentui/core"
async function main() {
const renderer = await createCliRenderer()
const root = renderer.getRoot()
const app = new GroupRenderable()
app.setStyle({
flexDirection: "row",
width: 80,
height: 30,
})
// Sidebar
const sidebar = new BoxRenderable()
sidebar.setStyle({
width: 20,
borderStyle: "single",
})
sidebar.add(new TextRenderable("Sidebar"))
// Main content
const main = new BoxRenderable()
main.setStyle({
flexGrow: 1,
borderStyle: "single",
})
main.add(new TextRenderable("Main Content"))
app.add(sidebar)
app.add(main)
root.add(app)
renderer.start()
}
main()
Use case: Data entry applications
import { createCliRenderer } from "@opentui/core"
import {
GroupRenderable,
BoxRenderable,
TextRenderable,
InputRenderable,
} from "@opentui/core"
async function main() {
const renderer = await createCliRenderer()
const root = renderer.getRoot()
const form = new GroupRenderable()
form.setStyle({
flexDirection: "column",
gap: 1,
width: 60,
})
const title = new TextRenderable("User Registration")
title.setStyle({ textDecoration: "bold" })
const nameInput = new InputRenderable()
nameInput.setPlaceholder("Name")
const emailInput = new InputRenderable()
emailInput.setPlaceholder("Email")
const submitButton = new BoxRenderable()
submitButton.setStyle({ borderStyle: "single" })
submitButton.add(new TextRenderable("Submit"))
form.add(title)
form.add(nameInput)
form.add(emailInput)
form.add(submitButton)
root.add(form)
renderer.start()
}
main()
// components/Button.ts
import { BoxRenderable, TextRenderable } from "@opentui/core"
export interface ButtonOptions {
label: string
onClick?: () => void
variant?: "primary" | "secondary" | "danger"
}
export class Button {
private box: BoxRenderable
constructor(options: ButtonOptions) {
this.box = new BoxRenderable()
this.setupStyles(options.variant)
this.setupContent(options.label)
this.setupEvents(options.onClick)
}
private setupStyles(variant: string = "primary") {
const styles = {
primary: {
borderStyle: "single" as const,
backgroundColor: new Color(100, 149, 237),
foregroundColor: new Color(255, 255, 255),
},
secondary: {
borderStyle: "single" as const,
backgroundColor: new Color(50, 50, 50),
foregroundColor: new Color(255, 255, 255),
},
danger: {
borderStyle: "single" as const,
backgroundColor: new Color(231, 76, 60),
foregroundColor: new Color(255, 255, 255),
},
}
const style = styles[variant as keyof typeof styles] || styles.primary
this.box.setStyle(style)
}
private setupContent(label: string) {
const text = new TextRenderable(label)
this.box.add(text)
}
private setupEvents(onClick?: () => void) {
if (onClick) {
this.box.on("click", onClick)
}
}
getRenderable() {
return this.box
}
}
// components/Modal.ts
import { BoxRenderable, TextRenderable, GroupRenderable } from "@opentui/core"
export class Modal {
private overlay: BoxRenderable
private content: BoxRenderable
constructor() {
this.overlay = new BoxRenderable()
this.overlay.setStyle({
position: "absolute",
top: 0,
left: 0,
width: 80,
height: 30,
backgroundColor: new Color(0, 0, 0, 0.5),
})
this.content = new BoxRenderable()
this.content.setStyle({
borderStyle: "double",
backgroundColor: new Color(30, 30, 30),
padding: 2,
})
this.overlay.add(this.content)
}
setContent(component: any) {
this.content.clear()
this.content.add(component)
}
show() {
this.overlay.setStyle({ display: "flex" })
}
hide() {
this.overlay.setStyle({ display: "none" })
}
getRenderable() {
return this.overlay
}
}
Week 1: Basics
Week 2: Interactive
Projects:
Week 3-4: Advanced
Projects:
Week 5-8: Production
Projects:
See .search-data/research/opentui/resources.md for a complete list of examples.
Key Examples:
# Clone OpenTUI repo
git clone https://github.com/sst/opentui.git
cd opentui
# Install dependencies
bun install
# Run core examples
cd packages/core
bun run src/examples/index.ts
# Run React examples
cd packages/react
bun run dev
src/
├── main.tsx # Entry point
├── app/ # App components
│ ├── App.tsx
│ └── layout/
├── components/ # Reusable components
│ ├── ui/
│ └── features/
├── hooks/ # Custom hooks (React/SolidJS)
├── stores/ # State management
├── utils/ # Helper functions
└── types/ # TypeScript types
Use /opentui-projects for:
For core development help, use /opentui
For React-specific help, use /opentui-react
For SolidJS-specific help, use /opentui-solid
.search-data/research/opentui/