Menu-bar text-polish tool that rewrites your clipboard with a local Ollama model. One global shortcut, seven presets, zero cloud.
Pebble lives in your menu bar. Press Cmd+Alt+P anywhere on your machine and whatever's on your clipboard gets rewritten by a local LLM β fix grammar, make it concise, formalize for an email, convert to bullets, or sharpen a vague prompt before sending it to an LLM. Polished text replaces the clipboard. Cmd+V to paste.
Nothing leaves your machine. No accounts, no telemetry, no cloud API.
- πͺ¨ One global shortcut β
Cmd+Alt+P(configurable). Works in any app. - π Preset dropdown β Polish, Concise, Formal, Friendly, Fix typos, Bullets, Prompt enhance. Last selection persists across sessions and is what the global shortcut uses.
- π 100% local β talks only to Ollama on
127.0.0.1. No cloud fallback. - π Menu-bar only β no dock icon, no main window. Hides on blur.
- π Cross-platform β macOS (primary), Windows, Linux.
- π§± Tiny code surface β Electron + React + ~600 lines of TypeScript. Easy to fork and modify.
- Node.js 20+
- Ollama running locally
- A chat-capable Ollama model (default:
qwen3-coder:30b)
git clone https://github.com/gashiartim/pebble.git
cd pebble
npm install
cp .env.example .env
# Pull a model β default is qwen3-coder:30b
ollama pull qwen3-coder:30b
npm run devnpm run build:mac # β dist/Pebble-1.0.0.dmg
npm run build:win # β dist/Pebble-1.0.0-setup.exe
npm run build:linux # β dist/Pebble-1.0.0.AppImageThe .dmg is unsigned (no Apple Developer ID). Personal-install on macOS:
ditto dist/mac-arm64/Pebble.app /Applications/Pebble.app
xattr -cr /Applications/Pebble.app
codesign --force --deep --sign - /Applications/Pebble.app
open /Applications/Pebble.appThe codesign step is required on macOS 15+ β without it the embedded Electron Framework's ad-hoc signature mismatches the main binary's and the app refuses to launch (Library not loaded ... different Team IDs).
All env vars are optional β Pebble has sane defaults baked in. Override in .env:
OLLAMA_HOST=http://127.0.0.1:11434 # default
POLISH_MODEL=qwen3-coder:30b # any chat-capable Ollama model
PEBBLE_POLISH_SHORTCUT=CommandOrControl+Alt+P| Model | Size | Quality | Speed (M-series) |
|---|---|---|---|
qwen3-coder:30b |
18 GB | Best (default) | Fast |
qwen2.5:14b |
9 GB | Very good | Faster |
llama3.1:8b |
5 GB | Good | Fastest |
gemma4:latest (8B) |
9.6 GB | Good | Fast |
Smaller models still work for short messages but lose nuance on longer rewrites and on the Prompt enhance preset (which depends on instruction-following discipline).
- Copy text in any app (
Cmd+C). - Press
Cmd+Alt+P. - Wait ~1β3 seconds for the "β Polished" notification.
- Paste with
Cmd+V.
The shortcut uses whichever preset you last picked in the panel.
Click the menu-bar icon to open the panel. Pick a preset from the dropdown, paste text in the textarea, hit ββ΅ (or click the button). The polished result replaces the textarea content and is auto-copied to your clipboard.
| Preset | What it does |
|---|---|
| Polish | Clean grammar and style, keep tone |
| Concise | Same meaning, fewer words |
| Formal | Business / client-facing email tone |
| Friendly | Casual, warm β Slack / team |
| Fix typos only | Minimal change, preserves voice |
| Bullets | Rewrite as a bullet list |
| Prompt enhance | Sharpen a vague LLM prompt |
Adding your own preset is one append to src/main/presets.ts β see CONTRIBUTING.md.
| File | Purpose |
|---|---|
src/main/index.ts |
Electron main: tray, panel window, IPC, global shortcut, notifications. |
src/main/polish.ts |
Ollama chat call with the selected preset's system prompt. |
src/main/presets.ts |
Preset definitions. Single array β first entry is the default. |
src/preload/index.ts |
Bridge: window.pebble.{polish, getPresets, quit}. |
src/renderer/src/Polish.tsx |
Preset dropdown + textarea + button. |
PRs welcome. Read CONTRIBUTING.md for the bar and the no-go list (no cloud LLMs, no Tailwind, no telemetry, etc.).
By contributing you agree to follow the Code of Conduct.
See SECURITY.md for vulnerability reporting.
MIT β do whatever you want with it, just keep the copyright notice.