Skip to content

Arch R Flasher v1.3.2

Latest

Choose a tag to compare

@github-actions github-actions released this 27 May 21:24

Arch R Flasher v1.3.2

Maintenance and reliability release. The headline change is a fix for a deterministic write corruption that affected a subset of users on Linux desktops with active session daemons. The Flasher also gains an integrated link to the in-browser Overlay Generator, audio coverage for every Y3506 Soysauce board, and offline-safe network handling so machines with no internet still work end to end.

Bug fixes

  • Critical: deterministic write corruption on Linux fixed. On hosts where udisks2.service was active when the flash started, the desktop daemon could be re-activated mid-write through D-Bus or polkit, automount the just-written partitions, and replay the ext4 journal. This invalidated every metadata_csum baked into the image and the R36S initramfs e2fsck then refused to mount the rootfs with "Filesystem corruption has been detected!" even though the dd write had been byte-perfect. The Flasher now masks udisks2.service (symlink to /dev/null) before stopping it, then unmasks and restarts it on exit. With the mask in place nothing on the system can resurrect the daemon during the write window. Reported by Discord users on V05 Soysauce hardware.
  • Verify mismatch now fails loudly. Previous builds emitted a VERIFY_WARN log line and continued the flash anyway, marking the run as successful even when the on-SD SHA-256 did not match the source image. The mismatch path now writes VERIFY_FAILED with both hashes and exits non-zero, surfacing in the UI through a dedicated event. Users will no longer see a "done" message on a silently corrupted SD.
  • Verify no longer needs ~5 GB of free /tmp space. The read-back used to dump the entire SD content into a mktemp file before hashing. On Arch-based desktops where /tmp is a 16 GB tmpfs already half-full from the decompressed source image, this would silently truncate at disk-full and produce false mismatch reports. The verify now streams dd | head -c | sha256sum through a pipeline, using only a few MB of memory regardless of image size.
  • Stall detector no longer kills dd during fsync. On SDs with a slow controller, the final conv=fsync after the data write could take 30+ seconds while NAND finished committing the controller's write cache. The previous stall detector saw pos: frozen at IMAGE_SIZE and shot dd with SIGKILL, leaving the last few MB unwritten. The dd loop is now plain synchronous with status=progress, no monitoring thread, no stall detection on the final fsync phase.
  • Hash compute pipeline tolerates SIGPIPE. head -c $IMAGE_SIZE | sha256sum closes the head end of its pipe once it has the bytes it needed, which makes upstream dd exit 141. The verify helper no longer enables pipefail so this benign SIGPIPE does not poison the pipeline result.

What is new

  • Online Overlay Generator button. A new secondary action sits below "Generate from custom DTB..." in both the Flash and Overlay flows. Clicking it opens arch-r.io/overlay-generator/ in the system browser, where users can upload their vendor DTB and get a mipi-panel.dtbo back through Pyodide in the browser. Translated into all five UI languages: English, Português (BR), Español, Русский, 中文.
  • Y3506 V04 2528 added to the Soysauce panel selector. The catalog now lists all 11 Soysauce boards (V03 1104, V03 1210 2507, V03 1210 2533, V03 0317, V04 2528 (new), V04 253x Panel 6, V04 253x Panel 7, V04 2548, V04 2548 Panel 2, V05 2551, V05 2601).
  • archr-dtbo.py synced from the distribution repo. The bundled overlay generator script now extracts joypad wiring (amux pins, per-button GPIOs, ADC tuning), routes Y3506 Soysauce audio through the new rk817-sound-spko-direct card variant so the speaker actually plays, and runs Tier 3 auto-discovery for board-specific vendor properties the whitelist misses. This brings the in-app "Generate from custom DTB" output to feature parity with the v2.0-rc4 image.

Offline-safe behaviour

  • Network timeouts on every external call. The GitHub release auto-check used to inherit the kernel TCP_USER_TIMEOUT (minutes) and could hold the startup banner waiting for an unreachable host. It now uses connect_timeout=3s, total=10s, surfacing as "Offline" in the UI within a few seconds.
  • Tauri updater check is bounded to 8 s at startup (was unbounded). The auto-update prompt either appears quickly or stays silent; it never blocks the rest of the flow.
  • Download path keeps a 5 s connect timeout but no overall timeout, so legitimate slow links can still complete a 1.5 GB image download without a false failure.
  • No CDN dependencies. The frontend bundles its single font locally, all i18n strings, all icons. The only outbound URLs are the GitHub API for the auto-update banner (optional), the GitHub release for the image download (user-initiated), and the manual link to the Overlay Generator. With Wi-Fi off the user can still pick a local .img.gz file and flash it.
  • Network error translation expanded so offline:, reqwest::Error, and tcp reset messages surface as the user-facing Network error string instead of leaking raw Rust errors.

Internal changes

  • Unmount in a four-level fallback chain. Mirrors the rpi-imager pattern: normal umount, then two graceful MNT_EXPIRE attempts, then MNT_DETACH (lazy), then MNT_FORCE as last resort with a warning. Eliminates partial-unmount races on busy desktops.
  • systemd-inhibit wraps the entire flash on Linux so screen lock, idle suspend, and shutdown stay paused while the SD is being written. Falls back to plain pkexec if systemd-inhibit is not present.
  • bs=4M, oflag=dsync, conv=fsync are now fixed defaults for the write dd. The speed-test heuristic that picked smaller block sizes (and produced more frequent sync round-trips than the SD controller could keep up with) is gone.
  • No pre-write wipefs, no first/last MB zero, no urandom speed test. Each of those writes had to be overwritten by the image dd and they kept the controller's write cache busy in ways that produced occasional bit drops on cheaper SDs. The image dd starts from a clean queue now.

Compatibility

  • Linux: .AppImage (no install), .deb (Debian/Ubuntu/derivatives), .rpm (Fedora/openSUSE/derivatives).
  • macOS: .dmg for Intel (x64) and Apple Silicon (aarch64).
  • Windows: .msi (preferred) and .exe setup installer.

The Linux build requires pkexec (part of polkit) and either systemd-inhibit or plain polkit for privilege elevation, both standard on every modern desktop distribution.

Installation

Download the package for your platform from the assets below, install it, and launch "Arch R Flasher" from your application menu. On Linux the AppImage is fully portable: chmod +x it and double-click. The app auto-updates from this same GitHub release stream; you do not need to re-download on the next version unless you skip an update prompt.

Verifying downloads

Every asset is signed; the matching .sig file is included next to each binary. The signing public key is embedded in the app itself so the in-app updater verifies new versions automatically. For manual verification:

minisign -V -P "RWQbQV3lHYjuN44NuI6qaRSLpAGpoqybnpB4KUSU0IGZnBmXNS1rpd7C" \
    -m Arch.R.Flasher_1.3.2_amd64.AppImage \
    -x Arch.R.Flasher_1.3.2_amd64.AppImage.sig

Report issues at https://github.com/archr-linux/archr-flasher/issues