TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
Native quick menu for Omarchy
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A Raycast-style command palette that replaces the Omarchy menu. One native Omarchy menu plugin in QML and JavaScript, running inside the existing omarchy-shell process, themed by whatever Omarchy theme is active. Type, or speak, what you want: apps, the whole Omarchy menu, calculations, conversions, colors, emoji, clipboard history, files, Codex, and anything an extension adds. Smart Match, a small embedding model running locally, understands what you mean when the words do not match exactly.README 전문 보기 ↗A Raycast-style command palette that replaces the Omarchy menu. One native Omarchy menu plugin in QML and JavaScript, running inside the existing omarchy-shell process, themed by whatever Omarchy theme is active. Type, or speak, what you want: apps, the whole Omarchy menu, calculations, conversions, colors, emoji, clipboard history, files, Codex, and anything an extension adds. Smart Match, a small embedding model running locally, understands what you mean when the words do not match exactly.
Explore the feature showcase and installation guide → · Read the usage guide: every feature, with a screenshot and one thing to try →
Release notes: 1.5.2 — copied text stays off the command line, g searches the engine you pick, file search no longer blocks hibernate, GIF previews cannot crash the shell, and Chrome bookmarks show up again. 1.5.1: the palette keeps its colours on Qt 6.12, Windows (>) and Herdr (%) join the box, 35 lb converts without a target, and Codex accepts newer CLIs. 1.5.0: Browser profiles and Recent projects join the box, Ctrl+↵ pastes from clipboard history, and Cursor joins the assistants. 1.4.4: a quieter results list: the keys for the selection live in the footer, the preview pane opens only when it has something to show, and confirmations rise from the bottom of the card. 1.4.3: a web address typed into the palette opens in your browser; Browser search and GIF Search join the box; Keyboard Cleaner keeps a wipe from opening the power menu. 1.4.2: the matching engine is rebuilt byte for byte and attested in CI; Currency and Keyboard Cleaner. 1.4.1: the usage guide reads like a manual. 1.4.0: extensions ship inside Keystroke, off until you turn them on, with Timer (now ringing and counting down in the bar) and Translate in the box; every typed command explains itself; a usage guide, reachable from Settings → Learn Keystroke. Earlier: 1.3.0, 1.2.1, 1.2.0.
Screenshots show the real Omarchy interface with public demo data, rendered offscreen from the real palette by tools/showcase/offscreen.py.
omarchy plugin add https://github.com/evindor/keystroke.git --enable
That is all. Enabling Keystroke makes it the menu: Super+Space, every omarchy-menu binding, omarchy menu summon <route>, and the omarchy-menu-select/omarchy-menu-input pickers all route to it. Disabling or removing it (omarchy plugin disable evindor.keystroke, omarchy plugin remove evindor.keystroke) restores the stock menu. This works because the manifest declares omarchy.clonedFrom: "omarchy.menu"; Omarchy's plugin registry routes calls for omarchy.menu to the enabled replacement and restores the original afterwards. The plugin id evindor.keystroke is permanent.
From a checkout, bin/keystroke install copies the tree into ~/.config/omarchy/plugins/evindor.keystroke (no symlinks) and enables it; bin/keystroke uninstall reverses that.
Smart Match defaults to Voice and text with the small 2M embedding model.
The first matching query fetches the model (8 MB, pinned digest) and starts the
compiled engine shipped with the plugin (a static x86_64 binary, rebuilt byte for
byte and attested in CI, see docs/engine-provenance.md;
16 MiB resident, ready in tens of milliseconds). On another architecture cargo builds it once from
the included source, and without a Rust toolchain Python 3 with uv installs the
equivalent pinned runtime instead. Ordinary search remains available
during setup; checkout installation prepares everything ahead of time. After
setup, matching works offline.
Bar-widget note (Omarchy 4.0.x). Keystroke also ships the menu button as a bar widget, so enabling it puts a button in your bar: in place of the stock one if you had it, otherwise first on the left when enabled through bin/keystroke install. omarchy plugin add --enable only asks for a section and places the button after the workspaces; omarchy bar move evindor.keystroke left --index 0 puts it first. For a third-party plugin, "enabled" means "referenced in shell.json", so removing that button from the bar also disables the menu. If you do not want the button, keep the plugin listed under plugins[] in ~/.config/omarchy/shell.json instead.
Requires Omarchy ≥ 4.0.2 (Quickshell 0.3, Qt 6.11). Like every Omarchy plugin, Keystroke runs unsandboxed inside your shell with your permissions; the code is here to read.
sqrt(144) + 15% of 80, 2m in feet, 32 F to C, 35 lb, 10am pt, 10 am in London, now in tokyo, #ff6644, :smile, readme, timer 10m tea, tr bonjour.tr, timer or : and the line under the search field names the action and the argument you are on (Translate · to: a language code or name), while the arguments still to type appear after the caret as [to] <text> and vanish as you fill them. Type the name instead (transl) and Tab types the prefix for you; while you type, Tab moves to the next argument. / lists every command with its usage; each extension's screen starts with the same usage and examples you can run with ↵. Every prefix can be renamed in the provider's settings.learn or guide anywhere) opens the usage guide: every feature on one page, each with a screenshot and one thing to try, ending with commands and extensions.prefp, keysepro and setaiprv all land on Keystroke Settings › AI & Web Search › Preferred assistant, prefcla on its Claude choice, sysshut on System › Shutdown. Letters may skip whole words of the breadcrumb, words can come in any order (ai prov), descriptions match by word. Inside a submenu the same search covers everything below it.example.com/path?q=hello#section, with or without http(s)://) and it appears above ordinary matches; ↵ opens it in your default browser. $example.com selects this provider directly. Domains default to HTTPS; bare IP addresses and localhost:3000 default to HTTP. International domains, IPv6 addresses in brackets, ports, query parameters and fragments are supported. Use an explicit scheme or for a single-word intranet host. A bare file name stays a file: and find your files rather than offering a web address, and a scheme, , a port or a path () asks for the address anyway. Settings → Open URL has and .Keystroke Settings > Matching contains:
Smart Match supplements exact and fuzzy search with action descriptions and local
semantic suggestions. It keeps launch/install/remove and start/stop distinct,
recognizes small typos, and offers Chromium for “launch Chrome” when Chrome is
absent. Spoken arithmetic such as “27 plus 90” becomes 27 + 90; dictation and
assistant prompts retain the original transcript. Results still require Enter and
keep their existing confirmations. Ambiguous speech can still need correction.
Both models run locally on CPU. The runtime unloads after two idle minutes, and a
setup failure leaves ordinary matching available. Use Retry Smart Match in the
Matching settings screen or bin/keystroke matching to retry installation. Runtime
files live under ~/.local/share/keystroke/matching (or XDG_DATA_HOME). More detail
is in the matching runtime documentation.
Third-party extensions live inside Keystroke itself, one folder each under extensions/, the way the Raycast extensions repository works: anyone adds a folder, opens a pull request, and once it is reviewed and merged the extension reaches every user with the next Keystroke update. The bundled providers in providers/ are the vetted core; extensions/ is where the community adds theirs.
Every extension is off until you turn it on. Installing or updating Keystroke never runs code from extensions/: an extension that is off is not even compiled. Type ext and open Extensions:
↵ opens its screen; Ctrl+↵ on a row that is on turns it off.~/.local/share/keystroke/extensions/ is picked up next time the palette opens, so you can use an extension you are writing before, or instead of, sending it upstream.In the box. Timer (timer 25m focus), Translate (tr fr good morning), Currency (100 usd to eur, the European Central Bank's daily rates through Frankfurter, kept for offline use; by Gunhan Selas), Keyboard Cleaner (wipe 30s blocks every keyboard and pointer through Hyprland while you wipe them; by ozz1ee), Browser search (browser github, or just the words at the root: your default browser's history and bookmarks, read in place without copies or network), GIF Search (gif thank you: a GIPHY grid, ↵ copies the GIF to the clipboard, Ctrl+↵ its link), Browser profiles (profile work: a new window in any profile of Chromium, Chrome, Brave, Vivaldi, Edge, Firefox, LibreWolf or Zen, Ctrl+↵ a private one; by Thomas Torggler), Recent projects (proj keystroke: a folder, workspace or remote that VS Code, VSCodium, Cursor or Windsurf opened recently, Ctrl+↵ a terminal in it; by Thomas Torggler), Herdr (% claude: an agent, workspace, tab or pane of any running Herdr session, focused in Herdr with its terminal window raised; by Justin Garza) and Windows (: any open Hyprland window, most recently used first, so then goes back to the previous one; by Justin Garza). All ten are off until you turn them on.
Write one. An extension is a folder with an extension.json (name, version, description, icon, apiVersion, and the commands it answers to: prefix, arguments and examples, which become its Usage section, its hint line and its entry on the / screen) and a Service.qml exposing a provider object with query(ctx). It can declare the shapes of text it answers as patterns (regular expressions with a boost: price = 10 lifts Calpad's offer above the assistant hand-offs without Calpad knowing about them), carry its own image icon on every row about it, and ship a view of its own over the palette card. The reference is extensions/timer: countdown timers with settings, a scoped screen, a service that outlives the palette, a sound when a timer ends, a countdown next to the menu button in the bar and unit tests, small enough to read in one sitting. extensions/translate is Google Translate without an account (tr bonjour, tr fr good morning, bonjour to english), with an editor view, a target-language picker and selection rows; it shows an extension with a view, patterns and network access. The contract is docs/providers.md; the step-by-step guide for people and coding agents, from the first folder to the pull request, is CONTRIBUTING.md.
Keystroke dictates through voxtype, the optional dictation daemon Omarchy installs from Install › AI › Dictation. Keystroke Settings › Voice shows Voxtype voice command integration, on by default as soon as voxtype is on the PATH, and offers Omarchy's installer when it is not. Keystroke uses that ordinary installation as-is: it does not install a fork, replace the user service, or edit ~/.config/voxtype/config.toml. Model, language, audio, VAD and output preferences remain entirely under voxtype configure.
Two ways in, both while the palette is open:
Tap the hotkey again. The second tap of Super+Space starts listening instead of closing the palette; a third tap stops. Set Second tap of the hotkey to Close to keep the stock toggle.
Hold the hotkey. Keep Super+Space down: after Hyprland's key-repeat delay the palette starts listening, and releasing the chord stops it. This needs a long-press bind and a release bind on the same key; Settings › Voice › Hold-to-talk bindings writes them into ~/.config/hypr/bindings.lua inside a marked block (confirmation first, then hyprctl reload). The block is plain Lua you can also paste yourself:
-- >>> keystroke voice: hold the palette hotkey to dictate (written by Keystroke Settings › Voice)
o.bind("SUPER + SPACE", nil, "omarchy-shell shell call omarchy.menu voiceHold '{}'", { long_press = true })
o.bind("SUPER + SPACE", nil, "omarchy-shell shell call omarchy.menu voiceRelease '{}'", { release = true })
-- <<< keystroke voice
While listening, a small waveform sits to the right. Releasing the hotkey, tapping it again, or pressing ↵ finishes the recording; the completed transcript then fills the query and a fresh ↵ runs the visible selection. Typing or navigating cancels the recording. Voxtype's overlay is hidden for Keystroke's one recording only, the transcript never goes through the clipboard or a virtual keyboard, and temporary transcript files are removed afterwards. If a future Voxtype release publishes live partials for file-output integrations, Keystroke already watches its runtime mirror and will update matches as the words arrive. Trailing punctuation, a leading launcher verb ("open", "go to") and filler are dropped before matching, so "Launch Chrome." is searched as Chrome.
Copy to Clipboard appears under Continue with after any spoken or typed query: ↵ copies the original text and closes, Ctrl+↵ copies, closes and pastes into the previous window. The separate Dictate to Clipboard launcher (bin/keystroke dictate) starts a prose-only recording with the same keys.
Keystroke passes only per-recording --file and --no-osd overrides. With the daemon stopped the palette says so instead of listening.
Type or speak, then select Ask Codex here, or type ? before your question. Answers stream inside the palette. ↵ sends a follow-up, Shift+↵ adds a line, your voice hotkey fills the composer, Stop interrupts, Esc closes. Codex → Recent questions continues a conversation; Continue in Codex (Ctrl+↵) hands it to your desktop app or CLI; Open task in Codex opens a new request there. Settings → Codex selects the model, Fast/Standard processing, destination and an optional working folder; the default is GPT-5.6 Luna using your existing codex login. Keystroke owns one local codex app-server process, shuts it down after ten idle minutes, never reads credentials, and stores only its recent-question index and drafts. This integration requires a stable Codex CLI, 0.153.2 or newer. Details and limits: docs/codex-integration-verification.md.
One file, hand-editable and hot-reloaded: ~/.config/omarchy/keystroke.json (see keystroke.example.json). Settings screens are generated from each provider's schema; writes are atomic, preserve unknown fields, and are refused while the file fails to parse. Every screen, setting and choice is searchable from the palette root through its breadcrumb. Learn Keystroke on the Settings screen opens the usage guide in your browser. Appearance: density (compact/comfortable), accent (theme accent or ember/violet/mint), previews on/off, animations (off, snappy or fluid) and the window transition (instant, fade or slide up). Colors, fonts, radius and spacing follow the active Omarchy theme.
bin/keystroke validate # omarchy plugin validate
bin/keystroke test # qmltestrunner unit tests, Quickshell integration checks, qmllint
docs/verification.md records what was run on the reference machine; docs/architecture.md describes the design; CONTRIBUTING.md is the contributor guide.
MIT, see LICENSE. Omarchy's MIT-licensed menu model is vendored in omarchy/MenuModel.js.
$readme.mdarchive.zip$readme.md/raw~ join the results from two characters on. Fuzzy abbreviations work: dwnlds finds Downloads, and ~dcmnts rpt searches only files and folders for reports under Documents. ~ always selects fuzzy file search; Settings → Files → Search in the main palette offers Fuzzy (default), Literal, or Only with ~. Hidden entries are optional; gitignore rules remain respected. Mounted filesystems are excluded by default to avoid blocked cloud or network searches; enable Search mounted filesystems in Settings → Files to include them. ↵ opens the result; Ctrl+↵ opens a terminal there. At most ten results mix into the main palette; ~ and the Files screen show up to sixty.↵ copies an entry, Ctrl+↵ pastes it into the window you came from; Settings → Clipboard History → Paste on selection swaps the two. Pasting sends Ctrl+Shift+V to a terminal (Omarchy's terminal tag, or a desktop entry in the TerminalEmulator category) and Ctrl+V anywhere else; Paste shortcut can force Shift+Insert.flcrn shows Full screen with Super + F, super f finds the same bind by its keys, screenshot finds the one that runs omarchy-capture-screenshot. ↵ runs the bind exactly as pressing it would (the list and the dispatch both come from omarchy-menu-keybindings, the script behind Super+K); the keys shown are the suggestion for next time, and frecency lifts what you actually use. The Hotkeys screen lists all of them in the Super+K order. Binds Omarchy cannot run from a menu (Lua closures such as Close window) are shown greyed so the keys can still be learned. At most ten mix into the root (Settings → Hotkeys).claude://claude.ai/new?q=…, the Codex desktop app via codex://threads/new?prompt=…, or the browser (claude.ai/new?q=, chatgpt.com/?prompt=; ?q= sends immediately when Send immediately in the browser is on). CLI mode opens a terminal with claude or codex and the prompt as a literal argument. With Cursor installed, Ask Cursor opens cursor://anysphere.cursor-deeplink/prompt?text=… through cursor --open-url, and CLI mode runs Cursor's agent instead (Settings → AI & Web Search → Cursor workspace folder passes --workspace).g rust lifetimes skips everything else and returns only that search, as the first row; rename g under Prefix. ↵ opens the results page in your default browser, Ctrl+↵ copies its URL. The text is percent-encoded, so it cannot add parameters to the URL.↑/↓ or Ctrl+P/Ctrl+N move, PageUp/PageDown jump six rows, ↵ or → activates, Tab types the selected command's prefix, and while typing a command moves to its next argument, Ctrl+1…Ctrl+8 activate the first to eighth result directly (holding Ctrl shows each row's number in place of its icon), Ctrl+↵ runs a row's alternate action, Esc closes, Ctrl+U clears the query, ←/Backspace on an empty query goes back, Del on an application offers to uninstall it, Ctrl+, opens Settings, Ctrl+K opens the selected provider's settings.~/.local/state/keystroke/usage.json as hashed ids only, never as query text.omarchy menu route works as before: submenus open scoped (omarchy menu toggle system), leaf aliases run immediately (omarchy menu summon reminder-set), apps opens the Applications provider. Pickers honor width/maxHeight; a new picker request cancels a pending one.> firefox>↵