Contributing to ComposeYogi
January 15, 2026 ยท View on GitHub
First off, thank you for considering contributing to ComposeYogi! ๐ต
Table of Contents
- Code of Conduct
- Getting Started
- Development Setup
- Project Structure
- Making Changes
- Pull Request Process
- Style Guide
- Reporting Bugs
- Requesting Features
Code of Conduct
This project and everyone participating in it is governed by our Code of Conduct. By participating, you are expected to uphold this code.
Getting Started
- Fork the repository on GitHub
- Clone your fork locally:
git clone git@github.com:YOUR_USERNAME/ComposeYogi.git cd ComposeYogi - Add upstream remote:
git remote add upstream git@github.com:AppsYogi-com/ComposeYogi.git - Create a branch for your changes:
git checkout -b feature/your-feature-name
Development Setup
Prerequisites
- Node.js 18.17 or later
- npm, yarn, or pnpm
Installation
# Install dependencies
npm install
# Start development server
npm run dev
The app will be available at http://localhost:3000.
Available Scripts
| Command | Description |
|---|---|
npm run dev | Start dev server with Turbopack |
npm run build | Create production build |
npm run start | Start production server |
npm run lint | Run ESLint |
npm run type-check | Run TypeScript type checking |
Project Structure
composeyogi.com/
โโโ app/ # Next.js App Router pages
โโโ components/
โ โโโ compose/ # DAW-specific components
โ โโโ ui/ # Reusable UI components
โโโ lib/
โ โโโ audio/ # Tone.js audio engine
โ โโโ store/ # Zustand state stores
โ โโโ persistence/ # IndexedDB operations
โ โโโ canvas/ # Canvas rendering utilities
โโโ hooks/ # Custom React hooks
โโโ types/ # TypeScript type definitions
โโโ messages/ # i18n translation files
Making Changes
Before You Start
- Check existing issues to see if someone is already working on it
- Open an issue to discuss major changes before implementing
- Keep changes focused โ one feature/fix per PR
Development Guidelines
- TypeScript: All code should be properly typed
- Components: Follow the existing component patterns
- State Management: Use Zustand stores for global state
- Audio: All audio operations should go through
lib/audio/ - Styling: Use Tailwind CSS classes
- Accessibility: Ensure keyboard navigation works
Testing Your Changes
# Type check
npm run type-check
# Lint
npm run lint
# Build to ensure no errors
npm run build
Pull Request Process
-
Update your branch with the latest upstream changes:
git fetch upstream git rebase upstream/main -
Push your branch to your fork:
git push origin feature/your-feature-name -
Create a Pull Request on GitHub
-
PR Title Format:
feat: Add new featureโ New featurefix: Fix bug descriptionโ Bug fixdocs: Update documentationโ Documentation onlyrefactor: Refactor codeโ Code change that neither fixes a bug nor adds a featurestyle: Format codeโ Formatting, missing semicolons, etc.perf: Improve performanceโ Performance improvementstest: Add testsโ Adding testschore: Update dependenciesโ Maintenance tasks
-
PR Description should include:
- What changes were made
- Why the changes were made
- Screenshots (for UI changes)
- Related issue numbers
-
Wait for review โ Maintainers will review your PR and may request changes
Style Guide
TypeScript
// Use explicit types for function parameters and returns
function calculateBpm(beats: number, seconds: number): number {
return (beats / seconds) * 60;
}
// Use interfaces for object shapes
interface Track {
id: string;
name: string;
type: 'audio' | 'midi' | 'drum';
}
// Use type for unions or simple types
type TrackType = 'audio' | 'midi' | 'drum';
React Components
// Use function components with TypeScript
interface ButtonProps {
children: React.ReactNode;
onClick?: () => void;
variant?: 'primary' | 'secondary';
}
export function Button({ children, onClick, variant = 'primary' }: ButtonProps) {
return (
<button
onClick={onClick}
className={cn('px-4 py-2 rounded', {
'bg-accent': variant === 'primary',
'bg-muted': variant === 'secondary',
})}
>
{children}
</button>
);
}
Tailwind CSS
- Use the design system colors defined in
tailwind.config.ts - Prefer utility classes over custom CSS
- Use
cn()helper fromlib/utils.tsfor conditional classes
Reporting Bugs
When reporting bugs, please include:
- Description: Clear description of the bug
- Steps to Reproduce: Numbered steps to reproduce the issue
- Expected Behavior: What should happen
- Actual Behavior: What actually happens
- Environment:
- Browser and version
- Operating system
- Node.js version (if relevant)
- Screenshots: If applicable
- Console Errors: Any errors from browser dev tools
Use the Bug Report template when creating an issue.
Requesting Features
When requesting features, please include:
- Problem: What problem does this feature solve?
- Solution: How do you envision this working?
- Alternatives: Have you considered any alternatives?
- Additional Context: Any mockups, examples, or references
Use the Feature Request template when creating an issue.
Questions?
If you have questions, feel free to:
- Join our Discord Community
- Open a Discussion
- Ask in the issue you're working on
Thank you for contributing! ๐นโจ