macOS menu-bar app: select text anywhere → press a hotkey → pick a tone → get a rewrite pasted back in place.
Bring your own API key. Keys stay on your machine.
Grab the latest macOS .dmg from
GitHub Releases,
or build from source (next section).
Use v0.1.2 or newer. Earlier builds had bugs with packaged automations, empty API base URLs, and HTTPS on work networks (details in Troubleshooting). v0.1.2 adds rich Markdown paste (bold, lists, quotes).
npm run tauri build
# DMG: src-tauri/target/release/bundle/dmg/*.dmg
# Rename for a stable asset name, e.g. Inline-Vocab-0.1.2-aarch64.dmg
gh release create v0.1.2 \
--title "v0.1.2" \
--notes "Rich Markdown paste (bold, italic, lists, quotes)." \
"path/to/Inline-Vocab-0.1.2-aarch64.dmg"- Works in Slack, Mail, Notes, and most other Mac apps
- Providers: OpenAI, Grok (xAI), Claude (Anthropic), OpenRouter, or a custom OpenAI-compatible endpoint
- Tone picker: Professional, Casual Slack, Concise, Friendly
- Rich paste: rewrites can include bold, italic, bullets, numbered lists, and block quotes (Markdown → HTML clipboard)
- YAML automations you can extend later
- Your API key is stored only in
~/Library/Application Support/Inline Vocab/settings.json - There is no Inline Vocab backend. Keys are sent only to the provider you select, when you rewrite text.
- Never commit that settings file.
Requirements: macOS 13+, Node.js 20+, Rust
git clone https://github.com/stephin007/inline-vocab.git
cd inline-vocab
npm install
npm run tauri buildThen open the app from:
src-tauri/target/release/bundle/macos/Inline Vocab.app
Or copy it to /Applications.
Unsigned downloads are blocked by macOS. Use one of these:
- Open panel: right-click Inline Vocab → Open → click Open in the dialog
- “Damaged and can’t be opened” (right-click does not work) — run:
xattr -cr "/Applications/Inline Vocab.app"
open "/Applications/Inline Vocab.app"Always install to Applications first; don’t launch from the DMG volume.
npm install
npm run tauri dev- Open Inline Vocab (menu bar icon)
- System Settings → Privacy & Security → Accessibility → enable Inline Vocab
(fortauri dev, enable your Terminal / Cursor instead) - In Settings: pick a provider → paste API key → choose a model → Save
- Select text anywhere → press ⌘⇧E → choose a tone
Saving Settings writes both the API key and the provider base URL (for example https://api.openai.com/v1). The key alone is not enough.
| Step | Action |
|---|---|
| 1 | Select text |
| 2 | Press ⌘⇧E |
| 3 | Pick a tone (last-used is preselected; Esc cancels) |
| 4 | Rewritten text replaces the selection |
| Item | Path |
|---|---|
| API key, provider, model, base URL | ~/Library/Application Support/Inline Vocab/settings.json |
| Automations | ~/Library/Application Support/Inline Vocab/automations/ |
In Finder: ⌘⇧G → paste ~/Library/Application Support/Inline Vocab/
Important: Settings are loaded into memory at launch. Quit the app before hand-editing settings.json, then reopen. If the app is running when you edit the file, the next tone apply can overwrite your edits from stale memory.
Example settings.json:
{
"provider": "openai",
"api_key": "sk-...",
"model": "gpt-4o-mini",
"api_base_url": "https://api.openai.com/v1",
"last_tone_id": "professional",
"status_message": null
}Defaults ship in automations/ and are bundled into the .app. On first launch they are copied into Application Support so you can edit tones without rebuilding.
See automations/polish-vocab.yaml for the built-in rewrite flow.
If Settings says “No automations loaded yet”, check that folder for polish-vocab.yaml. You can copy it from the repo’s automations/ directory as a temporary workaround, then quit and reopen the app.
Cause (fixed in v0.1.1): packaged builds looked for YAML under the developer’s source path, which does not exist on other machines. Seeding into Application Support failed.
Fix: upgrade to v0.1.1+, or manually copy automations/polish-vocab.yaml into
~/Library/Application Support/Inline Vocab/automations/ and relaunch.
Cause (fixed in v0.1.1): api_base_url was empty, so the app called bare chat/completions instead of https://api.openai.com/v1/chat/completions. Saving only an API key (or an older settings shape) could leave the base URL blank.
Fix:
- Open Settings → re-select your Provider (this fills the default base URL) → Save
- Quit Inline Vocab fully and reopen
- Confirm
api_base_urlinsettings.jsonstarts withhttps://
Cause (fixed in v0.1.1): HTTP used rustls with bundled roots and without macOS system proxy support. Terminal curl uses Keychain CAs and the system proxy, so it can succeed on work networks while the app fails (TLS interception / corporate proxy).
Fix: use v0.1.1+ (native cert store + macOS system proxy). If it still fails, the status message now includes the full URL and underlying error — paste that when filing an issue.
Open the app once first. For tauri dev, grant Accessibility to Terminal or Cursor, not only to Inline Vocab.
npm run tauri dev # run from source
npm run tauri build # package .app + .dmg- Tauri 2 + Rust
- React + TypeScript
- Provider APIs: OpenAI-compatible chat completions + Anthropic Messages
See CONTRIBUTING.md.
