Releases: srvsngh99/Krill
Release list
v0.23.0 — shell escapes at the chat prompt
A shell, in the chat. Type !git status at the prompt and it runs — right there, in the session's working directory. The output lands in the transcript and rides along with your next message, so you can show the model what happened instead of describing it. No more switching windows and pasting.
!! is the private form: same run, same output on screen, but the model never sees it. Handy when the command's output is noisy, irrelevant, or yours alone. Which behaviour the single bang gets is up to you — shell_output_to_model in ~/.krill/config.toml, and /config shell_output_to_model=false retargets the running session, not just the next one.
The output is banked rather than posted as a turn of its own: your message bubble still shows only what you typed, and Krill tells you when something is waiting to ride along. Stack up several runs before you write the message if you like. \! sends a message that really starts with an exclamation mark.
Shell escapes are a human action, so they are not leashed by the agent's permission level — plan mode restrains the model, not you. In the classic line REPL they only work on a real terminal, so piping a file into krill run can never execute a line inside it. The phone/web UI at /ui has no shell escape at all, since that surface is served over the network.
One fix worth calling out: the agent's bash tool used to hand its child Krill's own stdin. An ssh, a git commit with no -m, or a bare read would quietly compete with the TUI for your keystrokes. Commands now get /dev/null and an immediate end-of-input instead.
Install
brew tap srvsngh99/krill && brew install krill
# or
sh <(curl -fsSL https://raw.githubusercontent.com/srvsngh99/Krill/main/install.sh)Full notes: CHANGELOG · TUI reference
v0.22.0 — the agent can ask you things now
The agent can ask you things now. Give it an ambiguous task and instead of
guessing it asks — one question, a few concrete options, answered with a
keypress in the TUI, a tap on your phone, or a number on the CLI. It works in
every permission posture, because building the right thing matters more than
never being interrupted.
Plan mode also gained an exit. When the plan is ready the agent asks to start
implementing, and you choose how much leash to hand over: apply edits
automatically, confirm each one, or keep planning. It can never grant itself
unattended shell access — that stays a deliberate Shift+Tab.
New adaptive posture for when you don't want to be asked at all: the agent
starts read-only, writes its plan, then switches itself to editing when it is
ready. Shell commands still prompt, so the dangerous half stays leashed. The
footer tells you which phase it is in.
The TUI caught up too — a sidebar with live task progress, real context usage,
and session totals; and file edits now render as proper unified diffs with line
numbers instead of an escaped one-line blob. Plus a fix worth calling out: the
footer's context meter was showing only the window size, never what you had
actually used. brew upgrade krill.
v0.21.0 — agent sessions + phone/web UI at /ui
Krill code, from your phone. krill serve now hosts the agent — the same loop, tools and permission postures as krill code — and serves a web app at /ui that ships inside the binary. Open it from any browser on the LAN or over Tailscale, add it to your iPhone home screen, pick a repo, and drive a coding session: live transcript, collapsible tool calls, and approval prompts you answer with a tap. Sessions survive the phone disconnecting (the event stream replays on reconnect), each session works inside its own workspace, and agent turns share the GPU queue with ordinary API requests instead of blocking them.
brew upgrade krill # or: brew tap srvsngh99/krill && brew install krill
KRILL_API_KEY='choose-a-secret' krill serve --host 0.0.0.0
# phone → http://<mac-ip>:57455/ui (Share → Add to Home Screen)Added
- Hosted agent sessions under
/v1/agent/*: create a session rooted in any workspace, send tasks, tail a seq-numbered SSE stream (replayable via?since=/Last-Event-ID), answer tool approvals over HTTP. Docs:docs/AGENT_UI.md(with a step-by-step walkthrough),docs/SERVER_API.md. - The
/uiphone/web app: sessions list, workspace browser, live transcript with tool cards, tap-to-approve sheet, PWA manifest + icon.GET /redirects there; the startup banner prints the tailnet URL. AgentWorkspacetask-local so many sessions in one server each act in their own repo;RemoteApprovergate with per-session "always allow"; per-completion generation-queue slots so agent turns interleave with API chat.
Fixed
globandgrepresults lead with a match count (#300).- The agent SSE heartbeat is written on the connection's event loop.
Full notes: CHANGELOG.md. Apple Silicon only; digest 5dc13611a82a7a673cd76e41f56fdb834758fafc5cc8095569e5ebb5b3fa2b72.
v0.20.0 — Qwen3.8-27B
Qwen3.8-27B, for free. Qwen's new 27B vision-language flagship is built on the Qwen3.5 architecture and ships as model_type: "qwen3_5" — the same hybrid decoder Krill already runs natively, just scaled to 64 layers. So it needed no new architecture code.
krill pull qwen3.8-27b
krill run qwen3.8-27b "explain a hybrid linear-attention decoder"
krill run qwen3.8-27b --image diagram.png "what does this show?"Verified end to end on a 24 GB Mac: loads in 1.3s, 9.3 tok/s decode, image input correct including orientation. ~16.1 GiB resident at int4 — it fits a 24 GB box, but with little headroom.
Also in this release
- A config read that was correct only by luck. transformers 5.x moved the rope knobs into a nested
rope_parametersobject, and Qwen3.8 shipsrope_thetaonly there — Krill's top-level decode fell through to a10_000_000default that happens to equal the real value. A qwen3_5 checkpoint with a different theta would have loaded silently wrong. Fixed and gated. KRILL_REASONING_EFFORT(xhigh|medium|low) to dial Qwen3.8's thinking depth./modelno longer shows an ORNITH wordmark for Qwen models — theqwen3_5runtime now serves three vendors' checkpoints.
Weights: srv-sngh/Qwen3.8-27B-mlx-4bit, mirrored byte-for-byte from mlx-community/Qwen3.8-27B-4bit.
Full notes in CHANGELOG.md.
Install
brew tap srvsngh99/krill && brew install krill
# or
curl -fsSL https://raw.githubusercontent.com/srvsngh99/Krill/main/install.sh | shv0.19.0 — vision orientation fix, native Muse Glimmer 30B, krill perplexity
v0.19.0 — 2026-08-12
Your images were upside down. Krill flipped every image it decoded, in
Gemma 4, LLaVA, Qwen 2.5-VL and Llama 3.2 Vision — a CGBitmapContext stores
its buffer top-row-first, but four decoders read it back bottom-first. Because
a flip preserves shape and colour, it never looked like a bug; it looked like
models being bad at "above" and "below". Fixed, and pinned by a gate over all
seven decoders. This release also lands native Muse Glimmer 30B (text and
vision, no Python in the inference path), a new krill perplexity command
that measures what a quantization costs you in quality, and a repaired
krill bench — it had been benchmarking a code path the server never runs.
Install
brew upgrade krill # or: brew install srvsngh99/krill/krillFull detail in CHANGELOG.md.
v0.18.0 — Krill opens as an agent
Krill opens as an agent now. Bare krill lands in the full-screen agent TUI — tools on, read-only plan permissions until you raise them — with a new toolset (now, todo, and a native repo_map that hands even small models an accurate map of your codebase), the Krill.md loop (/init writes it, every session reads it), and ambient context so the model knows the date, directory, and machine without burning a turn.
web_search degrades to keyless DuckDuckGo instead of failing when a backend is missing. The TUI got a full polish pass: live status above the input box, collapsible tool output (ctrl+o), live tok/s in the footer, aligned columns, branded ember loading, and a session receipt on exit.
Under the hood, the server hardening line shipped: bearer auth for remote serving (KRILL_API_KEY), transactional model pulls with rollback, and digest-verified installs and self-updates.
Full details: CHANGELOG
brew tap srvsngh99/krill && brew install krill # or: brew upgrade krill
# or
curl -fsSL https://raw.githubusercontent.com/srvsngh99/Krill/main/install.sh | shv0.17.0 — fix sampling at temperature > 0, add native Nanbeige 4.2
v0.17.0 — 2026-07-28
Sampling was broken for every model at any temperature above zero. The
sampler handed MLXRandom.categorical probabilities where it expects logits, so
it softmaxed an already-softmaxed distribution — flattening it toward uniform and
giving tokens the filters had rejected the same weight as the model's top
choice. Greedy decoding never touches that path, which is why --temp 0 always
looked right and the bug shipped. If you ever set a temperature and got fluent
nonsense, this was why.
Two more things that only show up when you stream one token at a time: a
trailing Strip decoder ate the leading space of every token on SentencePiece
models (ThecapitalofFranceisParis.), and byte-fallback newlines were dropped
entirely, flattening markdown lists onto one line. Mistral was affected too.
Also adds native support for Nanbeige 4.2 3B — a looped transformer that
runs its 22 blocks twice over the same weights, giving 44 effective layers from
3B parameters' worth of memory. It holds 44 KV caches rather than 22, applies its
final norm at the end of every loop, and decouples head_dim from hidden_size.
llama.cpp cannot load the architecture at all and mlx-lm has no port, so Krill's
runtime is gated against the authors' own PyTorch code — and beats it 3.9x on
decode at a fifth of the memory. Ships as nvfp4 (2.26 GB from 8.3 GB):
krill pull nanbeige-4.2-3b. Apache 2.0, built on Nanbeige/Nanbeige4.2-3B —
credit to the Nanbeige team at BOSS Zhipin.
One usability note that came with it: a reasoning model can spend an entire
512-token budget inside a hidden <think> block and return nothing. Single-shot
krill run now gives thinking models the same headroom interactive chat already
had.
v0.16.3 — gemma-4-e2b crash fix + tool names constrained at sampling time
v0.16.3 — 2026-07-26
A correctness release, found by installing Krill from scratch and following our
own instructions. gemma-4-e2b — the model the install caveats tell you to
pull first — crashed on its first generation. 4-bit checkpoints ship the
per-layer projection already quantized; the loader was skipping it, so a dense
layer held a packed tensor and the first matmul trapped. Fixed, and the golden
path (brew install → krill pull gemma-4-e2b → krill run gemma-4-e2b) works
end to end again.
Also: tool names are now constrained while the model samples them. A model
trained on another harness's vocabulary used to ask for Read where Krill
offers read_file and die on its first tool call. A trigger-activated grammar
now makes an unknown tool name unrepresentable rather than something to detect
and repair — at no measurable decode cost. See
docs/TOOL_NAME_RESOLUTION.md.
Plus a quieter CLI: diagnostics go to stderr instead of corrupting krill list | …, the one-line installer no longer asks for a password it does not need, and
the pull progress bar reaches 100%.
Install
brew tap srvsngh99/krill && brew install krill # or: brew upgrade krill
curl -fsSL https://raw.githubusercontent.com/srvsngh99/Krill/main/install.sh | shApple Silicon, macOS 14+. Full detail in CHANGELOG.md.
v0.16.2 — LocateAnything-3B (visual grounding)
Native support for NVIDIA LocateAnything-3B, a visual-grounding VLM that locates anything in an image as bounding boxes (<box><x1><y1><x2><y2></box>, coords 0–1000).
- New native Swift+MLX runtime: MoonViT (Kimi-VL) native-resolution vision tower + connector + Qwen2.5-3B decoder; vision path logit-parity-verified vs the NVIDIA reference.
- Shipped as a mixed-precision nvfp4 build (~3.1 GB, grounding-parity with bf16, ~50 tok/s) at
srv-sngh/LocateAnything-3B-mlx-nvfp4under the NVIDIA License (non-commercial).
krill update
krill pull locateanything-3b
krill run locateanything-3b "Locate the red car." --image street.jpg
Built on nvidia/LocateAnything-3B — credit to the original authors.
v0.16.1: Qwythos-9B (qwen3_5)
Adds the qwythos-9b-nvfp4 model — the empero-ai/Qwythos-9B-Claude-Mythos-5-1M fine-tune in Krill's mixed-precision nvfp4 format.
It's a Qwen3.5-class hybrid (GatedDeltaNet linear-attention + full attention), the same architecture as Ornith-9B, so it runs on Krill's existing native .qwen35 text decoder (vision deferred to mlx_vlm) — no new runtime. The build is g16 nvfp4 with down_proj/o_proj protected at 8-bit affine and the vision tower preserved (~6.4 GB), published at srv-sngh/Qwythos-9B-Claude-Mythos-5-1M-mlx-nvfp4.
krill pull qwythos-9b-nvfp4
krill run qwythos-9b-nvfp4 "Give three tips for staying focused while studying."
Built on empero-ai/Qwythos-9B-Claude-Mythos-5-1M (Apache-2.0) — credit to the original authors.