Korvus AI popup: selected text → Claude, OpenAI, local models. Tray, streaming, two languages.
Project description
kortalk
Korvus AI popup — part of the korvus family apps. An AI popup for selected text in the spirit of Crow Translate: select text with the mouse → press a hotkey → a window with the AI response pops up near the cursor. Lives in the tray, streams responses, supports multiple providers.
Features
- Popup near the cursor — rounded corners, Markdown rendering with
highlighted code blocks, real-time token streaming, text
selection/copying, draggable by the mouse. Closes on an outside click or
Escape. - Two-column window — editable prompt+text on the left, response on the
right, provider selector in the toolbar,
Ctrl+Enterto send. - Tray — the application is resident: a monochrome raven icon (Corvus — the korvus emblem), left click = open the two-column window, a menu with the prompt library, a popup with the selection, settings and quit.
- Global hotkeys inside the application — one prompt-to-key table in
Settings → Prompts: each prompt has its own hotkey that opens the popup
with that prompt and the current selection (the default prompt, "Explain",
ships with
Ctrl+Alt+C), plus a separate hotkey to open the two-column window (Ctrl+Alt+Wby default). X11 — direct XGrabKey interception, Wayland — the system GlobalShortcuts portal. No external tools or DE configuration required. - Prompt library — any number of named prompts in Settings, each with its own hotkey and reachable from the tray submenu; one is marked as the default (used by the prompt's own popup hotkey).
- AI providers:
- Claude Code CLI — via
claude -p, no API key (default); - Anthropic API — official SDK, streaming (API key required);
- OpenAI-compatible APIs — OpenAI, Ollama, LM Studio, OpenRouter,
Groq, DeepSeek and any other service with
/chat/completions(configured withbase URL+ model + key; local servers need no key).
- Claude Code CLI — via
- Graphical settings — prompts, hotkeys, theme, font, popup sizes,
timeouts, a provider manager with keys, autostart at login.
The config is human-readable YAML (
~/.config/kortalk/config.yaml). - Theme and fonts — follows the environment theme (Qt) by default, optionally Nord Dark / Nord Light.
- Two interface languages — English (default) and Russian: Settings → General → Language.
- PRIMARY selection is read natively via Qt — xclip/xsel/wl-clipboard are not needed. Works on X11 and Wayland.
Installation
pipx install kortalk
kortalk --check # diagnostics: providers, tray, PRIMARY selection
No system packages or flags like --system-site-packages are required —
Qt (PySide6) comes from PyPI. The only external dependency is
Claude Code CLI, and only if you use the
claude-cli provider.
The config lives in
~/.config/kortalk/config.yamland is edited via Settings (or by hand). Configs of older versions (toml/ini) are not used.
Usage
kortalk # start the daemon (tray + hotkeys)
kortalk --popup # popup near the cursor (for scripts/external hotkeys)
kortalk "Translate to English:" # popup with a one-off prompt
kortalk --window # two-column window (alias: --split)
kortalk --provider ollama # one-off request through a specific provider
kortalk --settings # settings
kortalk --quit # quit the running instance
kortalk --check # diagnostics
The main scenario: kortalk starts the daemon, everything else is done
from the tray and via global hotkeys. The CLI flags are kept for scripting —
they are delivered to the running instance instantly over a local socket.
The text is taken from the PRIMARY selection — selecting it with the mouse is enough, no Ctrl+C needed.
Hotkeys
Assigned in Settings → Prompts — the "Open window" hotkey at the top of the tab, and one hotkey per prompt in the list below it. All of them work globally:
- X11 — the application grabs the keys directly (XGrabKey), works in any WM/DE without configuration.
- Wayland — the XDG Desktop Portal (GlobalShortcuts) is used;
GNOME/KDE will show a binding confirmation dialog. If the portal is not
available (minimalist compositors) — use the tray or bind
kortalk --popupto a hotkey in your compositor.
Provider setup
kortalk --settings → Providers tab. Examples:
| Provider | Type | Base URL | Model |
|---|---|---|---|
| Claude Code CLI | claude-cli | — | (empty = CLI default) |
| Anthropic API | anthropic | — | claude-opus-4-8 |
| OpenAI | openai | https://api.openai.com/v1 |
gpt-4o |
| Ollama | openai | http://localhost:11434/v1 |
llama3, qwen3, … |
| LM Studio | openai | http://localhost:1234/v1 |
name of the loaded model |
| OpenRouter | openai | https://openrouter.ai/api/v1 |
anything from the catalog |
The "active provider" is used by default for the popup; in the window the
provider is picked from a dropdown, for one-off requests — with
--provider <id>.
Autostart
Settings → General → "Start at login" — creates
~/.config/autostart/kortalk.desktop running kortalk.
Development
git clone https://github.com/r4ven-me/kortalk && cd kortalk
python -m venv .venv && . .venv/bin/activate
pip install -e '.[test]' ruff
ruff check . # linter
QT_QPA_PLATFORM=offscreen pytest # tests (headless)
QT_QPA_PLATFORM=offscreen kortalk --check # headless diagnostics
Layout: src/kortalk/ — app.py (CLI, tray, IPC),
providers.py (AI workers), hotkeys.py (XGrabKey / portal),
windows.py (popup and main window), settings_dialog.py, config.py,
theme.py.
Logs of the running application: ~/.local/state/kortalk/kortalk.log
(verbose output — the --debug flag).
Credits
The tray/window raven icon is based on the "raven" icon from SVG Repo, recoloured at runtime to match the active theme.
License
MIT, see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kortalk-0.5.8.tar.gz.
File metadata
- Download URL: kortalk-0.5.8.tar.gz
- Upload date:
- Size: 45.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1ba2367654d305df7c34c4ea6ab43210b3ed256dd526f7ac71766f3d247a09c
|
|
| MD5 |
a63005ade3f5fc46188d29dc939a1cfd
|
|
| BLAKE2b-256 |
d174288a95385600b5ad5db0235c6ce9df183fa4d2d366a98e2746cbb4d945f6
|
Provenance
The following attestation bundles were made for kortalk-0.5.8.tar.gz:
Publisher:
publish.yml on r4ven-me/kortalk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kortalk-0.5.8.tar.gz -
Subject digest:
d1ba2367654d305df7c34c4ea6ab43210b3ed256dd526f7ac71766f3d247a09c - Sigstore transparency entry: 2207918867
- Sigstore integration time:
-
Permalink:
r4ven-me/kortalk@c4322cf861efd82adfaa39926774edd890d32162 -
Branch / Tag:
refs/tags/v0.5.8 - Owner: https://github.com/r4ven-me
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c4322cf861efd82adfaa39926774edd890d32162 -
Trigger Event:
push
-
Statement type:
File details
Details for the file kortalk-0.5.8-py3-none-any.whl.
File metadata
- Download URL: kortalk-0.5.8-py3-none-any.whl
- Upload date:
- Size: 41.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
26d74030e5b3a0d07d826d8642e8b7266531338b2a6a2cefde0b13933114b4a2
|
|
| MD5 |
70a1e26caa32b6e5b7374876a1c3a0d9
|
|
| BLAKE2b-256 |
05d2dcf7c106331e8a4e4fe68575dcff305c103d660b3fa23200a41de471f33a
|
Provenance
The following attestation bundles were made for kortalk-0.5.8-py3-none-any.whl:
Publisher:
publish.yml on r4ven-me/kortalk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kortalk-0.5.8-py3-none-any.whl -
Subject digest:
26d74030e5b3a0d07d826d8642e8b7266531338b2a6a2cefde0b13933114b4a2 - Sigstore transparency entry: 2207918972
- Sigstore integration time:
-
Permalink:
r4ven-me/kortalk@c4322cf861efd82adfaa39926774edd890d32162 -
Branch / Tag:
refs/tags/v0.5.8 - Owner: https://github.com/r4ven-me
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c4322cf861efd82adfaa39926774edd890d32162 -
Trigger Event:
push
-
Statement type: