Thank you for your interest in contributing! This guide will help you get started.
- Node.js 18+ and npm
- OpenCode CLI in your
PATH(the server connects to the OpenCode binary to manage workspaces)
git clone https://github.com/NeuralNomadsAI/CodeNomad.git
cd CodeNomad
npm install
npm run devBrowse open issues and look for these labels:
| Label | Meaning |
|---|---|
ready-to-work |
Clear scope, ready for anyone to pick up |
good-first-issue |
Good for first-time contributors |
enhancement |
New feature requests |
bug |
Bug reports |
Before starting: comment on the issue so we can discuss approach and avoid duplicate work.
# Fork the repo on GitHub, then clone your fork
git clone https://github.com/YOUR_USERNAME/CodeNomad.git
cd CodeNomad
# Add the upstream remote
git remote add upstream https://github.com/NeuralNomadsAI/CodeNomad.git
# Create a branch from upstream/dev
git fetch upstream
git checkout -b fix/your-branch-name upstream/dev| Prefix | Use for |
|---|---|
fix/ |
Bug fixes |
feat/ |
New features |
docs/ |
Documentation changes |
refactor/ |
Code refactoring |
chore/ |
Build, config, maintenance |
Examples: fix/question-queue-ordering, feat/retry-tool-call, docs/contributing-guide
# Install dependencies
npm install
# Run the dev server
npm run dev
# Run type checking
npm run typecheck --workspace @codenomad/uiWrite clear, descriptive commit messages. Explain what changed and why.
git add .
git commit -m "fix(ui): preserve question queue order when upserting duplicate requests
When a question arrives as a global entry and later resolves to a tool
part with a newer timestamp, the original enqueue time was lost, causing
the question to move behind newer entries and break interruption order."git push origin your-branch-nameThen open a pull request on GitHub targeting the dev branch.
PR checklist:
- Branch is based on latest
upstream/dev - One issue per PR (don't mix unrelated changes)
- Type checking passes:
npm run typecheck(root) or the workspace-specific script matching your change area - Tests pass (if applicable)
- PR description explains the change, includes relevant screenshots for UI changes, and links related issues when applicable
| Package | Description |
|---|---|
packages/server |
Core logic & CLI — workspaces, OpenCode proxy, API, auth |
packages/ui |
SolidJS frontend — reactive UI components and stores |
packages/electron-app |
Electron desktop shell |
packages/tauri-app |
Tauri desktop shell (experimental) |
packages/opencode-plugin |
OpenCode plugin integration |
packages/cloudflare |
Cloudflare deployment adapters |
| Path | Purpose |
|---|---|
packages/ui/src/stores/session-events.ts |
SSE event handlers (idle, status, permissions, questions) |
packages/ui/src/stores/session-actions.ts |
User actions (send message, abort, revert, fork) |
packages/ui/src/stores/message-v2/ |
Message store (v2 architecture) |
packages/ui/src/stores/instances.ts |
Instance management and interruption queues |
packages/ui/src/components/tool-call.tsx |
Tool call rendering |
packages/ui/src/components/message-block.tsx |
Message display blocks |
packages/ui/src/components/session/session-view.tsx |
Main session view |
packages/ui/src/lib/i18n/messages/ |
Translation files (en, es, fr, ja, ru, he, zh-Hans) |
For a comprehensive map of all six functional areas (server, UI, desktop, speech/audio, build, Cloudflare), SDK integration patterns, and feature traces, load the
codenomad-architecture-guideskill:
.opencode/skills/codenomad-architecture-guide/SKILL.md
- Tokens:
packages/ui/src/styles/tokens.css - Utilities:
packages/ui/src/styles/utilities.css - Component styles:
packages/ui/src/styles/components/,packages/ui/src/styles/messaging/,packages/ui/src/styles/panels/ - Keep style files under ~150 lines; split by component
- Use
useI18n()in components,tGlobal()in stores - Messages live in
packages/ui/src/lib/i18n/messages/<locale>/ - When adding a string: add to
en/first, then add the same key to every other locale - Placeholders use
{name}syntax (word characters only)
- KISS: Keep modules narrowly scoped
- DRY: Share helpers before copy-pasting
- Single responsibility: Split files when concerns diverge
- Composable primitives: Prefer signals, hooks, utilities over deep inheritance
- Check existing issues and PRs
- Ask in the issue you're working on
- Review the server documentation for CLI flags and configuration