Feral v0.2.0
Released 2026-06-12 — Windows, macOS (Apple Silicon + Intel), and Linux.
⚠️ Migration notes from 0.1.x
- Updater key rotation. The original update-signing key was exposed in the
public git history and has been rotated. Upgrading from 0.1.7 or older
requires either installing the transitional 0.1.8 release first (it
carries the new verification key) or downloading the 0.2.0 installer
manually one time. Full plan:docs/UPDATER_KEY_MIGRATION.md. - Onboarding, conversations, models, and BYOK keys carry over unchanged.
New
- Vision — the agent can finally see your images. Pasted screenshots
(Ctrl+V) and uploaded image files now reach the model as real pixel data
(base64 data URLs), not just a[Image attached: …]filename note. Works on
both inference paths: direct chat (BYOK cloud via OpenAIimage_urlcontent
parts) and the Feral Agent sidecar (OpenAI-compatible, Ollamaimages, and
Anthropic base64 blocks). Local llama.cpp GGUF models remain text-only and
keep the filename note. - Memory that actually carries over. New conversations no longer start
cold: the chat tab now injects a "[Memory context]" block (facts from the
shared knowledge graph) into the system prompt on every send, and runs a
background extraction pass after each completed turn that writes
subject–predicate–object triples back into~/.feral/memory-graph.json—
the same graph the agent sidecar maintains. The sidecar side recalls graph
facts at every turn too, extracts from the very first assistant turn
(previously only every 3rd — short chats never learned anything), and the
previously-unregisteredmemory_ops/memory_graphtools are now live so
"remember X" / "forget Y" take effect immediately. - Memory Graph page redesign. Cognee-inspired dark visualization: glowing
neon nodes on a near-black canvas, degree-scaled node sizes, a filter rail
with per-type counts, relation chips, free-text node search, a labels
toggle, and a click-to-inspect detail card showing a node's connections. - MCP Extensions (native connector). Feral now consumes Model Context
Protocol servers through the officialrmcpRust SDK, managed entirely in
the Tauri host. New "Extensions" entry in the sidebar (under Skills) with an
app-store style UI: curated catalog (File Access, Long-term Memory, GitHub,
Web Search, Browser Automation, Deep Reasoning), one-click install, on/off
toggle, "What can it do?" tool listing, and humanized errors. No transports,
JSON-RPC, raw values, internal paths, or API keys ever reach the frontend;
configs (including keys) live backend-side in~/.feral/mcp.json. - Drag & drop + paste attachments — any file type. Files and images can
be dropped onto the chat input, and screenshots paste straight from the
clipboard (Ctrl+V). PDFs and Office documents (.docx, .pptx, .xlsx, .odt)
are now parsed natively (new Rustextract_file_textcommand) so their
text reaches the model; plain-text files of any extension work as before;
and true binaries are attached as a path reference the agent can open with
its file tools instead of becoming a dead "Unsupported format" chip. The
agent path now receives every attachment too — previously files whose text
couldn't be extracted were silently dropped and never reached the model. - macOS and Linux releases. The release pipeline now builds and signs
installers for Windows (.msi/.exe), macOS Apple Silicon + Intel (.dmg),
and Linux (.deb/.rpm) from a single tag, updater manifest included.
The agent sidecar resolves its per-platform binary on all five targets. - Mascot redesign — the real Feral monster. The pixel companion is now
the brand mascot itself: charcoal-black fluffy monster with orange horns,
an orange face plate with big black eyes, tiny white fangs, and a round
orange belly. 55 animated variants across all 22 states, composed from a
single base sprite so the cast stays consistent (laptop typing, thought
clouds and lightbulbs, magnifier searches, party hats, heart eyes, a real
side-run cycle, dissolve-in spawning, and more). It also renders 26%
larger at a crisp integer 3× pixel scale, so every state, variant, and
effect is clearly readable without crowding the chat input. A procedural
pixel-effects layer plays around it per state: confetti on celebrate,
rising hearts, drifting Z's while sleeping, thought dots, an orbiting
search ring, a drawn-in green check on done, flashing error cross, work
sparks during tool calls. - Sonnet-style agent voice. SOUL.md rewritten (super friendly + ultra
useful), plus new bundled IDENTITY.md and AGENTS.md companions — each
user-overridable at~/.feral/<NAME>.md— composed into the system prompt. - Contributor guide.
docs/CONTRIBUTOR_GUIDE.md: three-runtime
architecture, IPC protocols, test matrix, build & release flow.
Stability
-
macOS/Linux: cloud model selection works in agent mode. The agent
sidecar binary is now resolved next to the main executable
(Contents/MacOS/feral-agentin the .app bundle,/usr/bin/feral-agent
on deb/rpm installs) where Tauri actually places it — previously only the
resource directory was checked, so the sidecar was silently dead on
macOS/Linux production installs and picking a cloud (BYOK) model from the
model selector did nothing. Model-switch failures (sidecar offline,
provider disabled, missing key) now surface as error notifications
instead of vanishing silently. -
Agent stop actually stops (this release). The Stop button's signal now
travels the whole chain: newferal_stop_generationTauri command →stop
message over sidecar stdin →AgentLoop.stop(sessionId)aborts the
in-flight inference fetch and any running tool. Previously the frontend
called a Rust command that didn't exist, so agent generations were
unstoppable. -
Agent tasks survive chat/tab switches. A live per-session mirror
(lib/feralLiveSession.ts) accumulates streamed content, tool bubbles, and
agent phase even while another chat is on screen; re-opening the in-flight
conversation rehydrates all of it instead of showing the stale disk
snapshot (which made tasks look reset during long tool runs). -
Tool-call bubbles behave. The mascot's tool-call stack now grows upward
from above the mascot (it could previously extend down over the typing
bar), and each finished bubble fades out on its own after 4s instead of
piling up until the turn ended. -
Unified stream stop (A2). One stop entry point (
lib/streamControl.ts)
routes Stop to whichever path (chat backend / agent sidecar) actually owns
the in-flight generation. Previously the Stop button in Agent mode told the
idle chat backend to stop while the sidecar kept generating. Feral streams
are stoppable per-session, and a new send interrupts the previous in-flight
stream on both paths. -
Sidecar supervision (#11). The Tauri shell now watches the agent sidecar
process, restarts it with backoff on crashes, and shows an "agent offline /
restarting" banner. Before: a sidecar crash made Agent mode silently mute. -
GGUF chat template (A4). The prompt format is now read from the model's
own GGUF metadata (tokenizer.chat_template) via llama.cpp's template
engine; the filename-based guess is only a fallback. A renamed GGUF no
longer gets a wrong template and corrupted output. -
Real tokenizer endpoint (P3). New
/tokenizeroute on the local API
backed by the loaded model's actual vocabulary; the agent's context
accounting no longer relies on GPT-2 BPE guesses, and token counts are
cached per message text. -
Idle-timeout transparency (#13). A stream that stalls for 300s is now
reported as an explained error ("model stopped responding…") instead of
silently ending in a fake "stopped by user" state. -
No more mid-reasoning dead ends. When a completion exhausts its
per-call token limit while the model is still thinking, the agent loop now
feeds the partial reasoning back and asks the model to finish — up to 4
automatic continuations — instead of surfacing "(The model used all
available tokens on reasoning and produced no answer)". Tasks complete
end-to-end regardless of the Max Tokens slider.
Error handling
- Root React ErrorBoundary (#9). A render exception now shows a recovery
screen (try again / reload) instead of a blank window. - Humanized inference errors (#10). Raw provider errors (401/429/network/
context overflow…) are mapped to plain-English messages with a fix-it
action (e.g. "key rejected → Open Cloud Keys"); the raw error stays
available under "Technical details". Local-engine failures no longer leak
[Error: …]text into the chat transcript. - Cron visibility (X3). Scheduled jobs now run through the full agent
loop (tools, memory, budgets) instead of a bare LLM call, and their results
and failures surface as toasts. Failed runs emit acron_errorevent.
First-run experience
- Zero-models flow (#14). After the first model download finishes, it is
loaded automatically (when nothing else is loaded), taking a fresh install
from "empty app" to "ready to chat" without a manual Load click. - Hardware-aware recommendation (#15). The onboarding wizard's final step
now reads your RAM/VRAM/Vulkan detection and recommends a concrete model
size + quantization to download. - Slow-start indicator (#16). While a model loads (with %) or a long
prompt prefills, the chat shows an explanatory status instead of silent
dots. - Onboarding sequencing (#17). The agent-creation flow now actually
mounts (it was unreachable) and never stacks on top of the first-run
wizard.
UI
- Tool-call bubbles (#18) are interactive: finished calls expand to show
the tool's output (or error), and long-running tools show live
retry/progress notes. - Empty states (#19): HuggingFace browse now explains "no results" instead
of rendering a blank list. - i18n groundwork (#20): typed EN/RO dictionary wired to the existing
language setting; chat surface migrated first, the rest moves incrementally. - Accessibility (#21): the search overlay is a proper dialog (focus
restore, Escape from anywhere, arrow-key navigation, combobox semantics). - Window dragging (#22): Models and Settings pages gained drag regions —
the frameless window is now movable from every page, not just Chat. - Mascot (#23–26): reacts to ask_user prompts (curious) and sidecar
downtime (asleep); can be disabled in Settings → Appearance; greets you in
the onboarding wizard; single-animation states gained cadence variants so
long sessions don't loop one identical animation.
Docs
- README rewritten for 0.2.0 (install matrix, hardware requirements, BYOK
quick start, honest privacy section, current screenshots). - New:
SECURITY.md(threat model + reporting),docs/UPDATER_KEY_MIGRATION.md,
docs/USER_GUIDE.md(Agent vs Chat, tools, skills),docs/CONTRIBUTING.md
(architecture, tests, builds).