Thank you for your interest in contributing! This guide will help you get started.
- Fork the repository
- Clone your fork:
git clone https://github.com/YOUR_USERNAME/OpenRoom.git - Install dependencies:
pnpm install - Start the dev server:
pnpm dev - Create a feature branch:
git checkout -b feat/my-feature
- TypeScript is required for all source files
- ESLint and Prettier are enforced via pre-commit hooks
- Run
pnpm run lintto check and auto-fix issues - Run
pnpm run prettyto format code
All apps must use the project's design token system. Do not hardcode colors or spacing values. See .claude/rules/design-tokens.md for the full palette and CSS variable reference.
- All file/message operations must go through
@/lib— never import@gui/vibe-containerdirectly - Use
reportAction(APP_ID, actionType, params)for user-triggered actions - Use
useAgentActionListener(APP_ID, handler)for Agent-triggered actions - See
.claude/rules/data-interaction.mdfor the full specification
Use Lucide React icons only. Emoji is not allowed in the UI.
The fastest way is via the Vibe workflow with Claude Code:
/vibe MyApp Description of the appThis automatically generates all boilerplate, integrates with the AI Agent, and registers the app.
You can build an app by hand without any AI tooling. Follow this structure:
src/pages/MyApp/
├── components/ # UI components
├── store/ # State management (Context/Reducer)
├── actions/
│ └── constants.ts # APP_ID, APP_NAME, ActionTypes
├── i18n/
│ ├── en.ts
│ └── zh.ts
├── data/ # Seed data (JSON only)
├── meta/
│ ├── meta_cn/ # Chinese guide.md + meta.yaml
│ └── meta_en/ # English guide.md + meta.yaml
├── index.tsx # Entry point (lifecycle reports here only)
├── index.module.scss
└── types.ts
Don't forget to:
- Register the route in
src/routers/index.tsx - Add the app to
APP_STATIC_REGISTRYinsrc/lib/appRegistry.ts - Define
APP_IDandActionTypesinactions/constants.ts - Add seed data as JSON files in
data/ - Use
reportLifecycle()inindex.tsxfor the AI Agent integration - Provide i18n translations (at minimum
en.tsandzh.ts)
For reference, look at any existing app (e.g., src/pages/MusicApp/) as a template.
Note: The
.claude/directory contains the AI workflow engine used by the Vibe Workflow. It is not required for manual development — you can safely ignore it if you're not using Claude Code.
- Ensure
pnpm run lintpasses with 0 errors - Ensure
pnpm buildsucceeds - Write a clear PR title and description
- Link any related issues
We follow Conventional Commits:
feat: add new weather app
fix: resolve task list empty state
docs: update README with setup instructions
refactor: extract shared file API utilities
- Use GitHub Issues to report bugs or request features
- Include browser version, OS, and steps to reproduce for bugs
- Screenshots are always helpful
By contributing, you agree that your contributions will be licensed under the MIT License.