All notable changes to azlin will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- GUI Forwarding: Run remote Linux GUI applications locally (#828)
azlin connect --x11/-X— X11 forwarding for lightweight GUI apps (gitk, meld, xeyes)azlin gui [VM]— Full VNC desktop session with XFCE, auto-managed dependenciesazlin gui --minimal— Openbox window manager only (no full desktop overhead)azlin gui --app "cmd"— Single-app VNC mode, exits when app closes- Automatic local/remote dependency detection and installation guidance
- VNC on localhost only with random per-session passwords
- Works through Azure Bastion for private VMs
- New docs:
docs/GUI_FORWARDING.md
- Complete rewrite from Python to Rust -- 75-85x faster startup
- 2,536 tests, 53 commands, 154 subcommand variants
- Pre-built binaries for Linux, macOS, Windows
azlin self-updatefor automatic updatesazlin-pypreserves access to Python CLI- Migration bridge: existing uvx alias auto-routes to Rust binary
- Custom table renderer with guaranteed single-line truncation
- Non-TTY safe: all confirmation prompts handle piped input
- View cloud-init, syslog, and custom logs from any VM
- Stream logs in real-time or fetch historical entries
- Real-time monitoring: latency, traffic, errors, saturation
- Actionable health status for each VM
- Specify Ubuntu version when creating VMs (e.g.,
--os 25.10) - Full support for Ubuntu 25.10
- Add dedicated /tmp disks to new or existing VMs
- Configurable size and mount options
- Address VMs with
hostname:session_namesyntax - Works across all commands (connect, exec, code, etc.)
- Detects distro from Azure image reference (Ubuntu, Debian, Windows, RHEL, SUSE)
- OS name includes version (e.g., "Ubuntu 25.10", "Ubuntu 22.04 LTS")
- Save and restore session state across VM restarts
- Monitor active processes within sessions
- Parallelize CLI tool detection: 15s to 5s startup (#641)
- Batch storage quota queries to eliminate N+1 Azure CLI calls (#649)
- Per-VM incremental cache refresh (#639)
- Fix stale cache hiding newly created VMs (#670)
- Enable NFS RootSquash to prevent privilege escalation (#624)
- Use Azure AD auth instead of storage keys (#629)
- Use append mode for SSH keys per audit requirement (#632)
- Decompose vm_connector.py from 976 to 492 LOC (#642)
- Split monitoring.py into focused command modules (#635)
- Split connectivity.py into focused command modules (#636)
- Migrate NFS, Bastion, and storage modules to shared validation utilities (#637)
- Extract 48 helper functions from cli.py to cli_helpers.py (#634)
- Decompose monolithic list_command() into focused helpers (#633)
- Fix WSL SSH config sync for
azlin code(#731) - Auto-remediate tmux socket dir on Ubuntu 25.10 VMs during connect (#723)
- Fix cloud-init runcmd YAML parsing failure from version logging (#725)
- Make cloud-init work on Ubuntu 25.10 for npm and ripgrep (#727)
- Always measure SSH latency when
--with-latencyis requested (#721) - Fix
azlin list -qnot showing quota when VMs are cached (#688) - Add missing
--mountflag to disk add help text (#706) - Azure CLI WSL2 detection and auto-fix (#609)
- Tag-based VM discovery for
azlin w/ps/top(#610) - Replace remaining
datetime.utcnow()deprecations (#707, #703) - Address quality audit findings (debug logging, ANSI sanitization, timeouts, dead code) (#665)
- Remove disabled SSHFS auto-mount dead code (#643)
- Remove broken test imports from shared validation migration (#645)
- Replace XXX placeholders with descriptive webhook URL examples (#640)
- Unit tests for cli_helpers.py (#700)
- Unit tests for key_rotator.py (#698)
- Unit tests for orchestrator.py (#699)
- Unit tests for remote_exec.py and batch_executor.py (#702)
- Unit tests for tag_manager.py and service_principal_auth.py (#701)
- Resolve 6 skipped tests by implementing missing features (#711)
- Update 5 stale test skips to match current implementations (#704)
- Register missing pytest markers (#703)
- Correct mock scopes in integration tests (#697, #712)
- Add 8 GitHub Agentic Workflows for continuous improvement and maintenance
- Full system upgrade and gh CLI install in cloud-init (#719)
- Add tmux socket directory permissions for Ubuntu 25.10 (#718)
- Version logging for npm and rg during VM provisioning (#717)
- Decomposed cli.py into 11 modular command files
- Reduced cli.py from 10,242 to 6,863 lines (33% reduction)
- Preserved exact list command behavior (fixes #604)
- Completed comprehensive quality audit
- Created 9 issues for improvements (#595-603)
- Overall codebase score: 8.8/10
- Updated README to focus on user-facing features
- Removed emojis from documentation
- Clarified feature benefits and usage examples
- Launches terminal windows for all active azlin sessions with one command
- Smart platform detection (macOS Terminal, Windows Terminal, WSL, Linux)
- Multi-tab support for Windows Terminal
- User-configurable terminal preferences via
~/.azlin/config.toml - 49 comprehensive tests with security hardening
- Progressive Web App for managing VMs from iPhone
- Start/stop VMs, view status, manage tmux sessions
- Quasi-interactive terminal via Azure Run Command API
- Works with private IP VMs (no public IPs required)
- Azure AD authentication with device code flow
- Installable on iPhone home screen
- Complete cost tracking integration
- VS Code launcher now supports Bastion tunnels for private IP VMs
- Retry logic and rate limiting for tunnel creation
- Improved reliability for VMs without public IPs
- 60-minute cache TTL (up from 5 minutes)
- Background cache refresh after each
azlin list - Tiered caching with mutable/immutable separation
- Dramatically reduces Azure API calls and improves performance
- Automatic 100GB managed disk for
/homedirectory - Persistent storage isolated from OS disk
- Customizable with
--home-disk-sizeand--no-home-diskoptions - Cost-effective at ~$4.80/month for default configuration
- Added tmux session count column
- Renamed "Size" to "SKU" for clarity
- Rebalanced column widths for better readability
- BREAKING: Decomposed monolithic cli.py (10,011 lines) into 11 modular command files
- Reduced cli.py from 10,011 to 2,527 lines (75% reduction)
- Created self-contained modules following Bricks & Studs architecture
- All existing CLI commands preserved with backward compatibility
- Default Ubuntu version updated from 22.04 to 24.04 LTS (#559)
- Various timeout improvements for WSL/Windows compatibility
- New modular command structure in
src/azlin/commands/:batch.py: Batch operations (stop, start, sync, command)connectivity.py: SSH connection, VS Code, sync, cp commandsenv.py: Environment variable managementip_commands.py: IP diagnostics commandskeys.py: SSH key managementlifecycle.py: VM lifecycle (start, stop, kill, destroy)nlp.py: Natural language command execution (do command)provisioning.py: VM creation (new, vm, create, clone)snapshots.py: Snapshot managementtemplates.py: Template CRUD operationsweb.py: PWA development server commandsmonitoring.py: Expanded with list, session, w, top, ps, cost commands
- Shared
get_vm_session_pairs()function for list/restore consistency - CodeQL configuration to handle intentional lazy imports
- Automatic Claude Code installation during VM provisioning (#570)
- Security: AppleScript injection vulnerability (CWE-94) in restore.py
- Security: Permission race condition (CWE-732) in auth.py with atomic file creation
- Security: Documented SSH StrictHostKeyChecking tradeoff in cli_helpers.py
- Removed 164 lines of dead code (_doit_old_impl)
- Cleaned up
__all__exports to not include private functions - Fixed test mock patch locations for decomposed modules
- Session crossing prevention in azlin restore
- List/restore reliability improvements
- 74/74 module extraction tests passing (100%)
- Verified backward compatibility for existing test patches
- UVX installation tested and working
- Real Azure integration tested with 6 VMs
- Concurrent command execution tested (3 simultaneous commands)
- 352 comprehensive tests (vm_lifecycle, terminal_launcher, etc.)
- CI/CD pipeline with 6 security scanning tools
- API reference documentation (3,547 lines)
- Path traversal and IP validation security fixes
- Silent exception handling (36 locations)
- Consolidated duplicate VM listing logic
- 1,331 lines of dead code (xpia_defense.py)
Initial v2.0 release with config management and enhanced CLI.