Features
Sessions
Sidebar: new session, live-filtering search, rename, delete - resizable (drag its right edge, 200-480px) and collapsible, both remembered across reloads. The active session gets a left-edge accent "sidemark", same treatment as the selected server row.
Sessions persist server-side (one JSON file each) - full history, response stats, and reasoning/thinking text all replay exactly as before. Which session is active is also remembered across a page reload (localStorage), so refreshing the page doesn't drop you back to "no session selected".
Chat
- Streaming responses over WebSocket, labeled with whichever model actually answered.
- Rotating "Thinking / Chewing / Pondering..." word animation (character-by-character reveal, pulses gently once fully typed, crossfades into the next word with no gap, rotates every 5s) shown before the first token, then continues below the reply for as long as the turn is still in flight - covers gaps like a pause before a tool call.
- Collapsible "Thinking..." section for reasoning/thinking models (
reasoning_content), separate from the final answer. - Markdown-ish rendering (headers, bold/italic, inline code, lists, fenced code blocks).
- Titled collapsible notes for tool calls (Read / Write / Patch / Bash / Agent), each showing the relevant content/diff/command+output; other tool calls fall back to a generic system note.
- Attach one or more files to a message (removable chips while composing, read-only chips after sending); 200 KB limit per file, binary files rejected.
- Context-usage bar (used/total tokens), sized from the model's real ctx-size or a fallback setting; shows the model's trained context length in parentheses when the server reports it.
- Automatic context compaction once usage crosses a configurable threshold: summarizes the older part of the conversation into one collapsible "Compacted" note, keeping the most recent N messages verbatim (cut point always snaps to a full user turn). Also triggerable manually with
/compact. - Response stats (prompt/response/total tokens, elapsed time, tokens/sec) under each reply.
- Per-message timestamps, format configurable.
- Plan Mode / Edit Mode toggle: Plan Mode restricts the model to read-only tools (
read_file,list_files,update_plan) - file writes/patches/bash are rejected outright (enforced at execution time, not just by hiding the tools). Persists per session; a system note announces every switch. - Plan panel above the composer: a live, collapsible checklist driven by the model's
update_plancalls. First proposal needs approval (Allow / Deny / Request changes...); approving auto-switches Plan Mode → Edit Mode since nothing could otherwise execute. - Pressing Stop mid-generation saves whatever text had streamed so far as the real reply (skipping any tool call still being constructed) instead of leaving the UI stuck.
Model tuning sidebar ("Parameters")
Collapsible sidebar mirroring Open WebUI's per-chat Advanced Params: Temperature, Top K, Top P, Min P, Frequency/Presence Penalty, Repeat Penalty, Repeat Last N, Mirostat (+ Tau/Eta), Seed, Max Tokens, Stop Sequences. Per-field enable checkboxes - only checked fields are sent, unchecked ones fall back to server/global defaults. Values persist per session, independent of global settings.
Server discovery & selection
Auto-discovers every LlamaNexus serve instance on the LAN via UDP heartbeat (discoveryPort setting, default 50050) - shown as a clickable list in the sidebar. Forced per-chat server selection: every session, old and new alike, stays gated (composer disabled) until a server is explicitly picked for it - never auto-selected, even with only one candidate. The row matching the configured proxy also gets RPC mode/roster controls (single-node ↔ RPC toggle, add/remove workers) and a 🤖 icon to set that server as the session's independent agent server for run_agent.
Model tools (function calling)
read_file,list_files- read-only, no confirmation needed.patch_file- targeted snippet replacement (preferred over full rewrites for existing files); confirmation with a diff preview.write_file- create/fully rewrite a file; confirmation showing what would change.run_bash- run a command/script directly (off by default); confirmation showing the exact command; output truncated, 60s kill timeout.update_plan- drives the Plan panel described above; on by default, allowed even in Plan Mode since it never touches disk.run_agent- delegates a self-contained sub-task to the session's configured agent server; off by default; runs its own bounded tool-calling loop (capped steps + repeat-call guard), no recursive delegation, noupdate_plan; every nested action goes through the same confirmations as the main model's own calls; blocked in Plan Mode.
All file paths confined to the configured workspaceRoot; a literal-text tool-call fallback (for models that don't emit structured calls) is caught and gated identically to real calls. Loop protection: stops a tool-calling chain after the same call repeats N times in a row, or after a max chained-call depth as a backstop.
Confirmations
In-app dialog (not a native browser popup) for every action that asks permission: file writes/patches, bash commands, ejecting/removing a model, removing an RPC worker, plan approval, deleting a chat, disruptive proxy-restarting actions. Escape denies/cancels; clicking elsewhere does not dismiss the dialog.
Hugging Face model search
Search/download modal reachable from Settings or a "Search Hugging Face for models..." entry at the bottom of the composer's model picker. Search/listing calls go server-side so a private/gated repo can be searched with an HF_TOKEN env var the backend never exposes to the client. Collapsed-by-default repo list; expand to load quant files (cached). Shard-split quants shown as one combined-size entry. A "✓ Downloaded" badge marks quants already present; the download button doubles as a cancel button once a download starts.
Model picker & removal
The composer's model picker always sets a real model on pick and writes that pick through to Settings' "Model" field too. An Eject button unloads the currently-loaded model, freeing memory. Settings' model list shows each model's real context size and trained context, plus a red ✕ button to permanently remove a downloaded model (requires LlamaNexus 0.1.21+).
Slash commands
/model- same picker as the composer's model button, live-filtered, arrow keys to navigate, Enter to complete./ctx-size <size>- change the current model's context size and restart to apply./worker <ip:port>//worker rm <ip:port>- add/remove an RPC worker./compact- trigger context compaction manually.
Companion VS Code extension
A separate VS Code extension provides the same core chat experience directly inside the editor, no browser tab needed. Most features here were built to match it feature-for-feature.