Thank you for your interest in contributing! This guide covers everything you need to get started.
# 1. Fork the repository on GitHub, then clone your fork:
git clone https://github.com/<your-username>/rosview.git
cd rosview
# 2. Use the pinned Node.js version:
# Install nvm: https://github.com/nvm-sh/nvm
nvm install # reads .nvmrc (Node 24)
nvm use
# 3. Install dependencies and start dev server:
npm install
npm run dev # http://localhost:5173- Create a feature branch from
main:git checkout -b feat/my-feature # or: fix/bug-description, docs/update-api-reference - Make your changes with focused commits (see commit convention below).
- Run the full pre-PR check:
npm run lint npm test npm run build - Open a Pull Request against
main. Fill in the PR template. - A maintainer will review within a few business days.
We follow Conventional Commits:
<type>(<scope>): <short description>
[optional body]
[optional footer]
Common types: feat, fix, docs, refactor, test, chore, perf
Examples:
feat(viewer): add autoPlay prop to RosViewerProps
fix(mcap): handle empty channel list without throwing
docs(api): document fileManifest prop with JSON example
- Unit tests — add or update
*.test.ts/*.test.tsxalongside the changed module:npm test # run once npm test -- --watch # watch mode
- E2E tests — see
docs/DEVELOPMENT.mdfor Playwright instructions. - Coverage — run
npm test -- --coverageto generate an lcov report.
User-visible strings must go through react-intl. When adding UI text:
- Pick the correct shard under
src/shared/intl/messages/<locale>/(for examplepanels.jsonfor panel UI,welcome.jsonfor the welcome screen). - Add the same key to
en,zh, andjashards so all locales stay in sync. - Use stable dot-separated IDs (e.g.
panels.audio.settings.field.mute). - Use ICU placeholders for dynamic values:
{count}not string concatenation
getRosViewMessages() in src/shared/intl/loadRosViewMessages.ts merges shards at build time; src/features/panels/framework/panelMessageSlug.ts documents PanelType → message slug mapping for panels.<slug>.* keys.
- Match existing TypeScript and React patterns.
- Do not mix unrelated refactors with a bug fix in the same PR.
- All exported symbols in
src/entrypoints/index.tsare stable public API — changes there require semver impact review, and breaking changes must be documented in the PR description.
Open a GitHub Discussion if you have questions before opening an issue or PR.
Note: The open-source code and npm package live under the ioai-tech GitHub organization. Security and conduct contacts may use @io-ai.tech email addresses; that domain is operated by the same maintainers as IO-AI Tech (see LICENSE).