First off, thank you for considering contributing to VPN Manager! It's people like you that make VPN Manager such a great tool for the Linux community.
- Code of Conduct
- Getting Started
- How Can I Contribute?
- Development Setup
- Pull Request Process
- Style Guidelines
- Community
This project and everyone participating in it is governed by our Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior via GitHub Issues.
VPN Manager is a GTK4-based VPN client for Linux that supports OpenVPN, WireGuard, and Tailscale. Before you begin:
- Make sure you have a GitHub account
- Familiarize yourself with Git
- Read the README.md to understand the project
Looking for something to work on? Check out issues labeled good first issue – these are great for newcomers!
Before creating bug reports, please check the existing issues to avoid duplicates.
When creating a bug report, please use our bug report template and include:
- VPN Manager version (
vpn-manager --version) - Linux distribution and version
- Desktop environment (GNOME, KDE, etc.)
- Steps to reproduce the issue
- Expected vs actual behavior
- Relevant logs from
~/.config/vpn-manager/logs/
Feature requests are welcome! Please use our feature request template and describe:
- The problem you're trying to solve
- Your proposed solution
- Alternatives you've considered
- Fork the repository
- Clone your fork locally
- Create a branch for your changes (
git checkout -b feature/amazing-feature) - Make your changes following our style guidelines
- Test your changes thoroughly
- Commit using conventional commits
- Push to your fork
- Open a Pull Request
# Ubuntu/Debian
sudo apt install golang gcc libgtk-4-dev libadwaita-1-dev openvpn
# Fedora
sudo dnf install golang gcc gtk4-devel libadwaita-devel openvpn
# Arch Linux
sudo pacman -S go gcc gtk4 libadwaita openvpn# Clone your fork
git clone https://github.com/YOUR_USERNAME/vpn-manager.git
cd vpn-manager
# Download dependencies
go mod download
# Build
go build -o vpn-manager .
# Run
./vpn-manager# Run all tests
go test ./...
# Run tests with coverage
go test -cover ./...
# Run specific package tests
go test ./vpn/...vpn-manager/
├── main.go # Application entry point
├── app/ # Core application logic
│ ├── config.go # Configuration management
│ ├── eventbus.go # Event system
│ ├── logger.go # Structured logging
│ ├── resilience.go # Circuit breaker, retry logic
│ └── security.go # Encryption, secure storage
├── cli/ # Command-line interface
├── keyring/ # System keyring integration
├── ui/ # GTK4/libadwaita UI components
│ ├── app.go # Main application window
│ ├── openvpn_panel.go # OpenVPN management
│ ├── wireguard_panel.go
│ ├── tailscale_panel.go
│ └── tray.go # System tray
└── vpn/ # VPN providers
├── manager.go # Connection management
├── openvpn/ # OpenVPN provider
├── wireguard/ # WireGuard provider
└── tailscale/ # Tailscale provider
- Update documentation if you change functionality
- Add tests for new features
- Follow the PR template when submitting
- Wait for review – maintainers will review your PR
- Address feedback if changes are requested
- Celebrate when it's merged! 🎉
We follow Conventional Commits:
<type>(<scope>): <description>
[optional body]
[optional footer(s)]
Types:
feat: New featurefix: Bug fixdocs: Documentation changesstyle: Code style changes (formatting, semicolons, etc.)refactor: Code refactoringperf: Performance improvementstest: Adding or updating testschore: Maintenance tasks
Examples:
feat(wireguard): add split tunnel support
fix(tailscale): resolve exit node selection bug
docs: update installation instructions
- Follow Effective Go
- Use
gofmtfor formatting - Run
golintandgo vetbefore committing - Keep functions focused and small
- Add comments for exported functions and types
- Handle errors explicitly – don't ignore them
- Follow GNOME Human Interface Guidelines
- Use libadwaita widgets when available
- Support both light and dark themes
- Ensure accessibility (proper labels, keyboard navigation)
- Write tests for new functionality
- Use table-driven tests when appropriate
- Mock external dependencies
- Test error cases, not just happy paths
- GitHub Issues: For bugs and feature requests
- GitHub Discussions: For questions and community chat
- README: For setup and usage instructions
Contributors are recognized in:
- Release notes
- Contributors list
Thank you for making VPN Manager better for everyone! 💙