Agentero
Connect your own Agent, keep research context in a local Vault. Seamlessly migrate from Zotero, read, understand, link, and reuse your research context.
AI translation
A menu-bar monster that gives your keyboard teeth — click, scroll, jump, and search anything, no mouse required — and remembers everything you copy.
ProductivitySwift · MakefileGitHub @semanticartOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Suite of tools to keep your hands on the homerow
Taken from the repository README
Loading the full README.
Read the full README ↗A keyboard-driven macOS utility built around your clipboard. Key Monster lives in the menu bar, quietly records what you copy, and lets you search back through it and paste any earlier entry from a fast, centered panel — plus a set of keyboard-only ways to drive the rest of your Mac: focus apps, click anything on screen, scroll any pane, and jump the caret through text, all without the mouse.
LSUIElement), no Dock
icon, no window cluttering your screen.↑ / ↓ or Ctrl-N / Ctrl-P — move the selectionCtrl-J / Ctrl-K — scroll the preview pane for long contentReturn — paste the highlighted item into the app you were just using
(or copy it, if auto-paste is off or unavailable)Esc — dismiss the panel (it also closes when it loses focus)Return pastes the selection straight into the previously
focused app by synthesizing a ⌘V, so you don't have to switch back and paste
manually. On by default; it needs Accessibility permission (Key Monster requests
it when you enable the toggle) and gracefully falls back to copy-only without it.open_url_with and
open-actions.conf still apply; this needs allow_remote_control yes and
listen_on unix:/tmp/kitty in kitty.conf (restart kitty after adding
it), and tmux needs set -ga terminal-features ",xterm-kitty:hyperlinks"
for linked text to survive. Settings → Mouse shows whether kitty is set up (and says what to fix), and hint mode explains on screen when it can't read kitty. Kitty windows with splits aren't supported yet. Set File Path Script (Settings → Mouse) and file paths on screen that exist (/abs, ~/x, or src/a.swift:12:5, resolved against the window's directory) are hinted too; picking one runs your script with the absolute path as $1 (and $KEYMONSTER_LINE/$KEYMONSTER_COLUMN when given), e.g. to open it in nvim in a tmux pane. Relative paths inside tmux resolve against kitty's directory, not the pane's.
Separate shortcuts for left-click and right-click hints; holding Shift on the final letter clicks
with the opposite button. Elements too close together to label individually
share one green area label — typing it zooms into that area (a magnified
screenshot; this needs Screen Recording permission — Key Monster prompts the
first time, and zoom stays unavailable until it's granted) and
each element gets a normal label; Delete backs out of the zoom. Esc, a
real click, or any other chord dismisses the overlay. Requires Accessibility
permission.Grab the latest KeyMonster-<version>.dmg from the
Releases page, open it, and drag Key Monster.app
into /Applications. Releases are signed with a Developer ID certificate and
notarized by Apple, so it opens like any other app.
Prefer to build it yourself? See Building & Running below.
make lintThe project uses a Makefile for common tasks:
make run # build a proper .app bundle (icon, menu bar agent, signed) and open it
make app # build the .app bundle without launching it
make build # plain `swift build`
make install # build a release bundle and copy it into /Applications
make test # run the test suite
make lint # run SwiftLint
make icon # regenerate Resources/AppIcon.icns from Resources/icon.svg
make dist # build the release .app and package it into a DMG in .build/dist/
make notarize # submit the DMG to Apple's notary service and staple the ticket
make clean # clean build artifacts
make run assembles a real .app bundle so the menu bar agent, icon, code
signature, and bundled Sparkle framework are in
place. Because persistence is SQLite (via
GRDB) rather than something requiring a
bundle identifier, plain swift run also works for day-to-day development
(update checks stay off there, since a bare binary has no feed URL).
make install builds a release bundle and installs it to /Applications
(override with make install INSTALL_DIR=~/Applications).
Accessibility grants (needed for auto-paste, click hints, grid click, and text
jump) are tied to the app's code-signing identity. The Makefile auto-detects a
real signing identity from your keychain and signs with it, so the grant persists
across rebuilds; it falls back to ad-hoc signing if none is found (in which case
macOS forgets the grant on every rebuild). Override explicitly with
make run CODESIGN_IDENTITY=<identity> if needed.
See RELEASING.md for the release workflow — tagging, signing, notarization, and the GitHub Actions pipeline.
Return — it pastes into
the app you came from (or just copies, if auto-paste is off/ungranted).Your history is stored at:
~/Library/Application Support/keymonster/history.sqlite
See ARCHITECTURE.md for a file-by-file map of the codebase.
Q\A'Z/ReturnShiftDeleteEscJ / K
scroll it (hold for key repeat) until Esc, a real click, or any other chord
dismisses. A window with a single scrollable pane skips the pick and scrolls
immediately; Delete returns to the pane pick. Works on native scroll areas
and on web content in Safari, Chrome, and Electron apps, even when the pane
hides its scroll bars. In kitty running tmux, each tmux pane is its own pane
(the active one is labeled first). Requires Accessibility permission.Delete backs out of the zoom, then back to
pick a different character; Esc, a real click, or any other chord dismisses.
Requires Accessibility permission.git commit hands a message to
$EDITOR. Save and quit and the edited text replaces the field; a non-zero
exit (:cq in vim) leaves the field untouched, and an unchanged file is a
no-op. Blank lines are preserved exactly — only the one trailing newline
editors insist on is added going out and removed coming back. The editor is
taken from Settings, then $KEY_MONSTER_EDITOR (so you can force a filetype,
e.g. nvim -c 'set ft=markdown'), then $VISUAL, then $EDITOR, read from
your login shell. GUI editors must block until the file closes (code --wait,
zed --wait); terminal editors such as vim, nano, or emacs -nw need a
terminal to run in, chosen in Settings — Terminal and iTerm2 get a fresh
window; kitty, WezTerm, Alacritty, and Ghostty only take a command at launch,
so they get a separate instance that is quit again when the editor exits
(a toggle in Settings); any other terminal is handed a .command file. The
edited text is put back with a single
accessibility write where the field allows it, or by select-all-and-paste
otherwise; if focus has moved on, it is left on the clipboard rather than
pasted somewhere unintended. Requires Accessibility permission.exp pdf reaches File › Export › PDF…); the closest match floats to the top.
Navigate with ↑ / ↓ or Ctrl-N / Ctrl-P, and press Return to run the
highlighted item back in that app — no reaching for the mouse to hunt through
menus. Esc cancels. Disabled items and separators are skipped. Requires
Accessibility permission..scpt, .scptd, .applescript) runs via
osascript, executable files run directly (their shebang picks the
interpreter), and anything else runs in zsh as a login shell, so your usual
PATH applies. Failures (non-zero exits, with stderr) are appended to
~/Library/Logs/keymonster/scripts.log; the Scripts settings tab shows the
latest failure with an Open Log button, and everything is also logged
under the keymonster subsystem in Console.