What this work needed to become.
EasyHotkeys is a focused productivity tool built in Swift. It keeps snippet data local, supports system-wide shortcuts, and inserts text directly through macOS accessibility APIs.
The product is intentionally narrow: make repeated text fast without turning a small utility into a cloud account, browser extension, or clipboard-first workflow.
The hard part was in the edges.
Text expansion sounds simple until it needs to work outside the active application. Global shortcuts, Accessibility permission, focus, keyboard layouts, and secure local storage all become product concerns.
The clipboard is a convenient implementation shortcut, but it also overwrites user state and may expose sensitive content to clipboard history tools. EasyHotkeys needed a safer default path.
Constraints that shaped the solution
- Global text insertion requires explicit macOS Accessibility permission.
- The utility should remain local-first and useful without an account or network connection.
- Shortcut conflicts and failed insertion need understandable recovery.
- Sensitive snippet bodies should not live beside ordinary metadata in plain JSON.
Choices made explicit.
The implementation follows from these boundaries. Each choice solves one problem while accepting a clear trade-off.
Build natively
SwiftUI provides the product surface while AppKit and CoreGraphics cover menu-bar, global event, and text-insertion behavior.
Type text by default
Direct keyboard-event insertion avoids mutating the clipboard. An optional clipboard fallback exists, but it is disabled by default.
Separate secrets from metadata
Password snippet bodies are stored in macOS Keychain with device-only, unlocked accessibility while JSON retains non-secret metadata.
Treat permission as product state
Accessibility is explained and checked as part of onboarding rather than left as an unexplained operating-system failure.
Useful, shipped, and honest about its limits.
EasyHotkeys combines global shortcuts, direct text insertion, and Keychain-backed password snippets in a focused native utility supported by a public unit-test suite.
The result is a compact utility whose engineering is visible in the edges: permissions, storage boundaries, insertion policy, packaging, and failure behavior.
What I would carry forward.
A future iteration could strengthen the distribution story with notarization, richer product screenshots, and a short permission walkthrough.
The security boundary should stay deliberately simple: ordinary snippets remain local, while sensitive snippet values stay in macOS Keychain.