uttrflow / uttrflow/uttrflow-swift
Shortcuts can't be turned off or restored to their defaults, so ⇧⌘V, ⌃⌘V and ⌃⌘C stay taken from other apps
- Dominant language
- Swift
- Stars
- 4
- Forks
- 17
- Avg merge
- 3h 32m
- Merged PRs (30d)
- 277
Description
## What happens
Uttrflow ships four shortcuts (`ShortcutSet.default`, `Sources/UttrflowCore/Keyboard/ShortcutSet.swift:17-22`): Dictate ⌥Space, Clipboard ⇧⌘V, Paste last transcript ⌃⌘V and Copy last transcript ⌃⌘C. The last three are **claimed**: registered with Carbon, which swallows the combination so the frontmost app never receives it (`Docs/shortcuts.md`, "Carbon, only where a key must be swallowed"; registration in `AppDelegate.startWatchingForClaimedShortcuts`, `Sources/Uttrflow/AppDelegate.swift:688-718`).
In Settings each shortcut row has only **Change** (and Cancel while recording) (`Sources/Uttrflow/Settings/SettingsControlView.swift:209-217`). There is no way to:
- **turn a shortcut off.** `ShortcutSet.remove(at:from:)` exists and says "the last one may go, since an action with none is allowed" (`ShortcutSet.swift:59-65`), and the row can draw "None" (`SettingsControlView.swift:201-204`), but no `SettingsChange` removes a binding; the only removal is a legacy migration (`Sources/UttrflowSettings/SettingsStore.swift:38`);
- **put the defaults back.** The doc comment on `ShortcutSet.default` says "the shortcuts screen offers this back as 'reset'" (`ShortcutSet.swift:16`); no screen does. The only route is Reset personalisation, which also deletes the dictionary, history, clipboard history and preferences.
Nothing on the row says a claimed shortcut takes the combination away from other apps either; the explanations are "Opens the clipboard panel from any app." and similar (`Sources/UttrflowUX/ShortcutRegistry.swift:34-48`).
## Why it matters
⇧⌘V is paste-without-formatting in many apps (the reason `Docs/shortcuts.md` gives for claiming it), and any of the three may already be what someone uses in their own tools. A user who wants one of them back has to rebind the Uttrflow shortcut to some other combination they do not want, rather than simply switching it off. Somebody experimenting with shortcuts has no way back to the defaults short of wiping their data.
## How to reproduce
Open Settings → General and look for a way to leave Paste last transcript unbound, or to restore the original four shortcuts.
## Acceptance criteria
Product decisions first (hence `needs-info`): which shortcuts may be unbound (probably every one but Dictate), and where "Restore default shortcuts" lives.
Then:
- A claimed shortcut can be cleared from its row; the row shows "None" and the combination reaches other apps again.
- A "Restore Defaults" action resets only `shortcuts` (and `shortcutsReturnedToDefault`), through `SettingsEditor`, refusing nothing that would clash.
- The explanation for each claimed shortcut says it takes the combination from other apps while set.
- The `ShortcutSet.default` comment matches what the screen offers.
- Tests in `Tests/UttrflowUXTests/SettingsPresenterTests.swift` and the settings editor tests cover clearing and restoring.
Contributor guide
Research direction
Resolve the needs-info decisions first, then read ShortcutSet.swift, SettingsControlView.swift, SettingsEditor and AppDelegate.startWatchingForClaimedShortcuts to trace removal, reset, and claimed-key registration. Run SettingsPresenterTests.swift and the settings editor tests; done means supported shortcuts can show None, defaults can be restored without wiping other data, claimed-shortcut explanations are explicit, and the documented default matches the screen.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- swift
- Domain
- desktop
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100