Implement comprehensive settings modal with:
- Theme switching (light/dark/auto) with system preference detection
- Language selection for 17 languages with native name sorting
- Developer mode with detailed logging and log viewer
- About section with app info and external links
- Update notification improvements with reduced log spam
Technical improvements:
- Added ThemeContext with persistent state management
- Implemented memory-safe log file reading (5MB limit)
- Fixed all ESLint, TypeScript, and Clippy warnings
- Added JSDoc documentation for public APIs
- Updated README.md and DEVELOPMENT.md with new features
Board detection:
- Parse Armbian filename pattern (Armbian_VERSION_BOARD_DISTRO_...) to extract board name
- Match extracted board name against database to show board image instead of generic icon
- Auto-load board data if not cached with race condition protection
- Fallback to generic icon for non-Armbian images
Decompression improvements:
- Decompress custom images to app cache directory (custom-decompress/)
- Use timestamp-based unique filenames to avoid conflicts
- Cleanup decompressed files after successful flash
Performance:
- Optimize lock scope to release mutex early after extracting boards
- Use compare-and-swap pattern to prevent race conditions
Adds automated translation file synchronization with AI-powered
translations using LibreTranslate API.
Features:
- Auto-detects missing translation keys from en.json source
- Translates new keys using LibreTranslate (free/public API)
- Preserves i18next placeholders like {{count}} and {{boardName}}
- Batch processing with rate limiting
- Falls back to TODO: prefix on translation failures
- GitHub Action runs daily and creates PRs automatically
- Supports custom LibreTranslate instances and API keys
* Add Swedish localization file sv.json
* Add Swedish language support
* Add Swedish to supported languages in README
* Translate Swedish locale strings to Swedish
* Add missing items, translated with AI
---------
Co-authored-by: Niklas Engvall <niklas@engvall.it>
Add a toggle button to show/hide system devices in the device selection modal. This prevents users from accidentally selecting system drives while still allowing advanced users to access them when needed.
Changes:
- Add showSystemDevices state toggle in DeviceModal
- Filter devices based on toggle state (default: hide system devices)
- Redesign warning banner with toggle badge button
- Add Shield icon and translations for all 15 languages
- Update CSS with new banner layout and toggle button styles
- Replace liblzma C bindings with native Rust lzma-rust2 library
- Use XzReaderMt for parallel decompression across all platforms
- Remove dependency on system xz command
- Use get_recommended_threads() to utilize half of CPU cores
- Clean up unused find_binary and get_binary_search_paths functions
- Update module documentation to reflect native Rust approach
This change provides consistent multi-threaded decompression performance
across macOS, Linux, and Windows without requiring external tools.
Replace PowerShell with Win32 APIs (CreateFileW, DeviceIoControl) for reliable
device enumeration on all Windows editions.
Key improvements:
- Add IOCTL_DISK_GET_DRIVE_GEOMETRY_EX for disk size and geometry
- Add IOCTL_STORAGE_QUERY_PROPERTY for bus type and model detection
- Add drive letter mapping via GetLogicalDrives() and volume extents
- Fix system disk detection (check for C: drive instead of assuming disk 0)
- Add smart stop: halt enumeration after 4 consecutive non-existent drives
- Refactor: extract helpers, reduce code by 26% (475→349 lines)
Error handling:
- Suppress expected errors (1,2,5,21) to eliminate log spam
- Only log unexpected device failures
Fixes device enumeration failures on Windows editions without PowerShell.
Add omitBodyDuringUpdate and omitNameDuringUpdate to all upload jobs
to prevent overwriting auto-generated release notes with PR references.
- Remove generateReleaseNotes: false from upload jobs (not needed)
- Add omitBodyDuringUpdate: true to preserve release notes
- Add omitNameDuringUpdate: true to preserve release names
- Finalize job keeps omitBodyDuringUpdate but omits omitNameDuringUpdate
to ensure release title is set correctly when publishing
This ensures 'What's Changed' section with PR references remains
visible when releases are created from tags.
- Introduced `ListItemSkeleton` and `BoardCardSkeleton` components for loading states in lists and cards.
- Enhanced `DeviceModal`, `ImageModal`, and `ManufacturerModal` to utilize skeleton loading during data fetching.
- Improved modal exit animations for a smoother user experience.
- Updated styles for skeleton loading and modal animations.
- Removed loading text from translations across multiple languages.
- Added a comprehensive table of contents for easier navigation.
- Expanded prerequisites section with specific version requirements and platform-specific dependencies.
- Introduced a detailed step-by-step setup process, including automated installation scripts.
- Added a dedicated development workflow section with available commands and daily usage patterns.
- Clarified build instructions and outputs for distribution.
- Enhanced overall formatting and organization.
Add paths-ignore filter to pr-check workflow to skip running lint, type check, and build jobs when only documentation, images, or configuration files are modified.