This project is licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later). See LICENSE for the full text. Contributors should be aware:
- AGPL is a strong copyleft license. Anyone who runs a modified version of this project as a network service must publish their modifications under AGPL too.
- For typical self-hosting, internal use, forking, or contributing back, AGPL behaves like GPL.
All non-trivial contributions require signing the qontinui Contributor License Agreement (CLA). The CLA is administered via cla-assistant.io — when you open a pull request, the CLA bot will comment with a one-click sign link, and signing applies across all qontinui repositories. The CLA text lives in CLA.md. It grants Joshua Spinak the right to relicense your contribution under any future license; you retain copyright in your contributions.
The remainder of this document covers contribution mechanics specific to this repository.
Thank you for your interest in contributing to Qontinui! This document provides guidelines for contributing to the project.
Be respectful, constructive, and collaborative. We're all here to build something useful together.
- Check if the bug has already been reported in Issues
- If not, create a new issue with:
- Clear title describing the problem
- Steps to reproduce
- Expected vs actual behavior
- Python version and OS
- Code sample or JSON configuration if applicable
- Check existing Issues
- Create a new issue describing:
- The problem you're trying to solve
- Your proposed solution
- Example use cases
- How it relates to Brobot (if applicable)
-
Fork the repository and create a branch from
main -
Install development dependencies:
poetry install
-
Make your changes:
- Follow the Brobot migration approach (see CLAUDE.md)
- Write clear, documented code
- Follow existing code style (ruff format + ruff check)
- Add tests for new functionality
- Update documentation if needed
-
Run tests and linting:
poetry run pytest poetry run ruff format . poetry run ruff check --fix . poetry run mypy src/
-
Commit your changes:
- Use clear commit messages
- Reference issues when applicable
-
Push to your fork and submit a pull request
-
Address review feedback if requested
# Clone your fork
git clone https://github.com/yourusername/qontinui.git
cd qontinui
# Install dependencies (including multistate)
poetry install
# Run tests
poetry run pytest
# Run linting
poetry run ruff format .
poetry run ruff check --fix .
# Run type checking
poetry run mypy src/Qontinui is a Python port of Brobot. When contributing:
- Preserve Brobot's architecture and behavior
- Port classes faithfully from Java to Python
- Use Python idioms while maintaining the original design
- Check BROBOT_MIGRATION_TRACKER.md for migration status
- Ask for Brobot source code when porting a class
- Create new architectures or abstractions
- Skip ActionConfig/Options classes
- Add "helper" methods that don't exist in Brobot
- NEVER add backward compatibility code - This is active development
See CLAUDE.md for detailed migration guidelines.
- Python: Follow PEP 8, enforced by
ruff formatandruff check - Type hints: Required for all public APIs
- Docstrings: Google style for all public functions/classes
- Line length: 88 characters
- Naming: Follow Brobot naming conventions where applicable
- Write tests for all new features
- Port corresponding Brobot tests when migrating classes
- Maintain or improve code coverage
- Use
pytestfor unit tests - Test with actual GUI automation when applicable
- Update docstrings for any API changes
- Add examples for new features
- Update README.md if needed
- Document any deviations from Brobot behavior
qontinui/
├── src/qontinui/
│ ├── actions/ # Core action system (from Brobot)
│ ├── state_management/ # State management (Brobot + MultiState)
│ ├── find/ # Image finding operations
│ ├── json_executor/ # JSON configuration execution
│ ├── hal/ # Hardware Abstraction Layer
│ └── model/ # Data models (State, Transition, etc.)
├── tests/ # Test suite
└── examples/ # Example automation scripts
- Documentation improvements
- Example automation projects
- Bug fixes in JSON executor
- HAL improvements for Linux/Mac
Check BROBOT_MIGRATION_TRACKER.md for:
- Classes that need porting from Brobot
- Incomplete implementations
- Missing tests
- Performance optimizations
- New HAL implementations (wayland, mobile)
- Advanced MultiState integration
- GUI automation best practices
Qontinui depends on:
- MultiState - Multi-state state management
- OpenCV - Image template matching
- PyAutoGUI/pynput - Input control
- Check CLAUDE.md for AI assistant guidelines
- Open an issue for questions
- Ask about Brobot behavior when porting classes
By contributing, you agree that your contributions will be licensed under the MIT License.
Thank you for contributing! 🎉