Welcome Contributors!
Contributions are welcome! Feel free to fork the repository and submit pull requests. If you have ideas, suggestions, or bug reports, open an issue on GitHub.How to Contribute
Forking and Pull Requests
- Fork the repository on GitHub
- Create a feature branch from
main: - Make your changes and commit them with clear, descriptive messages
- Push to your fork:
- Open a Pull Request against the main repository
Issue Reporting
When reporting issues, please include:- Laptop model and specifications
- Linux distribution and version
- Kernel version (
uname -r) - Steps to reproduce the issue
- Expected behavior vs actual behavior
- Logs or error messages if applicable
Code Style
KVantage follows Kotlin coding conventions:- Use 4 spaces for indentation (configured in
gradle.properties) - Follow official Kotlin style guide (
kotlin.code.style=official) - Use meaningful variable and function names
- Add comments for complex logic or ACPI-specific operations
- Keep functions focused and single-purpose
Project Structure
The main codebase is organized as:Testing Considerations
The application requires root access to interact with/proc/acpi/call, but this access is isolated to the backend daemon (kvand). The GUI should never run as root.
Testing Best Practices
- Test the GUI application as a normal user
- The app will request the sudo password once during startup
- Root access is limited to the backend daemon only
- Always test on actual Lenovo hardware (no emulation support)
- Verify that ACPI module is loaded:
lsmod | grep acpi_call
Known Testing Limitations
- Hardware-specific: Only works on Lenovo laptops with ACPI support
- Root required: Backend needs root to read/write
/proc/acpi/call - No safe testing environment: Changes affect actual hardware settings
Logging Best Practices
The project maintainer learned this the hard way: Always use loggers to track application execution!
- Use proper logging instead of print statements
- Log state changes and ACPI interactions
- Include error context in error logs
- Add debug logs for troubleshooting complex flows
- Root-executed operations
- ACPI read/write operations
- Backend daemon communication
- Error handling paths
Translation Contributions
KVantage supports multiple languages with i18n resources in:Current Languages
- English (en) - Author
- Spanish (es) - Author
- Japanese (ja) - Author
- German (de) - AI translated
- French (fr) - AI translated
- Portuguese (pt) - AI translated
- Korean (kr) - AI translated
- Chinese (zh) - AI translated
Contributing Translations
To improve or add translations:- Copy the
values/directory structure - Create or update
values-{locale}/strings.xml - Translate all string resources
- Test by changing your system locale
- Submit a PR with your changes
Backend Development
The backend daemon (kvand) is maintained in a separate repository:
- Repository: github.com/kosail/Kvand
- Language: Go (Golang)
- Purpose: Handle root-level ACPI operations
kvand binary and reference source for convenience, but active backend development happens in the dedicated repository.
Why Separate?
- Clean separation between GUI and system operations
- Security isolation of root-level access
- Different tech stacks (Kotlin/Compose vs Go)
- JVM and Kotlin Native limitations for low-level operations
License
KVantage is licensed under GPLv3 (GNU General Public License v3).Free to use, modify, and distribute as long as derivative works:
- Remain open source
- Are not used for profitable purposes
- Include the same GPLv3 license
Questions?
If you have questions about contributing:- Open a GitHub Discussion
- Create an issue with the
questionlabel - Review existing issues and PRs for context
KVantage is a personal learning project and is not affiliated with Lenovo.Made with love from Honduras by kosail