Title: Global command palette (⌘K / Ctrl+K) to search and run any command · Issue #41 · modelstudioai/openwork · GitHub
Open Graph Title: Global command palette (⌘K / Ctrl+K) to search and run any command · Issue #41 · modelstudioai/openwork
X Title: Global command palette (⌘K / Ctrl+K) to search and run any command · Issue #41 · modelstudioai/openwork
Description: Problem or Motivation Every comparable desktop app ships a command palette — a single keyboard-driven overlay (⌘K / Ctrl+K in Linear/Vercel/Raycast, ⌘⇧P in VS Code / Codex desktop, ⌘K in Claude's desktop app) that lets you search for and...
Open Graph Description: Problem or Motivation Every comparable desktop app ships a command palette — a single keyboard-driven overlay (⌘K / Ctrl+K in Linear/Vercel/Raycast, ⌘⇧P in VS Code / Codex desktop, ⌘K in Claude's d...
X Description: Problem or Motivation Every comparable desktop app ships a command palette — a single keyboard-driven overlay (⌘K / Ctrl+K in Linear/Vercel/Raycast, ⌘⇧P in VS Code / Codex desktop, ⌘K in Claude'...
Opengraph URL: https://github.com/modelstudioai/openwork/issues/41
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Global command palette (⌘K / Ctrl+K) to search and run any command","articleBody":"## Problem or Motivation\n\nEvery comparable desktop app ships a **command palette** — a single keyboard-driven\noverlay (⌘K / Ctrl+K in Linear/Vercel/Raycast, ⌘⇧P in VS Code / Codex desktop, ⌘K\nin Claude's desktop app) that lets you search for and run any command without\nhunting through menus. It is the fastest way to discover and trigger app actions.\n\nOpenWork already has all the ingredients but **no palette that ties them together**:\n\n- A centralized **action registry** (`apps/electron/src/renderer/actions/`) with 26\n actions carrying `label`, `category`, `defaultHotkey`, and — crucially — an\n `execute(actionId)` method that runs the first enabled handler.\n- The cmdk **command primitives** (`components/ui/command.tsx`) — currently only\n consumed by the in-input slash-command menu.\n- Translated action labels (`shortcuts.action.*`) and category headings\n (`shortcuts.category.*`) already in every locale.\n\nToday the action registry is surfaced **only** in read-only reference views (the\nKeyboard Shortcuts dialog and the Settings → Shortcuts page). There is no way to\n*run* an action by searching for it. Discovering an action means opening Settings\nand scrolling, or memorizing a hotkey.\n\n## Proposed Solution\n\nAdd a **global command palette** opened with `⌘K` / `Ctrl+K` (and from the App\nmenu). It:\n\n- Lists every registry action, grouped by category, with its hotkey shown on the\n right.\n- Filters as you type (cmdk's built-in fuzzy match over the translated label).\n- Shows a \"No results found\" empty state when nothing matches.\n- On select, closes and calls the registry's `execute(actionId)` — so \"Settings\",\n \"Toggle Theme\", \"New Chat\", etc. run exactly as if their hotkey were pressed.\n- Closes on `Esc` / selection (integrated with the existing modal stack).\n\nThis is a **frontend-only** change:\n\n- It reuses the existing action registry (`useActionRegistry().execute`), the cmdk\n primitives, and the existing hotkey/label infrastructure — no backend, no\n qwen-code change.\n- It introduces **no new i18n keys**: the input placeholder reuses\n `commands.searchCommands`, the empty state reuses `common.noResultsFound`, labels\n reuse `shortcuts.action.*`, and group headings reuse `shortcuts.category.*`.\n\n## Alternatives Considered\n\n- **Keyboard Shortcuts dialog / Settings → Shortcuts page** already exist, but they\n are *reference* surfaces — you can read a shortcut, not run the action. A palette\n is the run surface every comparable app pairs with the reference.\n- **Slash-command menu** (`/`) exists inside the chat input, but it is scoped to\n chat commands and the message composer, not global app actions.\n\n## Additional Context\n\nFeasibility: **frontend-only / doable.** Verified against `apps/electron` — the\nregistry already exposes `execute()`, actions carry all needed display metadata,\nand cmdk is already a dependency.\n\n### Acceptance criteria (CDP e2e assertion)\n\nA new `e2e/assertions/command-palette.assert.ts` drives the real built app over CDP\nand asserts the full path:\n\n1. Pressing `⌘K` / `Ctrl+K` opens the palette; it renders and lists **more than\n one** action row.\n2. Typing a query (`theme`) narrows the list — every visible row contains the\n query and the row count shrinks — and the known **Toggle Theme** action is\n present.\n3. A no-match query (`zzqqxxnomatchzzqqxx`) shows the empty state and hides every\n row.\n4. Clearing the query restores the full list.\n5. Selecting **Toggle Theme** closes the palette **and** flips the app theme\n (`documentElement` `dark`⇄`light` class), proving the palette actually *executes*\n the action rather than merely displaying it.\n\nPart of the autonomous desktop-feature loop (`loop-bot`).","author":{"url":"https://github.com/DragonnZhang","@type":"Person","name":"DragonnZhang"},"datePublished":"2026-07-01T01:31:44.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/41/openwork/issues/41"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:aa0d1c92-69d1-f02c-9116-085976aec5fe |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 95D2:F97FB:3CC716:5150C9:6A5248FF |
| html-safe-nonce | c83571fa2384fdf04b44198a2d97fcf7e0b43023771b43fe78a35781a62e4b05 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5NUQyOkY5N0ZCOjNDQzcxNjo1MTUwQzk6NkE1MjQ4RkYiLCJ2aXNpdG9yX2lkIjoiODA4MTkxNjg0Njg3NjU0MzIzMSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | bca9e4bc5880183e4e09f48f41f4ba8ec6d1ae688689d8e2375937c838c63332 |
| hovercard-subject-tag | issue:4781612536 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/modelstudioai/openwork/41/issue_layout |
| twitter:image | https://opengraph.githubassets.com/2c33ec3f8da114dc8c8838fd340cdf897192071bd7261638487f88f2e3efe92b/modelstudioai/openwork/issues/41 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/2c33ec3f8da114dc8c8838fd340cdf897192071bd7261638487f88f2e3efe92b/modelstudioai/openwork/issues/41 |
| og:image:alt | Problem or Motivation Every comparable desktop app ships a command palette — a single keyboard-driven overlay (⌘K / Ctrl+K in Linear/Vercel/Raycast, ⌘⇧P in VS Code / Codex desktop, ⌘K in Claude's d... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | DragonnZhang |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/modelstudioai/openwork git https://github.com/modelstudioai/openwork.git |
| octolytics-dimension-user_id | 283556804 |
| octolytics-dimension-user_login | modelstudioai |
| octolytics-dimension-repository_id | 1256697754 |
| octolytics-dimension-repository_nwo | modelstudioai/openwork |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1256697754 |
| octolytics-dimension-repository_network_root_nwo | modelstudioai/openwork |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7aed05249554b889eb33d002851a973eebcc7e91 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width