Koda π»
Koda is a terminal-native AI coding agent. It runs locally, keeps all data on your machine, and connects to any LLM provider you choose.
Modes at a glance
| Mode | How to invoke | Best for |
|---|---|---|
| Interactive TUI | koda (no args) | Long sessions, iterative coding |
| Headless | koda "prompt" or echo β¦ | koda | Scripts, CI, one-shot tasks |
| ACP server | koda server --stdio | Editor plugins (VS Code, Zed, β¦) |
Quick start
# 1. Open the interactive TUI
koda
# 2. Ask something at the prompt
# > explain why the auth tests are failing
# 3. Type /help inside for keybindings and commands
First run triggers onboarding: Koda looks for a running local model (LM Studio, Ollama) and falls back to prompting for a cloud API key.
Whatβs next
- Jump straight to the CLI reference for all flags
- Read about headless mode for scripting and CI use
- Explore slash commands for everything you can do in a session
- See providers & model aliases to connect your preferred LLM
CLI reference
Flags
| Flag | Env var | Description |
|---|---|---|
-p, --prompt <PROMPT> | Run a single prompt and exit (headless). Use "-" for stdin | |
<PROMPT> (positional) | Same as -p β koda "fix the bug" works | |
-a, --agent <NAME> | Agent definition to use (JSON in agents/, default: default) | |
-s, --resume <ID> | Resume a previous session by ID prefix | |
--model <NAME> | KODA_MODEL | Model name or alias (e.g. claude-sonnet, gemini-flash) |
--provider <NAME> | KODA_PROVIDER | LLM provider (anthropic, gemini, openai, ollama, β¦) |
--base-url <URL> | KODA_BASE_URL | Override the providerβs API base URL |
--max-tokens <N> | Maximum output tokens | |
--temperature <F> | Sampling temperature (0.0β2.0) | |
--thinking-budget <N> | Anthropic extended thinking budget (tokens) | |
--reasoning-effort <L> | OpenAI reasoning effort (low, medium, high) | |
--sandbox <MODE> | KODA_SANDBOX | Bash tool sandbox: none (default), project (restrict writes to project dir + /tmp), or strict (project + deny reads of credential dirs: ~/.ssh, ~/.aws, ~/.gnupg, ~/.kube, ~/.azure, ~/.config/gcloud) |
--output-format <FMT> | Headless output format: text (default) or json | |
--project-root <DIR> | Project root (defaults to cwd) |
Subcommands
| Command | Description |
|---|---|
koda server --stdio | Start ACP server over stdin/stdout (for editors) |
koda server --port <N> | WebSocket ACP server on port N (not yet implemented) |
Headless mode
Headless mode runs a single prompt, prints the answer, and exits. No TUI β the assistantβs reply streams to stdout; tool status goes to stderr.
# Positional prompt (shortest form)
koda "what does this codebase do?"
# Explicit -p flag
koda -p "fix the failing tests"
# Read prompt from stdin (use "-" literally)
koda -p - < my_question.txt
# Pipe into koda β stdin is auto-detected when not a TTY
git diff HEAD~1 | koda
cat error.log | koda
echo "review auth.rs" | koda
# With a model override
koda "explain this" --model gemini-flash
# Capture just the assistant reply (tool status stays on stderr)
koda "list exported functions in lib.rs" > functions.txt
Exit codes
| Code | Meaning |
|---|---|
0 | Turn completed successfully |
1 | Error (API failure, bad config, β¦) |
Approval in headless mode
There is no human to approve tool calls. Koda automatically:
- Approves read-only tools: Read, Grep, Glob, WebFetch
- Approves safe write tools: Write, Edit (files only)
- Rejects destructive Bash commands (
rm -rf,git push --force, β¦) - Skips AskUser questions (prints to stderr, continues with empty answer)
Rejected actions are printed to stderr. The turn still completes with exit code 0 unless the API itself errors.
Output formats
--output-format text (default) β streams the assistantβs reply to stdout
exactly as typed. Tool call summaries go to stderr.
--output-format json β emits a single JSON object after the turn ends:
{
"success": true,
"response": "The exported functions are β¦",
"session_id": "a3f8bc12-β¦",
"model": "claude-sonnet-4-6"
}
File attachment in headless mode
The @file syntax works in headless mode too:
koda "review @src/auth.rs and @tests/auth_test.rs"
Resuming a session in headless mode
# Note the session ID shown in the TUI status bar, then continue from a script
koda -s a3f8bc "run the failing tests and fix them"
Interactive TUI
Run koda with no arguments to open the full-screen TUI.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β [conversation history β scrollable with PgUp/PgDn] β
β β
β β‘ Bash cargo test β
β β running 42 tests β¦ β
β β Bash (exit 0) β
β β
β All tests pass! Here's what I changed in `auth.rs` β¦ β
βββββββββββββββ claude-sonnet Β· auto Β· 34% Β· 8s ββββββββββββββββββββββββββββ€
β > _ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The status bar shows: model Β· approval mode Β· context % Β· elapsed
Layout
- Top panel β conversation history. Scrollable; supports syntax-highlighted code blocks, rendered markdown, and collapsible tool-call summaries.
- Status bar β live view of model, approval mode, context usage, and inference time.
- Input β multi-line editor with history, tab-completion for slash commands
and
@filepaths, and reverse-search (Ctrl+R).
Starting a conversation
Just type and press Enter. Koda streams the response in real time.
While inference is running, Esc or Ctrl+C cancel the current turn.
See slash commands for all in-session commands and keybindings for the full keyboard reference.
File & image attachments
Attaching files
Type @ anywhere in your message to attach files as context:
> explain @src/auth.rs
> compare @old_impl.rs and @new_impl.rs
> what's wrong with @error.log
As you type after @, a fuzzy file picker appears. Press Tab to cycle
through matches or select with Enter. The fileβs full contents are
injected into the message before itβs sent to the model.
Images
For vision-capable models (Claude, Gemini, GPT-4o), attach images directly:
> what does @screenshot.png show?
> explain the architecture in @diagram.png
Supported formats: PNG, JPEG, GIF, WEBP. Images are base64-encoded and sent inline to the model API.
Non-image files (SVG, PDF, etc.) attached via @ are sent as text content,
not as vision input.
Large pastes
Pasting more than ~500 characters into the input is automatically wrapped in a reference block to keep prompts clean:
> [pasted 1,234 chars β attached as reference]
> what's the bug in this code?
The paste is still sent to the model; it just doesnβt clutter the display.
Slash commands
Type in the TUI input. Tab-completion is available for all commands.
/help
Shows the quick-reference keybinding card inside the TUI.
This docs site is the full reference; /help is the in-session reminder.
/model [<alias-or-id>]
Without an argument: opens an interactive picker listing all model aliases and any locally running models detected via LM Studio or Ollama.
With an argument: switches immediately.
/model gemini-flash β switch by alias
/model claude-opus β switch by alias
/model local β auto-detect from LM Studio
/model gpt-4o β literal model ID (no alias needed)
/model llama3.2 β any model name your provider understands
The new model is persisted to the keystore and used for all future sessions until changed again. See Providers & model aliases.
/provider [<name>]
Without an argument: opens a two-step picker β choose provider, then browse and pick one of its available models.
With an argument: jumps straight to that providerβs model list.
/provider β open the picker
/provider anthropic β go straight to Anthropic models
/provider ollama β browse locally running Ollama models
/key
Opens the API key manager. Select a provider, then type or paste your key. Keys are stored in the local SQLite keystore (file mode 0600) and injected as environment variables at every startup.
Shell env vars always win over stored keys β so export ANTHROPIC_API_KEY=β¦
in your shell or .envrc is always a clean override.
/compact
Summarises old conversation history to free context tokens. Koda auto-compacts when the context window hits 85% full, but you can trigger it manually at any time:
- All but the last 4 messages are summarised by the model
- The summary replaces the old messages in the DB
- The compressed session continues normally
- Use
/purgelater to clean up the archived messages
/purge [<age>]
Deletes compacted (archived) message history. Does not touch the live messages in your current session.
/purge β delete all archived messages (prompts for confirmation)
/purge 90d β only messages archived more than 90 days ago
/purge 30d β only messages archived more than 30 days ago
Requires y to confirm. Deleted messages are gone permanently.
/undo
Reverts all file mutations from the previous inference turn β Write,
Edit, and Delete tool calls. One /undo per turn; call again to go back
another turn. Bash commands (e.g. cargo build) are not undoable.
# Koda wrote bad code in the last turn
/undo β all file changes from that turn are reverted
/undo β undo the turn before that
/diff
Shows a summary of uncommitted git diff in the project root. Then offers:
- Review β sends the diff to the model for code review comments
- Commit β asks the model to write a conventional commit message and
runs
git commit -m "β¦"
/sessions [<sub-command>]
/sessions β open the session picker (shows last 100 sessions)
/sessions resume abc β resume the session whose ID starts with "abc"
/sessions delete abc β permanently delete that session
Session IDs are UUIDs; you only need 6β8 characters to be unambiguous. On resume, Koda shows an away-summary: idle time, message count, token usage, and a banner if the previous turn was interrupted mid-inference.
/memory [save]
/memory β show the paths to project and global memory files
/memory save β ask the model to summarise the session and append to MEMORY.md
See Memory for the full memory system.
/skills [<query>]
/skills β list all built-in and custom skills
/skills security β filter by name or description
/agent <name>
Switches to a named sub-agent for the current session. The agentβs system prompt, model, and allowed tools replace the current defaults.
/agent testgen β use the "testgen" agent definition
/expand [<n>]
Shows the full, untruncated output of a recent tool call. Useful when Koda
collapsed a long cargo build or grep result during streaming.
/expand β show full output of the most recent tool call
/expand 3 β show full output of the 3rd most recent tool call
/copy [<n>]
Copies the Nth-most-recent assistant response to the system clipboard.
Defaults to the most recent response (n=1).
/copy β copy the last response
/copy 2 β copy the second-to-last response
/copy 5 β copy the fifth-to-last response
Reads from the full session DB, so compacted (summarised) responses are included in the count. A one-line preview is shown in the confirmation.
/export [<file.md>]
Exports the full session transcript as a Markdown document.
/export β auto-named file in the current directory
/export notes/session.md β write to a specific relative path
Paths must be relative to the current directory. Absolute paths and ..
traversal are rejected.
When no path is given, the filename is derived from the first user message and the current UTC time:
koda-20260410-143022-refactor-the-auth-module.md
The transcript includes all user messages, assistant responses, and a summary of every tool call. System prompts are excluded.
/verbose [on|off]
Toggles verbose tool output. By default Koda collapses long outputs during streaming. Verbose mode shows every line in real time.
/verbose β toggle
/verbose on β enable explicitly
/verbose off β disable explicitly
/exit
Quit Koda. Equivalent to Ctrl+D.
Keybindings
Input
| Key | Action |
|---|---|
Enter | Send message |
Alt+Enter | Insert newline (multi-line input) |
Tab | Autocomplete slash commands and @file paths |
Shift+Tab | Toggle approval mode (auto β confirm) |
β / β | Cycle through input history |
Ctrl+R | Reverse history search |
Navigation
| Key | Action |
|---|---|
PgUp / PgDn | Scroll history one page up / down |
Home | Jump to top of history |
End | Jump to bottom (latest output) |
| Mouse scroll | Scroll conversation history |
Session control
| Key | Action |
|---|---|
Esc | Cancel current inference |
Ctrl+C | Cancel current inference |
Ctrl+D | Quit koda |
Approval prompt
These keys appear when the agent asks to execute a tool:
| Key | Action |
|---|---|
y | Approve this action |
n | Reject this action |
a | Approve and switch to auto mode (no more confirmations this session) |
f | Reject and type written feedback explaining why |
Esc | Reject (same as n) |
Approval modes
Koda has two approval modes, toggled with Shift+Tab (current mode shown
in the status bar):
Auto β safe tools run without confirmation. Destructive shell commands
(rm -rf, sudo, git push --force, etc.) still require explicit y.
Read-only tools (Read, Grep, Glob, WebFetch) are always auto-approved.
Confirm β every write or mutation requires explicit y before executing.
Read-only tools are still auto-approved.
The mode is persisted per session β if you approve with a (auto),
that session remembers it even after resuming.
In headless mode, there is no human to prompt. Destructive Bash commands are silently rejected; all other tools proceed automatically.
Approval keys
| Key | Effect |
|---|---|
y | Approve this one action |
n | Reject this one action |
a | Approve and enable auto mode for the rest of the session |
f | Reject and provide written feedback the model can act on |
Esc | Reject (same as n) |
Session management
Koda stores every conversation in a local SQLite database, organised by project root. Each session gets a UUID that you can use to resume it.
# List and pick a session interactively
/sessions
# Resume by ID prefix from the TUI
/sessions resume a3f8bc
# Resume from the command line (headless or interactive)
koda -s a3f8bc
koda -s a3f8bc "continue where we left off"
# Delete a session permanently
/sessions delete a3f8bc
Away summary
When you resume a session that was idle, Koda shows:
- How long you were away
- Message and tool-call counts
- Total tokens used
- A banner if the previous turn was interrupted mid-inference
Session title
Koda auto-generates a short title after the first exchange. The title is
shown in /sessions and the status bar.
Context management
Every provider has a context window limit (measured in tokens). The status
bar shows current usage as a percentage (e.g. 34%).
Auto-compact
When usage reaches 85%, Koda automatically compacts the session:
- All but the last 4 messages are summarised by the model
- The summary is stored in the DB (recoverable with
/purge) - A status line appears:
π» Context at 85% β auto-compactingβ¦
Auto-compact is skipped if there are pending tool calls (it waits for the turn to finish cleanly).
Manual compact
Run /compact at any time to compact early, e.g. before starting a large
refactor so you have the full context window available.
Purging archived history
/compact keeps summaries in the DB. Use /purge to delete them:
/purge β prompt and delete all archived messages
/purge 90d β delete only archived messages older than 90 days
Memory
Memory files persist facts and preferences across sessions.
Project memory β MEMORY.md in the project root (Koda also reads
CLAUDE.md and AGENTS.md for compatibility). Injected into every
system prompt for that project.
Global memory β ~/.config/koda/memory.md. Injected into every
system prompt across all projects.
/memory β show the paths to both memory files
/memory save β ask the model to summarise and append to MEMORY.md
MemoryWrite tool
The MemoryWrite tool lets the model append facts to memory directly
during a conversation:
> Remember that we use tabs not spaces in this project
Koda will call MemoryWrite automatically when you ask it to remember.
File precedence
| File | Scope | Priority |
|---|---|---|
.koda/MEMORY.md | Project | Highest |
MEMORY.md | Project root | High |
CLAUDE.md | Project root | High (compatibility) |
AGENTS.md | Project root | High (compatibility) |
~/.config/koda/memory.md | Global | Base |
Providers & model aliases
Supported providers
| Provider name | --provider value | API key env var | Default model | Needs key |
|---|---|---|---|---|
| Anthropic | anthropic | ANTHROPIC_API_KEY | claude-sonnet-4-6 | β |
| OpenAI | openai | OPENAI_API_KEY | gpt-4o | β |
| Google Gemini | gemini | GEMINI_API_KEY | gemini-flash-latest | β |
| Groq | groq | GROQ_API_KEY | llama-3.3-70b-versatile | β |
| Grok / xAI | grok | XAI_API_KEY | grok-3 | β |
| DeepSeek | deepseek | DEEPSEEK_API_KEY | deepseek-chat | β |
| Mistral | mistral | MISTRAL_API_KEY | mistral-large-latest | β |
| MiniMax | minimax | MINIMAX_API_KEY | minimax-text-01 | β |
| OpenRouter | openrouter | OPENROUTER_API_KEY | anthropic/claude-3.5-sonnet | β |
| Together AI | together | TOGETHER_API_KEY | Llama-3.3-70B-Instruct-Turbo | β |
| Fireworks AI | fireworks | FIREWORKS_API_KEY | llama-v3p3-70b-instruct | β |
| LM Studio | lm-studio | β | auto-detect | β |
| Ollama | ollama | β | auto-detect | β |
| vLLM | vllm | β | auto-detect | β |
Local providers (LM Studio, Ollama, vLLM) are auto-detected on first run and require no API key. The model is discovered from the running server.
Model aliases
Aliases let you switch models without memorising exact IDs. Theyβre shown
in the /model picker and accepted by --model and /model.
| Alias | Provider | Exact model ID |
|---|---|---|
gemini-flash-lite | Gemini | gemini-flash-lite-latest |
gemini-flash | Gemini | gemini-flash-latest |
gemini-pro | Gemini | gemini-pro-latest |
claude-haiku | Anthropic | claude-haiku-4-5-20251001 |
claude-sonnet | Anthropic | claude-sonnet-4-6 |
claude-opus | Anthropic | claude-opus-4-6 |
local | LM Studio | auto-detect at runtime |
You can also use any literal model ID your provider supports β aliases
are just shortcuts. koda --model gpt-4o-mini or /model o3 both work.
Configuration
Precedence
When multiple sources specify the model, provider, or API key, the highest-priority source wins:
1. CLI flags --model, --provider, --base-url (highest)
β
2. Shell env vars KODA_MODEL, KODA_PROVIDER, KODA_BASE_URL
β
3. Keystore / DB saved by /model, /provider, /key (injected at startup)
β
4. Built-in defaults Claude Sonnet via Anthropic (lowest)
API keys (ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, β¦)
follow the same chain. Keys saved with /key are injected at startup β
but a key already in the shell environment takes precedence and is never
overwritten.
# Per-call override (doesn't change saved config)
koda "review auth.rs" --model o3
# Per-project via direnv (.envrc)
export KODA_MODEL=gemini-2.5-pro
# CI / GitHub Actions
ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_KEY }} koda -p "check types"
Config files
Everything lives in ~/.config/koda/:
| Path | Content |
|---|---|
db/koda.db | SQLite β sessions, messages, settings, API keys, input history |
logs/koda.log | Rolling daily tracing log (not shown in the TUI) |
agents/ | Global custom agent JSON definitions |
skills/ | Global custom skill markdown files |
memory.md | Global memory (injected into all system prompts) |
Project-level overrides live in .koda/ at your project root and take
priority over global config:
| Path | Content |
|---|---|
.koda/agents/ | Project-specific agent definitions |
.koda/skills/ | Project-specific skills |
MEMORY.md | Project memory (also checks CLAUDE.md, AGENTS.md) |
Custom agents
Place JSON files in .koda/agents/ (project-local) or
~/.config/koda/agents/ (global):
{
"name": "testgen",
"system_prompt": "You are a test generation specialist. When asked to write tests, always use the project's existing test patterns.",
"model": "gemini-2.5-flash",
"allowed_tools": ["Read", "Write", "Edit", "Bash", "Grep", "Glob"]
}
Agent fields
| Field | Required | Description |
|---|---|---|
name | β | Identifier used with /agent <name> and InvokeAgent |
system_prompt | β | The agentβs persona and instructions |
model | Model alias or ID (defaults to current saved model) | |
allowed_tools | Subset of tools the agent can call (defaults to all) |
Using agents
/agent testgen β switch to a named agent for the current session
The main model dispatches to sub-agents via the InvokeAgent tool. Each
sub-agent runs in its own worktree with its own model, tools, and session.
Built-in agents
| Agent | Purpose |
|---|---|
guide | Documentation assistant β answers questions about Koda |
default | General-purpose coding assistant |
Skills
Skills are reusable expertise modules β markdown files loaded into the system prompt on demand.
/skills β list all available skills
/skills security β filter by name or description
The model can also activate skills automatically via the ActivateSkill
tool when it determines a skill is relevant.
Creating custom skills
Place a SKILL.md file inside a named directory under .koda/skills/
(project-local) or ~/.config/koda/skills/ (global). The directory name
becomes the skill name.
.koda/
skills/
my-checklist/
SKILL.md β skill content goes here
SKILL.md format
Frontmatter is YAML between --- fences; the body is the skill prompt:
---
name: my-checklist
description: One-line summary shown in ListSkills output.
tags: [review, quality]
when_to_use: Use when the user asks to review a pull request or a diff.
allowed_tools: [Read, Grep, Glob]
user_invocable: true
argument_hint: <file_or_pr_url>
---
# My Review Checklist
When reviewing code, always check:
- [ ] No hardcoded secrets
- [ ] Error handling covers all paths
- [ ] Tests cover the new logic
| Field | Required | Description |
|---|---|---|
name | β | Skill identifier (used with ActivateSkill) |
description | recommended | One-line summary shown in ListSkills |
tags | optional | Searchable tags: [tag1, tag2] |
when_to_use | recommended | Guidance for the model on when to activate |
allowed_tools | optional | Restrict tools during activation (empty = all) |
user_invocable | optional | false = model-only, hidden from /skills |
argument_hint | optional | Usage hint (e.g. <file_path>) |
Note: Both underscore (
allowed_tools) and hyphenated (allowed-tools) field names are accepted for CC compatibility.
How allowed_tools enforcement works
When a skill with allowed_tools is activated:
- Tool definitions are filtered β only the listed tools (plus meta-tools
like
ActivateSkill,ListSkills,ListAgents,InvokeAgent,AskUser) are sent to the LLM on subsequent turns. - Blocked tool calls are rejected β if the model still attempts a blocked tool (e.g., from cached context), the call returns an error explaining the scope restriction.
- Scope clears automatically when a different skill without
allowed_toolsis activated.
Scope transitions are logged as info events (π scope activated /
π scope cleared).
Skill lookup order
.koda/skills/(project-local, highest priority)~/.config/koda/skills/(global)- Built-in skills bundled with the binary
Project-local skills shadow global ones with the same name.
Tools reference
Koda exposes these tools to the model. In Confirm approval mode youβll be prompted before each mutating call. In Auto mode, only destructive Bash commands require confirmation.
| Tool | Effect | Description |
|---|---|---|
Read | Read-only | Read a file (with optional line range) |
Write | Mutating | Create or overwrite a file |
Edit | Mutating | Targeted text replacement within a file |
Delete | Mutating | Delete a file or directory |
Bash | Varies | Run a shell command |
Grep | Read-only | Search for patterns across files (ripgrep) |
Glob | Read-only | List files matching a glob pattern |
WebFetch | Read-only | Fetch a URL and return its text content |
WebSearch | Read-only | Search the web via DuckDuckGo |
Think | Internal | Extended reasoning step (no side effects) |
MemoryRead | Read-only | Read from project or global memory |
MemoryWrite | Mutating | Append a fact to a memory file |
TodoRead | Read-only | Read the session task list |
TodoWrite | Mutating | Update the session task list |
RecallContext | Read-only | Search session history for past context |
ListSkills | Read-only | List available skills |
ActivateSkill | Internal | Load a skillβs instructions into context |
InvokeAgent | Varies | Delegate a task to a named sub-agent |
ListFiles | Read-only | List directory contents |
AskUser | Interactive | Ask the user a clarifying question |
Approval behaviour by tool
| Category | Tools | Auto mode | Confirm mode |
|---|---|---|---|
| Read-only | Read, Grep, Glob, ListFiles, WebFetch, WebSearch, TodoRead, RecallContext | β Auto | β Auto |
| Internal | Think, ActivateSkill | β Auto | β Auto |
| Safe writes | Write, Edit, Delete, MemoryWrite, TodoWrite | β Auto | βΈ Prompt |
| Agent calls | InvokeAgent | β Auto | βΈ Prompt |
| User interaction | AskUser | βΈ Prompt | βΈ Prompt |
| Destructive shell | rm -rf, sudo, git push --force, β¦ | βΈ Prompt | βΈ Prompt |
ACP server (editor integration)
Koda implements the Agent Client Protocol over stdio JSON-RPC 2.0. This lets editors connect to Koda as a local agent without network setup.
# Start the server (editors launch this automatically)
koda server --stdio
Protocol lifecycle
Editor β initialize (negotiate protocol version)
Koda β InitializeResponse
Editor β session/new (create a session)
Koda β NewSessionResponse (returns session_id)
Editor β session/prompt (send a user message)
Koda β [stream of session/update events]
Koda β PromptResponse (turn complete)
Editor β Cancel (optional β aborts the running turn)
Each line on stdin/stdout is a complete, self-contained JSON-RPC object.
Editor setup
For VS Code, Zed, and other editors, see your editorβs extension docs for how to configure a local ACP agent. The command to register is:
koda server --stdio
No ports, no tokens, no network configuration required.
Privacy & data
Koda has zero telemetry. No usage data, crash reports, or analytics are collected or transmitted anywhere.
What stays local
- Conversations are stored only in your local SQLite database
- API keys are stored locally in the same database (file mode 0600)
- The only network traffic is your LLM API calls to the provider you chose
- Version checks query crates.io only (no Koda-specific server)
- You can audit every byte sent to the model by reading the DB directly
Database location
~/.config/koda/db/koda.db
The database is a standard SQLite file. You can inspect it with any
SQLite browser or the sqlite3 CLI.
Deleting your data
# Delete all sessions
rm ~/.config/koda/db/koda.db
# Or selectively from the TUI
/sessions delete <id>
There is no cloud backup. Deleted data is gone.