Menu

#22 ci: prove an Intel macOS build, and fix the false claim in #19

closed
nobody
None
2026-08-05
2026-08-05
Anonymous
No

Originally created by: AbhishekBarali

Closes the factual error reported in [#19], and proves an Intel macOS build in CI.

The wrong claim

The README said GitHub had retired its Intel build machines, so there was "no way
to produce and test" an Intel build. That was false. GitHub retired macos-13 on
2025-12-04 but replaced it with macos-15-intel, available until August 2027
(actions/runner-images#13045). The same mistaken premise had spread into three
workflow files. All corrected, credited to @hellosimplerick.

Two real obstacles, both handled

Metal is off on Intel. ggml's Metal backend targets Apple Silicon, and
upstream whisper.cpp/llama.cpp carry open reports of it producing corrupted output
on Intel Macs with AMD GPUs. The macOS dependency table applied to both
architectures, so Intel was silently inheriting Metal. It is now split by arch and
Intel builds CPU only. Verified per target with cargo tree:

target transcribe-cpp transcribe-rs
aarch64-apple-darwin metal whisper-cpp, whisper-metal, onnx
x86_64-apple-darwin none, CPU only whisper-cpp, onnx
x86_64-pc-windows-msvc dynamic-backends, vulkan unchanged
x86_64-unknown-linux-gnu dynamic-backends, vulkan unchanged

Apple Silicon, Windows and Linux resolve identically to before. Note that
cargo metadata cannot verify this, as it reports the union across all platforms;
only cargo tree --target is per-target.

ONNX Runtime is bundled. pykeio's ort dropped prebuilt
x86_64-apple-darwin binaries, so there is no static ORT to embed there. It also
cannot simply be dropped: ort backs vad-rs (Silero VAD, used by every
recording) as well as transcribe-rs (Parakeet). A Homebrew dylib's install name
is an absolute Cellar path, so linking straight against it produces an app that
only starts on a machine with that formula installed.

CI copies the dylib into src-tauri/onnx-libs/, rewrites its install name to
@rpath before linking, and bundle.macOS.frameworks ships it in
Contents/Frameworks. build.rs emits the matching
@executable_path/../Frameworks rpath. Rewriting pre-link avoids post-bundle
surgery on the .app, which would leave the generated .dmg stale.

Verified

Test Build 30976522069
produced SpeakoFlow_1.1.0_x64.dmg and passed all four audit gates:

file      -> Mach-O 64-bit executable x86_64
otool -L  -> @rpath/libonnxruntime.dylib (1.28.0), no Homebrew path
LC_RPATH  -> @executable_path/../Frameworks
smoke     -> transcribe.cpp compute devices: 1

The smoke test is the meaningful one: it ran on a native Intel runner, and dyld
resolves every linked dylib before main(), so the bundled ONNX Runtime genuinely
loaded from inside the app.

Scope: test-build only

Intel is added to test-build.yml and not to either release matrix. It stays
out until a tester confirms it runs on real Intel hardware, since no maintainer
has an Intel Mac.

There is also a hard constraint worth recording: Homebrew now publishes an Intel
onnxruntime bottle only for Sonoma, and the bundled dylib reports minos 14.0,
while the app binary itself is minos 10.15. So this build requires macOS 14 or
newer
, which excludes Intel Macs that cannot reach Sonoma. Lowering that floor
means building ONNX Runtime from source with a lower deployment target. The audit
step prints both minimums and the available bottle tags on every run, so the
constraint is visible rather than assumed.

macos-15-intel itself retires in August 2027.

AI assistance

Investigated and implemented with an AI coding assistant. The runner facts were
verified against GitHub's changelog and actions/runner-images#13045 rather than
taken from the issue, and the Metal and ort constraints were confirmed against
upstream release notes and issues.

Related

Tickets: #19

Discussion

  • Anonymous

    Anonymous - 2026-08-05

    Originally posted by: coderabbitai[bot]

    [!WARNING]

    Review limit reached

    @AbhishekBarali, you've reached your PR review limit, so we couldn't start this review.

    Next review available in: 38 minutes

    You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.


    How can I continue?

    After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

    To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.


    How do review limits work?

    CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

    For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

    Please refer docs for additional details.


    Review details


    ⚙️ Run configuration

    Configuration used: defaults

    Review profile: CHILL

    Plan: Pro Plus

    Run ID: 6723b5dd-87f3-4d58-bbcc-50646b0ca461


    📥 Commits

    Reviewing files that changed from the base of the PR and between [0a72cc] and b99c5bceaf1ef797df821124fce47edcaea468aa.


    📒 Files selected for processing (9)

    • .github/workflows/build.yml
    • .github/workflows/release-unsigned.yml
    • .github/workflows/release.yml
    • .github/workflows/test-build.yml
    • BUILD.md
    • README.md
    • src-tauri/.gitignore
    • src-tauri/Cargo.toml
    • src-tauri/build.rs

    Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

    ❤️ Share - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

    Comment @coderabbitai help to get the list of available commands.

     

    Related

    Commit: [0a72cc]

  • Anonymous

    Anonymous - 2026-08-05

    Ticket changed by: AbhishekBarali

    • status: open --> closed
     

Log in to post a comment.