15 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Common Commands
Running the Application
uv run python main.py- Start the VPN manager GUI applicationuv run python main.py &- Start the application in background for testing- The application runs as a system tray application and can be minimized to the tray
Managing Running Instances
ps aux | grep "python main.py" | grep -v grep- Check for running instancespkill -f "uv run python main.py"- Kill running instances (recommended)- Note:
KillBashonly kills the shell, not the spawned uv process - usepkillinstead
Development Environment
- This project uses
uvfor Python package management uv sync- Install dependencies from pyproject.toml- Python 3.13+ required
- Dependencies: PyGObject (GTK3), pystray, Pillow, PyYAML
Configuration Management
python init_config.py- Initialize configuration directory with examplespython data_loader.py --init- Alternative way to create example files- Configuration location:
~/.vpntray/customers/ - Each customer gets their own YAML file (e.g.,
customer_name.yaml)
Code Architecture
Core Components
main.py - Main GUI application entry point
VPNManagerWindowclass: Primary PyGObject/GTK3-based GUI application- Two-column layout: active customers (left) vs inactive customers (right)
- Features system tray integration using
pystray - Uses GNOME-style theming with CSS card styling
- Includes comprehensive logging system with collapsible log view
- HeaderBar for native GNOME look and feel
- Current location tracking and enhanced display with network topology
models.py - Type-safe data model definitions using dataclasses and enums
ServiceType: Enum for service types (SSH, Web GUI, RDP, VNC, SMB, Database, FTP)HostType: Enum for host types (Linux, Windows, Windows Server, Proxmox, ESXi, Router, Switch)VPNType: Enum for VPN types (OpenVPN, WireGuard, IPSec)Service: Individual services on hosts with type-safe enums and port numbersHost: Physical/virtual machines with multiple IP addresses, services, and recursive sub-hosts (VMs)Location: Customer locations with VPN configurations and host infrastructureCustomerService: Customer's cloud/web services (O365, CRM, etc.)Customer: Top-level entities containing services and locations- Each model includes comprehensive helper methods for common operations
data_loader.py - YAML-based data management layer
load_customers(): Loads customer configurations from~/.vpntray/customers/*.yamlfilessave_customer(): Saves customer data back to YAML files with proper enum serializationinitialize_example_customers(): Creates example configuration files- Robust parsing with enum conversion, error handling, and graceful fallbacks
- Falls back to demo data if no configuration files exist
- Supports both
.yamland.ymlfile extensions
views/ - High-level UI view management (MVC pattern)
active_view.py:ActiveViewclass for displaying active locations with full interactioninactive_view.py:InactiveViewclass for search results (inactive locations)- Clean separation of concerns with dedicated view controllers
__init__.py: View exports for clean imports
widgets/ - Modular UI components using PyGObject
customer_card.py:ActiveCustomerCardandInactiveCustomerCardclasses- Compact tree-like design: Hierarchical layout with expand/collapse arrows
- Card styling: Customer cards contain location subcards with proper visual hierarchy
- Multi-column layout: Fixed-width columns for proper alignment (name, IP, actions)
- Service action icons: Direct access buttons for SSH, RDP, Web GUI with tooltips
- Multiple IP support: Display primary IP with hover tooltip showing all addresses
- Active cards: Full interaction with connection controls and infrastructure details
- Inactive cards: Activation buttons and current location setting
location_card.py:ActiveLocationCardandInactiveLocationCardclasses- Active cards: Connection controls, deactivation (X button), and infrastructure details
- Inactive cards: Current location setting and activation buttons
host_item.py:HostItemclass for displaying hosts and their services- Hierarchical display supporting hypervisors with sub-hosts (VMs)
- Service buttons for direct access to SSH, Web GUI, RDP services
__init__.py: Widget exports for clean imports
services/ - VPN and credential management (modular architecture)
vpn_manager.py: NetworkManager (nmcli) integration with .ovpn file supportpassbolt_client.py: Passbolt CLI client for secure credential managementconnection_manager.py: High-level orchestrator combining VPN and credentials- Support for flexible credential storage (direct username/password or Passbolt UUIDs)
views/ - Comprehensive logging system
log_view.py:LogViewclass with collapsible interface- Command logging: Real-time capture of nmcli and system command output
- Color-coded levels: Info, success, warning, error with visual distinction
- Auto-scroll: Automatic scrolling to latest entries with manual override
- Expandable/collapsible: Bottom panel that can be hidden to save space
Configuration Files
init_config.py: Helper script to initialize user configuration with examplesexample_customer.yaml: Complete example showing YAML schema with all features- User config:
~/.vpntray/customers/*.yaml- One file per customer
Key Architecture Patterns
Hierarchical Data Structure: Customer → Location → Host → Service
- Customers have cloud services (accessible anywhere) and multiple physical locations
- Each location has VPN configuration, connection state, and host infrastructure
- Hosts can have sub-hosts (VMs under hypervisors) with recursive nesting
- Services represent endpoints (SSH, Web GUI, RDP, etc.) with specific ports
Location State Management:
- Active/Inactive: Locations can be activated for VPN management
- Current Location: User's physical location (separate from VPN connections)
- Connection State: VPN connection status independent of location activation
- Network Topology: Each location includes internal networks and external endpoints
- Credential Management: Flexible credential storage (direct or Passbolt UUID)
- Automatic UI updates based on state changes with immediate feedback
Two-Column Layout Architecture:
- Left column: Active customers with full location details and infrastructure
- Right column: Inactive customers available for activation
- Compact design: Tree-like hierarchy with proper indentation and alignment
- Real-time filtering: Search affects both columns simultaneously
- Dynamic reorganization: Customers move between columns based on location state
Widget-Based Component System:
- Modular widget classes handle their own GTK widget creation and event handling
- Callback system for widget-to-main-window communication
- Clear separation between data models and UI representation
- Different widget behavior for active vs inactive states
Type-Safe Configuration System:
- Comprehensive enum usage for all categorical data
- YAML-based configuration with robust parsing and validation
- Graceful error handling and fallback mechanisms
- Easy extensibility for new service types, host types, and VPN protocols
Current Location Tracking
The application tracks two distinct location concepts:
- Current Location: Where the user physically is (set via "Set as Current" button)
- Active Locations: Locations available for VPN connections
Enhanced Current Location Display:
- Prominent info box with customer name, location, and VPN type
- Host count summary with VM breakdown (e.g., "3 hosts (7 total with VMs)")
- Collapsible infrastructure section with detailed host and VM information
- Network topology display: Internal networks and external endpoints
- Visual host type icons (🐧 Linux, 🪟 Windows, 📦 Proxmox, 🌐 Router, etc.)
- Hierarchical VM display with service counts and multiple IP addresses
- Multi-interface support: Hosts can have multiple IP addresses (firewalls, routers)
- Users can set current location from inactive location cards without activating VPN
Search and Discovery Features
Advanced Search Functionality:
- Real-time search across customers, locations, hosts, and services
- Wildcard support: Type
*to show all inactive locations - Smart filtering: Search includes IP addresses, service types, and port numbers
- Context switching: Empty search shows active view, any text shows search results
- Auto-clear: Activating a location automatically clears search and returns to active view
Data Flow
- Initialization:
data_loader.load_customers()loads configurations from YAML files in~/.vpntray/customers/ - UI Setup: Creates views and widgets using callback architecture
- Search/Filter: Real-time filtering with wildcard support and smart matching
- View Management:
Gtk.Stackmanages smooth transitions between active/inactive views - User Interactions: Callbacks update dataclass attributes with immediate UI feedback
- Persistence: Changes can be saved back to YAML files using
save_customer() - State Updates: Location activation, connection changes, and current location updates
UI Layout Structure
Modern Two-Column Design:
- HeaderBar with title and current location display
- Enhanced current location info box with network topology and collapsible infrastructure
- Search entry with real-time filtering across both columns
- Left column: Active customers with full interaction (connections, services, infrastructure)
- Right column: Inactive customers with activation and current location setting
- Compact tree-like cards with customer cards containing location subcards
- Fixed-width columns: Proper alignment of host names, IP addresses, and action icons
- Collapsible log view: Bottom panel for command output and system logs
- GNOME-style cards with CSS theming, proper spacing, and visual hierarchy
- System tray integration for minimize-to-tray behavior
Customer Card Features:
- Active cards: Start expanded, show full location details and services
- Inactive cards: Start collapsed to save space during search
- Location count badges: Show number of locations in parentheses
- Smooth expand/collapse: Click arrow buttons to toggle content visibility
GTK3/PyGObject Specific Features
- CSS styling: GNOME-style cards with borders, shadows, and adaptive theming
- Native widgets: HeaderBar, SearchEntry, ScrolledWindow, Stack with crossfade transitions
- Proper GNOME HIG compliance: Spacing, margins, typography, and layout
- Button styling: suggested-action and destructive-action classes for clear visual hierarchy
- Thread-safe integration: System tray using GLib.idle_add for thread safety
- Responsive design: Proper scrolling and adaptive layouts
Mock Implementation Status
- Currently a UI mockup with no actual VPN functionality
- All VPN operations (connect, disconnect, routes) are placeholder methods
- Button actions update UI state but don't perform real network operations
- Rich configuration system ready for real VPN client integration
- Comprehensive infrastructure modeling supports complex network topologies
YAML Configuration Schema
Customer files in ~/.vpntray/customers/ follow this structure:
name: Customer Name
# Cloud/web services (always accessible)
services:
- name: Service Name
url: https://service.url
service_type: Service Category
description: Optional description
# Physical locations with VPN and infrastructure
locations:
- name: Location Name
vpn_type: OpenVPN|WireGuard|IPSec
vpn_config: /path/to/config/file
# VPN credentials (three options):
# Option 1: Dictionary with username/password
vpn_credentials:
username: vpnuser
password: password123
# Option 2: Passbolt UUID (for future implementation)
# vpn_credentials: "550e8400-e29b-41d4-a716-446655440000"
# Option 3: Omit or set to null if no credentials needed
# vpn_credentials: null
# Note: active and connected are runtime state (not stored in config)
# Network topology information
external_addresses: [vpn.domain.com, backup.domain.com] # VPN endpoints
networks: [192.168.1.0/24, 10.0.1.0/24] # Internal networks
hosts:
- name: Host Name
ip_addresses: [192.168.1.10, 10.0.1.10] # Multiple interfaces supported
host_type: Linux|Windows|Windows Server|Proxmox|ESXi|Router|Switch
description: Optional description
services:
- name: Service Name
service_type: SSH|Web GUI|RDP|VNC|SMB|Database|FTP
port: Port Number
sub_hosts: # Optional VMs/containers (recursive structure)
- name: VM Name
ip_addresses: [192.168.1.20] # VMs can also have multiple IPs
host_type: Linux|Windows|Windows Server
services: # Same structure as parent host
- name: Service Name
service_type: SSH|Web GUI|RDP
port: Port Number
Future Extensibility
VPN Integration Ready:
- Implement actual VPN connection logic in placeholder methods
- Add real-time VPN status monitoring and automatic reconnection
- Support for multiple VPN clients (OpenVPN, WireGuard, IPSec)
- Integration with system network management
Configuration Management:
- Import/export functionality for customer configurations
- Configuration validation with detailed error reporting
- Backup and restore capabilities
- Multi-user configuration support
UI Enhancements:
- Settings panel for application preferences
- Connection logs and monitoring
- Network diagnostics and troubleshooting tools
- Custom themes and layout preferences
- Notification system for connection status changes
Advanced Features:
- Auto-discovery of network services and hosts
- Integration with network monitoring tools
- SSH key management and authentication
- Bookmark system for frequently accessed services
- Connection history and analytics
Development Notes
Code Quality:
- Type hints throughout codebase for better IDE support
- Comprehensive error handling with graceful degradation
- Clean separation of concerns (MVC pattern)
- Extensive use of dataclasses and enums for type safety
Testing Strategy:
- Configuration can be tested with example YAML files
- UI components are modular and independently testable
- Mock data system allows UI testing without VPN dependencies
Performance Considerations:
- Efficient YAML loading with caching
- Minimal UI updates with smart re-rendering
- Background thread for system tray to prevent UI blocking
- Lazy loading of complex widget hierarchies