This release makes prompt caching a core part of how Frona runs conversations, helping reduce the cost of long chats and agents that make repeated tool calls. Each model request carries instructions, context, and conversation history. Frona now keeps that earlier content stable so inference backends can reuse a cached prompt prefix across requests.
These improvements apply across providers, including local inference. APIs can charge less for cached input; local inference can reuse previously computed context to reduce prompt-processing work and time to the first token. Long conversations and multi-step tasks benefit from repeatedly reusing the same growing history. Actual savings depend on the backend's caching support, configuration, and cache hits.
Frona preserves the exact context and skill expansions supplied on earlier turns, while delivering updated memory and capabilities with new turns. This keeps conversations current without repeatedly changing their historical prefix. Improved compaction makes room for continued work while preserving active requests and complete tool-call/result pairs.
MCP bridge mode now offers a dedicated mcpctl tool that calls Frona's MCP service without requiring shell access. Servers can update their tool lists while running, and directly registered MCP tools preserve supported image results. Browser calls share a current-page preview in chat, with action details, navigation warnings, and authenticated browser takeover.
The release also adds a separate file-upload limit, corrects input-token and cache-write accounting, restores chat state after streaming reconnects, and improves task cancellation, mobile navigation, attachments, and error recovery. Security fixes tighten authorization for approvals, tasks, MCP logs, files, downloads, and authentication flows.
Supported channels: Slack, Discord, Telegram, Signal, SMS, WhatsApp Cloud, WhatsApp Personal.
Prompt caching, lower costs, and faster local inference
- Preserve reusable prompt prefixes across providers, including local inference backends with prefix caching. Frona applies this context-preservation behavior automatically.
- Keep historical prompt prefixes stable across turns, tool calls, and retries so repeated context can qualify for provider cache reuse. Longer conversations and multi-step agent work offer more opportunities to reuse that context.
- Append memory and capability updates with new turns instead of regenerating earlier context. Persist skill expansions and provider tool-call details so replay does not unnecessarily change the prefix.
- Reduce repeated prompt-processing work on local inference backends that reuse cached context, helping shorten time to the first token.
- Show cached-input counts, cache-hit ratios, and estimated API costs in chat and the Usage dashboard when the backend reports the necessary usage. Account for cache writes separately from reads.
- Establish a fresh baseline when compaction changes the prompt. Actual reuse depends on backend cache support, capacity, and expiry; saved context alone does not guarantee a cache hit.
Conversation context and compaction
- Persist immutable agent context snapshots scoped to the user, agent, and space, with matching content reused across messages. Context records what was supplied to the agent; shared memory retains its existing ownership and scopes.
- Save prepared model-facing message text, including skill expansion and context updates, so retries and historical replay do not reread changed or deleted skill files or regenerate earlier context.
- Refresh recalled memory and available skill, agent, and MCP-server catalogues on later user turns, delivering changes alongside new input. Apply explicit standing-instruction and native-tool edits at the next user turn.
- Initialize context lazily for existing conversations. Fail preparation if a required context source cannot be collected, without publishing a partial snapshot.
- Refresh context during compaction and persist it with the summary as a stable leading baseline before retained history.
- Compact native model history while preserving the active request, recent messages, complete tool-call/result pairs, and the existing rolling summary. Retain summaries and valid tool pairs in non-streaming history too.
- Include tool definitions in context budgeting and calibrate matching history against consistent provider-reported input usage. Keep new content estimated and reject incompatible measurements.
- Preserve active-turn context through streaming retries, and retain provider tool-call identities, signatures, and arguments through approvals, persistence, and replay.
MCP and file tools
- Add a dedicated
mcpctltool that accepts an argument array and calls the MCP service directly using the current user and agent. It needs no shell access; shell metacharacters are literal argument data. - Share command parsing, help, flags, output, and errors between the dedicated tool and the standalone HTTP-backed CLI. Preserve existing CLI workflows and enforce underlying tool permissions on both routes.
- Bound dedicated bridge arguments and output, support cancellation, and cap execution at 120 seconds or a shorter configured agent timeout.
- Refresh registered tools when an MCP server announces a tool-list change. Update bridge discovery and direct registration without restarting the server, retaining the last successful list if refresh fails.
- Preserve PNG, JPEG, GIF, and WebP images returned by directly registered MCP tools. Replace invalid or excessive images with informative placeholders while preserving text and result status.
- Bound image preparation for native file and browser tools, including encoded size and decoded image limits.
- Prefer exact file-edit matches before normalized matches, preserve line endings and surrounding whitespace, and reject ambiguous replacements unless replacing all matches.
- Return bounded directory guidance and small listings from
read, directing agents togloborgrepfor larger directories. - Validate environment variable names before credential and MCP updates, and allow clearing the last MCP environment entry.
Browser workflows
- Show a shared browser snapshot for chat browser calls, refreshed after completed actions, with expandable action details, closed-session state, and recoverable snapshot errors.
- Wait for the target document's readiness without blocking on unrelated frames. Surface readiness warnings when navigation succeeds with incomplete checks.
- Serialize browser session creation and bound connection retries to avoid competing sessions and indefinite waits.
- Apply configured Browserless authentication to WebSocket sessions and HTTP endpoints, preserving URL parameters and giving explicit token configuration precedence.
- Restore authenticated debugger takeover through Frona, enforce browser-profile access, bound proxy waits, and stream debugger responses.
- Update Browserless examples and development images to Chromium
v2.57.2.
Chat, tasks, and interface reliability
- Keep chat subscriptions across event-stream reconnects and reconcile persisted messages with live state, clearing stale running indicators after completion or cancellation.
- Make task cancellation cover successive model turns and pending approvals; late approval replies cannot resume cancelled work.
- Keep task lists ordered during live updates and notify clients when recurring schedules advance to their next run.
- Preserve composer drafts and successful attachments after upload failures. Keep uploads active when the attachment menu closes and normalize clipboard handling across paste event types.
- Keep image previews consistent after reloads and align previewable file classification between the client and server.
- Add
server.max_upload_file_size_bytes, defaulting to 100 MiB per file. The upload route uses this limit plus 1 MiB for multipart metadata, independently of the general request-body limit, and returns clear size errors. - Isolate Markdown rendering failures, retry rendering when content changes, and provide route-level error recovery with a retry action.
- Make configuration navigation, row actions, and settings help usable by touch and keyboard. Close mobile navigation drawers after selecting a chat or task.
- Copy execution output together with its command.
- Update the Signal integration to receive first-contact messages.
Providers and usage accounting
- Fall back to
primarywhen an agent references a missing model group, while retaining errors for invalid groups that are actually configured. - Offer reconnection when a provider's saved credential is missing or revoked.
- Validate OpenRouter credentials with an authenticated probe and recognize Gemini invalid-key responses during validation.
- Include safe transport-error causes in provider diagnostics without exposing sensitive request data.
- Normalize recorded input tokens to include fresh input, cache reads, and cache writes. Treat cached input as a subset of the total prompt count.
- Price cache writes separately using the catalogue cache-write rate, falling back to the input rate when absent. Use catalogue family matching when an exact model ID has no price entry.
- Recover historical input totals where recorded provider totals support them, without changing saved costs or pricing snapshots. Mark incomplete counts and suppress misleading cache ratios and token-derived metrics.
- Show consistent token breakdowns in chat and Usage views. Label input outside cache reads as Other input, including both fresh input and cache writes.
Security and storage
- Bind approval resolution to the authorized chat and check task ownership before deletion can cancel execution.
- Restrict MCP log reads and streams to the server's owner.
- Resolve file paths before workspace and policy checks, protect resolved workspace roots from file operations, and constrain agent downloads to their workspace.
- Bind private presigned downloads to the authorized user. Serve explicit downloads as attachments and isolate interactive HTML previews from Frona's page and storage.
- Restrict accepted token types at authentication entry points and consume refresh-token pairs atomically.
- Check OAuth state expiry before exchanging authorization codes, normalize login lockout identities, and honor the full lockout duration.
- Load legacy message and agent fields with database defaults to preserve compatibility with older records.
Build, containers, and development
- Upgrade Rust to 1.99.1 and Node.js to 24.22.1, refresh Rust and frontend dependencies, and update pinned system, Python, and runtime tools. Keep SurrealDB at 3.2.4.
- Update the development SearXNG image to
2026.10.19-81371861f. - Match development-container Kache to the workspace version, verify downloaded releases, and pin container cache paths and permissions. Allow an explicit
KACHE_VERSIONwhen host detection is unavailable. - Install frontend dependencies before starting development watchers.
- Add optional shared Podman intermediate-image caching through
CONTAINER_CACHE_REGISTRY, retaining existing local-image reuse and--no-buildbehavior. - Add
mise run test:browserto run browser integration tests against an isolated Browserless container, including authenticated debugger and profile-isolation checks. - Expand regression coverage for context persistence, compaction, usage accounting, authorization, file handling, MCP updates, browser sessions, and reconnect recovery.
Upgrade notes
- Back up the database, configuration, and encryption secret together before upgrading. Startup normalizes recoverable historical input-token totals; recorded costs remain unchanged.
- If you used
server.max_body_size_bytesto control uploads, setserver.max_upload_file_size_bytesorFRONA_SERVER_MAX_UPLOAD_FILE_SIZE_BYTESexplicitly. Allow an additional 1 MiB in your reverse proxy for multipart metadata. - Existing chats establish saved context on next use. No manual reset is required. Context preservation applies across providers, including local inference; actual cache reuse depends on the backend and request.
- Bridge mode remains on by default. The dedicated
mcpctltool does not require shell permission, but MCP ownership and tool policies still apply. - For token-protected Browserless instances, set
browser.api_tokenorFRONA_BROWSER_API_TOKENto match the Browserless token. Verify navigation and browser takeover after upgrading. - Correct invalid credential-binding or MCP environment variable names before saving edits. Names must use ASCII letters, digits, and underscores and cannot start with a digit.
- Run
mise installand rebuild development images withmise run container:dev:build. SetKACHE_VERSIONif workspace Kache is unavailable.
Get started
- Quickstart: bring up the stack with Docker Compose
- Upgrades: configuration changes and upgrade checks
- Documentation: full guides and reference