Releases: Laerdal-Medical/simserver-imager
Release v1.0.9
Release Notes
What's New in v1.0.9
New Features
- GitHub Releases as Top-Level Source: GitHub Releases is now a dedicated source type alongside CDN and GitHub CI, making it easier to find and flash release images
Improvements
- Branch Filter ComboBox Usability: The branch filter dropdown in CI source selection is now much easier to use — typing no longer jumps the cursor, Enter selects the highlighted branch and advances to the next step, and focusing the field selects all text for quick re-editing
- Device Detection: Centralized device name detection with improved CANCPU and LinkBox filtering for more accurate hardware matching
Bug Fixes
- Stale OS List Items: Fixed Release items persisting in the CI Artifact view (and vice versa) when switching source types or branches — the model now properly clears when there are no matching results
Release v1.0.8
Release Notes
What's New in v1.0.8
Improvements
- SPU Copy Speed Display: The SPU copy step now shows transfer speed (MB/s), bytes transferred, and estimated time remaining during copy operations, matching the write step UI
- SPU Copy Status Messages: Show accurate "Flushing to USB drive..." status when data is being synced after copy completes, instead of showing the stale preparation message
- SPU Copy Progress Percentage: The SPU copy step now shows copy progress percentage in the status text
Bug Fixes
- Device Change Invalidates Artifact Cache: Changing the target device now correctly clears cached artifact state so that the CI artifact selection step re-filters files for the new device
- Write Progress Bar Over 100%: Fixed progress bar exceeding 100% when writing compressed images (e.g., .wic.xz) from release assets by passing unknown extract size and adding a runtime safety fallback to indeterminate mode
- TypeError on Cached OS Restoration: Fixed "Could not convert argument 0 from undefined to QUrl" warning when navigating back to OS selection by using the complete model entry directly instead of the delegate proxy
- Duplicate Signal Handling in CI Artifact Step: Fixed artifact download signals being processed multiple times by zombie step instances during StackView transitions
Release v1.0.7
Release Notes
What's New in 1.0.7
Features
- GitHub Release Grouping: GitHub release assets are now grouped by release tag instead of showing each file as a separate entry. Selecting a release opens the file selection step where users can pick from available assets (factory images, system updates, etc.) filtered by the selected device platform
- Release Filter Option: Added "Releases" filter option in the GitHub source dropdown to show only releases without CI artifacts. The previous "All branches" option renamed to "Default branch" for clarity
- Loading Indicator: Added a loading spinner overlay when fetching GitHub images to prevent showing stale data while the list updates
Improvements
- Device Selection Workflow: "Erase" and "Use custom" options moved from OS selection to device/hardware selection step for a more intuitive workflow. "Use custom" now supports SPU files in addition to WIC/VSI images, allowing local firmware updates to be selected directly from device selection
Bug Fixes
- Fix ADD Button: Fixed the ADD button in the GitHub repository dialog remaining disabled after adding a repository
- Local File Bottleneck Detection: Fix bottleneck status incorrectly showing "network" when extracting from local files. Local file extraction now correctly identifies "disk read" as the upstream bottleneck when throughput is limited
Release v1.0.6
Release Notes
What's New in v1.0.6
Features
- Direct Artifact Streaming: Single-file CI artifacts (.wic, .wic.xz, .spu) are detected by filename and stream directly to USB, bypassing the CI artifact selection step. WIC images use a new two-stage ZIP extraction pipeline (DownloadArchiveExtractThread) that decompresses on-the-fly. SPU artifacts download the ZIP to cache and extract the entry to FAT32
- SPU URL Streaming: SPU downloads from CDN or GitHub releases now stream directly to the FAT32 mount point while simultaneously caching to disk, eliminating the intermediate temp file
- Write Progress Display: Real-time speed (MB/s) and estimated time remaining shown during write operations. Completion screen now displays write statistics including total bytes written, duration, and average speed
- Download Speed Display: Real-time download speed (Mbps) and estimated time remaining shown during download and verify operations with proper network/disk I/O units
- CI Artifact Selection Step: Unified wizard step for downloading CI artifacts and selecting files from ZIP archives, replacing modal dialogs with integrated wizard flow. All GitHub CI artifacts are routed through the artifact selection step for inspection. Direct CDN artifact files (.wic, .spu, .vsi) skip this step and advance directly to storage selection
- Progress Bar Styling: All progress bars (download, write, verify) now use consistent Laerdal brand colors - blue for writing/downloading operations and green for verification, with custom styling replacing Material Design defaults. Created reusable ImProgressBar component with rounded borders (8px radius), glassy effect (2px semi-transparent border), and indeterminate animation support
- ScrollBar Styling: All scrollbars now use consistent Laerdal brand styling with rounded corners (fully rounded pill shape), Laerdal blue color, and smooth hover/press state transitions. Created reusable ImScrollBar component that replaces default Qt ScrollBar styling across all list views and scrollable areas
- Multi-Partition Detection: Added API to detect drives with multiple partitions for improved SPU copy warnings
Improvements
- Write Pipeline Memory Reduction: Reduced write buffer size from 8MB to 1MB and right-sized ring buffers to match the actual io_uring queue depth. Previously, ring buffer over-allocation (4GB+) caused memory pressure that blocked the UI thread via page faults. Now uses ~40MB total, eliminating UI stuttering during writes
- Smooth Progress Bar: Added width animation to progress bar fill, creating smooth visual transitions between completion events instead of discrete jumps
- Utils Singleton: Consolidated utility functions (formatBytes, formatDuration, calculateThroughputMbps, etc.) into a centralized Utils.qml module, eliminating code duplication across wizard steps
- QML Lint Compliance: Fixed unqualified property access across wizard components using
pragma ComponentBehavior: Bound - Write Progress Status Consolidation: Bottleneck status is now shown inline with speed and ETA instead of as a separate line below. Time remaining and throughput are displayed during both write and verify phases, and speed is only shown when a valid ETA is available. Bottleneck detection now distinguishes between storage, network, and decompression bottlenecks, only warning when throughput drops below 15 MB/s
- OS Selection Navigation: OS list model is no longer unnecessarily reloaded and re-sorted when navigating back to the OS selection step. The C++ model persists across QML component recreation, so data is only loaded once per session, improving performance and eliminating redundant sorting
- CI Build Deduplication: Prevent duplicate CI builds when a tag and branch push arrive for the same commit by using a SHA-based concurrency group. Tag builds take priority over branch builds
- Button and Component Theming: Replace hardcoded
Qt.rgba()disabled colors with dedicated Style properties (buttonDisabledBackgroundColor,button2DisabledBackgroundColor,popupDisabledBorderColor, etc.) for consistent Laerdal branding. Remove legacyraspberryRedalias and update all component focus/hover colors to uselaerdalBlue
Bug Fixes
- Compressed Download Bottleneck Detection: Fix bottleneck detection during compressed file downloads to correctly distinguish between network and decompression bottlenecks by monitoring the ring buffer fill level. When the buffer is less than 25% full, the network is identified as the bottleneck; otherwise decompression is the limiting factor
- Write Progress for Unknown Extract Size: Fix write progress no longer showing misleading percentages when the uncompressed size is unknown. Previously it would fall back to using the compressed download size as the total, resulting in incorrect progress. Now the progress bar stays in indeterminate mode when the extract size is unavailable
- SPU Copy Ejecting Status: Fix progress bar showing "Safely ejecting..." status during SPU copy completion phase. Previously the status changed too quickly to be visible
- Wizard Back Navigation: Fix back button navigation now uses a history stack to return to the correct previous step. Previously it simply decremented the step index, which could skip steps when the wizard flow had conditional steps (e.g., CI Artifact Selection)
- Write Progress Bytes Display: Show bytes written and total (e.g., "1.5 GB / 4.2 GB") in the write progress status line alongside speed and ETA
- Uncompressed WIC Progress: Fix write progress showing incorrect total for uncompressed .wic files from CDN where JSON metadata has wrong extract_size. Now uses actual Content-Length from curl when no compression filter is detected
- Compressed Image Validation: Fix "not a valid disk image" error and >100% write progress for .wic.xz files from GitHub releases where extract_size reflects the compressed size. The 512-byte alignment check is now skipped for compressed source files, and write progress shows indeterminate state when the decompressed size is unknown
- Private Repo Downloads: Fix 404 errors when downloading release assets from private GitHub repositories by using the API asset endpoint with proper authentication headers
- SPU Release Discovery: Include SPU files in GitHub release search filters so firmware updates are discovered alongside WIC and VSI images
- ImBadge Style Fix: Fix runtime ReferenceError warnings by using Style singleton directly instead of qualified RpiImager.Style access
- Artifact File Type Detection: Fix SPU and VSI files in CI artifacts being incorrectly identified as WIC, causing them to be written as disk images instead of using their correct write modes
- Artifact Download Freeze: Fix CI artifact downloads hanging indefinitely by using proper API timeout on the initial redirect request and enabling cancellation during the redirect phase
- CI Artifact Step Navigation: Fix CIArtifactSelectionStep not appearing in sidebar navigation, storage selection being skipped after file selection, OS selection state being lost when navigating to/from artifact selection, back button state preservation across navigation, wrong cached files being shown when selecting a different CI artifact, cached selections not being cleared when changing download source, cache not being restored when navigating back from storage selection, multiple items showing different highlight colors by synchronizing ListView currentIndex with selected file index, Back button skipping OSSelectionStep by removing duplicate signal handler in WizardContainer, improve download cancellation UX by enabling Back button during download instead of changing Next button to Cancel, and fix non-CI artifacts (Erase, Use custom, direct WIC/VSI/SPU files) incorrectly routing to artifact selection step instead of directly to storage selection
- Write Complete Screen Alignment: Align "Write statistics:" section with "Your choices:" section by using consistent heading font size (Style.fontSizeHeading), proper spacing, and fixed-width label columns (120px) to ensure data values align vertically across both sections for improved visual consistency on the completion screen
- OS List Source Switch: Fix system image list not updating when switching between CDN and GitHub artifact sources. The OS list model now detects source type changes and reloads accordingly
- Write Another Freeze: Fix application freeze when writing the same artifact image a second time via "Write Another". The archive streaming variables were cleared after the first write, causing the second write to fall through to DownloadExtractThread which deadlocked trying to resolve the internal
archive://URL scheme as a network host - Close During Download Crash: Fix segfault when closing the application during a CI artifact download. Network reply signals are now disconnected before abort in the GitHubClient destructor, and a quit confirmation dialog is shown when a download is in progress (matching the existing behavior for write operations)
Release v1.0.5
Release Notes
What's New in v1.0.5
Features
- Download Resume: Support for resuming interrupted downloads on startup with user confirmation dialog
- Branch Filter Persistence: Save and restore last selected branch filter across app restarts
- Branch Filter Search: Branch filter dropdown now supports type-ahead search for quickly finding branches in large repositories. Combobox now selects matching branch while typing and is fully editable
- CLI SPU Support: Full command-line support for SPU file copy operations with proper mount handling
- SelectionListDelegate: New reusable QML delegate component providing consistent styling for list items with icon, title, description, badges, and metadata across all wizard selection screens
- Deferred Artifact Download: CI artifacts are now downloaded only when user double-clicks or presses Next, reducing unnecessary downloads when browsing the artifact list
- Install Authorization Button: Added button to permission warning dialog for easier authorization flow
- File Extension Registration: WIC, VSI, and SPU files are now registered with the OS on all platforms (Windows, macOS, Linux). Double-click image files to open them directly in the imager
Improvements
- Device Readiness Polling: Replaced fixed sleep delays with intelligent device readiness polling across all platforms (Linux, Windows, macOS). Operations complete faster when devices are ready and wait longer when devices need more time
- Drive List Refresh: Improved drive list refresh and UI updates
- Touch Scrolling: Improved touch screen scrolling behavior across all list views and scrollable areas with smoother deceleration and better tap vs scroll gesture detection
- SPU Copy Flow: Improved SPU file copy workflow with auto-advance to done step, dedicated completion message, and display of SPU file and drive information during copy
- Dialog Components: Refactored dialog components with new BaseDialog header system for consistent styling and reusable dialog patterns
- GitHub Artifact Handling: Improved artifact handling and branch filtering
- Linux io_uring Optimization: Limit async I/O queue depth to 4 when using O_DIRECT to prevent massive latency buildup on USB devices. Reduces end-of-write drain time from ~175 seconds to ~2 seconds
- Write Progress Logging: Added periodic progress logging showing MB written, speed in MB/s, and pending writes for better diagnostics
Bug Fixes
- Windows Upgrade Fix: Preserve user cache and settings during Windows installer upgrades
- macOS Build Fix: Resolve deprecation warnings and use thin LTO for faster builds. Fixed QRegularExpression usage in mount helper
- Windows FAT32 Fix: Support formatting drives larger than 32GB as FAT32 using DiskFormatter with format.com to bypass Windows' artificial limit
- Storage Removed Dialog: Show storage removed dialog when device is removed during write operations with improved styling
- SPU Device Removal: Set write state during SPU copy to prevent spurious device removal dialog
- Mount Helper Fix: Check if device is already mounted before trying to get exclusive access, avoiding timeout when device is already in use
- Large Artifact ID Fix: Support GitHub artifact IDs larger than 2^31 by using JavaScript's safe integer range (2^53)
v1.0.4
Laerdal SimServer Imager v1.0.4
-
Full support for .spu firmware update files
-
Files are copied to mounted device rather than flashed as disk image
-
Platform-specific mount/unmount helpers (Linux, macOS, Windows)
-
FAT32 formatting support when needed
-
SPU wizard steps for folder selection and copy progress
-
Support for Laerdal's VSI disk image format
-
Zlib-compressed sparse format optimized for factory imaging
-
MD5 verification during write
-
New ImBadge component for visual file type identification
-
Color-coded badges: SPU (indigo), WIC (emerald), VSI (cyan)
-
Displayed in OS selection list and artifact file picker
-
GitHub CI option disabled when not authenticated
-
GitHub CI option disabled when no repositories configured
-
Clear messaging for each disabled state
-
New comprehensive user guide (doc/userguide.md)
-
Updated schema documentation with Laerdal extensions
-
Enhanced README with image types and tooling sections
-
Device filtering and sorting for OS images
-
Release dates display in user's local timezone and format
-
Updated GitHub OAuth client ID
-
Fixed URL opening in GitHub login dialog
-
Fixed FIFO permission issue with pkexec (suspend inhibitor)
-
Fixed "No device selected" display when launching with image argument
-
Fixed macOS build: QRegularExpression usage in mount_helper
v1.0.3
Laerdal SimServer Imager v1.0.3
- Source Selection: Fixed source type radio selection to properly show CDN or GitHub CI images
- Status Display: Shows filtered image count: "X images available, Y for this device"
- Lazy Loading: CI images are only fetched when clicking Next after selecting GitHub source
- Date Sorting: GitHub CI images are now sorted by date (newest first)
- API Timeout: Added 30 second timeout for GitHub API calls to prevent hangs
v1.0.2
Laerdal SimServer Imager v1.0.2
- Direct ZIP Streaming: Stream WIC files directly from artifact ZIPs to disk without intermediate extraction, saving disk space and improving performance
- Branch Filtering Fix: Cached CI artifacts now correctly appear only under their respective branches instead of all branches
- Compression Support: Handle both compressed (.wic.gz, .wic.xz, .wic.zst, .wic.bz2) and uncompressed (.wic) entries via libarchive streaming
v1.0.1
Laerdal SimServer Imager v1.0.1
-
Artifact Inspection: CI build artifacts are now inspected to detect multiple installable images, allowing users to select which WIC file to flash
-
WIC File Extraction: Direct extraction of WIC files from cached artifact ZIPs with progress indication
-
Startup Image URL: Support for passing image URL via command line argument for automated workflows
-
Download Progress Dialog: New progress dialog with cancel support for artifact downloads
-
Artifact Caching: Downloaded CI artifacts are cached locally with validation and cache management in settings
-
Cache Management: Added cache size display and clear cache option in Application Options
-
Cancel Support: Users can cancel artifact downloads with proper cleanup of partial files
-
Cache Validation: Cached artifacts are validated on reuse to prevent corrupt file issues
v1.0.0
Laerdal SimServer Imager v1.0.0
First release of Laerdal SimServer Imager, forked from Raspberry Pi Imager.
Changes Since Upstream
Laerdal-Specific Features
- Factory Images: Support for Laerdal SimServer factory images from CDN
- Branding: Updated application name, icons, and styling to Laerdal brand
- Configuration: Laerdal CDN repository integration with proper URLs
GitHub Integration
- GitHub Releases: Automatic fetching of images from GitHub releases
- OAuth Authentication: GitHub device flow authentication for private repositories
- Release Metadata: Parse GitHub release assets and display version information
- CI Pipeline: Build and release artifacts automatically from GitHub Actions
Download & Caching
- Disk Cache: Local caching of downloaded images with SHA256 verification
- Resume Support: Resume interrupted downloads
- Progress Tracking: Download progress with speed and ETA display
User Interface Improvements
- Wizard Flow: Multi-step wizard for image selection and configuration
- File Dialog: Improved file browser with folder tree navigation
- Drive Selection: Enhanced drive picker with device details
- Customization: Pre-write configuration options
Technical Improvements
- Qt 6.8+: Updated to latest Qt framework
- CMake Build: Modern CMake configuration with proper dependency handling
- Cross-Platform: Builds for Linux (x86_64, aarch64), Windows, and macOS
- Telemetry: Optional usage telemetry with privacy controls
Packaging
- AppImage: Portable Linux packages
- Debian: .deb packages for Debian/Ubuntu
- Windows: Inno Setup installer and ZIP archive
- macOS: DMG disk images