Vaise is a keyboard-first desktop launcher for shortcut cheat sheets, built with Tauri 2, React, TypeScript, and Rust.
It behaves like a small command palette that stays out of the dock/taskbar, opens on a global shortcut, lets you fuzzy-search cheat sheets, then drill into individual commands and copy them to the clipboard.
- Launch Vaise.
- Press
Ctrl+Cmd+Kto show or hide the launcher. - Type to search across cheat sheet names, tags, entry names, entry actions, aliases, and command text.
- Press
Enteron a cheat sheet to open it. - Type again to search entries within that sheet.
- Press
Enteron an entry to copy its command text to the clipboard.
Keyboard controls inside the launcher:
ArrowDown,Tab, orCtrl+Nmoves selection downArrowUp,Shift+Tab, orCtrl+Pmoves selection upEnteropens a cheat sheet or copies an entryBackspaceon an empty entry query returns to the sheet listEscapeclears the current query or exits the selected sheetCtrl+/focuses and selects the search input
- Opens and hides from a global shortcut:
Ctrl+Cmd+K - Runs as an accessory-style desktop app with a tray icon
- Uses a two-step search flow between cheat sheets and their entries
- Copies the selected command or command sequence to the clipboard on
Enter - Seeds a user cheat sheet directory with default JSON files on first launch
- Hides automatically when the window loses focus
The current Tauri window is configured as:
- transparent
- borderless
- always on top
- centered
- hidden by default
- skipped from the taskbar
On macOS, the launcher is additionally configured to behave more like a utility palette:
- accessory activation policy
- visible across spaces
- hidden on deactivate
- raised to a status-window-level style
- Tauri 2
- Rust
- React 18
- TypeScript
- Vite 5
.
├── src/ # React frontend
├── src/lib/ # Tauri bridge, search, shared types
├── src-tauri/ # Rust app, Tauri config, icons
├── package.json # frontend and Tauri scripts
└── README.md
Vaise is currently developed and packaged with a macOS-first setup.
You need:
- Node.js and npm
- Rust toolchain
- the macOS-native dependencies required by Tauri
This repo is configured to use macOSPrivateApi, tray icons, and macOS-specific launcher window behavior.
npm installStart the Tauri app in development mode:
npm run tauri:devUseful scripts:
npm run devstarts the Vite frontend on port1420npm run buildruns TypeScript compilation and builds the frontend bundlenpm run previewpreviews the built frontendnpm run tauri:devruns the full desktop appnpm run tauri:buildbuilds desktop bundles/installers
Targeted macOS builds:
npm run tauri build -- --target aarch64-apple-darwinnpm run tauri build -- --target x86_64-apple-darwin
Vite is configured with:
- port
1420 strictPort: trueclearScreen: false
Create a production bundle:
npm run tauri:buildBuild a specific macOS target:
npm run tauri build -- --target aarch64-apple-darwin
npm run tauri build -- --target x86_64-apple-darwinThe Tauri bundle config currently targets all and uses generated icons from:
src-tauri/icons/32x32.pngsrc-tauri/icons/128x128.pngsrc-tauri/icons/128x128@2x.pngsrc-tauri/icons/icon.icnssrc-tauri/icons/icon.ico
GitHub Actions currently builds Apple desktop artifacts only:
aarch64-apple-darwinx86_64-apple-darwin
Vaise stores cheat sheets in the app data directory under:
<app data dir>/cheatsheets
In the frontend fallback state, the expected macOS path is shown as:
~/Library/Application Support/com.vaise.app/cheatsheets
On first launch, Vaise:
- creates the
cheatsheetsdirectory if it does not exist - checks whether any
.jsonfiles already exist - writes default cheat sheets only when the directory is empty
Files are loaded from that directory at runtime, parsed as JSON, and sorted by cheat sheet name.
The app currently seeds these examples:
VS CodeFigmaTerminaltmux
The tmux sheet is the largest sample and includes multi-step bindings and command-style entries.
Each cheat sheet is a JSON file with this shape:
{
"id": "vscode",
"name": "VS Code",
"icon": "code",
"tags": ["editor", "typescript"],
"entries": [
{
"id": "command-palette",
"name": "Command Palette",
"action": "Open the command palette",
"command": ["Cmd", "Shift", "P"],
"aliases": ["palette", "commands"],
"tags": ["search"]
}
]
}id: stable identifier, also used for the default filenamename: display nameicon: optional short icon token used by the UItags: optional cheat sheet tags used in searchentries: list of commands or actions
id: stable entry identifiername: display labelaction: human-readable descriptioncommand: optional single key combo as a string arraycommandText: optional literal command stringcommandSequence: optional array of combos or stepsaliases: optional alternate search termstags: optional entry tags
Vaise supports three practical entry styles:
Single shortcut:
{
"id": "command-palette",
"name": "Command Palette",
"action": "Open the command palette",
"command": ["Cmd", "Shift", "P"]
}Literal command text:
{
"id": "new-session",
"name": "New Session",
"action": "Start a new tmux session",
"commandText": "tmux new-session"
}Multi-step sequence:
{
"id": "copy-properties",
"name": "Copy and Paste Properties",
"action": "Copy properties and paste them elsewhere",
"commandSequence": [
["Option", "Cmd", "C"],
["Option", "Cmd", "V"]
]
}When copying an entry:
commandTextis preferred if present- otherwise
commandis serialized asKey+Key+Key - otherwise
commandSequenceis serialized as comma-separated steps
Search is implemented in the frontend with a lightweight ranking function.
It:
- normalizes text to lowercase
- removes accents/diacritics
- rewards exact matches most strongly
- then prefix matches
- then substring matches
- then ordered character matches
The top matching items are sorted by descending score.
The React app:
- loads cheat sheets from Tauri on startup
- falls back to hardcoded demo data outside the Tauri runtime
- listens for a
vaise://focus-searchevent so the input focuses when the window opens - uses
useDeferredValueto keep search responsive - copies selected commands with the Clipboard API
Relevant files:
The Rust side:
- resolves the app data directory
- creates and seeds the cheat sheet folder
- reads and deserializes JSON files
- registers the global shortcut
- manages tray icon/menu behavior
- shows, hides, and focuses the launcher window
- emits the search-focus event to the frontend
Main backend file:
Vaise includes:
- a generated app icon set for bundling
- a tray icon bitmap used at runtime
- the vector source used to derive the icon set
Relevant files:
If you want to regenerate icons, the Tauri CLI supports:
./node_modules/.bin/tauri icon src-tauri/icons/app-icon.svg -o src-tauri/icons- Cheat sheets are file-based only; there is no editor UI yet.
- Invalid JSON files will fail loading.
- The launcher currently ships with a macOS-oriented global shortcut and window behavior.
- The frontend fallback path is informational; the real path comes from Tauri at runtime.
No license file is currently included in this repository.