GhostPen

Guide

Install GhostPen, set up your AI, and use it in every app.

Install

Download the file for your system from the download section or the GitHub releases.

  • Linux: the .deb (Debian, Ubuntu) and .rpm (Fedora, openSUSE) install GhostPen with what it needs (GTK 4, WebKitGTK 6.0). The AppImage runs without installing, on a system that has those libraries. They run captions, dictation and Built-in models on the GPU through Vulkan (any GPU vendor). With an NVIDIA GPU (RTX 20xx or newer) and the CUDA 13 runtime installed (Arch: cuda; others: NVIDIA’s CUDA packages), the NVIDIA CUDA downloads are 10–20% faster; without the runtime they use Vulkan too, and they update to CUDA builds.
  • Windows: run the installer; it installs for your user, no administrator needed. Captions, dictation and Built-in models run on any GPU through Vulkan (the CPU without a Vulkan driver). Windows may warn about an unknown publisher until the installer is code-signed: choose More info → Run anyway.
  • macOS: open the .dmg and drag GhostPen to Applications. The app isn’t notarized by Apple yet, so the first start is blocked (“Apple could not verify GhostPen…”): choose Done, then System Settings → Privacy & Security → Open Anyway and confirm. (Or, in Terminal: xattr -dr com.apple.quarantine /Applications/GhostPen.app.) Then macOS asks for Accessibility, which GhostPen needs to copy your selection and paste the result.

GhostPen starts in the tray (menu bar on macOS). Its menu has Dictation, Captions, Playground and Settings.

Set up your AI

GhostPen needs a model to talk to. In Settings → AI Profiles, a profile runs on one of two things:

  • Built-in: GhostPen runs the model itself, with the llama.cpp compiled into it. Nothing is sent over the network and no other software is needed. Download a model in Settings → Built-in models and press Use: this creates a Built-in (GhostPen) profile and makes it active.
  • An AI endpoint: any OpenAI-compatible API. Presets fill in Ollama (http://localhost:11434/v1), LM Studio, OpenAI, OpenRouter and Groq; Fetch models lists what the endpoint offers.

You can keep several profiles and switch between them; the menu shows which one is active.

Built-in models

ModelSizeGood for
Qwen3.5 2B1.3 GBthe fastest; fine for proofreading
Gemma 3 4B2.5 GBa good all-rounder, many languages
Qwen3.5 4B2.7 GBbalanced
Gemma 4 E4B5.0 GBrecommended
Qwen3.5 9B6.0 GBthe best quality; needs about 8 GB of GPU memory

Downloads can be paused and resumed, and are checked against the SHA-256 that Hugging Face publishes. GGUF models already downloaded by LM Studio are found and offered too.

The model runs on the GPU when there is one (on Linux through Vulkan, on any GPU vendor; Metal on macOS; CUDA in a -Dcuda build): as many of its layers as the free GPU memory holds, the rest on the CPU. Runner settings: the context window (8k tokens by default), the GPU on or off, and how long the model stays loaded after its last use (10 minutes; it loads again in a few seconds).

Use it

In any app

  1. Select text.
  2. Press Ctrl+Shift+A (or click the tray icon).
  3. Pick an action with the mouse or its number key.

The result replaces your selection, and your clipboard is restored afterwards. Intensity (Subtle, Balanced, Strong) sets how far a rewrite goes. The prompt bar at the bottom takes any instruction (“make it a bulleted list”, “answer politely”). Press Esc to close the menu, or to stop an answer the built-in model is still writing.

Your own actions (Settings → Custom Actions) appear in the menu and the Playground next to the built-in ones.

Playground

A window to try actions on text you paste, with the answer streaming in. Open it from the tray or the flask icon in the menu.

Live captions

Ctrl+Shift+L shows subtitles for what your computer plays, transcribed on your machine by whisper. Pick the whisper model in Settings → Live Captions (small is a good choice on a GPU) and download it once. Captions can be translated to English by whisper, or to any language by your AI profile. On macOS, captions need a loopback device such as BlackHole to hear the system audio.

Meetings

Turn on 🎙 Meeting in the captions bar, then Start. The captions also record what your computer plays and your microphone (shown as “Me”), and label the other speakers by voice as they talk. Stop & save (or Esc, or the hotkey) saves the meeting: the whole audio is transcribed again with the time of each word, the speakers are told apart by voice, and your AI profile proofreads it into a clean text with a title. A notification says when it’s ready.

Tray → Meetings lists them. Press play and the word being said is highlighted; click a line to play from it, double-click to edit it. Click a speaker to rename them (every line follows); their menu merges them into another speaker or remembers their voice, so later meetings name them by themselves. Copy gives the clean text, Markdown or subtitles; Redo proofreads or finds the speakers again; right-click a meeting to rename or delete it.

The Summary tab writes an overview, key points, decisions and action items with your AI profile (a long meeting is read in parts first), and under it you can ask your own questions, such as What did Alex say about me? Answers cite the times they come from and are saved with the meeting; 🔊 Read reads the summary or an answer aloud.

Use a headset if you can: through speakers the microphone hears the call too. GhostPen drops those lines (same words, same moment), but a headset keeps your track clean. The speaker model (WeSpeaker, 26 MB) downloads the first time a meeting is saved; Settings → Speech → Meetings has the options.

Dictation

Ctrl+Shift+D, speak, then Enter. The transcript is proofread by your AI profile (turn Polish off for the raw text) and copied to the clipboard.

Read aloud

GhostPen reads text aloud with a natural voice (Kokoro) that runs on your computer: nothing is sent anywhere.

  • The Read action: select text, open the menu and pick Read. It reads the selection as it is, with no AI pass, in a voice for the language of the text, which GhostPen works out from the text itself.
  • 🔊 Speak on a result: when the menu shows a result, Speak (or the S key) reads it. A translated result is read in the target language’s voice.
  • The summary window: Read summary and Read page.

Press ■ Stop, S again, or Esc to stop. Long texts are read in sentence chunks, so the voice starts after the first sentence instead of waiting for the whole text.

The first time, GhostPen downloads the voice model (about 135 MB) and a voice for the language (about 0.5 MB each), checked against their SHA-256. Settings → Voices lists them, downloads or deletes them, and shows whether the voice runs on the CPU or the GPU (with a GPU build, through Vulkan or CUDA). Voices: English (US and UK), Spanish, French, Portuguese, Italian, Japanese, Chinese and Hindi. The pronunciation data ships with GhostPen, so no extra package is needed.

From a terminal:

ghostpen --say "Good morning" --lang es --voice ef_dora

The binaries that read aloud include espeak-ng (GPL-3.0-or-later) for pronunciation; GhostPen’s own code stays MIT.

Text from images

Copy an image (a screenshot) and trigger GhostPen: Extract text reads it with a vision model through your profile, and the text becomes the selection. It works with a vision model on an endpoint (e.g. gemma4:e4b in Ollama) or with a built-in model that reads images: every catalog model has an image projector, downloaded with it (or Add image support in Settings → Built-in models for one you already have), and GhostPen runs it on your GPU.

Hotkeys

The three hotkeys are set in Settings → Behaviour. On Wayland they go through the desktop’s GlobalShortcuts portal, which asks you to confirm them the first time. Where there is no portal, bind the command line flags in your compositor instead; a running GhostPen receives them:

ghostpen --trigger      # the menu
ghostpen --voice-input  # dictation
ghostpen --captions     # captions

Hyprland, for example:

bind = CTRL SHIFT, A, exec, ghostpen --trigger

Command line

ghostpen-cli runs an action from a terminal with the same settings:

echo "teh quick brown fox" | ghostpen-cli proofread
ghostpen-cli translate --lang French --stream "Good morning"
ghostpen-cli profiles
ghostpen-cli models

Where things are

LinuxWindowsmacOS
Settings~/.config/dev.ghostpen.Oriel/%APPDATA%\dev.ghostpen.Oriel\~/Library/Application Support/dev.ghostpen.Oriel/
Models (whisper, built-in)~/.local/share/GhostPen/models/%LOCALAPPDATA%\GhostPen\models\~/Library/Application Support/GhostPen/models/
Voices (read aloud)~/.local/share/GhostPen/tts/%LOCALAPPDATA%\GhostPen\tts\~/Library/Application Support/GhostPen/tts/
Meetings~/Documents/GhostPen/Meetings/ (your Documents folder)%USERPROFILE%\Documents\GhostPen\Meetings\~/Documents/GhostPen/Meetings/
Known voices~/.local/share/GhostPen/voices.json%LOCALAPPDATA%\GhostPen\voices.json~/Library/Application Support/GhostPen/voices.json

Settings from the earlier Rust/Tauri GhostPen are imported on the first start, and its downloaded whisper models are reused.

Build from source

GhostPen is built with Oriel:

git clone https://github.com/highercomve/GhostPen
cd GhostPen
oriel doctor --fix   # Zig, Node.js, …
oriel build          # zig-out/bin/ghostpen and ghostpen-cli
oriel build -Dcuda   # with an NVIDIA GPU (needs the CUDA toolkit)
oriel build -Dvulkan # with any GPU through Vulkan (Vulkan headers, glslc)
oriel package        # deb, rpm, AppImage / setup.exe / .app and .dmg