Thank you for your interest in contributing! Whether it's a bug report, new feature, code fix, or UI improvement, all contributions are welcome.
Important
By contributing, you agree that your contributions will be licensed under the GNU General Public License v3.0.
- Code of Conduct
- How to Contribute
- Reporting Issues
- Feature Requests
- Pull Request Process
- Development Setup
- Coding Guidelines
- Commit Messages
- Testing
Please be respectful and constructive in all interactions. Harassment, trolling, and personal attacks will not be tolerated.
- Fork the repository and create your branch from
main. - Make your changes following the coding guidelines below.
- Test your changes locally.
- Open a Pull Request with a clear description of what you've done.
When opening an issue, please use the provided issue template (if available) or include:
- A clear, descriptive title
- Steps to reproduce the issue (minimal, complete, and verifiable)
- Expected behavior and actual behavior
- Environment details:
- Windows version (e.g., Windows 10 22H2, Windows 11 24H2)
- Python version (
python --version) - VoirolClass version (check
config.tomlor the About tab) - RAM and CPU info (relevant for performance issues)
- Logs — attach the latest log file from
%LOCALAPPDATA%\VoirolClass\logs\voirol.log - Screenshots / screen recordings if applicable
Tip
Search existing issues before creating a new one to avoid duplicates.
Feature requests are welcome! Please include:
- What problem does this feature solve?
- How would it work? Describe the expected behavior.
- Alternative solutions you've considered.
- Relevant context (e.g., classroom scenario, hardware constraints).
- Ensure your PR addresses a single concern — avoid mixing unrelated changes.
- Run the application locally and verify your changes work correctly.
- Check for any debug/test code that should not be committed.
- Rebase your branch on the latest
mainto keep history clean.
-
Title: Short, descriptive, and prefixed with the area of change:
Prefix Example feat:feat: add dark mode supportfix:fix: VAD crash on empty audio chunkrefactor:refactor: extract APP_MAP to maps.pydocs:docs: update README badgesstyle:style: fix indentation in pipeline.pyperf:perf: reduce latency in audio pipelinei18n:i18n: add Japanese translationchore:chore: bump version to 0.2.3 -
Description: Explain what your PR does and why. Include before/after behavior if applicable.
-
Related issues: Reference any related issues with
Closes #123orFixes #456. -
Screenshots: For UI changes, include before/after screenshots.
- A maintainer will review your PR within a few days.
- Address any review comments by pushing additional commits.
- Once approved, your PR will be squashed and merged.
git clone https://github.com/ChidcGithub/VoirolClass.git
cd VoirolClass
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python main.pyTo use the AI Agent or API features, copy config.toml.example to config.toml and fill in your API keys:
[ai]
enabled = true
api_key = "sk-your-key-here"-
Target Python 3.10+
-
Follow PEP 8 for code style
-
Use type hints for all function signatures:
def process_audio(audio: np.ndarray, sample_rate: int) -> np.ndarray: ...
-
Imports order: standard library → third-party → project modules, separated by blank lines
-
Naming:
snake_casefor functions and variablesPascalCasefor classesUPPER_CASEfor constants
-
Docstrings: Not required for simple functions, but include them for public APIs and complex logic
-
Logging: Use
get_logger(__name__)at module level instead ofprint()
- Keep UI logic out of model/code files — use signals and slots
- Use
t("key")for all user-facing strings (internationalization) - Prefer layout-based sizing over fixed geometry
Each skill function must:
- Accept a single
params: dictargument - Return a
strresult description - Have a JSON schema for validation (see existing skills in
voirol/agent/skill_registry.py)
Follow Conventional Commits:
<type>: <short description>
[optional body]
[optional footer]
Examples:
fix: handle empty audio buffer in VAD
Avoid division by zero when no speech is detected.
Fixes #42
feat: add speaker enrollment via settings dialog
Teachers can now register by reading 5 sentences.
CI runs on every push and PR:
- Syntax check:
python -m compileallensures no syntax errors - Import verification: All core modules are importable
For manual verification, please check:
- Audio pipeline: Speech is detected, verified, and transcribed correctly
- Command matching: All 3 tiers (exact, keyword, fuzzy) work as expected
- AI features (if changed): Agent and semantic matcher produce correct results
- UI: Settings dialog opens/closes, teacher profiles can be registered and selected
- No regressions: Existing functionality still works after your changes
If you're adding a new feature, consider including a test script or manual test steps in your PR description.
If you're unsure about anything, feel free to open a Discussion or ask in an issue. We're happy to help!