Thank you for your interest in contributing! This project is built on the belief that human-centered design can be proven through architecture, not just claimed — and contributions that share that vision are welcome.
- Read the philosophy first: WELCOME.md is the front door. DESIGN-PHILOSOPHY.md outlines the four principles that guide every decision.
- Understand the architecture: AGENTS.md covers coding standards, file organization, and workflows.
- Set up your environment:
git clone https://github.com/shalomormsby/opencosmos.git
cd opencosmos
pnpm install
pnpm build- Node.js 24+ (see
.nvmrc) - pnpm 8.15.0+
- Open an issue on GitHub Issues
- Include: steps to reproduce, expected vs actual behavior, browser/OS, and screenshots if applicable
- Check existing issues first to avoid duplicates
- Open a feature request issue describing the use case, not just the solution
- Explain how it aligns with the design philosophy
- Fork the repository and create a branch:
type/brief-description(e.g.,feat/motion-slider,fix/button-focus) - Follow the coding standards in AGENTS.md
- Ensure your changes pass:
pnpm lint && pnpm typecheck && pnpm build - Write a clear commit message following conventional commits:
Types:
type(scope): descriptionfeat,fix,docs,style,refactor,test,chore - Open a pull request against
main
If you're adding a new component to @opencosmos/ui, that work happens in the opencosmos-ui repository, not here.
The OpenCosmos knowledge corpus welcomes contributions — source texts, commentary, guides, and reference material. See the knowledge publication workflow for the full process and the knowledge README for the corpus schema.
- Accessibility is non-negotiable. Every component must be keyboard navigable, screen reader compatible, and work with
prefers-reduced-motion: reduce. - Use design system components first. Don't create one-off solutions when a shared component exists or could be created.
- CSS variables over hardcoded colors. All styling must respect the active theme.
- Motion must respect preferences. Always use
useMotionPreference()— intensity 0 must work perfectly.
When making choices, follow this priority:
- Functional — It must work
- Honest — It must be true to what it claims
- Lovable — It should delight
- Perfect — Polish comes last
By contributing, you agree that your contributions will be licensed under the MIT License.