kortalk
Korvus AI chat — part of the korvus family apps. A desktop AI chat for Linux: persistent multi-turn dialogs with Claude, OpenAI-compatible or local models, with session history, file/image attachments and in-conversation search. Lives in the tray, streams responses as they arrive. For a quick one-off question, a lightweight popup — in the spirit of Crow Translate — answers on selected text right near the cursor instead of opening the full window.
Features
- Dialog window — the main surface: a session list of saved
conversations next to a single thread that keeps full multi-turn
context (every earlier turn is resent to the provider),
Ctrl+Enterto send,Ctrl+Fto search the conversation (text and code blocks alike). A pinned "Quick questions" entry is always there too, for one-off messages that shouldn't accumulate context or get saved between restarts. Paste (Ctrl+V), drag and drop, or use the 📎 button to attach images and text files — they go to the model with your next message, on every provider including Claude Code CLI; click an image to open it full-size. A prompt's own provider/model choice (see "Prompt library" below) never overrides what's picked here. - 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
- Prompt library — any number of named prompts in Settings, each with its own global hotkey and reachable from the tray submenu; one is marked as the default. A prompt can pin its popup to a specific provider/model, overriding whatever provider is active — handy for keeping a fast/cheap model on one hotkey and a stronger one on another — without touching the provider selected in the dialog window.
- Popup near the cursor — a quick, secondary way to get a one-off answer on selected text without opening the dialog window: select text with the mouse → press a hotkey → a small window with the streamed response appears right there. Rounded corners, Markdown rendering with highlighted code blocks, text selection/copying, draggable by the mouse and resizable from its edges. Always opens at the size configured in Settings; a manual resize sticks for that popup instead of snapping back as the answer keeps streaming in. Stays on top of every other window and only closes via its own ✕ button — losing focus or clicking outside it does nothing.
- Tray — the application is resident: a monochrome raven icon (Corvus — the korvus emblem), left click = open the dialog 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 dialog window (Ctrl+Alt+Wby default). X11 — direct XGrabKey interception, Wayland — the system GlobalShortcuts portal. No external tools or DE configuration required. - Graphical settings — prompts, hotkeys, theme, font, popup sizes,
timeouts, a provider manager with keys, autostart at login, deleting
all saved dialogs. 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. The tray icon's own colour follows that same theme by default too, or can be pinned to dark/light regardless of it (Settings → General → "Tray icon") — the system tray's own background isn't always the same as the app's theme.
- 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
On X11 (most desktops — not needed on Wayland), Qt's own xcb platform
plugin needs libxcb-cursor0 (Qt ≥ 6.5), which a minimal install may be
missing:
sudo apt install libxcb-cursor0 # Debian, Ubuntu, Mint, ...
sudo dnf install xcb-util-cursor # Fedora
sudo pacman -S xcb-util-cursor # Arch
pipx install kortalk
kortalk --check # diagnostics: providers, tray, PRIMARY selection
No other system packages or flags like --system-site-packages are
required for pipx/pip itself — Qt (PySide6) comes from PyPI. The only
external dependency is Claude Code CLI, and
only if you use the claude-cli provider. kortalk itself checks for
libxcb-cursor0 before starting and prints a plain error (instead of
crashing) if it's still missing.
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 --window # dialog window (alias: --split)
kortalk --popup # popup near the cursor (for scripts/external hotkeys)
kortalk "Translate to English:" # popup with a one-off prompt
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 popup's 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 dialog window picks its provider from a dropdown; the popup uses the
"active provider" by default, unless the prompt it was opened with pins
its own (Settings → Prompts). One-off CLI requests take --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 (dialog window and popup), settings_dialog.py, config.py,
theme.py.
Logs of the running application: ~/.local/state/kortalk/kortalk.log
(verbose output — the --debug flag).
Author
Ivan Cherniy — r4ven.me. Source: github.com/r4ven-me/kortalk.
Credits
The tray/window raven icon is based on the "raven" icon from SVG Repo, recoloured at runtime to match the active theme.
License
GNU General Public License v3.0 or later (GPL-3.0-or-later), see LICENSE.
Release files for kortalk 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| kortalk-1.0.0.tar.gz | 137.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| kortalk-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 247.2 kB
Release files / kortalk-1.0.0.tar.gz
| Download URL | kortalk-1.0.0.tar.gz |
|---|---|
| Size | 137.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f15ab7c1923567b31a489b1b92c930174119986676ea4944b2427f82aac999c6
|
|
BLAKE2b-256 checksum How to use checksums |
6294ff84aa7714d8b67f56b58e182c41888134324ef7a370674196f607af31c7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.
Transparency logRelease files / kortalk-1.0.0-py3-none-any.whl
| Download URL | kortalk-1.0.0-py3-none-any.whl |
|---|---|
| Size | 109.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b1ac13fe8e92f5997e33e0a01ad4619803ecfc9ea91f10463e60e6e5035b79f5
|
|
BLAKE2b-256 checksum How to use checksums |
425b987572c8576128335c5b46f6ceb4f03205ed0df9e704b1baa974b4630a59
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.
Transparency log