-
Notifications
You must be signed in to change notification settings - Fork 537
feat: add Intel macOS (x86_64) support #1933
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- Add build-macos-intel job to desktop_cd.yaml for x86_64-apple-darwin builds - Update publish job to include Intel macOS DMG in GitHub releases - Add get_target_arch command to misc plugin for platform detection - Update STT select UI to filter AM models on Intel Macs (only show Whisper models) - Add download buttons for each platform in changelog page - Create apple-intel.tsx download redirect page - Enable Intel macOS download option on download page Co-Authored-By: yujonglee <yujonglee.dev@gmail.com>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
✅ Deploy Preview for hyprnote-storybook ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
✅ Deploy Preview for hyprnote ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
📝 WalkthroughWalkthroughThis PR implements multi-architecture macOS support by adding a matrix-based CI/CD workflow for aarch64 and x86_64 builds with per-architecture artifact naming, architecture-aware model selection in the desktop app using OS detection, and platform-specific download routes and UI components for macOS variants. Changes
Sequence DiagramsequenceDiagram
participant Desktop App
participant OS Plugin
participant Model Service
Desktop App->>OS Plugin: arch()
OS Plugin-->>Desktop App: "aarch64" or other
Desktop App->>Desktop App: Derive isAppleSilicon
alt isAppleSilicon == true
Desktop App->>Model Service: Load [cloud, QuantizedTinyEn, QuantizedSmallEn, am-parakeet-v2, am-parakeet-v3]
else
Desktop App->>Model Service: Load [cloud, QuantizedTinyEn, QuantizedSmallEn]
end
Model Service-->>Desktop App: Models array
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes
Possibly related PRs
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (1)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
🔇 Additional comments (12)
Comment |
|
The latest updates on your projects. Learn more about Argos notifications ↗︎
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
apps/web/src/routes/_view/download/index.tsx (1)
153-159: FAQ may need updating for Intel Mac.The FAQ states "macOS Intel and Windows are planned for January 2026", but Intel Mac is now available. Consider updating this answer to reflect current availability.
{ question: "Which platforms are currently supported?", answer: - "macOS 14.2+ with Apple Silicon is currently available. macOS Intel and Windows are planned for January 2026, Linux for February 2026, and iOS/Android for April 2026. Please note that these dates are subject to change and may be delayed.", + "macOS 14.2+ with Apple Silicon and Intel are currently available. Windows is planned for January 2026, Linux for February 2026, and iOS/Android for April 2026. Please note that these dates are subject to change and may be delayed.", },
🧹 Nitpick comments (2)
.github/workflows/desktop_cd.yaml (1)
166-253: Intel build intentionally excludes local STT binaries.The Intel build omits the argmax SDK setup and STT sidecar binary download that are present in the Silicon build. This is consistent with the web UI stating "Intel Mac available with cloud-based transcription" — Intel users will use cloud STT only.
However, this should be documented to prevent future confusion:
Consider adding a comment clarifying this intentional difference:
build-macos-intel: needs: [compute-version, cn-draft] if: ${{ !cancelled() && (needs.cn-draft.result == 'success' || needs.cn-draft.result == 'skipped') }} + # Note: Intel build excludes local STT models - uses cloud transcription only permissions: contents: write runs-on: macos-13apps/desktop/src/components/settings/ai/stt/select.tsx (1)
231-238: Consider skipping parakeet queries on Intel.The code queries
isDownloadedforam-parakeet-v2andam-parakeet-v3(lines 233-234) even on Intel where they'll never be used. This is a minor inefficiency.You could conditionally skip these queries:
- const [p2, p3, tinyEn, smallEn] = useQueries({ - queries: [ - sttModelQueries.isDownloaded("am-parakeet-v2"), - sttModelQueries.isDownloaded("am-parakeet-v3"), - sttModelQueries.isDownloaded("QuantizedTinyEn"), - sttModelQueries.isDownloaded("QuantizedSmallEn"), - ], - }); + const [p2, p3, tinyEn, smallEn] = useQueries({ + queries: [ + { ...sttModelQueries.isDownloaded("am-parakeet-v2"), enabled: isAppleSilicon }, + { ...sttModelQueries.isDownloaded("am-parakeet-v3"), enabled: isAppleSilicon }, + sttModelQueries.isDownloaded("QuantizedTinyEn"), + sttModelQueries.isDownloaded("QuantizedSmallEn"), + ], + });Note: This requires
targetArchquery to resolve first. Current approach is simpler and the overhead is negligible, so this is optional.Also applies to: 247-258
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
plugins/misc/js/bindings.gen.tsis excluded by!**/*.gen.ts
📒 Files selected for processing (7)
.github/workflows/desktop_cd.yaml(6 hunks)apps/desktop/src/components/settings/ai/stt/select.tsx(3 hunks)apps/web/src/routes/_view/changelog/$slug.tsx(1 hunks)apps/web/src/routes/_view/download/apple-intel.tsx(1 hunks)apps/web/src/routes/_view/download/index.tsx(2 hunks)plugins/misc/src/commands.rs(1 hunks)plugins/misc/src/lib.rs(1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Avoid creating a bunch of types/interfaces if they are not shared. Especially for function props, just inline them instead.
Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.
If there are many classNames with conditional logic, usecn(import from@hypr/utils). It is similar toclsx. Always pass an array and split by logical grouping.
Usemotion/reactinstead offramer-motion.
Files:
apps/web/src/routes/_view/download/index.tsxapps/web/src/routes/_view/download/apple-intel.tsxapps/desktop/src/components/settings/ai/stt/select.tsxapps/web/src/routes/_view/changelog/$slug.tsx
🧠 Learnings (2)
📚 Learning: 2025-11-24T16:32:23.055Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:23.055Z
Learning: Applies to **/*.{ts,tsx} : Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.
Applied to files:
apps/desktop/src/components/settings/ai/stt/select.tsx
📚 Learning: 2025-11-24T16:32:19.706Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:19.706Z
Learning: Applies to **/*.{ts,tsx} : Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) for 99% of cases instead of setError and similar patterns.
Applied to files:
apps/desktop/src/components/settings/ai/stt/select.tsx
🧬 Code graph analysis (2)
apps/web/src/routes/_view/changelog/$slug.tsx (1)
apps/storybook/stories/Button.stories.tsx (1)
Icon(72-77)
plugins/misc/src/lib.rs (1)
plugins/misc/src/commands.rs (1)
get_target_arch(18-20)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
- GitHub Check: Redirect rules - hyprnote
- GitHub Check: Header rules - hyprnote
- GitHub Check: Pages changed - hyprnote
- GitHub Check: fmt
- GitHub Check: ci (macos, macos-14)
🔇 Additional comments (8)
plugins/misc/src/commands.rs (1)
16-20: LGTM!Clean implementation using
std::env::consts::ARCHfor compile-time architecture detection. This correctly returns the target architecture the binary was compiled for, which is the appropriate choice for determining which STT models to offer.apps/web/src/routes/_view/changelog/$slug.tsx (1)
127-155: LGTM!Clean component that constructs versioned download URLs for each platform. The URL patterns (
hyprnote-macos-aarch64.dmg,hyprnote-macos-x86_64.dmg,hyprnote-linux-x86_64.AppImage) correctly align with the artifact names in the CI workflow.plugins/misc/src/lib.rs (1)
13-17: LGTM!The command is correctly registered without the
::<tauri::Wry>type parameter sinceget_target_archdoesn't require aRuntimegeneric (it doesn't useAppHandle). This is consistent with its implementation incommands.rs.apps/web/src/routes/_view/download/index.tsx (2)
29-33: LGTM!The updated banner clearly communicates the feature difference between Apple Silicon (on-device STT) and Intel Mac (cloud-based transcription).
58-63: Intel Mac download is now available.The card correctly links to
/download/apple-intelwhich will redirect to the external download URL.apps/desktop/src/components/settings/ai/stt/select.tsx (2)
223-229: LGTM!Good use of
useQuerywithstaleTime: Infinityfor architecture detection — the value won't change during the app's lifetime. TheisAppleSiliconderivation correctly identifies Apple Silicon viaaarch64.
247-265: Model list construction is correct.The logic correctly builds the base model list (cloud, QuantizedTinyEn, QuantizedSmallEn) and only adds the parakeet models when on Apple Silicon. This ensures Intel users only see cloud and quantized options.
apps/web/src/routes/_view/download/apple-intel.tsx (1)
1-9: Consistency confirmed between Apple Intel and Apple Silicon routes.Both
apple-intel.tsxandapple-silicon.tsxfollow the identical redirect pattern with thechannel=nightlyparameter hardcoded consistently. The only difference is the architecture identifier (dmg-x86_64vsdmg-aarch64), which is intentional. No inconsistency exists.
…main) Co-Authored-By: yujonglee <yujonglee.dev@gmail.com>
Co-Authored-By: yujonglee <yujonglee.dev@gmail.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (2)
apps/desktop/src/components/settings/ai/stt/select.tsx (2)
2-4: Arch detection query looks good; please confirm the'aarch64'contract and consider normalizing itThe
useQuerywiring andstaleTime: Infinityare appropriate for a static CPU architecture, and importingmiscCommandshere makes sense. The only fragile bit is the hard-coded comparison against"aarch64":const isAppleSilicon = targetArch.data === "aarch64";If
miscCommands.getTargetArch()ever returns"arm64"or a full triple (e.g."aarch64-apple-darwin"), Apple Silicon will be treated as non‑AppleSilicon and AM models will never show up.It would be safer to either normalize the value in the misc plugin (e.g. return a small enum/union like
"apple-silicon" | "intel") or broaden the predicate here to accept all known Apple Silicon identifiers.Also applies to: 223-229
231-238: Hyprnote model mapping matches the arch requirements; optionally gate AM download queries onisAppleSiliconThe new
hyprnotemodels list correctly:
- Always includes cloud + Whisper (
QuantizedTinyEn,QuantizedSmallEn).- Only appends
am-parakeet-v2/v3on Apple Silicon viaisAppleSilicon.- Uses
billing.isProto enable/disable the cloud option and download flags for the rest.This achieves the Intel‑only Whisper set without exposing AM models on x86_64.
One small improvement: AM download checks still run on Intel even though the results are never used. You can avoid unnecessary work by gating those two queries:
- const [p2, p3, tinyEn, smallEn] = useQueries({ - queries: [ - sttModelQueries.isDownloaded("am-parakeet-v2"), - sttModelQueries.isDownloaded("am-parakeet-v3"), - sttModelQueries.isDownloaded("QuantizedTinyEn"), - sttModelQueries.isDownloaded("QuantizedSmallEn"), - ], - }); + const [p2, p3, tinyEn, smallEn] = useQueries({ + queries: [ + { + ...sttModelQueries.isDownloaded("am-parakeet-v2"), + enabled: isAppleSilicon, + }, + { + ...sttModelQueries.isDownloaded("am-parakeet-v3"), + enabled: isAppleSilicon, + }, + sttModelQueries.isDownloaded("QuantizedTinyEn"), + sttModelQueries.isDownloaded("QuantizedSmallEn"), + ], + });Behavior stays the same, but AM queries won’t touch disk/FS on Intel.
Also applies to: 247-258, 264-264
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
apps/desktop/src/components/main/sidebar/search/index.tsx(0 hunks)apps/desktop/src/components/settings/ai/stt/select.tsx(3 hunks)
💤 Files with no reviewable changes (1)
- apps/desktop/src/components/main/sidebar/search/index.tsx
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Avoid creating a bunch of types/interfaces if they are not shared. Especially for function props, just inline them instead.
Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.
If there are many classNames with conditional logic, usecn(import from@hypr/utils). It is similar toclsx. Always pass an array and split by logical grouping.
Usemotion/reactinstead offramer-motion.
Files:
apps/desktop/src/components/settings/ai/stt/select.tsx
🧠 Learnings (2)
📚 Learning: 2025-11-24T16:32:23.055Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:23.055Z
Learning: Applies to **/*.{ts,tsx} : Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.
Applied to files:
apps/desktop/src/components/settings/ai/stt/select.tsx
📚 Learning: 2025-11-24T16:32:19.706Z
Learnt from: CR
Repo: fastrepl/hyprnote PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T16:32:19.706Z
Learning: Applies to **/*.{ts,tsx} : Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) for 99% of cases instead of setError and similar patterns.
Applied to files:
apps/desktop/src/components/settings/ai/stt/select.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
- GitHub Check: Redirect rules - hyprnote-storybook
- GitHub Check: Redirect rules - hyprnote
- GitHub Check: Header rules - hyprnote-storybook
- GitHub Check: Header rules - hyprnote
- GitHub Check: Pages changed - hyprnote-storybook
- GitHub Check: Pages changed - hyprnote
- GitHub Check: ci (linux, depot-ubuntu-24.04-8)
- GitHub Check: ci (macos, depot-macos-14)
- GitHub Check: ci (linux, depot-ubuntu-22.04-8)
- GitHub Check: ci (macos, macos-14)
- GitHub Check: fmt
Co-Authored-By: yujonglee <yujonglee.dev@gmail.com>
|
Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it. |
- Replace custom get_target_arch command with @tauri-apps/plugin-os arch() - Remove get_target_arch from misc plugin commands - Add @tauri-apps/plugin-os JavaScript package dependency Co-Authored-By: yujonglee <yujonglee.dev@gmail.com>
- Combine build-macos-silicon and build-macos-intel into single build-macos job with matrix - Use conditional steps for AM-specific setup (argmax SDK, sidecar download) - Update publish job to reference unified build-macos job - Regenerate misc plugin bindings (removed getTargetArch) Co-Authored-By: yujonglee <yujonglee.dev@gmail.com>
Summary
Adds Intel macOS (x86_64-apple-darwin) support to the desktop application. Key changes:
CI/CD Pipeline: Added
build-macos-inteljob that builds for x86_64 onmacos-14runner. The Intel build excludes Argmax SDK and AM STT sidecar (only available on Apple Silicon). Updated publish job to dynamically include Intel DMG in releases.STT UI: Uses
arch()from@tauri-apps/plugin-osto detect CPU architecture at runtime. The STT model selector filters out AM models (am-parakeet-v2, am-parakeet-v3) on Intel Macs, showing only Whisper models (QuantizedTinyEn, QuantizedSmallEn) and cloud transcription.Download Pages: Created
/download/apple-intelredirect page and enabled Intel Mac download option on the main download page.Changelog: Added platform-specific download buttons (Apple Silicon, Intel Mac, Linux) to changelog version pages.
Updates since last revision
get_target_archTauri command witharch()from@tauri-apps/plugin-osget_target_archfrom misc plugin commands@tauri-apps/plugin-osJavaScript package dependencyReview & Testing Checklist for Human
arch()function should return"aarch64"on Apple Silicon and"x86_64"on Intel - confirm STT model filtering works as expected on both architecturesbuild-macos-inteljob completes successfully before mergingdmg-x86_64- confirm this matches CrabNebula's expected format for x86_64 buildsRecommended test plan:
Notes