Added a preparation section with details for nerds.
ai-controller
sudo pacman -S python3-gi gir1.2-gtk-4.0
~/.config/capture-ai/env.sh --> export OPENROUTER_API_KEY="sk-or-v..."
$capture-ai = /home/$USER/capture-ai/capture-ai.sh
bind = $mainMod SHIFT, Q, exec, $capture-ai image
bind = $mainMod, Q, exec, $capture-ai text
Offline Voice for Linux
🎤 pw-record / arecord
⬇
📄 WAV dosyası
⬇
🧠 whisper-cli
⬇
✍ Metin
sudo pacman -S --needed git cmake make gcc pipewire wireplumber alsa-utils
paket kontrol
command -v pw-record || echo "pw-record yok"
command -v arecord || echo "arecord yok"
git clone https://github.com/ggml-org/whisper.cpp.git
cd whisper.cpp
cmake -B build
cmake --build build -j --config Release
ls build/bin
#... whisper-cli, main, whisper-server, ...
Tiny model indirme (hafif, düşük CPU)
mkdir -p ~/.local/share/whisper
wget -O ~/.local/share/whisper/ggml-tiny.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny.bin
paket test
ls -l ~/whisper.cpp/build/bin/whisper-cli
ls -lh ~/.local/share/whisper/ggml-tiny.bin
Manual test (çalıştığını doğruladık)
/home/bob/whisper.cpp/build/bin/whisper-cli \
-m /home/bob/.local/share/whisper/ggml-tiny.bin \
-f /tmp/capture-ai-mic-20260228-205753.wav \
-l tr
Roadmap
- Use reference trees
- Dark/Light themes
- Copiable code blocks
- Regenerate
- Enter input with your voice -Speech to text(online or local)-
🔎 Preparation
For Nerds
1. Chat management Create new chats (chat_1.json, chat_2.json, …) Switch between chats Delete chat (with confirmation) Rename chat (popover) Pin/unpin chats (📌) Sorting: pinned first, then most recently modified-
Persistent settings (config.json) Remember last opened chat (last_chat) Dark/light theme (dark_mode) Pinned chats (pinned_chats) Model list (ai_models) Per-chat model mapping (chat_models) Store OpenRouter key (open_router_key) Mic mode online/offline (is_mic_online) Online STT model (stt_model_online) Offline whisper.cpp paths (whisper_cpp_bin, whisper_cpp_model)
-
Sidebar UI Collapse/expand sidebar (☰) Toggle Chats list Toggle AI Models list
-
Model management (per chat) Separate active model per chat Selecting a model assigns it to the current chat LRU behavior: recently chosen model moves to top Delete models (cannot delete the last remaining model) If a model is deleted, affected chats fall back to default (self-heal) “AI Models +” to add a model (dialog + OpenRouter models link)
-
Message selection mode Click to select one or multiple messages Selection counter bar Clear selection (✕) Selected bubbles get an outline
-
Reference trees (reference chain expansion) Expands used_refs recursively (references of references) Ensures context (including images/refs) isn’t lost Stores: used_refs (indices sent to AI) refs_groups (UI reference preview groups)
-
Reference trees (reference chain expansion) Expands used_refs recursively (references of references) Ensures context (including images/refs) isn’t lost Stores: used_refs (indices sent to AI) refs_groups (UI reference preview groups)
-
Regenerate (♻) Appears only when exactly one bubble is selected If user bubble: re-asks the same prompt If bot bubble: finds preceding user prompt + rewrites a similar answer Regenerated prompts are marked (regen) with a distinct style Keeps reference trees during regeneration
-
Copy (📋) Appears only on the single selected bubble If message contains copy ... copy, copies only the inner block Otherwise copies full message
-
Code block detection Messages wrapped by copy markers render as a code-style block Code block includes a “Copy” button overlay
-
Image sending / preview Supports a pending image preview before sending Saves image path into chat history Shows a small image preview in message bubbles Clears preview after sending
-
Typing indicator Animated “Thinking…” while AI is running Removed when response arrives
-
Scroll behavior Floating scroll-to-bottom button (↓) appears when not at bottom Clicking scrolls to bottom and re-enables auto-scroll Button visibility updates based on scroll position (You also tuned behavior to scroll only on regenerate)
-
Input shortcuts Enter to send Shift+Enter for newline Added: Ctrl+C / Ctrl+V / Ctrl+X / Ctrl+A
-
Voice-to-text input 🎤 to start recording, ⏹ to stop Uses pw-record if available, otherwise arecord (Linux) After stop, transcribes (offline/online) and appends text into input
-
Offline STT (whisper.cpp) Uses whisper-cli + ggml-tiny.bin for low CPU transcription Reads .txt output (stdout fallback)
-
Online STT (OpenRouter) If is_mic_online: true, transcribes via OpenRouter Sends base64 WAV as input_audio Model selected via stt_model_online