Core workflows
Chat Mode
Chat Mode (Ctrl+1) is a session-based conversational interface backed by the same agentic loop as Code Mode. It keeps persistent memory across sessions, supports file attachments and web research, and routes messages to the right model tier automatically.
The input bar
The chat composer is one card: the textarea on top, and a single control row inside the card beneath it.
Control row, left to right: + (attachments: files, screenshot) → Web → Research → ⋯ More options → the model chip → Mic (only when voice input is enabled) → Send with a ▾ caret (or Stop while it is generating).
⋯ More options holds Harness (only when an external harness is installed), Boost and Fast Mode; each row shows its current value and opens the same control it always did. A control that does not apply to the selected model is left out of the menu, and when none applies the ⋯ button is not shown.
The model chip shows the model, the routing tier (Auto/Fast/Smart/Code) and, once you pick one, the effort, for example Claude Opus 5.5 · Auto · High. Open it for, top to bottom: Routing (the tier and the rule that picked it), Effort (see below), the model list, and a Context · 38% of 200k · Inspect row that opens the context inspector.
Effort only appears for models that can think before answering. Tiered models get a slider over their own levels (Off is offered only when the model can turn thinking off); local models with on/off thinking get one Thinking switch; models that always reason on their own get one line saying there is nothing to set. Hover or focus the ? for what effort means. The line under the slider says what more effort costs: for a cloud provider, more tokens per message, so it adds up faster against your usage; for a model running on your machine, slower replies; for a custom or self-hosted endpoint, simply that replies take longer. Picking an effort does not close the menu.
The context ring is drawn around Send: it fills as the conversation uses more of the model's window, turns yellow past 80% and red past 95%. While a reply is generating, Stop wears the same ring.
Chat Mode has no Memory control yet. The + menu is attachments only. Code Mode's Agent composer uses the same model chip, ⋯ and ring, with Ask ▾ in place of Web and Research - its web tools are available whenever tools are, so just ask the agent to search.
The control row stays visible and usable while the agent is generating - you can change model, tier, or toggles mid-response. The two things that do get disabled while a response is streaming are the Mic button and the + attach menu.
Send as…: the caret beside Send
The ▾ beside Send (Alt+R) opens Send as…: Send (Enter), Start in background (Ctrl+Enter, ⌘+Enter on macOS), Start in parallel…, Make this a loop…, Move this session to a worktree, and Background defaults: change…. Background, parallel and loop need a project folder: when the chat has none those rows are greyed out and say so, and Send works as always. Start in background runs the draft in a new code session in that folder (the chat you are in is never taken over); Move this session to a worktree is for Code mode sessions and is disabled here with a reason. Run tasks is not in Chat Mode (it has no terminal).
Starting something does not toast. A line under the composer says what started and links to Runs, which is the fourth tab of the sidebar.
Auto model routing
By default, Bodega classifies each message before sending it and picks the appropriate model tier:
| Tier | When it fires |
|---|---|
| Fast | Greetings, short lookups, single-line questions |
| Smart | General reasoning, multi-step explanations |
| Code | Programming tasks, debugging, file edits |
| Image | Image generation requests (falls back gracefully if no image model is configured) |
The tier picker pill in the input bar shows the active mode. In Auto mode it shows a hint - for example Auto →Smart - as you type, so you know where the message is headed before you send.
The frontend classifier (routingPatterns.ts) runs in real time for the hint. The backend (MessageRoutingService.ts) runs the authoritative classification and determines which model actually handles the request.
Your routing mode choice persists across sessions (chat.routing_mode setting). The models behind each tier are configured at Settings → Models & Providers → Models (llm.fast_model, llm.smart_model, llm.code_model).
Single-model setups
When only one model is active - for example, a single llama.cpp or LM Studio instance - the Auto/Fast/Smart/Code tier picker is hidden entirely. All tiers resolve to the same model, so the picker would be meaningless. The Research and Web pills stay visible because those are independent of which model handles the request.
The + menu
Click the + button at the left of the input bar to open the AttachDropdown. It has four sections:
Attach
Add files or photos- opens the system file pickerTake a screenshot- minimizes the app briefly, captures the full desktop, attaches the image
Context
Add to project folder- links a filesystem folder to the current session. A remove button appears when a folder is already linked.Add knowledge from URL- opens the KnowledgeDialog to fetch a page or paste text into the knowledge base
Context Scope (only meaningful when a project folder is linked)
Auto- repo map + recent filesCurrent File- only the open editor fileSelection- only selected codeCodebase- full repo map
Close with Escape or by clicking outside.
Research mode
Research mode runs a dedicated synthesis phase before the agent responds. It plans 3–5 search queries from your message, runs them in parallel via DuckDuckGo, ranks and de-duplicates the results, then produces a cited summary - all before the normal LLM response begins.
You see live progress between your message and the reply: Planning → Searching → Synthesizing → Complete.
Toggle it via the Research pill in the bottom row of the input bar (active state: the accent-colored label text, no fill or border). Research mode is blocked when air-gap is on.
Research mode vs. web search: Research runs a pre-loop multi-query synthesis. Web search lets the agent decide mid-response whether to call web_search or web_fetch. Use Research when you want comprehensive coverage with citations; use Web search when you want the agent to look things up on its own judgment.
Web search
When Web search is on, the agent can call the web_search and web_fetch tools during its normal response. Unlike Research mode, there's no separate synthesis phase - the agent decides when and whether to search.
Toggle via the Web pill in the bottom row of the input bar.
Web search resets to off when the app restarts - it is not persisted to disk.
The auto-intent router can also enable web search automatically for a single turn when it detects recency-dependent patterns ("latest version", "current price") even if the toggle is off. It only promotes OFF→ON, never overrides a setting you've made.
Cloud Boost
The Boost pill routes the current message through a configured cloud provider (default: OpenRouter) when local model quality is insufficient for the task.
- Configure it at Settings → Models & Providers → Cloud fallback - enter your API key.
- The Boost pill appears in the input bar between the textarea and the model selector.
- Click it to activate for the next send (its label turns accent-colored - Bodega's controls never use a filled background).
- It resets to off after each send.
Boost is hidden when no cloud provider is configured or when air-gap mode is on. The QEL system can also activate Boost automatically when a verification fails and hardware headroom is low (BoostEscalationDecider).
Attaching files
Three ways to attach files:
- File picker: Click + → Add files or photos
- Drag and drop: Drag files onto the chat window - a drop overlay appears when files enter the window
- Paste image:
Ctrl+Vpastes an image from the clipboard directly into the attachment area
Attached files appear as chips above the input. Click the × on a chip to remove it before sending.
File contents are injected as inline text, marked to the model as untrusted data from the file (instructions written inside a document are not followed). PDFs (scanned or image-only pages are refused, since text is extracted on your machine and there is no OCR) and Office files (docx, pptx, xlsx, odt, rtf, epub) are converted to text whether you use the picker or drag them in. Dragged text files over 512 KB, and anything that cannot be read, are skipped with a notice instead of silently. Images must be PNG, JPEG, GIF or WebP (the type is checked from the file itself); SVG and BMP are refused with a message. Photo metadata (EXIF, including GPS location, plus XMP/IPTC and text comments) is stripped from JPEG, PNG and WebP images when you attach, drop or paste them; the rotation tag is kept so photos still display upright, and the image itself is not re-encoded. Images are base64-encoded and require a vision-capable model for interpretation. Watch the context budget meter on the right side of the input bar - large attachments fill the context window quickly.
Voice input
Voice input transcribes microphone audio to text. It's off by default - the mic button only appears once you enable it.
- Go to Settings → General → Voice input and toggle it on (
stt.enabled). - The mic button appears in the input bar.
- Click it to start recording. The button turns red with a pulsing ring that tracks mic amplitude.
- Click again to stop, or it auto-stops after 2 minutes.
- Transcribed text is appended to whatever is already in the input field.
Provider options (stt.provider):
ollama(default) - hits Ollama's/v1/audio/transcriptionsendpoint (Ollama 0.5+) and falls back to/api/generatewith base64 audio on older versionsopenai- uses OpenAI Whisper (whisper-1); blocked in air-gap mode
For a dedicated faster-whisper-server, point stt.base_url at it (for example http://localhost:8000). The model defaults to large-v3 for Ollama and whisper-1 for OpenAI; override with stt.model.
Persistent memory
The agent automatically saves facts from conversations using the save_memory tool and retrieves relevant ones before each response via query_memory. It runs on every message unless you turn off Remember facts from chats in the Learning & memory block of Settings → Prompts & Memory → Memory & learning.
Memories persist indefinitely in SQLite, scoped to your user account. Relevance uses BM25 + recency + access-frequency scoring. The context assembly layer keeps memory injection within 5–10% of the context window budget.
Useful interactions:
- "What do you remember about me?" - triggers an explicit
query_memorycall - "Forget [fact]" - the agent removes it from memory
- View and delete memories at Settings → Prompts & Memory → Memory & learning
The Knowledge Base is separate from Memory. Memory = facts the agent extracted from conversations. Knowledge = content you added manually (via + → Add knowledge from URL, or Settings → Prompts & Memory → Knowledge base). The agent queries both, but via different tools (query_memory vs. query_knowledge).
Prompt templates
Prompt templates define how the agent behaves - its purpose, tone, tool usage policy, and output formatting. You can set separate defaults for Chat and Code mode; Bodega switches automatically when you change modes.
- Go to Settings → Prompts & Memory → System prompt.
- The top of the section shows two Default Selector widgets: Chat Default and Code Default.
- Below is a template list with tabs: All / Built-in / Custom.
- Click + New to create a template. Built-in templates are read-only.
- Each template has five content fields: Purpose, Tone & Style, Tool Usage Policy, Safety & Permissions, Output Formatting.
- Click the lightning bolt icon on a template card to set it as the Chat or Code default.
Templates layer on top of the base system prompt. The lower-level persona.system_prompt override (Settings → Prompts & Memory → System prompt) predates the templates system and still works if you need full control.
The agent's display name is persona.name (default: Bodega). Change it at Settings → General → Profile.
Follow-up queue
You can type and send a message while the agent is still responding. The new message goes into a queue instead of interrupting.
- A badge appears next to the stop button showing how many messages are queued (e.g.
2 queued). - The input placeholder changes to "Send a follow-up..." and the send button tooltip changes to "Add to queue".
- Queued messages are applied at the agent's next step, not mid-sentence. Steering: a short correction such as "actually, use pnpm" or "wait, change that" also cancels the reply the model is writing right now, drops the unfinished text and carries your correction into the very next request. It never interrupts a tool that is already running; a correction sent then waits for that tool to finish. The message shows Steering while this is happening.
Hitting Stop cancels the current response and clears all queued messages.
Context budget meter
The meter on the right side of the input bar shows how much of the model's context window is in use. It updates automatically after each message (the data comes from the streaming backend via debug frames).
It shows nothing on a fresh session before the first message. When it's visibly full, use /compact to summarize older history and free space.
During an agent run, if history has to be dropped (not just summarized) to fit the model's window, the status line reads Context pressure with roughly how much was dropped. If that keeps happening several iterations in a row, the run stops early and says the task no longer fits the model's context window - switch to a model with a larger window or break the task into smaller steps.
Auto-intent detection
The backend's ChatIntentRouter analyzes each message and can automatically promote feature toggles from off to on for a single request:
- Recency-dependent query ("latest version", "current price") → enables web search for that turn
- Comprehensive analysis request → enables research mode for that turn
- Complex reasoning request → promotes extended thinking for that turn
It only promotes off→on. It never overrides a toggle you've explicitly set. Code you paste in a fenced block is ignored when it decides, so const current = ... in a snippet does not turn on web search. The frontend shows routing hints in real time (e.g. Auto →Smart) but the backend is the authoritative router.
Fixing code you paste
With no folder linked, paste the code (in a fenced block) or the text (in quotes) and ask for the change: "Fix this bug: js ...", "Refactor this to async/await", "Fix the typo in this sentence: "..."". Bodega answers in one reply with the corrected version, and does not go looking for a file to edit, because there is none.
It stays a tool turn when the message names a file (src/cart.js, utils.ts) or a web address, asks to run, search, fetch or save something or to put it in your notes or knowledge base, when web search or research is on, or when the conversation is already using tools. Link a folder with + → Add to project folder if you want the change written to your files; with a folder linked, the agent edits files as usual.
Asking for new code
With no folder linked, "Build a simple React component for a todo list", "Write me a CLI in Go that..." or "Can you create a login form in Vue?" is answered in one reply with the code in it. Bodega does not try to save it, because there is no folder to save it to.
It stays a tool turn when the message names a file or says where to put it ("save it to a file", "in a file called config.ts", "in my project"), asks for a document or report, asks to preview it, asks the agent to run, test, save or search for something ("and run it", "search the web for..."), has a web address, mentions your notes, saved memories, a reminder, your knowledge base or Bodega itself, when web search or research is on, or when the conversation is already using tools. Link a folder with + → Add to project folder if you want the files written; with a folder linked, the agent creates them as usual.
@-mentions
Type @ in the chat input to open the mention menu. Arrow keys to navigate, Enter or Tab to select, Escape to dismiss. It offers, in priority order:
- Panels -
@agent,@research,@debug,@advisor. Selecting one opens that panel and switches to it. This is a navigation action, not an attachment; the@token is removed from your input. - Context injections -
@codebaseattaches a repo summary (needs a linked project folder) and@memoryattaches relevant memory. @code-session- pulls context from your active Code Mode session into this chat. It only appears when there is an active Code Mode session to pull from.- Open editor tabs, marked with an
openbadge, then project files and folders from the linked project.
The menu doesn't open if your input already starts with / - slash commands win.
The agent browser in Chat Mode
The agent can drive a real browser from Chat Mode, not just from Code Mode. When agent web browsing is enabled and air-gap is off, an Agent Browser toggle appears in the chat header; it opens a resizable right-hand rail. Drag its edge to resize - the width is saved and restored across restarts.
You don't have to open it. It appears on its own when the agent navigates, and screenshots the agent takes stay in the transcript after the turn ends.
Browsing anywhere other than localhost is off by default and each site needs your approval. See the Agent Browser page for the full safety model.
Runs: the sidebar's fourth tab
Next to Chats, Projects and Saved, the sidebar has a Runs tab (Ctrl+Shift+U). It lists what needs you, what is working, what finished while you were away, and your recent chats, in four sections: Needs you, Working, Done, Recent. The tab reads Runs · 3 when three runs need you. While it is open, the search box at the top of the sidebar searches runs.
A chat you watched finish goes straight to Recent; one that finished while you were in another window shows under Done until you open it. Nothing about a run pops up as a toast. See the Runs page for the rows, the keys and the right-click menu.
Exporting a chat
Right-click a chat in the sidebar to export it. Export as Markdown saves a text file. Export as web page saves the conversation as one HTML page that opens in any browser: it has no scripts and no links to outside sites. Export self-hostable viewer saves a standalone viewer page. If the conversation contains something that looks like a password or key, Bodega asks you to confirm before it writes the file; cancel to keep it from being exported.
Slash commands
Type / in the input to open the command menu. Arrow keys or Tab to navigate, Enter to select, Escape to dismiss.
| Command | What it does |
|---|---|
/export |
Save the current conversation as a Markdown file. Opens a save dialog. Chat mode only - shows an info toast in Code mode. |
/compact |
Summarize older history to free context space. POSTs to the backend and refreshes the message list on success. |
/clear |
Clears the input field. Does not delete conversation history. |
/mode ask|plan|act |
Sets the permission mode for Code mode panels. Has no effect in Chat mode. |
/preview [url] |
Opens the Preview tab. Without a URL, shows the port picker (3000 / 5173 / 8080 / 4200). With a URL, jumps straight to it. |
/map |
Opens the Bodega Map (file-dependency graph for the linked project). Shows an info toast if the map is disabled in settings. |
/help |
Lists all available slash commands as a toast. |
/goal <text> |
Sets a persistent session goal the agent drives toward across messages; /goal alone shows the current goal, /goal clear abandons it. |
/browser |
Opens the Agent Browser panel (the sandboxed, non-localhost browsing surface). |
/sidechat |
Opens the docked Sidechat side view for the active session. Code mode only - shows an info toast in Chat mode. |
Skill triggers (e.g. /commit, /review) also appear in the menu when configured. They pass through to the backend as messages rather than being handled client-side.
Exported files include user, assistant, and system message text only. Tool call results, thinking blocks, and attached file content are not included.
Tips
The composer toggles have three different lifetimes, and it matters. Boost is one-shot - it clears itself the moment you send. Web search is per-run - it resets to off when the app restarts. Fast Mode is a persisted setting - it stays on across restarts until you turn it off. If a setting seems to keep coming back or keep vanishing, that is which bucket it is in.
The per-message reasoning control outranks Fast Mode. Fast Mode is the standing default; setting an effort on a single message wins for that message. You don't have to turn Fast Mode off to think hard about one question.
Voice input appends, it doesn't replace. Transcribed text is added to whatever is already in the box, with a space. You can type half a message, dictate the rest, and edit before sending - and a mis-transcription doesn't cost you what you already typed.
@ won't open if the line starts with /. The mention menu is suppressed for slash-command input, so a command that happens to contain an @ won't fight the menu for your Enter key.
Changing model mid-response is allowed. The control row stays live while the agent streams; the change applies to your next message, not the one in flight.
In the CLI
The REPL (bare bodega) is the closest CLI equivalent - an interactive session with slash commands for session management (/clear, /new, /resume, /compact), model/provider switching (/model, /provider, /connect), and mode (/mode act|ask|plan). It doesn't split into separate Chat/Code modes; project context is set by --cwd, not a mode switch, and there's no memory/knowledge sidebar - /memory gives a read-only view instead.
Recap and plan strip
When a turn ends and you were not looking (the window was in the background, or you were in another session) or it stopped needing you (an approval, a question, a diff to review), the conversation ends with a Recap card: what changed (files and lines), what the agent did, whether the result was checked, what needs you, and any plan items still open. It is written from what the agent actually did (its tool calls and the verification result), not from what it said it did. The Verified line reads Not verified when the turn changed nothing to check (it is never shown as Failed), and a muted Answer check line appears only when an answer cited sources the agent never read. A turn you watched to the end has no recap. If the card says Approve shell, its Approve button is the same decision as the approval card: whichever you press first counts and the other disappears.
Under the recap, Follow-ups lists up to five things left to do. Here adds it to this session (queued if the agent is still working, otherwise sent as your next message). (Background is only offered in Code Mode, where there is a project to copy.) Later adds it to the plan. The recap is written without a model; an optional rewrite in plainer sentences exists (recap.polish, off by default) and is never used when air-gap is on or the model runs on this computer. Both switches are in Settings → Automations → Background runs → Recaps and follow-ups; the rewrite switch is greyed out, with the reason beside it, while air-gap is on or your active provider is not a cloud provider (Settings uses the cloud-provider list, which is stricter than the backend's check for a model on this computer).
The plan strip described in Code Mode appears above the conversation here too.
Keyboard shortcuts
| Keys | Action |
|---|---|
| Ctrl+1 | Switch to Chat Mode |
| Enter | Send message (or add to queue if agent is responding) |
| Shift+Enter | New line in the input |
| Escape | Dismiss slash command menu or close + dropdown |
| /export | Export conversation to Markdown |
| /compact | Summarize old history to free context space |
| /clear | Clear the messages on screen (the agent keeps the context); /new starts a fresh session |
| /mode ask|plan|act | Set permission mode (Code mode panels only) |
| /preview [url] | Open Preview tab |
| /map | Open Bodega Map |
This page mirrors the in-app docs hub for app version 1.0.0-beta.46. Found something unclear or out of date? Tell us on Discord. New here? Download the free beta and follow along.