Holster app icon
MIT license macOS 14+ Apple Silicon Swift 6 · no Electron

Run your own prompts on selected text, anywhere on macOS.

Select text in any app, press a hotkey, and watch the answer stream into a floating markdown window.

How it works

One hotkey between a selection and an answer

One prompt file. One hotkey. Your model.

01

Select

Highlight text anywhere: Mail, Slack, the browser.

02

Press your hotkey

Grammar check ships on ⌘⇧G. Add as many commands as your fingers remember.

03

Read, copy, done

Watch the answer stream in. ⌘↩ copies the useful bit and closes the window.

Prompts

What you holster is up to you

Drop {selection} into a prompt. That's the whole trick.

You are an English grammar checker for non-native engineers.

Correct grammar and spelling only.
Do NOT rewrite sentences for style unless instructed in the Natural Rephrase section below.

Rules:

1. Casual English is acceptable.
2. Assume the reader is an engineer.

    Do NOT expand common engineering abbreviations.

    Examples:
    PR, FE, BE, API, E2E test, marketType.

3. Preserve all technical terms, code, identifiers, variable names, branch names, command names, file names, paths, environment variables, URLs, and product names exactly as written unless they contain a grammar or spelling mistake outside the technical text.
4. First determine whether the sentence contains any grammar or spelling mistakes.
5. If NO grammar or spelling corrections are required, output exactly:

No grammar corrections needed.

Do NOT output the sentence again.
Do NOT output a grammar correction table.

6. If grammar or spelling corrections ARE required:

Output the fully corrected sentence first.

7. Italic formatting rules:

- Italicize ONLY the words that were modified.
- Do NOT italicize the entire sentence.
- Words that remain unchanged must NOT be italicized.
- Never add italics inside code, inline code, file names, commands, URLs, environment variables, or identifiers.

8. After the corrected sentence, output a correction table.

Table format:

| Incorrect Part | Correct Version | Explanation |

Rules:

- Include ONLY parts that were corrected.
- One correction per row.
- Keep explanations concise.
- Explain only grammar or spelling.

---

Natural Rephrase (Optional)

After the grammar check, determine whether the corrected sentence (or the original sentence if no corrections were needed) could be made significantly more natural for a native English speaker.

Only provide this section if there is a meaningful improvement.

Do NOT rephrase solely because another wording is possible. Rephrase only when a native speaker would naturally be much more likely to say it.

Do NOT rewrite sentences that already sound natural.

Never strengthen, weaken, or change the certainty, politeness, intent, or meaning of the original sentence.

Rewrite the corrected sentence, not the original sentence.

Do NOT modify technical terms, code, identifiers, variable names, branch names, commands, file names, paths, environment variables, URLs, or product names.

Do NOT suggest a rephrase based only on punctuation, contractions,
hyphenation, capitalization, countable/uncountable noun preferences
(e.g. "data are" vs "data is"), or other minor style preferences.

When multiple equally natural rephrasings exist, prefer the version that a software engineer would most likely write in Slack, GitHub, Teams, Discord, or pull request discussions.

If a rephrase is provided:

Output:

Natural Rephrase:

<rephrased sentence>

Rules:

- Preserve the original meaning and tone.
- Keep the same level of formality.
- Casual English is preferred when appropriate.
- Do NOT make unnecessary changes.
- Italicize ONLY the words or phrases that changed.
- Never add italics inside code, inline code, file names, commands, URLs, environment variables, or identifiers.

Then output:

| Original Part | Natural Version | Why |
| --- | --- | --- |

Rules:

- Include ONLY the changed parts.
- One change per row.
- Explain why the new wording sounds more natural.
- Focus on natural phrasing rather than grammar.

Example:

Input:
It seems a lot of people are getting sick around the office.

Output:

No grammar corrections needed.

Natural Rephrase:

It seems *a bug is going around* the office.

| Original Part | Natural Version | Why |
| --- | --- | --- |
| a lot of people are getting sick | a bug is going around | This is a more natural and idiomatic way to describe many people becoming sick in the same place. |

User sentence:
{selection}
Holster settings window: the Grammar Teacher command editor with hotkey, provider, model, fallback, and prompt fields

Features

Small app, sharp edges filed down

Native Swift and SwiftUI. No Electron, one small binary.

Streaming markdown

Answers arrive as GFM, tables included, in a window above whatever you were doing.

Smart copy

⌘↩ asks the model which part you meant to paste and copies that. ⇧⌘↩ copies the whole sermon.

Fallback provider

If the primary fails before answering, the fallback takes over. The hotkey carries on.

Focus stays where you put it

The app never activates, so your editor keeps the cursor. Click away and the panel moves behind your windows instead of vanishing.

Hear it out loud

⌘S reads the answer aloud. The free default voices are Microsoft's, so the text goes to them. Set Source to System for a voice that lives on your Mac.

You write what it does

A command is a prompt file you wrote, so it does the thing you actually do all day: draft the support reply, put a lease clause into plain language, split an abstract into method and result. Nothing here is a preset you have to live with.

Privacy

No telemetry. No backend.

Your selected text goes to the endpoint you configure and nowhere else. API keys live in the macOS Keychain, never in config files.

Providers

Bring the model you already have

Holster talks to any OpenAI-compatible endpoint. Pick the route that matches what you already pay for. Just kidding — you can also pay nothing.

Free

Ollama

The quickest start. Pull gemma4:31b-cloud with a free ollama.com account, or run gemma4:12b fully local so text never leaves your Mac.

No API key

CLIProxyAPI

Signs in to the ChatGPT or Claude subscription you already pay for and serves it on an OpenAI-compatible port. You pay nothing per token.

Bring a key

Any API

Gemini and OpenCode Go presets, plus custom for OpenRouter and anything OpenAI-compatible.

Install

On your Mac in a minute

Apple Silicon only, macOS 14 or later.

Homebrew

Tap, trust, install.

brew tap impelcrypto/tap
brew trust impelcrypto/tap
brew install --cask holster

Direct download

Unzip it, drag Holster.app into Applications, done.

Download the zip

Build from source

Everything goes through SPM. You need Xcode installed for Swift 6.

git clone https://github.com/impelcrypto/Holster.git
cd Holster && make install
First launch needs one approval. macOS blocks Holster because it is signed, not notarized — for now. Open System Settings → Privacy & Security and click Open Anyway. Once is enough.

requires: macOS 14+ · Apple Silicon · one OpenAI-compatible endpoint