Thank you for your interest in contributing! This project welcomes contributions from everyone, whether you're fixing a typo, adding a feature, or creating new visual modules.
- Code of Conduct
- How Can I Contribute?
- Development Setup
- Coding Standards
- Submitting Changes
- Module Contributions
- Documentation Contributions
- Bug Reports
- Feature Requests
- Testing Guidelines
- Architecture Guidelines
- Getting Help
This project follows a simple code of conduct:
- Be respectful and inclusive
- Be constructive in feedback
- Help newcomers learn
- Focus on what's best for the community
Unacceptable behavior will not be tolerated.
Found a bug? Open an issue with:
- Clear description of the problem
- Steps to reproduce
- Expected vs actual behavior
- Your environment (OS, Node version, etc.)
- Screenshots if applicable
Have an idea? Open an issue with:
- Clear description of the feature
- Why it would be useful
- How it might work
- Example use cases
Documentation improvements are always welcome:
- Fix typos or unclear explanations
- Add examples
- Improve tutorials
- Translate to other languages
- Fix bugs
- Add features
- Create new modules
- Optimize performance
- Improve UI/UX
- Node.js v18 or higher
- Git
- A code editor (VS Code recommended)
- Basic familiarity with JavaScript
- Fork the repository on GitHub
- Clone your fork locally:
git clone https://github.com/YOUR_USERNAME/nw_wrld.git
cd nw_wrld- Add the upstream repository:
git remote add upstream https://github.com/aagentah/nw_wrld.gitnpm installnpm startTwo windows should open: Dashboard and Projector.
- Create a branch for your changes:
git checkout -b feature/my-awesome-feature- Make your changes
- Test thoroughly
- Commit with clear messages
- Push to your fork
- Open a pull request
- Use ES6+ features (arrow functions, destructuring, etc.)
- Use
constandlet, nevervar - Use meaningful variable names
- Keep functions small and focused
- Prefer functional patterns over imperative
- 2 spaces for indentation
- Semicolons are optional but be consistent
- Use single quotes for strings
- No trailing whitespace
- Add comments for complex logic
- Use JSDoc for functions and methods
- Explain "why" not "what"
- Keep comments up to date
Example:
/**
* Pulses the module by animating scale.
* @param {Object} options
* @param {number} options.intensity - Scale multiplier (default: 1.5)
* @param {number} options.duration - Animation duration in ms
*/
pulse({ intensity = 1.5, duration = 500 }) {
// Animation logic here
}All modules must:
- Extend
ModuleBaseorBaseThreeJsModule - Include the required
@nwWrlddocblock metadata (name,category,imports) - Default-export the module class
- Call
super()first in constructor - Implement
destroy()and callsuper.destroy()last
Example:
/*
@nwWrld name: MyModule
@nwWrld category: Examples
@nwWrld imports: ModuleBase
*/
class MyModule extends ModuleBase {
constructor(container) {
super(container);
this.init();
}
init() {
// Setup code
}
destroy() {
// Cleanup code
super.destroy();
}
}
export default MyModule;- Test your changes thoroughly
- Run the app and verify no console errors
- Test on your target platform (Mac/Windows)
- Update documentation if needed
- Add yourself to contributors if it's your first PR
Use clear, descriptive commit messages:
Good:
- "Add pulsing circle module with color customization"
- "Fix MIDI channel mapping bug in Dashboard"
- "Update README with Windows setup instructions"
Bad:
- "Update"
- "Fix stuff"
- "Changes"
-
Title: Clear and descriptive
- Good: "Add support for custom MIDI port selection"
- Bad: "Update code"
-
Description: Include:
- What changed and why
- How to test it
- Screenshots/GIFs for UI changes
- Related issue numbers (
Fixes #123)
-
Keep it focused: One feature/fix per PR
-
Be responsive: Address review feedback promptly
-
Update your branch if main has changed:
git fetch upstream
git rebase upstream/main- Maintainers will review your PR
- They may request changes
- Be patient—reviews take time
- Address feedback constructively
- Read the Module Development Guide
- Create your module in your project folder under
modules/YourModule.js - Follow the module structure standards
- Test with multiple instances
- Create documentation (see below)
If you’re contributing documentation for a module, add a markdown file alongside the docs in this repo (or link to a project folder example in the PR).
Include:
# Your Module Name
Brief description of what it does.
## Preview

## What It Does
Detailed explanation.
## Methods
### methodName
Description and parameters.
## Example Usage
Step-by-step guide to use it.
## Tips
Any tips or tricks.
## Learning Points
What developers can learn from this module.If your module needs assets, there are two cases:
- Starter assets shipped with nw_wrld (seeded into new projects): add them under
src/assets/(e.g.src/assets/images/,src/assets/json/) - Assets for a specific user project: they live in that project folder under
assets/(e.g.MyProject/assets/images/)
Use appropriate categories:
Text- Text-based visualsGUI- UI elements and overlays3D- Three.js 3D graphics2D- Canvas-based 2D graphicsData- Data visualizationEffects- Visual effects and filtersParticle- Particle systemsExamples- Tutorial/example modules
- README.md - Main project documentation
- GETTING_STARTED.md - Beginner tutorial
- MODULE_DEVELOPMENT.md - Module creation guide
- Examples - Module examples and tutorials
- Write for beginners (assume minimal coding knowledge)
- Use clear, simple language
- Include code examples
- Add screenshots/diagrams where helpful
- Test all instructions
- Keep it up to date
Examples should be:
- Self-contained and working
- Well-commented
- Progressive (simple → complex)
- Practical and useful
A good bug report includes:
- OS: macOS 13.2 / Windows 11
- Node version: 20.x.x
- App version: 1.0.0
1. Open Dashboard
2. Create new track
3. Add Text module
4. Click on...
"The text should change color"
"The app crashes with error..."
Include error messages from the Developer Console.
Visual evidence is helpful.
A good feature request includes:
"As a VJ, I need to quickly switch between color palettes during a performance."
"Add a 'Color Palette' module that stores 5 colors and can cycle through them."
"I could use multiple color pickers, but that's cumbersome."
"This would be useful for live shows where you need fast color changes."
Before submitting:
- Fresh Install Test: Clone your branch fresh and run it
- MIDI Test: Verify MIDI routing works
- Module Test: Test your module with different parameters
- Multi-Instance Test: Add multiple instances of your module
- Performance Test: Check CPU/memory usage
- Cleanup Test: Switch tracks and verify cleanup
Open Developer Tools and check for:
- No errors in Console
- No warnings about memory leaks
- No 404s for missing assets
- Dashboard handles UI and MIDI input
- Projector handles visual output
- IPC for communication between windows
- Jotai for state management in Dashboard
- ModuleBase for module inheritance
- Test that existing modules still work
- Don't change base class APIs without discussion
- Maintain backward compatibility where possible
- Don't over-engineer
- Avoid unnecessary abstractions
- Prefer clarity over cleverness
- Keep dependencies minimal
- Open a discussion on GitHub
- Check existing issues
- Read the documentation
- Ask in discussions before starting large changes
- Propose your approach before implementing
- Request early feedback with draft PRs
Contributors are recognized in:
- README.md contributors section
- Release notes for significant contributions
- GitHub contributors page
By contributing, you agree that your contributions will be licensed under the GPL-3.0 License.
Your contributions make this project better for everyone. Whether you're fixing a typo or building a complex feature, we appreciate your time and effort.
Happy contributing! 🎨🎵