Releases: GNS3/gns3-gui
Releases · GNS3/gns3-gui
Release list
Version 3.1.0 alpha 5
Version 2.2.61
GUI
- No changes
Server
- Sync appliances
- fix(import): unvalidated symlink creation in import_project
- fix(qemu): fix addition of QEMU RNG device causes interface names to change
- fix(qemu): remove trailing space from RNG object argument
- fix: do not start nodes when deleting a project
- fix: correct always-true state check in DockerVM.stop()
Version 2.2.60
GUI
- feat(capture): implement live packet capture with internal tail
- Add support for Ptyxis terminal. Fixes #3834
Server
- Sync appliances
- Only set IOU images to be executable when importing images
- fix(import): project import does not move images symlinks into place
- Search for system UEFI that is compatible with Python < 3.12
- Add OVMF firmware directory configuration
- Automatically add a Random Number Generator (RNG) device when using uefi option is enabled
- fix(docker): handle container name conflict automatically
- fix: gns3-server crashes on startup if "Open this project in the background" is active but there is a problem with that project
- Handle HTTPNotFound exception when retrieving compute status
- Fix: Check compute connectivity before open() during project deletion
- API endpoints to manage base configuration files for templates
Version 3.1.0 alpha 4
GUI
- No changes
Server
- Bundle web-ui v3.1.0a4
- Add jwt_refresh_token_expire_minutes to sample configuration
- Remove deleted web-ui files from git
- .dockerignore ignore .dockerignore
- typo made me reconsider and move out to env
- defaulted DOCKERHUB_ORG repository variable
- Remove API docs from 2.2 after merging
- Update GitHub Actions workflows
- Fix web-wireshark docker build broken by xpra 6.5 release
- Update CI to install [ai-features,dev] instead of [ai-copilot,dev]
- Make AI features (AI Copilot + MCP) optional via [ai-features] extra
- Add refresh token mechanism documentation under docs/features/
- Add /refresh to allowed public endpoints list in route auth test
- Add stateless JWT refresh token mechanism
- Add project/node/link handler tests: 39 total, covering list/get/create/delete/start/stop/suspend/reload/console/update/fields
- Add MCP tool parameter consistency tests
- Fix appliance_install: add version parameter
- Add coordinate system note to docs
- Document canvas coordinate system in node_create x/y params
- Update docstring: batch concurrency from 10 to 100
- Remove unused import time
- Add list type check before nodes[0] access in _normalize_link_nodes
- Add fields type validation in create handlers
- Use pop() instead of pop(0) for O(1) port removal
- Fix review issues: key_prefix length, count validation, WAL log, timeout comment, pointless temp var
- Fix: pass name from TemplateUsage to add_node_from_template
- Remove unused imports (logging, log, select)
- Add warning for unconsumed pre-allocated UDP ports after link creation
- Remove FIXME comment about middleware in server.py
- Rename device_command_run_handler → device_show_run_handler to match tool name
- Rename device_command_run → device_show_run for clarity
- Fix device_command_run KeyError('commands'): tool desc said show_commands but backend expects commands
- Fix template_list return type annotation to match _run_handler_sync envelope
- Add performance optimization documentation
- Update MCP service docs: API key format, auth flow, tool parameters, concurrency
- Increase HTTP connection pool to 500/1000
- Increase BATCH_MAX_WORKERS and Pool concurrency from 20 to 100
- Remove final timing artifact in projects.py
- Remove remaining dead timing variables and imports
- Remove database warmup (proven ineffective - real bottleneck was bcrypt blocking event loop)
- Clean up all timing/debug logs
- Add memory: import validation best practice
- Fix: add missing UUID imports
- Generate fresh JWT on API key auth instead of returning raw key
- Optimize API key auth: O(1) lookup via UUID-embedded key format
- Fix: offload bcrypt.checkpw to thread pool to prevent blocking event loop
- Add timing to API key auth path and log api_keys count
- Replace SELECT 1 warmup with full database file read to warm OS page cache
- Add timing logs to auth dependency chain to identify 6s pre-handler delay
- Add granular timing to get_template: separate execute vs fetch time
- Warm up database connection pool on startup to avoid 8s cold-start penalty on first API request
- Fix: register WAL PRAGMA on sync_engine instead of Engine class for async compat
- Add timing logs to get_template to identify DB query bottleneck
- Add timing middleware to log slow requests (>1s) with [CTRL-TIMING] prefix
- Fix: _time → time in compute.py timing log
- Add [CTRL-TIMING] logs to controller create_node flow
- Fix: pass template_id to batch mode handler so top-level template_id works as default
- Add detailed timing logs to MCP node creation and HTTP client
- Add fields filter to template_list tool with description for AI
- Fix: add missing _filter_link_response function
- Pass name parameter through to controller API when creating node from template
- Add validation to compact link format with clear error messages
- Add compact array format for link node entries to reduce token usage
- Add fields filter to link_create tool
- Reduce md5sum cache write failure log level from error to warning
- Add fields filter to node_create tool description for AI
- Optimize MCP create_node: support inherited template_id and default fields filter
- Increase MCP HTTP client timeout from 10s to 30s
- Enable SQLite WAL mode to fix 'database is locked' errors under concurrent API requests
- Cache IOU image default values per image path to avoid redundant subprocess calls
- Increase node and link creation concurrency from 5 to 20
- Fix: revert IOU lock optimization, serialize IOU node creation for correct application_id assignment
- Performance: accelerate project opening with parallel link creation and batch UDP port allocation
- feat: Add batch link_ids to link_delete/link_reset, fields filter to link_list
- feat: Add fields filter to link_list
- feat: Add batch node_ids to node_delete
- fix: Convert http to ws scheme in node_console WebSocket URL
- feat: Add batch link_ids to link_capture_download
- feat: Add batch link_ids to link_capture_start/stop
- fix: Store username in gns3_ctx during auth, use for short-lived download JWTs
- fix: Generate independent short-lived JWT for pcap download
- revert: Remove _configs_map changes in tools_v2 (handled by template renderer now)
- fix: Merge commands for duplicate device_names in _configs_map
- fix: Actually pass template param to device_config/command handlers
- fix: Correct Jinja2 template commands_field per tool type
- feat: Jinja2 template support in device_command_run
- feat: Jinja2 template support in device_config_send
- feat: Add batch node_ids support to node_start/stop/reload/suspend
- feat: Add fields filter to appliance_list
- feat: Add fields filter to node_list
- feat: node_get fields filter — match controller Node schema fields
- fix: Set auto_close=False on project_create so projects stay open when clients disconnect
- feat: Add batch mode to node_create and link_create (parallel, max 10 workers)
- fix: Pass API key directly instead of generating short-lived JWT
- feat: API key lifecycle — revoke/restore/delete
- fix: Rename revoke_api_key → delete_api_key
- fix: Hard-delete API keys instead of soft delete (revoked flag)
- feat: Support API keys in REST API authentication (reuse gns3_ prefix keys)
- fix: Lazily access db engine for API key validation
- fix: Add missing updated_at column to api_keys table
- fix: Export ApiKeyCreate from schemas package
- feat: Add API Key support for MCP authentication
- fix: Validate JWT token exp claim — was silently ignored after migration to joserfc
- fix: Add image field to template_create, document type-specific params in description
- fix: Remove .json() calls on 204 responses for prune/install images
- fix: Skip always-running nodes in start_all/stop_all
- fix: Add missing rotation parameter to drawing_update MCP tool
- fix: Map MCP device_command_run parameter to tool's expected field name
- fix: Update link_reset description to match actual behavior (delete + recreate)
- fix: Remove unsupported description param from project_create
- fix: Fix symbol_get/upload/delete handlers for correct API paths
- feat: Log registered MCP tools at startup
- fix: Type compute_id as uuid.UUID to reject non-UUID values at MCP input layer
- fix: Require UUID for compute_get/images, remove 'local' string default
- feat: Add device configuration MCP tools (config_send, command_run, vpcs_config_set)
- refactor: unify MCP tool naming to _ convention
- feat: Add symbol upload/delete, project load, and locked check MCP tools
- feat: Add image management MCP tools
- feat: Add symbol and appliance MCP tools
- feat: Add node bulk ops, project lock, and server info MCP tools
- feat: Add snapshot and drawing MCP tools
- refactor: unify MCP handlers to use http_call directly, relocate node file ops to Node class
- feat: Add node file operations as MCP tools (list, get, write, delete)
- Add comment about rootful Docker permissions at container start
- Fix _fix_permissions test: set process.returncode=0 and update assertion
- Fix list_node_files PermissionError on os.scandir
- Fix _fix_permissions error handling and list_node_files PermissionError
- Add async_iterable_to_stream utility to avoid aiohttp compatibility issues
- Add descriptive detail to 403 errors in compute file endpoints
- Fix silent file write failure in write_compute_project_file
- feat: Node file streaming, recursive listing, file type detection, and file delete
- Update README tool descriptions: .txt → .md
- Update README tool descriptions to mention Markdown format
- Add MCP project tools: update, duplicate, and README operations
Version 3.1.0 alpha 3
GUI
- No changes (the web-ui is the most advanced interface)
Server
- Bundle web-ui v3.1.0a3
- fix: update MCP link tools descriptions with detailed filter info
- fix: correct MCP nodes and links tool parameter handling for nested kwargs
- fix: correct MCP template tool parameter handling for nested kwargs
- feat: add client information logging to MCP connection rejection
- refactor: replace MCP ready state polling with asyncio.Event
- fix: revert duplicate image check to fix failing tests
- fix (templates): Add ordering to handle the duplicate cases gracefully
- fix(templates): Database error detected when saving a template with a disk image change
- fix: return 503 error on MCP server ready timeout
- fix: add MCP server ready check to prevent initialization errors
- fix: resolve MCP server URL host via default route IP when bound to 0.0.0.0
- fix: correct MCP transport security config to actually allow all hosts by default
- feat: add configurable MCP transport security settings via gns3_server.conf
- fix: add load_feature_skills() to properly load network planning features
- refactor: convert all MCP tool parameter descriptions to Annotated+Field
- fix: remove platformdirs upper bound to resolve fastmcp-slim dependency conflict
- fix: add missing fastmcp dependency to resolve CI test failures
- refactor: move all imports to top of init.py
- test: add /v3/mcp/ to allowed public endpoints
- fix: remove console_host/port from get_node_console_info
- feat: add get_node_console_info tool
- feat: add 3 Compute MCP tools - Add list_computes, get_compute, get_compute_images - Total MCP tools: 29
- feat: add 5 Template MCP tools
- feat: add Node and Link MCP tools, update copyright - Add 9 node tools and 5 link tools - Update copyright year to 2026, add author
- feat: complete MCP SSE transport with JWT auth
- feat: support Authorization header and query param for MCP token
- feat: implement standard MCP protocol with SSE transport
- feat: add MCP (Model Context Protocol) service with project tools
- Add project memory: Docker container stop delay analysis
- Fix Docker VM tests for container status detection on node creation
- Add running project check for fast duplication
- Move running project check before fast duplication
- Add running project check for fast duplication
- Fix Docker container status detection on node creation
- Fix web-ui update script to handle custom GitHub URL changes
- Fix unnecessary Docker container recreation when renaming a project
- Fix project rename and duplicate issues
- Fix double deletion issue in remove_resource_from_pool
- Complete fix: delete resource records when deleting resource pool
- Apply fix from PR #2315: delete resource from resource table when removing from pool
- Remove deprecated 'PermissionsStartOnly' setting for Systemd service. Ref #1830
- Optimize project loading by implementing parallel node creation
- Fix delay filter validation: ensure delay: [0, X] returns proper error message
- Fix packet filter validation tests: use correct ubridge filter type names
- Update tests to match show_interface_labels default change
- Set default value of show_interface_labels to True
- Optimize project variable updates to use parallel node processing
- Fix ghost Docker nodes causing 60-second VNC timeout on variable updates
- Fix Docker container variable compatibility with Pydantic models
- Fix delay latency minimum: ubridge rejects latency <= 0
- Improve packet filter validation: use tcpdump, handle multi-line BPF, safe project load
- Add packet filter parameter validation to prevent ubridge errors
- feat: add mermaid-to-SVG conversion script with environment setup
- perf: batch RBAC permission checking for GET /projects
- test: add benchmark script for GET /projects performance testing
- fix: prevent duplicate projects when user projects are in resource pools
- fix: check both regular ACEs and resource pool ACEs for proper access control
- test: update RBAC test to use test_user.username for user isolation
- feat: add alembic migration for LLMConfig privileges
- feat: add independent LLMConfig permissions for AI profile management
- feat: remove resource pools from 'all endpoints' list
- refactor: add efficient get_aces_for_path method for resource pool checks
- feat: prevent deletion of resource pools used by ACE configurations
- feat: fix permission check logic to properly handle ACE and user isolation
- feat: implement layered permission checks for proper user isolation and sharing
- feat: implement simple user isolation based on project ownership
- fix: clean BPF syntax error message and specify loopback interface
- feat: add BPF syntax validation using tshark
- feat: add show_filters_icon parameter to packet filter tool
- feat: add packet filter management tool for GNS3-Copilot fault injection
- fix: update test_json expected output to include show_filters_icon field
- fix: add getattr fallback to show_filters_icon property for backward compatibility
- feat: add show_filters_icon property to Link for controlling Web UI filter icon display
- fix: ensure show_filters_icon is always returned in API responses
- feat: add show_filters_icon property to Link for controlling Web UI filter icon display
- fix: remove explicit paramiko pin to resolve dependency conflict with netmiko
- fix: update netmiko to 4.7.0 and pin paramiko>=5.0.0 to fix CVE-2026-44405
- fix: close DockerHTTPClient session to prevent UnixConnector leak in Web Wireshark
Version 3.1.0 alpha 2
GUI
- Remove psutil version check
- Fix remaining PyQt6 compatibility issues. Fixes #3822
- Add --title to remote-viewer console commands. Fixes #3783
- Fix deleting drawings. Ref #3810
Server
- Bundle web-ui v3.1.0a2
- fix: surface tshark stderr errors to LLM, not just log them
- fix: hint LLM about -c behavior when tshark returns empty with -c
- fix: update search_fields examples to use existing field names
- fix: reject multi-keyword search_fields, single keyword only
- fix: document action/query params in PacketAnalysisTool description
- feat: add search_fields action to PacketAnalysisTool for real-time field lookup
- feat: validate tshark -e field names before running analysis
- fix: document -c behavior caveat in PacketAnalysisTool description
- fix: demote loader-level load logs to DEBUG, info already reported by manager
- fix: promote skills/prompts load logs to INFO level
- fix: load packet analysis protocols during skills initialization
- feat: add PacketAnalysisSkillsTool
- fix: remove remaining quoted example from tool input docstring
- fix: use shlex.split for tshark_args parsing
- feat: add packet analysis workflow to tool description
- refactor: remove old PacketCaptureTool, replaced by PacketAnalysisTool
- feat: add protocol-oriented packet analysis tool
- docs: add roadmap docs for planned features
- feat: require superadmin for /reload/skills endpoint
- fix: remove background init timeout and allow skills reload retry
- deps: add PyYAML and GitPython to ai-requirements.txt
- feat: add fault injection system and external skills repository
- fix: Disable DeepSeek thinking mode to avoid reasoning_content errors
- fix: Skip offline compute nodes during project import
- fix: Import status module in project.py
- fix: Handle connection errors when stopping node console
- refactor: Remove MD5 calculation from node files listing
- fix: Export NodeFile schema to schemas module
- feat: Add detailed metadata to node files listing
- feat: Add API endpoint to list node files
- Fix snapshot restore does not work after export/import of project
- Warn to use 64-bit IOU images. Fixes #2716 32-bit IOU image support has been removed from the GNS3 VM.
- Fix: Improve Docker container deletion error logging
- Fix: Add exponential backoff to compute reconnection attempts
- Fix: Check compute connectivity before node creation in open()
- Fix: Check compute connectivity before open() during project deletion
- Fix: Add error logging when closing/deleting projects on computes
- Fix: Skip add_compute for existing computes when opening projects
- feat: add AI provider config files to .gitignore
- Fix: Use _computes instead of _project_created_on_compute for deletion check
- Fix: Check compute connection status before project deletion
- fix: extend remote compute image path conversion to all node types
- fix: send relative image path to remote compute nodes
- fix: handle directory access for static web-ui routes
- fix: add duplicate name validation when updating templates
- fix: avoid AttributeError when password is not provided in compute update
- fix: improve hostname validation error messages with allowed characters
- feat(compute): Fix Dynamips to listen on the internal port when ssh is used for auxiliary console
- feat(compute): Fix ambiguous log message related to the active console transport.
- feat(compute): Updated server host key to use the secure ssh-ed25519 instead of old ssh-rsa algorithm
- feat(compute): Fix missing SSH wrapping for auxiliary console
- feat(compute): Added AsyncioSSHServer dedicated tests
- feat(compute): add SSH console type support
- fix: include error details in LLM model config failure response
- Fix telnet console silent-proxy hang on non-ConnectionError exit (#2344)
Version 2.2.59
Version 3.1.0 alpha 1
GUI
- Fix bug when an image checksum matches with another image filename
- Refresh Ui & resources files
- Copy GUI configuration from previous minor version
- Change default disk names when creating Qemu disks
- Fix QMenu parents
- Fix UltraVNC preconfigured command
- Fix bug when dragging scene
- Implement Dark Style
- Properly close image after uploading. Fixes #3736
Server
- New completely revamped Web interface.
- Add GNS3 Copilot AI agent back-end
- Web-wireshark: packet capture and live traffic analysis in the browser
- Fix using SSL with remote computes. Fixes #3733
- Add --url and --branch parameters to update-bundled-web-ui.sh
- Fix bug when custom_adapters is None in port_factory.py
- Have optional body in start node API endpoint
- Fix snapshots after merging
- Potential fix for pull request finding 'CodeQL / Information exposure through an exception'
- Refactored the way snapshots are handled in the server
- fix(symbols): add authentication to symbol raw endpoint
- fix(symbols): add CORS headers to symbol file responses
- Allow to find new project in sub dirs
- Enhancement: Refresh projects list without restarting the GNS3 server
- Fix accessing username in authentication.py
- Improved exception handling and telnet client disconnect
- Use get method for registry_version to avoid KeyError
- Add support for appliance format version 8
- Convert database template fields from PickleType to JSON
- feat(statistics): distinguish open vs closed project nodes
- fix(statistics): handle closed projects where nodes/links are dicts
- feat(controller): extend /statistics API with project, node and link stats
- Use FastAPI Lifespan Events
- feat(link): add control_offset field to LinkStyle
- feat(symbols): add DELETE API for removing custom symbol files
- Enhancement: Re-write current Telnet server implementation using telnetlib3 library
- feat: improve error handling for API configuration errors
- Enhancement Added link type support on the server side
- Ignore HTTPException received when closing a project
- Prevent router to be duplicated when running and add tests
- Fixed issue #1605 regarding Cisco slots causing configs to break
- feat: add VNC WebSocket console support for Docker and QEMU nodes
- Return 405 error for unsupported actions for other node types
- feat(telnet_server): improve error handling and connection management
- fix(telnet): handle connection race condition during broadcast
- Change first() to one_or_none() for image query
- Fix for duplicating Qemu nodes
- Minor optimizations to logic
- Fixed an issue with the server causing errors when uploading large images + Preparation for a smarter check when uploading images
- Implemented a smarter node_type system
- docs: restructure copilot docs and update node tools
- fix(acl): correct endpoint paths for users, groups, and roles
- fix(iou): return 405 error for unsupported suspend operation
- feat(api): enhance max_tokens field with robust null handling
- feat(docs): add AI prompting guide for configuration templates
- Deactivate 'use default IOU values' by default and update RAM/NVRAM values
- Make sure the node shows as stopped when the wrap console cannot be stopped. Ref GNS3/gns3-registry#1010
- chore: update author name and copyright headers
- feat(docs): enhance AI chat API documentation with examples and details
- feat: add .claude directory to gitignore for API key security
- Revert "Fix QEMU serial console artifacts by filtering ANSI CPR responses in …"
- docs: add troubleshooting guide for datetime timezone issue
- Drop support for Python 3.9
- feat: add multi-user concurrency control design document
- docs: add troubleshooting guide for force kill residual processes
- Fixed the path traversal check
- Fix image handling
- Qemu VMs: only compute MD5 checksums for existing disks
- Copy config files and database from a previous version if it exists
- Add enable_http_auth in gns3_server.conf sample
- feat(compute): option to disable compute authentication
- tests(controller,port): short_name finishes successfully when port name is None
- fix(controller,port): handle None port name to prevent TypeError in short_name method
- fix(docker): handle container name conflict automatically
- feat(virtualbox): add fallback for VBoxManage executable detection
- feat: simplify port name assignment logic
- feat(ports): add null checks for port name in short name generation
- Remove unneeded rbac_repo in get_templates
- Use lists for tags instead of dicts
- Fix for resizing Qemu VM disks
- feat(templates): safely access settings dict keys
- feat(api): fix ETag handling and JSON serialization in template endpoint
- feat(api): add tag filtering to nodes and templates endpoints
- Update project schema and fix tests
- Add 'created_by' field to track project creator
- Fix updating packet filters
- Add vendor, model and netmiko_device_type fields to templates
- fix: handle RuntimeError in notification_manager emit()
- fix: busybox static link detection on Alpine/musl
- Fix bug when updating compute password to be empty
- Cancel tasks if controller cannot be started
- Enable parallel compression with zstandard. Fixes #2324
- Add Dynamips to Dockerfile dependencies
- Take populated disks into consideration when calculating PCI device ID
- Fix telnet keepalive options on macOS
Version 2.2.58.1
GUI
- Fix callback issues in found in v2.2.58
Server
- Sync appliances
Version 2.2.58
GUI
- Update snapshot date & time format
- Fix bug when HTTP DELETE requests are silently dropped. Fixes #3810
- Show if a linked base VM or not in device's properties
- Add HTTP method to response timeout slot. Ref #3810
- Add default link style section in preferences
- Update the default style colors based on the interface style
- Support bring to front for vnc and spice consoles on Linux. Fixes #3783
- Update appliance schemas
- Fix bug when adding multiple nodes at the same time. Fixes #3807
- Fix QWebSocket error signal. Fixes #3804
Server
- Bundle web-ui v2.2.58
- Sync appliances
- Snapshot refactoring