A terminal-based chat interface for Ollama, built with Textual. Run multiple conversations simultaneously, switch between models on the fly, manage multiple Ollama servers, and get streaming responses with real-time markdown rendering — all without leaving the terminal.
- Multi-conversation sidebar — Maintain several independent conversations at once, each with its own model and message history
- Model switching — Change the active model from the top dropdown mid-session; carry the conversation history over or start fresh depending on the persistence toggle
- File attachments — Attach images or text files to any message; images are sent via the Ollama vision API and text files are inlined into the message content
- Multi-server management — Save multiple named Ollama server configurations and switch between them from the Settings panel; connection is validated before a server is added or set active
- Server fallback — On startup, if the active server is unreachable, the app automatically falls back to the next available configured server
- Per-server system prompts — Each server stores its own system prompt, which is automatically injected at the start of every conversation on that server
- Streaming responses — Responses stream in token by token with live markdown rendering and smart auto-scroll (only follows the bottom if you're already there)
- Model attribution — Each assistant response displays the model that generated it in the message border
- Server info & model management — View server status, connection health, and active model details; browse all installed models and delete them directly from the UI
- Conversation summary — Generate an AI summary of any conversation using the currently selected model
- Conversation info — View message counts, word and character totals, and a full timeline (start time, last message, duration) for any conversation
- Rename conversations — Rename any conversation manually, or use the Generate Name button to have the model suggest a short title based on the conversation content
- Error detail modals — Errors shown in the chat include a Details button to view the full error trace in a scrollable modal
- Persistent config — Server list, active server, and system prompts are saved to
~/.ollamatermui/config.jsonand restored on launch - Persistent conversations — All conversations are automatically saved to
~/.ollamatermui/conversations/and restored on launch, scoped per server; conversations whose model is no longer installed reopen as read-only
- Python 3.10+
- An Ollama server running and accessible on your network with at least one model pulled
- The dependencies listed in
requirements.txt:
textual
textual-dev
textual-fspicker
requests
pip install -r requirements.txtpython ollamatermui.pyOn first launch the app defaults to http://localhost:11434. Open the Settings panel (gear button, top-left) to add your Ollama server URL and give it a name. The app will test the connection before saving. Your server list is persisted to ~/.ollamatermui/config.json and loaded automatically on every subsequent launch.
- New Conversation — Opens a new chat with the currently selected model
- Conversation list — Click an entry in the sidebar to switch to it; conversations are restored automatically on every launch
- Rename Conversation — Click the Rename button inside the chat area to rename the conversation manually, or click Generate Name in the rename dialog to have the model suggest a title
- Delete Conversation — Click the red Delete Conversation button inside the chat area (confirmation required)
- Read-only conversations — If a conversation's model has been uninstalled, it reopens in read-only mode with a warning; the history is still viewable and can be summarized
Click the attachment button in the input tray to open a file picker. Supported file types:
| Type | Behaviour |
|---|---|
| Images (.png, .jpg, .jpeg, .gif, .webp, .bmp) | Encoded and sent to Ollama's vision API alongside the message |
| Text files | File contents are inlined into the message body |
The attached filename is shown above the input area once a file is selected. Click the clear button to remove the pending attachment before sending. Attachments are recorded in the conversation history and displayed inline when the conversation is reloaded.
Select a model from the dropdown at the top. The Convo Persist toggle controls what happens next:
| Persist | Behaviour |
|---|---|
| ON | The current message history carries over to the newly selected model |
| OFF | A brand new conversation is started with the selected model |
Click the gear icon in the top-left to open Settings.
Servers tab:
- The table lists all saved servers; the active one is marked with a bullet, and each row shows a live ping latency or "Offline" status
- Select a row and click Set Active to switch to a different server (only available when the selected server is online) — the model list reloads automatically
- Select a row and click Edit to change the server's name or URL inline
- Test & Add tests connectivity before adding a new server; invalid or unreachable URLs are rejected
- The last remaining server cannot be deleted
System Prompt:
- Each server has its own system prompt, shown and editable below the server table
- Switching "Set Active" to a different server swaps the textarea to that server's prompt
- The system prompt is injected silently at the start of every new message; it does not appear in the conversation history
Settings are saved to ~/.ollamatermui/config.json when you click Save. Renaming a server preserves its conversation history automatically.
Click the info icon inside the status bar to open the server panel:
- Live connection status and server version
- Active model details: family, parameter count, quantization level, disk size
- Full list of all models installed on the server
- Select a model row and click Delete to remove it from the server (confirmation required)
Click the Conversation Info button in the sidebar to open a summary panel for the active conversation:
- Title and model details (family, parameter count, quantization, disk size)
- Message counts broken down by role (user, assistant, errors, attachments)
- Total word and character counts across all messages
- Timeline showing when the conversation started, when the last message was sent, and the total duration
The Summarize Conversation button appears in the sidebar once a conversation has at least one message. Clicking it sends the current conversation to the active model and displays a summary in a modal. The button is disabled on empty conversations.

