Skip to content

Add global hotkey overlay panel for #2758 - #4026

Closed
austinywang wants to merge 24 commits into
mainfrom
issue-2758-global-hotkey-overlay
Closed

austinywang wants to merge 24 commits into
mainfrom
issue-2758-global-hotkey-overlay

Conversation

@austinywang

@austinywang austinywang commented May 12, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • adds a dedicated nonactivating NSPanel for the system-wide global hotkey
  • configures the panel for all Spaces and full-screen auxiliary display
  • updates settings/docs copy and adds runtime coverage for the panel contract

Closes #2758

Testing

  • git diff --check
  • bun --cwd web --eval '<shortcut locale coverage check>'
  • jq coverage check for all globalHotkey xcstrings locales
  • ./scripts/reload.sh --tag issue-2758-global-hotkey-overlay
  • GitHub Actions CI is the source of truth for tests per repo policy

Demo Video

  • Not recorded in this iteration; dogfood build is linked for local verification.

Checklist

  • Tagged Debug reload build passes
  • User-facing strings are localized
  • Review bot high/medium feedback addressed or replied to
  • Dogfood build will be handed off before merge

Note

Medium Risk
Changes global hotkey behavior and main-window registration/focus routing; mistakes could affect session restore or active-window targeting, though the overlay role is explicitly isolated and covered by new tests.

Overview
The system-wide hotkey no longer toggles all cmux windows; it shows or hides a dedicated hotkey overlay built as a non-activating NSPanel that can appear over full-screen Spaces.

Runtime: New GlobalHotkeyPanelController hosts full ContentView in a floating panel (canJoinAllSpaces, fullScreenAuxiliary, stable id cmux.hotkeyPanel). Hiding the overlay restores the previously active session-restorable main window context. MainWindowContextRole.globalHotkeyPanel excludes the panel from session snapshots, window cycling, and “last window” quit prompts.

Copy & docs: Settings, README, web shortcuts, and Localizable.xcstrings rename the action from “show/hide all windows” to hotkey window / overlay; web shortcut data gains localizedShortcutText with broader locale fallbacks.

Tests: GlobalHotkeyPanelControllerTests cover panel configuration, layout, config load, and focus/close-warning behavior with the new role.

Reviewed by Cursor Bugbot for commit 0738d27. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Adds a system‑wide hotkey overlay that floats above any app, including full‑screen Spaces. Implements #2758 by toggling a non‑activating panel, restoring focus on hide, and updating shortcut text and localization across app and web.

  • New Features

    • Global overlay via GlobalHotkeyPanelController/Configuration; .nonactivatingPanel with .canJoinAllSpaces and .fullScreenAuxiliary, top‑anchored and screen‑aware; ESC hides it.
    • Routes the global hotkey to toggle the overlay; adds MainWindowContextRole.globalHotkeyPanel (non‑restorable) and passes the role through ContentView.
    • Updates Settings and README to “Show/Hide Hotkey Window”; web docs use localizedShortcutText with locale alias fallbacks.
  • Bug Fixes

    • Registers stable window id cmux.hotkeyPanel as an auxiliary window; excluded from session restore, cycling, and close warnings.
    • Hiding the overlay restores the previously active app/window; preserves active context on restorable windows and keeps overlay state isolated while hidden.
    • Localizes the hotkey window title and shortcut metadata; ensures config is ready when the panel opens.

Written for commit 0738d27. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added a global hotkey overlay window (Show/Hide Hotkey Window — ⌃ ⌥ ⌘ .) that appears over full‑screen apps and toggles independently of main-window session restoration.
  • Documentation

    • Updated README, settings UI copy, and web docs; expanded and revised localized strings and labels across many languages to reference the hotkey overlay.
  • Tests

    • Added tests for overlay panel configuration, layout positioning, and role-based session-restorable behavior.

Review Change Stack

@vercel

vercel Bot commented May 12, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jun 6, 2026 2:00pm
cmux-staging Building Building Preview, Comment Jun 6, 2026 2:00pm

@coderabbitai

coderabbitai Bot commented May 12, 2026 •

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds an NSPanel-backed SwiftUI global hotkey overlay summonable from any app (including full-screen), threads a session-aware main-window role through ContentView/AppDelegate to exclude the panel from session restore, and updates localization, web/docs, project wiring, and tests.

Changes

Global Hotkey Panel Feature

Layer / File(s) Summary
Panel configuration, layout, controller, and content state
Sources/App/GlobalHotkeyPanelConfiguration.swift, Sources/App/GlobalHotkeyPanelLayout.swift, Sources/App/GlobalHotkeyPanelController.swift, Sources/App/GlobalHotkeyPanelContentState.swift, Sources/CmuxConfig.swift
Adds panel layout helpers and configuration; GlobalHotkeyPanel NSPanel subclass and GlobalHotkeyPanelController for toggle/show/hide/position; a GlobalHotkeyPanelContentState that wires collaborators and defers config loading; CmuxConfigStore wiring gains flags to avoid unconditional reload during wiring.
AppDelegate session management and global hotkey wiring
Sources/AppDelegate.swift
Adds MainWindowContextRole and stores it on MainWindowContext; registerMainWindow accepts role; session autosave/snapshot/visibility and recoverable-route logic filter by role.isSessionRestorable; global hotkey toggle routed to globalHotkeyPanelController.toggle(); improves mainWindowId lookup and restorable-window helpers.
ContentView environment integration for window context role
Sources/ContentView.swift
Adds EnvironmentKey/EnvironmentValues accessor and View modifier for mainWindowContextRole; ContentView reads role to compute windowIdentifier and passes role into registerMainWindow.
Localization, settings, search, UI text, and README
Resources/Localizable.xcstrings, Sources/KeyboardShortcutSettings.swift, Sources/SettingsNavigation.swift, Sources/SettingsSearchAliases.swift, Sources/cmuxApp.swift, web/data/cmux-shortcuts.ts, web/app/[locale]/*, README.md
Adds globalHotkey.window.title and updates localized copy to reference the "cmux hotkey window" overlay and full-screen behavior; changes shortcut label to "Show/Hide Hotkey Window"; updates settings search entries/aliases and web shortcut localization usage; README updated with the new hotkey row.
Build configuration and panel controller tests
cmux.xcodeproj/project.pbxproj, cmuxTests/GlobalHotkeyPanelControllerTests.swift
Project file registers new source/test files; tests validate panel configuration flags, layout/frame constraints, and that the standard role is session-restorable while the hotkey panel role is not.

Sequence Diagram

sequenceDiagram
  participant AppDelegate
  participant GlobalHotkeyPanelController
  participant GlobalHotkeyPanel
  participant GlobalHotkeyPanelContentState
  AppDelegate->>GlobalHotkeyPanelController: toggle()
  GlobalHotkeyPanelController->>GlobalHotkeyPanel: ensurePanel() / apply configuration
  GlobalHotkeyPanelController->>GlobalHotkeyPanel: show() / makeKeyAndOrderFront
  GlobalHotkeyPanelController->>GlobalHotkeyPanelContentState: scheduleConfigLoadAfterFirstDisplay()
  GlobalHotkeyPanel->>GlobalHotkeyPanelController: cancelOperation -> onCancel -> hide()
  GlobalHotkeyPanelController->>GlobalHotkeyPanel: hide() / orderOut
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • manaflow-ai/cmux#3908: Modifies system-wide hotkey flow and adds a separate globalSearch hotkey; related to global-hotkey plumbing.
  • manaflow-ai/cmux#2389: Earlier changes to show/hide global windows behavior; shares the same showHideAllWindows action wiring.

Suggested reviewers

  • jesstelford

Poem

🐰 A hotkey panel springs to life,
Over full-screen calm and strife,
One key, cmux overlays your space,
Escape to hide — a swift embrace.
Hop, toggle, code — the rabbit grins.


Caution

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

  • Ignore

❌ Failed checks (2 errors, 1 warning)

Check name Status Explanation Resolution
Cmux Swift Concurrency ❌ Error GlobalHotkeyPanelContentState.swift introduces DispatchQueue.main.async in new code; violates concurrency modernization rules requiring Task-based deferred execution instead. Replace DispatchQueue.main.async { cmuxConfigStore?.loadAll() } with Task { await MainActor.run { cmuxConfigStore?.loadAll() } }.
Cmux Architecture Rethink ❌ Error Uses DispatchQueue.main.async to defer loadAll() and adds didScheduleConfigLoad flag to control timing, violating the timing-repair and multiple-owner anti-patterns in the rules. Pass pre-initialized CmuxConfigStore to GlobalHotkeyPanelContentState from AppDelegate, eliminating the need for delayed dispatch and mutable state guards.
Docstring Coverage ⚠️ Warning Docstring coverage is 4.44% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (14 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely identifies the main change: adding a global hotkey overlay panel and references the closed issue #2758.
Linked Issues check ✅ Passed The PR successfully implements all core requirements from #2758: NSPanel with .fullScreenAuxiliary/.canJoinAllSpaces, hotkey toggle, transient non-restorable registration, full locale coverage, and unit tests.
Out of Scope Changes check ✅ Passed All changes are scoped to implementing the global hotkey overlay panel, related localization, and supporting refactors; no unrelated modifications detected.
Cmux Swift Actor Isolation ✅ Passed All new types properly marked @MainActor (UI types/coordinators/helpers) or are value types with safe main-queue access, matching existing codebase standards.
Cmux Swift Blocking Runtime ✅ Passed Five new hotkey panel files contain no Task.sleep, locks, or blocking waits. Only async deferral used, which is allowed per reference doc for AppKit safety deferrals.
Cmux No Hacky Sleeps ✅ Passed No hacky sleep patterns found in PR's non-Swift production code. TypeScript files contain zero sleep/setTimeout/delay instances; Swift changes properly use async dispatch instead of sleeps.
Cmux Swift @Concurrent ✅ Passed New @MainActor-isolated classes properly annotate UI work; deferred config loading uses DispatchQueue.main.async correctly; no @concurrent misuse or missing annotations detected.
Cmux Swift File And Package Boundaries ✅ Passed New files under 400 lines with clear responsibilities; additions to oversized files ~67 lines, below 250-line threshold; no mixed concerns; qualifies as small UI/AppKit glue.
Cmux Swift Logging ✅ Passed All new Swift code complies with swift-logging rules: GlobalHotkeyPanel* files contain only #if DEBUG-guarded cmuxDebugLog, no unguarded print/NSLog, no secrets exposed.
Cmux User-Facing Error Privacy ✅ Passed PR adds global hotkey panel with localized UI strings containing only safe product terminology and no vendor names, credentials, environment variables, or sensitive data exposed to users.
Cmux Full Internationalization ✅ Passed All Swift user-facing text uses String(localized:) with complete xcstrings translations (20 locales). Web shortcut data covers all routing locales with localizedShortcutText consumption utility.
Cmux Swiftui State Layout ✅ Passed No SwiftUI state layout violations found. GlobalHotkeyPanelContentState is plain @MainActor class, not SwiftUI state. Stores passed at ContentView root, not lazy subtrees. No render-time mutations.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed New GlobalHotkeyPanel NSPanel has stable cmux.hotkeyPanel identifier, registered in cmuxAuxiliaryWindowIdentifiers, and properly covered by cmuxWindowShouldOwnCloseShortcut function.
Description check ✅ Passed The pull request description comprehensively addresses all required template sections with clear, substantive content.
✨ 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 issue-2758-global-hotkey-overlay

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 and usage tips.

@greptile-apps

greptile-apps Bot commented May 12, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR replaces the "hide all cmux windows" global hotkey behavior with a dedicated floating overlay panel (GlobalHotkeyPanelController), backed by a non-activating NSPanel that can appear over full-screen apps on all Spaces, with focus-restore on hide and explicit exclusion from session autosave, cycling, and close-quit prompts.

  • GlobalHotkeyPanelController/Configuration/Layout: New @MainActor types create a .nonactivatingPanel sized to the cursor's screen, registered under MainWindowContextRole.globalHotkeyPanel (non-restorable), with cancelOperation as the single Escape path and restoreActiveMainWindowAfterHiding on dismiss.
  • AppDelegate plumbing: toggleApplicationVisibilityFromGlobalHotkey now delegates to a lazy globalHotkeyPanelController; registerMainWindow guards attemptStartupSessionRestoreIfNeeded with isSessionRestorable, preventing the overlay from consuming the one-shot startup-restore flag.
  • Localization and web copy: All new xcstrings keys carry translations for every locale; cmux-shortcuts.ts covers all 20 locales in web/i18n/routing.ts.

Confidence Score: 5/5

Safe to merge — all lifecycle boundaries (session restore, close-quit prompts, window cycling, focus restore) are correctly isolated for the overlay role.

The overlay panel is registered via the ObjectIdentifier-keyed mainWindowContexts dict, so setActiveMainWindow and restoreActiveMainWindowAfterHiding work correctly despite the non-standard identifier. The isSessionRestorable=false role gates out startup session restore, session snapshot, and close-warning paths. Actor isolation is explicit. Escape is handled through a single cancelOperation path. Locale coverage is complete across all 20 locales. Five new unit tests cover the critical contract surfaces.

No files require special attention.

Important Files Changed

Filename Overview
Sources/App/GlobalHotkeyPanelController.swift Core controller: @MainActor-isolated, single cancelOperation Escape path, correct canHide logic, focus-restore on hide via restoreActiveMainWindowAfterHiding.
Sources/AppDelegate.swift Adds globalHotkeyPanelController lazy var and MainWindowContextRole.globalHotkeyPanel (isSessionRestorable=false); correctly guards attemptStartupSessionRestoreIfNeeded behind isSessionRestorable.
Resources/Localizable.xcstrings New globalHotkey.window.title key and updated settings.globalHotkey.* strings include translations for all supported Apple locales.
web/data/cmux-shortcuts.ts showHideAllWindows description and note fields updated with translations for all 20 locales defined in web/i18n/routing.ts.
cmuxTests/GlobalHotkeyPanelControllerTests.swift Five tests covering panel configuration contract, layout bounds, session-restorable role invariant, config-store eager load, and focus-restore behavior.

Sequence Diagram

sequenceDiagram
    participant User
    participant AppDelegate
    participant Controller as GlobalHotkeyPanelController
    participant Panel as GlobalHotkeyPanel
    participant PrevWindow as Previous Standard Window

    User->>AppDelegate: toggleApplicationVisibilityFromGlobalHotkey()
    AppDelegate->>Controller: toggle()

    alt Panel not yet created
        Controller->>Panel: create NSPanel (nonactivating, canJoinAllSpaces, fullScreenAuxiliary)
        Controller->>AppDelegate: registerMainWindow(panel, role: .globalHotkeyPanel)
    end

    alt Panel hidden
        Controller->>Panel: orderFrontRegardless() + makeKey()
        Controller->>AppDelegate: setActiveMainWindow(panel)
    else Panel visible
        Controller->>Panel: orderOut(nil)
        Controller->>AppDelegate: restoreActiveMainWindowAfterHiding(panel)
        AppDelegate->>PrevWindow: activateMainWindowContext(prevVisibleRestorable)
    end

    User->>Panel: Press Escape
    Panel->>Controller: cancelOperation → onCancel() → hide()
Loading

Reviews (13): Last reviewed commit: "fix: normalize project file" | Re-trigger Greptile

Comment thread Sources/App/GlobalHotkeyPanelController.swift Outdated
Comment thread Sources/App/GlobalHotkeyPanelController.swift Outdated
Comment thread Sources/App/GlobalHotkeyPanelController.swift Outdated
@austinywang

Copy link
Copy Markdown
Contributor Author

Addressed Greptile's summary-only startup-restore note in 727e36d: registerMainWindow now only runs startup restore and follow-up registration snapshot saves for session-restorable roles, so the global hotkey panel cannot consume the one-shot startup restore path.

coderabbitai[bot]
coderabbitai Bot previously requested changes May 23, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Resources/Localizable.xcstrings (1)

72652-72734: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Fix missing locales for updated globalHotkey strings in Resources/Localizable.xcstrings (lines ~72652–72734)

The updated keys settings.globalHotkey.enable, settings.globalHotkey.enable.subtitleOn, settings.globalHotkey.note, and settings.globalHotkey.shortcut only include en, ja, and ko localizations, but the catalog already supports additional locales: ar, bs, da, de, es, fr, it, km, nb, pl, pt-BR, ru, th, tr, uk, zh-Hans, zh-Hant. Add proper translations (no placeholder/machine markers) for all missing locales.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Resources/Localizable.xcstrings` around lines 72652 - 72734, The new
localization entries for the keys settings.globalHotkey.enable,
settings.globalHotkey.enable.subtitleOn, settings.globalHotkey.note, and
settings.globalHotkey.shortcut currently only include en/ja/ko; update
Resources/Localizable.xcstrings to add the missing locale blocks for ar, bs, da,
de, es, fr, it, km, nb, pl, pt-BR, ru, th, tr, uk, zh-Hans, and zh-Hant for each
of those four keys, supplying proper translations (no placeholders or
machine-marked values) consistent with existing stringUnit structure so each
localization has state and value fields like the other languages.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cmuxTests/GlobalHotkeyPanelControllerTests.swift`:
- Around line 50-51: The two failing assertions in
GlobalHotkeyPanelControllerTests should use inclusive boundaries: replace
XCTAssertGreaterThan(frame.width, screenFrame.width * 0.85) and
XCTAssertGreaterThan(frame.height, screenFrame.height * 0.75) with
XCTAssertGreaterThanOrEqual so the min-size contract accepts exact 85%/75%
values; update both assertions (the ones referencing frame.width/frame.height
and screenFrame.width/screenFrame.height) to XCTAssertGreaterThanOrEqual with
the same right-hand expressions.

In `@Resources/Localizable.xcstrings`:
- Around line 72600-72622: The new localization key globalHotkey.window.title
only includes en/ja/ko but must include every locale the catalog supports; add
entries for the missing locales (ar, bs, da, de, es, fr, it, km, nb, pl, pt-BR,
ru, th, tr, uk, zh-Hans, zh-Hant) under the same key in
Resources/Localizable.xcstrings, set each stringUnit.state to "translated" (or
appropriate state) and provide the correct localized value for each locale (or
placeholder translation if necessary) so the key has a localization object for
each supported locale.

---

Outside diff comments:
In `@Resources/Localizable.xcstrings`:
- Around line 72652-72734: The new localization entries for the keys
settings.globalHotkey.enable, settings.globalHotkey.enable.subtitleOn,
settings.globalHotkey.note, and settings.globalHotkey.shortcut currently only
include en/ja/ko; update Resources/Localizable.xcstrings to add the missing
locale blocks for ar, bs, da, de, es, fr, it, km, nb, pl, pt-BR, ru, th, tr, uk,
zh-Hans, and zh-Hant for each of those four keys, supplying proper translations
(no placeholders or machine-marked values) consistent with existing stringUnit
structure so each localization has state and value fields like the other
languages.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 8baef861-8885-4b0f-98b8-e3e821a9b3b9

📥 Commits

Reviewing files that changed from the base of the PR and between 5ab642a and 386fd00.

📒 Files selected for processing (12)
  • README.md
  • Resources/Localizable.xcstrings
  • Sources/App/GlobalHotkeyPanelController.swift
  • Sources/AppDelegate.swift
  • Sources/ContentView.swift
  • Sources/KeyboardShortcutSettings.swift
  • Sources/SettingsNavigation.swift
  • Sources/SettingsSearchAliases.swift
  • Sources/cmuxApp.swift
  • cmux.xcodeproj/project.pbxproj
  • cmuxTests/GlobalHotkeyPanelControllerTests.swift
  • web/data/cmux-shortcuts.ts

Comment thread cmuxTests/GlobalHotkeyPanelControllerTests.swift Outdated
Comment thread Resources/Localizable.xcstrings Outdated
@austinywang

Copy link
Copy Markdown
Contributor Author

Addressed the latest Greptile localization note in ea3c98a: globalHotkey.window.title now has entries for all locales currently present in the catalog, including ar, nb, zh-Hans, zh-Hant, and km.

@austinywang

Copy link
Copy Markdown
Contributor Author

Addressed CodeRabbit's outside-diff localization request in 454d53c: the global hotkey section, enable subtitles, note, shortcut label, window title, and related global-hotkey search aliases now cover every locale present in the catalog. Also applied the inclusive layout assertion suggestion from the inline test comment.

@austinywang

Copy link
Copy Markdown
Contributor Author

Follow-up for the full internationalization feedback: commit 13f0b38 adds all 20 web routing locales for the hotkey shortcut description/note in web/data/cmux-shortcuts.ts and updates both docs consumers to prefer locale-specific shortcut text with English fallback. I also rechecked the globalHotkey xcstrings keys against the catalog locales and the tagged reload build passes.

Comment thread web/app/[locale]/keyboard-shortcuts.tsx Outdated
@austinywang

austinywang commented May 23, 2026 •

Copy link
Copy Markdown
Contributor Author

Follow-up for the CodeRabbit Swift file/package boundary failure: commit d23ff6f splits GlobalHotkeyPanelLayout and GlobalHotkeyPanelConfiguration into separate utility files and moves panel-owned SwiftUI state into injected GlobalHotkeyPanelContentState. GlobalHotkeyPanelController no longer creates TabManager, sidebar state, or CmuxConfigStore internally. The tagged reload build passes after the refactor.

coderabbitai[bot]
coderabbitai Bot previously requested changes May 23, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/app/`[locale]/docs/configuration/page.tsx:
- Around line 11-15: Confirm that showHideAllWindows in
web/data/cmux-shortcuts.ts indeed contains description and note entries for all
20 locales (no code change required for that shortcut), then remove the
duplicated localeAliases constant from both page.tsx and keyboard-shortcuts.tsx
and extract it into a single shared module (exporting the const localeAliases:
Record<string,string>), update both files to import localeAliases from that
shared module, and ensure the shared export preserves the same mappings
("nb":"no","zh-Hans":"zh-CN","zh-Hant":"zh-TW") and type so consumers continue
to work.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 58aaacdf-b7b8-454a-b0e2-569aa4a967e6

📥 Commits

Reviewing files that changed from the base of the PR and between 454d53c and 13f0b38.

📒 Files selected for processing (3)
  • web/app/[locale]/docs/configuration/page.tsx
  • web/app/[locale]/keyboard-shortcuts.tsx
  • web/data/cmux-shortcuts.ts

Comment thread web/app/[locale]/docs/configuration/page.tsx Outdated
@austinywang

Copy link
Copy Markdown
Contributor Author

Follow-up for the CodeRabbit concurrent/main-thread config-load failure: commit 86d0182 removes the synchronous CmuxConfigStore.loadAll() call from hotkey panel state construction. The panel now orders front synchronously, attaches directory tracking without the initial reload, and schedules config loading for the next main-queue turn after first display. Tagged reload passes after the change.

Comment thread Sources/App/GlobalHotkeyPanelController.swift Outdated
Comment thread Resources/Localizable.xcstrings Outdated
@austinywang
austinywang dismissed stale reviews from coderabbitai[bot] and coderabbitai[bot] May 24, 2026 03:20

Stale automated review: locale alias duplication was addressed by centralizing localizedShortcutText in web/data/cmux-shortcuts.ts, and the current CodeRabbit check is passing.

Comment thread Sources/App/GlobalHotkeyPanelController.swift
Comment thread Sources/App/GlobalHotkeyPanelController.swift
Comment thread Sources/CmuxConfig.swift Outdated
Comment thread Sources/AppDelegate.swift
Comment thread Sources/AppDelegate.swift
@rainstuff

Copy link
Copy Markdown

What's holding this PR?

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 383a62f. Configure here.

Comment thread Sources/AppDelegate.swift
@austinywang

Copy link
Copy Markdown
Contributor Author

Status update: merge conflicts with origin/main are resolved and pushed. The project-file normalization guard also failed once after conflict resolution; that is fixed in 0738d270a and workflow-guard-tests is now passing.

What is holding the PR now is pending CI/review-bot completion on the current head: tests, tests-build-and-lag, ui-regressions, activation-session, release-ghostty-cli-helper, both Vercel deployments, and Greptile. I am continuing to watch checks and review feedback; no unresolved actionable review thread is currently open.

@austinywang

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 6, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@rainstuff

rainstuff commented Jun 7, 2026 •

Copy link
Copy Markdown

I've been using this for a while (pulled it + rebased on main) and it works great. A few things I've noticed (that I fixed locally):

  • If you resize the overlay panel, when you hide + show it again it'll show up in its original size (not the one you resized it to)
  • The hotkey combination cannot be changed via settings (the UI will show the new combination as persisted, but it will not actually work, you can only do control + option + command + .).
  • Notifications will be sent even if you have the overlay focused.

These all might be because of rebase conflicts and how I resolved, though.

@lawrencecchen lawrencecchen added the stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening. label Sep 23, 2026
@github-project-automation github-project-automation Bot moved this from Todo to Done in cmux backlog Sep 23, 2026

This branch was successfully deployed

1 active deployment
Preview – cmux — 0738d270 Deployed Jun 6, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature request: iTerm2-style global hotkey window with full-screen overlay

4 participants