Skip to content

desktop: latest-linux.yml 2.0.18 lists the AppImage sha512 for the rpm entry (checksum mismatch) #51929

Closed

Description

@steevej-2077

Summary

The latest-linux.yml published for desktop 2.0.18 carries the AppImage's sha512 in its rpm entry, so every RPM checksum verification fails — manual verification and the in-app auto-update alike (electron-updater validates sha512 before installing). Affects both x86_64 and arm64.

Environment

  • opencode version: CLI v2.0.18; Desktop opencode-2.0.15-1.x86_64 (2.0.18 offered as update)
  • OS: Fedora Linux 44, kernel 7.2.7-200.fc44.x86_64, x86_64
  • Terminal: TERM=xterm-256color
  • Shell: /bin/bash
  • Install/channel: release channel, RPM from the opencode.ai CDN; updater is provider: generic, url: https://opencode.ai/update/api/latest/desktop/opencode/, channel: latest
  • Active plugins: /home/steeve/ponytail-v2

Reproduction

  1. curl -sSL https://opencode.ai/update/api/latest/desktop/opencode/latest-linux.yml
  2. curl -sSL https://opencode.ai/files/bin/2.0.18/opencode-desktop-linux-x86_64.rpm -o rpm
  3. sha512sum rpm
  4. Compare with the sha512: value of the opencode-desktop-linux-x86_64.rpm entry in the yml.

Expected Behavior

Each files[] entry's sha512 matches the artifact it points to, so manual verification and the RPM auto-update both succeed.

Actual Behavior

The rpm entry's sha512 is byte-identical to the AppImage entry's sha512 — the RPM's own hash is published nowhere.

latest-linux.yml — version: 2.0.18, releaseDate: 2026-09-25T23:30:42.704Z (x86_64):

entry published sha512 (base64) actual sha512 of downloaded file verdict
…-x86_64.AppImage TRG+6PxwN5JvGOsydL6l4epmChjanWeZftElEoE8WAlFnCApXtaZPv+oxMLHir9f2sbgAfThsnbYf3tc20iE9Q== TRG+6PxwN5JvGOsydL6l4epmChjanWeZftElEoE8WAlFnCApXtaZPv+oxMLHir9f2sbgAfThsnbYf3tc20iE9Q== ok
…-linux-amd64.deb xkJIsvMNAz2EaxllLd+QiAQVzRisQo4F0HbcHfqicEvLx6b/na8Jh9zX0OT6wRyOJnFE8XR0kj9/dG4xGBmAew== xkJIsvMNAz2EaxllLd+QiAQVzRisQo4F0HbcHfqicEvLx6b/na8Jh9zX0OT6wRyOJnFE8XR0kj9/dG4xGBmAew== ok
…-x86_64.rpm TRG+6PxwN5JvGOsydL6l4epmChjanWeZftElEoE8WAlFnCApXtaZPv+oxMLHir9f2sbgAfThsnbYf3tc20iE9Q== ygBXgdlPAd3TMtBhRtsQw70VCGq0f11vd7X9oShwvj4PU/3UWxsLAkkq2A/x/5m2Fi+n5qJPmUhUBBAgYXyFKQ== mismatch

Actual RPM sha512 (2.0.18, x86_64, 166613049 bytes — matches the published size, and rpm -qp reports opencode 2.0.18-1):

hex    : ca005781d94f01ddd332d06146db10c3bd15086ab47f5d6f77b5fda12870be3e0f53fdd45b1b0b02492ad80ff1ff99b6162fa7e6a24f994854041020617c8529
base64 : ygBXgdlPAd3TMtBhRtsQw70VCGq0f11vd7X9oShwvj4PU/3UWxsLAkkq2A/x/5m2Fi+n5qJPmUhUBBAgYXyFKQ==

The arm64 feed has the same defect: in latest-linux-arm64.yml (2.0.18), the opencode-desktop-linux-aarch64.rpm sha512 equals the arm64 AppImage's sha512 (L9feZG1C…).

Additional Context

  • Published size values are correct for all three artifacts; only the RPM sha512 is wrong, i.e. the hash was copied from the AppImage entry while the size was computed per file.
  • The 1.x line is healthy, so this looks like a regression in the 2.x publish path:
    • releases/download/v1.18.33/latest-linux.yml → rpm sha512 y5AkwOeo… matches the actual opencode-desktop-linux-x86_64.rpm (106 478 045 bytes).
    • Same check passes for 1.18.32 (sha512 bQyJxts…, size 106 460 189) against a locally cached updater artifact.
  • packages/desktop/scripts/finalize-latest-yml.ts only re-serializes electron-builder's own latest-linux.yml, so the bad value is either produced by electron-builder (targets are ["AppImage", "deb", "rpm"] in packages/desktop/electron-builder.config.ts) or introduced between build and upload.
  • There is no GitHub release for tag v2.0.18 (GET /releases/tags/v2.0.18 → 404); the 2.0.x feed only exists on the CDN, which makes the bad value harder to catch.
  • No SHA512SUMS / *.sha512 sidecars are published (404 on /files/bin/2.0.18/SHA512SUMS and friends) and the RPM is unsigned (Signature: (none)), so users currently have no independent way to verify an RPM download.
  • Suggested fix: recompute each files[] sha512 from the artifact before uploading the feed and fail the release on any mismatch; ideally also publish SHA512SUMS alongside /files/bin/<version>/.

Workaround

Users can install manually once the file is fetched over HTTPS and its size matches the feed, but there is currently no published value to verify it against — the values above are measured locally and should be re-checked by the release pipeline.

Activity

  1. steevej-2077 commented on Oct 9, 2026

    @steevej-2077
    Author

    Verified: fixed since 2.0.24, confirmed live on 2.0.26.

    Root cause / fix: #53309 — parse() in packages/desktop/scripts/publish.ts assigned every sha512: line to the last file seen, so electron-builder's legacy top-level path:/sha512: fields (which repeat the first file) overwrote the last entry of each manifest (the rpm on Linux, the dmg on macOS).

    Since which version:

    • Fix merged 2026-10-05 08:35 UTC (938baed).
    • packages/desktop/scripts/publish.ts contains the fix from tag v2.0.24 (2026-10-06) onward; v2.0.23 (2026-10-05 05:24 UTC) predates the merge and is the last broken release — consistent with the bad 2.0.23 manifests cited in the PR.

    Live verification against latest-linux.yml / latest-linux-arm64.yml (version: 2.0.26, releaseDate 2026-10-08), hashes measured from the downloaded artifacts:

    entry feed sha512 (base64) measured size
    opencode-desktop-linux-x86_64.rpm adejch5D8JzT7ovePIMj+qcuzwE89X8bnF25yJ8OO8Flu/z3pRnRnCd3M5gSbaASls/AdUotjfoUOzrF3wvC/Q== identical 193 866 305 ✓
    opencode-desktop-linux-aarch64.rpm xZ78DXL53k8FnCOodSB8t4ASaHPt04WWGGd7f5GpQEjx/iisSTQpRpP8HV1V7EUKgOyNv8QDJg+fmZ9Lu5+fig== identical 186 292 861 ✓

    The AppImage and deb entries still carry their own distinct hashes, and latest-mac.yml now lists distinct zip/dmg hashes as well — the legacy-field overwrite is gone everywhere.

    Still open from the original report (optional, not a blocker): no SHA512SUMS sidecars and the RPM remains unsigned, so there is still no independent way to verify a download. Happy to keep that as a separate follow-up issue.

    Closing as fixed in 2.0.24+, verified on 2.0.26.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions