An agent, not a chat box: 22 tools plus MCP servers, persistent memory, its own skills, a browser panel, and eyes.
Runs on this machine, or on a provider you choose.
| MoE 512 experts, 10 active |
200k context, one slot |
73.45 GiB model on disk |
30,984 MiB VRAM in use |
41.76 tok/s decode |
727.65 tok/s prefill |
yes vision |
Decode and prefill: 2026-09-01 (#182), driver 616.56, pin 6c84c7d5d, one 33,494-token cold turn per boot, three rounds interleaved against the previous placement (539.98 / 35.74). Decode range 40.34–42.76. The two engine patches that followed, PR #28040 and PR #27880, were each measured at parity against this line. VRAM: settled after load, 2026-09-01.
| Operating point | what this build runs at |
| Second operating point | Qwen3.8-27B, still shipped |
| Requirements | card, disk, Windows |
| Install | one line |
| Start | server, then a client |
| Documentation | everything else |
Default since 2.0.0. DEFAULT_BASE_URL is http://127.0.0.1:8083/v1.
| Model | Qwen3.8-Flash-Next-UD-Q2_K_XL, 3 shards, 73.45 GiB |
| Architecture | qwen4exp MoE: 48 layers, 512 experts per layer, 10 active, full attention every 4th |
| Quant | UD-Q2_K_XL, Unsloth |
| Context | -c 200000, one slot (-np 1) |
| Placement | -ncmoe 30 --fit off --load-mode none, -b 2048 -ub 2048 |
| KV | q8_0 / q8_0 |
| Vision | --mmproj mmproj-F16.gguf, 904,004,000 B (#170) |
| Reasoning | low medium high; max, minimal and an explicit off return HTTP 500 (#160) |
| Thinking cap | reasoning_budget 1024 per request, from the manifest (#176) |
| GPU | RTX 5090, 32,607 MiB. 30,984 MiB in use, 1,059 MiB left |
| Decode | 41.76 tok/s (40.34–42.76) |
| Prefill | 727.65 tok/s |
| Build | llama.cpp pin 6c84c7d5d (PR #27742) + PR #28040 + PR #27880, local. 62 graph splits per decoded token |
| License | qwen-community-1.0 — not Apache-2.0 |
| Source of truth | manifests/operating-point.json |
Conditions: 2026-09-01, driver 616.56, one 33,494-token cold turn per boot, 200 tokens out,
three rounds interleaved against the previous placement -ncmoe 40 -ub 4096 (539.98 / 35.74);
wall clock per turn 67.9 s → 51.3 s. Accepted live at 41.8 tok/s. Decode falls with context
depth: ms/token = 24.06 + 0.0706 per 1,000 tokens (r² 0.93), i.e. ~41 tok/s at 30k and ~28 at
175k. Not measured: decode at a full 200k window, and whether an image prefill fits in the
1,059 MiB left on the card.
The engine is a local build. The packaged b10269 cannot load qwen4exp at all. The pin
carries two patches, both measured at parity or better on this line: PR #28040 (the PLE n-gram
lookup in O(log n) instead of a scan over every used KV cell) and PR #27880 (the PLE embedding
hoisted into the token embedding's graph split: 62 splits per decoded token instead of 64,
−0.99 ms on the fixed term in the one clean pair, inside the 1.35 ms spread of one arm).
The engine has nothing more to give, and that is measured (#159, #186). 67.1 % of CPU
cycles per token are synchronization at the 62 CPU↔GPU handoffs; the RAM bus runs at 33.5 %.
Every lever inside llama.cpp is dead by a direct measurement: bandwidth, expert cache, thread
count, OMP_WAIT_POLICY, -ncmoe below 30, and the barrier implementation itself
(GGML_OPENMP=OFF costs +4 to +6 ms per token).
Qwen3.8-27B is still shipped, still measured, and still bootable from the model menu — it is the faster one per token and the smaller download.
| Model | Qwen3.8-27B-UD-Q4_K_XL.gguf, 17,559,178,144 B |
| Architecture | dense, no expert_count; hybrid attention + SSM, full_attention_interval 4 |
| Quant | UD-Q4_K_XL, Unsloth, imatrix 1,251 chunks |
| Context | -c 200000, one slot (-np 1) |
| KV | q8_0 / q8_0, 6,647.00 MiB measured against 6,645.8 predicted |
| Vision | --mmproj mmproj-F16.gguf, 927,607,488 B; +1,124 MiB VRAM, text prefill unchanged |
| Speculation | --spec-type draft-mtp, head ships in the GGUF |
| GPU | RTX 5090, 32,607 MiB. 26,140 MiB in use |
| Decode | 123.05 tok/s (11-round turn) · 133.18 (warm turn) |
| Prefill | 2,262.96 tok/s |
| Port | 8082 |
| Build | llama.cpp server 1c3c967 — the packaged engine runs it |
| License | Apache-2.0 |
| GPU | NVIDIA. 32 GB for this operating point. 16 GB is the installer's floor, unmeasured |
| System RAM | 32 GB for the 27B. 64 GB for Flash-Next -- -ncmoe 30 keeps the experts of 30 of 48 layers in system RAM |
| Disk | ~2 GB for Crow, 73.45 GiB for the model (3 shards) plus 0.9 GiB for the projector. The 27B is 16.35 GiB plus 0.9 |
| OS | Windows x64 |
| Python | 3.8+. Terminal client uses the standard library only |
| WebView2 | Window only. Ships with Windows 11 and with Edge |
| pywebview | Window only, ~2 MB. Installed by install.ps1 |
| Node | Only for MCP servers started with npx or node. Reported by the preflight, never required. NOT installed by install.ps1 |
irm https://raw.githubusercontent.com/nibor1896/Crow/main/install.ps1 | iexPreflight, download, extract, per-file sha256 against the release manifest, then the start lines
with paths resolved. No elevation. Everything under %LOCALAPPDATA%\Crow.
Model, separately. Flash-Next, the default:
hf download unsloth/Qwen3.8-Flash-Next-GGUF --include "*UD-Q2_K_XL*" --local-dir $env:LOCALAPPDATA\Crow\models\qwen-next-gguf
hf download unsloth/Qwen3.8-Flash-Next-GGUF mmproj-F16.gguf --local-dir $env:LOCALAPPDATA\Crow\models\qwen-next-ggufThree shards of 73.45 GiB total, plus 904,004,000 B for the projector.
The 27B, the second operating point:
hf download unsloth/Qwen3.8-27B-GGUF --include "*UD-Q4_K_XL*" --local-dir $env:LOCALAPPDATA\Crow\models\qwen38-gguf
hf download unsloth/Qwen3.8-27B-GGUF mmproj-F16.gguf --local-dir $env:LOCALAPPDATA\Crow\models\qwen38-ggufOne file of 17,559,178,144 B and one of 927,607,488 B.
The second line of each pair is the vision projector, and the glob of the first does not catch
it — it sits in the repository ROOT, above the quant folder. Without it the server starts as a
text model and read_image refuses with a sentence. hf prints ✓ Downloaded even when it could
not reach the repository, so check the byte counts.
Crow boots it for you, from the manifest, with the log and the process group it needs:
python $env:LOCALAPPDATA\Crow\cli\crow.py --serve flash-next-q2-k-xlWithout a name it lists what is bootable. The window does the same from the model menu, and records the boot so a later window can revive the server.
By hand, the default operating point:
C:\path\to\your\llama-server.exe `
-m $env:LOCALAPPDATA\Crow\models\qwen-next-gguf\UD-Q2_K_XL\Qwen3.8-Flash-Next-UD-Q2_K_XL-00001-of-00003.gguf `
--port 8083 -c 200000 -b 2048 -ub 2048 -ctk q8_0 -ctv q8_0 `
-ncmoe 30 --fit off --load-mode none -np 1 `
--mmproj $env:LOCALAPPDATA\Crow\models\qwen-next-gguf\mmproj-F16.gguf --jinja--load-mode none is what makes it reproducible: the expert weights are read once at boot
(about a minute) instead of being paged off the disk during the turn.
This one needs a local engine. qwen4exp exists in llama.cpp only from PR #27742; the
packaged b10269 cannot load it. Build the pin 6c84c7d5d and apply PR #28040 (one hunk by
hand) and PR #27880 (applies cleanly) for the line above. Do not build b10687 or newer: it
aborts during CUDA warmup on this card, and the cause is not attributed.
The second operating point runs on the packaged engine:
$env:LOCALAPPDATA\Crow\bin\llama-server.exe `
-m $env:LOCALAPPDATA\Crow\models\qwen38-gguf\Qwen3.8-27B-UD-Q4_K_XL.gguf `
--mmproj $env:LOCALAPPDATA\Crow\models\qwen38-gguf\mmproj-F16.gguf `
--port 8082 -c 200000 -ctk q8_0 -ctv q8_0 -ngl 99 -np 1 --jinja `
--slot-save-path $env:LOCALAPPDATA\Crow\session `
--spec-type draft-mtppython $env:LOCALAPPDATA\Crow\cli\crow_gui.pypython $env:LOCALAPPDATA\Crow\cli\crow.pyThe window reads the --port off the running process. The terminal client defaults to
http://127.0.0.1:8083/v1 since 2.0.0; --base-url http://127.0.0.1:8082/v1 points it at the
second operating point.
Configuration, features and measurements live under docs/.
| Server flags | what llama-server is started with |
| Client flags | what crow and the window take |
| Reasoning levels | low, medium, high, off |
| Tools | the twenty-two built in -- git, read_image, render_page among them |
| Settings | settings.json |
| mcp.json | every key, both transports |
| Memory | what is written, by whom, and the gate |
| Skills | using and writing one |
| Session search | the index |
| MCP servers | stdio, elicitation, commands |
| MCP over HTTP | headers, OAuth |
| Remote models | subscriptions, dialects, routing |
| Window | the GUI |
| Measurements | every number with its conditions |
| Other models | DeepSeek 0731 and Qwen3.8-27B, each with its measured line |
| Browser panel | tabs, the address bar, and what render_page does |
| Architecture | the four modules and the core/surface split |
| Testing | three suites, five checkers, the manifest |
| Repo | layout |
| Not built | decided against, and why |
MIT. See LICENSE.
Model: Qwen (Apache-2.0). Quantisation by Unsloth. Engine: llama.cpp. The optional third model, Qwen3.8-Flash-Next, is licensed qwen-community-1.0 — read it before redistributing; Crow does not ship the weights.
Earlier READMEs: v0.5.1, Qwen-first · v0.5.1, the one before it.