Skip to content

Declare Intel macOS unsupported for the local backend (#889) + Windows portable-install docs (#766 follow-up) - #891

Merged
debpalash merged 1 commit into
mainfrom
fix/889-intel-mac-policy
Jul 2, 2026
Merged

Declare Intel macOS unsupported for the local backend (#889) + Windows portable-install docs (#766 follow-up)#891
debpalash merged 1 commit into
mainfrom
fix/889-intel-mac-policy

Conversation

@debpalash

@debpalash debpalash commented Jul 2, 2026

Copy link
Copy Markdown
Owner

What

Two documentation + policy fixes:

#889 — Intel-Mac first launch broken (P0): declare the platform unsupported

torch 2.8.0 (pinned in uv.lock) has no macOS x86_64 wheels — PyTorch dropped Intel-Mac after 2.2.x, and transformers 5.x needs torch ≥2.6, so a platform-marker downgrade is infeasible. Per the platform-parity hard rule, the only honest option left is declaring Intel macOS unsupported for the local backend. This PR implements that declaration:

  • Bootstrap pre-check (frontend/src-tauri/src/bootstrap.rs): on target_os = macos + target_arch = x86_64, ensure_venv_ready now fails fast before creating a venv or attempting any uv sync (first-run and repair paths) with a clear, actionable message — "Intel Macs can't run the local AI backend — PyTorch no longer ships Intel-Mac (macOS x86_64) builds…" plus the remote-backend escape hatch (Settings → Sharing → Remote backend) and a docs link — instead of a raw uv resolver error after minutes of downloads. A healthy already-synced venv (pre-torch-bump install) is deliberately not blocked. Unit test pins the message's load-bearing phrases.
  • Splash UX (BootstrapSplash.jsx + all 21 locales): the failure routes to a dedicated localized hint (bootstrap.hint_intel_mac) and suppresses the Retry/Clean-&-Retry-oriented hints, which can never help here.
  • README.md: every Intel-Mac support claim (quickstart downloads note, System Requirements, Roadmap "Desktop" row, FAQ) now states plainly: the UI installs, but the Python backend cannot run because PyTorch dropped Intel-Mac wheels.
  • docs/install/macos.md: prominent [!IMPORTANT] note at the top for Intel users — no false hope, including the from-source path (it fails the same resolution); DMG table row + "Apple Silicon vs Intel" section updated to match. docs/install/troubleshooting.md §9 gets a one-line reality update.
  • release.yml: the macos-15-intel build leg is kept — a comment now flags that the artifact is effectively UI-only under [P0] Intel-Mac first launch is broken: uv.lock pins torch 2.8.0, which has no macOS x86_64 wheels #889 and that keeping vs. dropping it is an owner call.

#766 follow-up — "Portable install (Windows)" docs section

docs/install/windows.md gains the section promised when closing #766: why Portable is greyed out after a default Program Files install, how to enable it (custom folder in the MSI wizard or msiexec /i … INSTALLDIR="D:\Apps\OmniVoice"), and exactly what lives next to the exe (OmniVoiceStudio-Data\ with config.json, env\, data\models\).

Gates

  • cargo check -q — clean (only pre-existing setup.rs unreachable-expression warning, untouched by this diff); new intel_mac_message_keeps_its_contract_phrases test passes
  • uv run pytest tests/ -q -k "readme or features or docs or inventory" — 63 passed, 1 skipped
  • tests/test_no_hardcoded_cjk.py — passes (new CJK strings live only in frontend/src/i18n/locales/)
  • Frontend: vitest run 675/675 passed; oxlint 0 errors; oxfmt clean
  • CHANGELOG.md untouched per instructions

Closes #889. Follow-up to #766.

🤖 Generated with Claude Code

Summary

  • Declared Intel macOS (x86_64) unsupported for the local backend and fail fast during bootstrap with an explicit message and remote-backend/docs guidance.
  • Updated the bootstrap splash hint logic to surface a dedicated Intel-Mac message instead of retry-oriented hints.
  • Expanded docs for macOS, Windows portable install, README, and troubleshooting to reflect the new support policy.
  • Added the Intel-Mac hint to all localized bootstrap strings.

Behavior

flowchart TD
  A[App starts bootstrap] --> B{macOS Intel x86_64?}
  B -- No --> C[Continue normal venv/uv sync flow]
  B -- Yes --> D[Set bootstrap stage = Failed]
  D --> E[Show Intel-Mac unsupported message]
  E --> F[Suggest remote backend / docs]
Loading

UI sketch

Before:
[Bootstrap splash]
- generic retry/help hints
- mixed troubleshooting suggestions

After:
[Bootstrap splash]
- Intel-Mac specific unsupported hint
- no retry guidance for this case
- docs + remote backend guidance

…irst-run gate + docs (#889); Windows portable-install docs (#766 follow-up)

torch >=2.3 ships no macOS x86_64 wheels (transformers 5.x needs torch >=2.6),
so `uv sync` can never resolve on an Intel Mac — per the platform-parity rule
the honest option is declaring the platform unsupported, not letting first
launch die in a raw resolver error:

- bootstrap.rs: pre-check on macOS x86_64 before any venv create / uv sync
  (first-run AND repair paths) fails fast with an actionable message
  (remote-backend escape hatch + docs link); healthy pre-torch-bump venvs are
  deliberately untouched. Unit test pins the message's load-bearing phrases.
- BootstrapSplash: routes the failure to a dedicated localized hint
  (bootstrap.hint_intel_mac, all 21 locales) and suppresses the useless
  Retry-oriented hints for it.
- README + docs/install/macos.md (+ troubleshooting #9): every Intel-Mac
  support claim now says UI-installs-but-backend-cannot-run, including the
  from-source path (also broken); remote backend documented as the only use.
- release.yml: #889 note on the macos-15-intel leg — artifact is UI-only;
  keep-or-drop is an owner call, deliberately not changed here.
- docs/install/windows.md: new "Portable install (Windows)" section promised
  in #766 — custom MSI wizard folder / msiexec INSTALLDIR=..., what lives in
  OmniVoiceStudio-Data next to the exe, and the Program-Files-greyed-out why.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 872d3ae7-8f4d-40ee-9e1c-70412272ad04

📥 Commits

Reviewing files that changed from the base of the PR and between d58010f and 19f7743.

📒 Files selected for processing (28)
  • .github/workflows/release.yml
  • README.md
  • docs/install/macos.md
  • docs/install/troubleshooting.md
  • docs/install/windows.md
  • frontend/src-tauri/src/bootstrap.rs
  • frontend/src/components/BootstrapSplash.jsx
  • frontend/src/i18n/locales/ar.json
  • frontend/src/i18n/locales/de.json
  • frontend/src/i18n/locales/en.json
  • frontend/src/i18n/locales/es.json
  • frontend/src/i18n/locales/fr.json
  • frontend/src/i18n/locales/hi.json
  • frontend/src/i18n/locales/id.json
  • frontend/src/i18n/locales/it.json
  • frontend/src/i18n/locales/ja.json
  • frontend/src/i18n/locales/ko.json
  • frontend/src/i18n/locales/nl.json
  • frontend/src/i18n/locales/pl.json
  • frontend/src/i18n/locales/pt.json
  • frontend/src/i18n/locales/ru.json
  • frontend/src/i18n/locales/sv.json
  • frontend/src/i18n/locales/th.json
  • frontend/src/i18n/locales/tr.json
  • frontend/src/i18n/locales/uk.json
  • frontend/src/i18n/locales/vi.json
  • frontend/src/i18n/locales/zh-CN.json
  • frontend/src/i18n/locales/zh-TW.json

📝 Walkthrough

Walkthrough

This PR marks macOS Intel (x86_64) as unsupported for the local Python backend across docs, release workflow comments, and app behavior. Rust bootstrap code fails fast with an Intel-specific error before venv/uv operations; the frontend detects this message and surfaces a localized hint (bootstrap.hint_intel_mac) added to all locale files. Separately, Windows docs gain a new "Portable install" section.

Changes

Intel Mac local backend unsupported

Layer / File(s) Summary
Bootstrap fail-fast gate
frontend/src-tauri/src/bootstrap.rs
Adds INTEL_MAC_UNSUPPORTED_MSG and intel_mac_backend_unsupported(), gates repair and first-run venv paths to fail with BootstrapStage::Failed on Intel Macs, and adds a contract-phrase unit test.
Frontend hint detection and localization
frontend/src/components/BootstrapSplash.jsx, frontend/src/i18n/locales/*.json
detectHints matches the Intel failure message and returns bootstrap.hint_intel_mac; the translation key is added across all 24 locale files.
Documentation updates
README.md, docs/install/macos.md, docs/install/troubleshooting.md, .github/workflows/release.yml
Quickstart, System Requirements, FAQ, roadmap, macOS install guide, and troubleshooting doc are updated to state Intel is unsupported for the local backend; release workflow comments clarify the Intel matrix leg is UI-only.

Windows portable install documentation

Layer / File(s) Summary
Portable install section
docs/install/windows.md
Adds a new section explaining portable data storage, enablement conditions, MSI/msiexec setup, folder layout, and comparison to installed mode.

Estimated code review effort: 2 (Simple) | ~15 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5 | ❌ 4

❌ Failed checks (4 warnings)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title describes the PR, but it is not conventional-commit style with a scope prefix as required. Rewrite it as fix(<scope>): ... (or similar) and keep the issue reference in the title or body.
Description check ⚠️ Warning The body covers the main changes and testing, but it does not follow the required template sections like Summary, Changes, Type, Testing, and Checklist. Reformat the PR body to the repo template with Summary, Changes, Type, Testing, Checklist, and Release cadence sections, then move the current content into them.
Cross-Platform Default Parity ⚠️ Warning FAIL: macOS Intel x86_64 now fails fast in ensure_venv_ready before venv/uv sync, while Windows/Linux keep the normal bootstrap path; that’s a platform-divergent default. Either gate the Intel-Mac behavior behind an explicit opt-in/flag, or make the first-run bootstrap path identical across macOS, Windows, and Linux.
I18n Completeness (21 Locales) ⚠️ Warning hint_intel_mac exists in all 21 locale files, but bootstrap.rs hardcodes a user-facing Intel-Mac error and sends it straight to the UI, bypassing i18n. Replace the literal bootstrap message with an error code/locale key and render the localized bootstrap.hint_intel_mac in the frontend.
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Local-First Guarantee ✅ Passed bootstrap.rs:506-524 and BootstrapSplash.jsx:102-105 only add a local Intel-Mac fail-fast/hint; no fetch/axios/telemetry code appeared in touched runtime files.
Backward Compatibility ✅ Passed PASS: bootstrap.rs returns a healthy existing venv before the Intel gate, and only first-run/repair rebuilds are blocked; tests/test_db_schema_reconcile.py proves additive-only schema reconcile...
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/889-intel-mac-policy

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed. For unrecoverable errors, disable the tool in CodeRabbit configuration.


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

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

@greptile-apps

greptile-apps Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR formally declares Intel macOS unsupported for the local backend by adding a fast-fail pre-check in ensure_venv_ready (first-run and repair paths), wires a dedicated localized hint in all 21 locales, and updates every user-facing Intel-Mac claim in README, macOS install doc, and troubleshooting. A second, independent change adds the promised "Portable install (Windows)" documentation section explaining why Portable is greyed out after a default Program Files install and how to enable it.

  • bootstrap.rs: intel_mac_backend_unsupported() uses cfg!() (not #[cfg]) so the guard and INTEL_MAC_UNSUPPORTED_MSG are compiled and testable on every platform. A contract test pins the three phrases that BootstrapSplash.jsx's regex routing and docs depend on. spawn_backend calls ensure_venv_ready, so the Retry button also hits the fast-fail path (fails in milliseconds, same message).
  • BootstrapSplash.jsx: detectHints returns ['bootstrap.hint_intel_mac'] via an early return, suppressing all retry-oriented hints — but the Retry and Clean & Retry buttons remain rendered unconditionally, contradicting the hint text. The early return is also placed after all other hint accumulations run, creating a silent discard pattern that could surprise future maintainers.
  • Docs + CI: README, macos.md, troubleshooting.md, and the release.yml comment are all updated consistently; the Intel build leg is kept with an explicit owner-call note.

Confidence Score: 4/5

Safe to merge — no runtime regressions introduced; the fast-fail pre-check is correct on both first-run and retry paths.

The Rust logic and i18n coverage are solid. The two rough edges are both in BootstrapSplash.jsx: the Retry/Clean-&-Retry buttons stay visible even though the hint text explicitly says retrying cannot help, and the Intel Mac early-return is positioned after all other hint accumulations, leaving a maintenance trap for future hint additions. Neither breaks anything today, but the button/hint contradiction directly contradicts the stated UX goal of this PR.

frontend/src/components/BootstrapSplash.jsx — ordering of the Intel Mac check in detectHints and the unconditional rendering of the action buttons in the failure section.

Important Files Changed

Filename Overview
frontend/src-tauri/src/bootstrap.rs Adds intel_mac_backend_unsupported() guard at two points in ensure_venv_ready: first-run (before venv creation) and repair path (before repair sync). Uses cfg!() so the check is compiled and testable everywhere. Contract test pins the three load-bearing phrases the JSX routing depends on. Logic is sound — spawn_backend calls ensure_venv_ready, so Retry also hits the fast-fail path.
frontend/src/components/BootstrapSplash.jsx Intel Mac hint detection is placed at the end of detectHints, after up to eight other hint checks accumulate results that are then silently discarded by the early return. Retry and Clean & Retry buttons remain visible even when the only hint says "retrying won't change that", contradicting the stated UX intent.
frontend/src/i18n/locales/en.json Adds hint_intel_mac key with accurate English text matching the Rust message's action items. Lead phrase matches the regex in BootstrapSplash.jsx.
docs/install/macos.md Old "from source works" claim for Intel removed and replaced with [!IMPORTANT] callout; DMG table row and Apple Silicon vs Intel section updated consistently. No false hope left in the doc.
docs/install/windows.md New "Portable install" section explains the grayed-out option, gives two ways to install to a writable path, and shows the resulting directory layout. Closes the #766 gap cleanly.
.github/workflows/release.yml Comment-only change; the macos-15-intel build leg is kept with an owner-call note. No CI logic altered.
README.md Four locations updated: download badge sub-line, System Requirements table, Roadmap Desktop row, and Apple Silicon FAQ. All consistently state the UI installs but the local backend cannot run on Intel.
docs/install/troubleshooting.md §9 "mlx-whisper not loading" updated to clarify it only applies to Apple Silicon — the Intel path is now obsolete. One-liner reality check added.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[App launch / Retry] --> B[spawn_backend]
    B --> C[ensure_venv_ready]
    C --> D{intel_mac_backend_unsupported?}
    D -- "yes (first-run path)" --> E[fail: INTEL_MAC_UNSUPPORTED_MSG]
    D -- no --> F{venv exists & healthy?}
    F -- yes --> G[return venv_py, backend_dir]
    F -- "no / broken" --> H{intel_mac_backend_unsupported?}
    H -- yes --> E
    H -- no --> I[repair uv sync]
    I --> G
    E --> J[BootstrapStage::Failed]
    G --> K[spawn uvicorn]
    K --> L[BootstrapStage::Ready]
    J --> M[detectHints in JSX]
    M --> N{message contains Intel phrase?}
    N -- yes --> O[return hint_intel_mac ONLY]
    N -- no --> P[accumulate other hints]
    O --> Q[Show hint: retrying won't change that]
    P --> R[Show Retry / Clean & Retry buttons]
    Q --> R
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[App launch / Retry] --> B[spawn_backend]
    B --> C[ensure_venv_ready]
    C --> D{intel_mac_backend_unsupported?}
    D -- "yes (first-run path)" --> E[fail: INTEL_MAC_UNSUPPORTED_MSG]
    D -- no --> F{venv exists & healthy?}
    F -- yes --> G[return venv_py, backend_dir]
    F -- "no / broken" --> H{intel_mac_backend_unsupported?}
    H -- yes --> E
    H -- no --> I[repair uv sync]
    I --> G
    E --> J[BootstrapStage::Failed]
    G --> K[spawn uvicorn]
    K --> L[BootstrapStage::Ready]
    J --> M[detectHints in JSX]
    M --> N{message contains Intel phrase?}
    N -- yes --> O[return hint_intel_mac ONLY]
    N -- no --> P[accumulate other hints]
    O --> Q[Show hint: retrying won't change that]
    P --> R[Show Retry / Clean & Retry buttons]
    Q --> R
Loading

Comments Outside Diff (2)

  1. frontend/src/components/BootstrapSplash.jsx, line 512-526 (link)

    P2 Retry/Clean-&-Retry buttons shown despite hint saying "retrying won't change that"

    The failure section renders the Retry and Clean & Retry buttons unconditionally for every failure kind. When the only hint is bootstrap.hint_intel_mac, every locale string explicitly tells the user "retrying won't change that," yet both action buttons remain visible below. A user who reads the hint and then sees the buttons will try them anyway. While each retry does fail fast (a few milliseconds, because spawn_backendensure_venv_ready → Intel Mac check → immediate fail), the contradiction erodes trust and causes repeated confirmation dialogs from Clean & Retry.

    The intent expressed in the comment — "retrying can never help — show only this" — applies to the buttons too. The detectHints result is already available in the render scope; drive button visibility from it.

    Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

    Fix in Claude Code

  2. frontend/src/components/BootstrapSplash.jsx, line 82-109 (link)

    P2 Intel Mac early-return fires after all other regex accumulations run

    The detectHints function pushes up to eight hints into the hints array before reaching the Intel Mac check at line 104. Because the early return discards whatever was accumulated, those evaluations are wasted when the Intel Mac phrase is present. More importantly, this is a maintenance trap: a future hint check whose regex accidentally matches a substring of INTEL_MAC_UNSUPPORTED_MSG (e.g., a new pattern containing "can't" or "install") would push its hint to hints, only to have it silently discarded by the early return — making the new check appear to work everywhere except on an Intel Mac failure, which is hard to spot in a non-Intel-Mac dev environment.

    Moving the Intel Mac block to the very top of detectHints (before any hints.push) would make the exclusivity explicit and avoid the accumulate-then-discard hazard.

    Fix in Claude Code

Fix All in Claude Code

Reviews (1): Last reviewed commit: "fix(platform): declare Intel-Mac local b..." | Re-trigger Greptile

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[P0] Intel-Mac first launch is broken: uv.lock pins torch 2.8.0, which has no macOS x86_64 wheels

1 participant