<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title>SingularityByte</title>
        <link>https://singularitybyte.com/feed.xml</link>
        <description><![CDATA[SingularityByte’s Artificial Intelligence RSS Feed]]></description>
        <language>en</language>
        <ttl>120</ttl>
        <atom:link href="https://singularitybyte.com/feed.xml" rel="self" type="application/rss+xml"/>
        <image>
            <url>https://singularitybyte.com/assets/images/singularitybyte-logo.png</url>
            <title>SingularityByte</title>
            <link>https://singularitybyte.com</link>
        </image>
        <item>
    <title><![CDATA[MotionBricks]]></title>
    <link>https://singularitybyte.com/models/nvidia-motionbricks-real-time-motion-generation.html</link>
    <description><![CDATA[ 
<p>Assassin's Creed ships with over 15,000 hand-authored animation clips. Every one of them is wired into a state machine by hand: this walk blends into that turn, that turn blends into this vault, and if you add a new gait you touch a hundred transitions. NVIDIA Research just published a model that replaces that graph. MotionBricks is a single 224M-parameter neural backbone covering more than 350,000 motion skills, running at 15,000 FPS with 2 ms latency, and it drives a Unitree G1 humanoid from the same weights that drive a game character. The code is Apache 2.0, the checkpoints are downloadable, and there is a licensing catch that nobody is talking about. Here is what shipped, how it works, and what is actually open.</p>

<h2>What actually shipped</h2>

<p>MotionBricks lives in NVIDIA's <a href="https://github.com/NVlabs/GR00T-WholeBodyControl/tree/main/motionbricks" target="_blank" rel="nofollow noopener noreferrer">GR00T-WholeBodyControl</a> repository, in a <code>motionbricks/</code> subdirectory. The repo sits at roughly 3.2k stars. The paper was accepted to SIGGRAPH 2026 and published in ACM Transactions on Graphics, with the preprint posted to arXiv on 2026-04-27.</p>

<p>The release is dual-licensed. Source code is Apache 2.0. Pretrained weights fall under the NVIDIA Open Model License, which permits commercial use with attribution, subject to NVIDIA's trustworthy-AI terms. The checkpoints ship through Git LFS rather than Hugging Face, and total about 2.2 GB:</p>

<ul>
<li><code>motionbricks_pose</code>, 1.6 GB</li>
<li><code>motionbricks_root</code>, 391 MB</li>
<li><code>motionbricks_vqvae</code>, 273 MB</li>
<li><code>G1-clip.ckpt</code>, 7.5 MB</li>
</ul>

<p>One thing to set expectations on early: this is a preview. The repo says full integration into NVIDIA's GEAR-SONIC pipeline was targeted for roughly one month after the April release. It is August now, and MotionBricks is still labelled preview. You get the interactive demo and the checkpoints; you do not yet get the fully embedded production pipeline.</p>

<h2>The problem: animation graphs do not scale</h2>

<p>If you have never shipped a character controller, here is the shape of the problem. Traditional real-time animation runs on a state machine, often called an animation graph. Each node is a clip or a blend space. Each edge is a transition with conditions, blend durations, and priority rules. Walking to running is one edge. Walking to running while injured while carrying a crate while on a slope is a combinatorial mess.</p>

<p>The cost is not the clips. Mocap is cheap now. The cost is the wiring, and the wiring grows faster than the content. Adding a zombie gait to a finished game is not one clip, it is every transition into and out of that gait, plus the QA pass to catch the ones you missed. This is why animation teams grow superlinearly with game scope.</p>

<p>Robotics hit the same wall from the opposite direction. A humanoid like the Unitree G1 does not have 15,000 curated clips; it has a controller that is either hand-tuned per behaviour or trained per task with reinforcement learning. Both approaches are per-skill. Neither gives you one policy that walks, crouches, picks something up, and transitions between all three without a human specifying the transitions.</p>

<p>MotionBricks proposes the same fix for both: stop authoring the graph, and learn the whole space of motions in one generative model that you query at runtime.</p>

<h2>How it works: tokenizer, root, pose</h2>

<p>The system is three modules, and the total is small enough to be surprising. About 224M parameters covers all 350,000 skills. For a site that mostly writes about 100B-class releases, that number is worth sitting with.</p>

<h3>1. The motion tokenizer (23.5M params)</h3>

<p>Motion is continuous, but the generative backbone works on discrete tokens, so the first job is converting one into the other. MotionBricks uses a VQ-VAE, a vector-quantized autoencoder: it compresses input into a latent space, snaps each latent vector to the nearest entry in a learned codebook of discrete symbols, then reconstructs from those symbols. The codebook entries become your vocabulary, and motion becomes a sequence you can model like text.</p>

<p>The encoder is a 1D convolutional U-Net with 1024 channels and three residual conv layers per level, downsampling at 2x and 4x so that T input frames become T/4 tokens. It encodes joint positions and rotations but deliberately excludes root information. The decoder mirrors it and reinjects the root trajectory through skip connections at every level.</p>

<p>The quantization is multi-head: instead of one codebook per latent, each embedding is split along the feature dimension and quantized separately against K parallel codebooks. That gives you a combinatorial vocabulary from small codebooks, which is how you get 350,000 skills out of something this size.</p>

<h3>2. The root module (50M params)</h3>

<p>The root is where the character actually goes in world space. It is a transformer, 512 dimensions, 12 heads, 12 layers, and it runs in two steps. First it predicts timing: given the target, how many frames should this motion take? It outputs a distribution over frame counts at 4-frame resolution. Then it predicts the actual root trajectory over 16 learnable frame-slot embeddings, covering up to 64 frames.</p>

<p>Splitting timing from trajectory matters. It is why a reach can take longer when the target is farther away without anyone authoring a speed curve.</p>

<h3>3. The pose module (150M params)</h3>

<p>The largest module, and the one that does the animation. A transformer at 1024 dimensions, 16 heads, 16 layers, modelling the distribution over pose tokens conditioned on the root trajectory and any keyframe constraints. Training uses masked token modelling with a cosine-scheduled curriculum: you hide a fraction of the tokens and train the model to fill them back in, starting easy and masking progressively harder. It is BERT-style pretraining applied to motion, and it is what makes the model good at in-betweening, since filling gaps is literally the training objective.</p>

<p>Training cost, for reference: 32 H100s across 4 nodes, 2 million updates, batch size 256 per GPU, Adam at 5e-5 decaying to 2e-6. Roughly 7 days for the tokenizer, 3 for the root module, 7 for the pose module.</p>

<h2>Smart primitives: the part you actually program against</h2>

<p>The architecture is the interesting half. The interface is the useful half. NVIDIA calls the control layer "smart primitives," and it comes in two flavours.</p>

<p><strong>Smart Locomotion</strong> is the navigation interface. You give it velocity, heading, and a style, and it produces the gait. Styles include stylized variants like zombie, injured, skipping, and strafing, and you can switch between them continuously at runtime instead of triggering a transition clip. Under the hood the root trajectory gets refined in stages: a critically damped spring model produces a first pass, a neural refinement pass improves it, and the decoder refines it once more. That layering is why the output does not foot-skate when you yank the stick.</p>

<p><strong>Smart Objects</strong> is the interaction interface, and it is the one that eats the most authoring time in a traditional pipeline. You place a proxy keyframe describing intent, for example the hand pose at the moment of grabbing a handle, and the backbone fills in the approach, the contact, and the follow-through. You do not author the reach.</p>

<p>Keyframe enforcement has a dial. Setting the tolerance to zero makes the keyframe a hard constraint, so the hand lands exactly there, which is what you want for a door handle or a ladder rung. Setting it above zero makes it soft guidance, so the model gets close but prioritizes natural motion, which is what you want for a gesture. Objects bind through collision tracing for detection, a socket system for placement, and keyframe anchoring, and each behaviour can use a different number of keyframes.</p>

<h2>Benchmarks</h2>

<p>The paper evaluates against six baselines on its 350k dataset. The headline table:</p>

<table class="styled-table">
<thead>
<tr><th>Method</th><th>FPS</th><th>Latency</th><th>FID</th><th>MMD</th><th>Win rate</th><th>Jnt jitter</th><th>Foot skate</th></tr>
</thead>
<tbody>
<tr><td><strong>MotionBricks</strong></td><td>15,000</td><td>2 ms</td><td>1.054</td><td>0.1056</td><td>86.5%</td><td>3.38</td><td>0.003</td></tr>
<tr><td>Cond. in-betweening</td><td>27,000</td><td>2.4 ms</td><td>1.594</td><td>0.1093</td><td>0.8%</td><td>16.88</td><td>0.018</td></tr>
<tr><td>CondMDI</td><td>1,930</td><td>33.2 ms</td><td>1.213</td><td>0.1080</td><td>15.6%</td><td>16.19</td><td>0.012</td></tr>
<tr><td>MMM</td><td>3,600</td><td>18.1 ms</td><td>1.544</td><td>0.1176</td><td>19.9%</td><td>5.40</td><td>0.005</td></tr>
<tr><td>Closd-DiP</td><td>4,200</td><td>15.3 ms</td><td>1.292</td><td>0.1076</td><td>15.1%</td><td>14.03</td><td>0.015</td></tr>
</tbody>
</table>

<p>Read the first two rows together, because they are the honest story. Conditional in-betweening is faster: 27,000 FPS against 15,000. It also has a 0.8% human win rate, five times the joint jitter, and six times the foot skate. Speed was never the hard part of this problem. Quality at speed was, and that is where the gap sits.</p>

<p>The metrics, briefly: FID measures distribution distance from real motion, lower is better. MMD is another distributional distance. Joint jitter and foot skate are the two artifacts that make generated animation read as fake, high-frequency limb noise and feet sliding on the ground while planted. Win rate is a human preference study.</p>

<p>The same ordering holds on HumanML3D and LaFAN1-G1, which are public benchmarks, so this is not purely a home-field result. Note the FPS figures are measured on an RTX 5090.</p>

<h2>Does it scale? The 350k versus 70k question</h2>

<p>The paper trains on four datasets, and the pair that matters is the internal 350k corpus and its 70k subset. The full set is 700 hours, 315k training clips, 36 categories, roughly 9,300 unique skills. The 70k subset is 140 hours and 62k training clips, and exists specifically as a scaling benchmark.</p>

<p>The scaling result is the argument for the whole approach: quality improves with corpus size, which means this is a data problem rather than an architecture problem. Given that the architecture is 224M parameters, the implied roadmap is obvious. Do not scale the model, scale the mocap.</p>

<p>Which raises the question of where you get the mocap.</p>

<h2>The dataset catch: what "open" means here</h2>

<p>This is the part worth reading carefully before you plan around MotionBricks.</p>

<p>The 350k corpus the shipped checkpoints were trained on is proprietary. It is production-grade mocap from real actors, and it was not released. What was released, on 2026-03-16, is BONES-SEED: 142,220 annotated human motions, roughly 288 hours, in SOMA and Unitree G1 formats, with natural-language descriptions, temporal segmentation, and skeletal metadata. It is a genuinely large and well-annotated dataset.</p>

<p>It is also gated. Access on Hugging Face is restricted, and the terms cover academic use and qualifying startups; anything else goes through <code>licensing@bones.studio</code>. So the practical position for a commercial team is this asymmetry:</p>

<ul>
<li>You <strong>can</strong> ship the pretrained weights in a commercial product, under the NVIDIA Open Model License, with attribution.</li>
<li>You <strong>cannot</strong> reproduce those weights, because the corpus behind them is not public.</li>
<li>You <strong>cannot</strong> straightforwardly retrain on the open substitute either, because BONES-SEED is gated for commercial use, and it is 288 hours against the 700 the model actually saw.</li>
</ul>

<p>The training scripts underline the point. They ship and they run, but they default to synthetic data. Real training means bringing your own corpus or clearing a license.</p>

<p>That is a meaningfully different posture from NVIDIA's own <a href="/models/nvidia-nemotron-3-ultra.html">Nemotron 3 Ultra</a>, which shipped weights, data, and recipes under a permissive license and can be reproduced end to end. MotionBricks is open-weights and open-code, not open-pipeline. Both are legitimate releases. They are not the same thing, and the difference decides whether you can fine-tune on your own studio's motion library or only consume what NVIDIA trained.</p>

<h2>Two audiences, one repo</h2>

<p>MotionBricks is aimed at game and animation developers on one side and robotics teams on the other, and the two get quite different value today.</p>

<p><strong>Game and animation developers</strong> get the strongest immediate case. The state machine problem is real, the smart primitives map cleanly onto how character controllers already work, and 2 ms latency fits inside a frame budget with room to spare. What you do not get is an engine plugin. There is no Unreal or Unity integration in the box, so shipping this means writing the bridge yourself and validating it against your rig. The retargeting caveat below bites here.</p>

<p><strong>Robotics teams</strong> get a G1-specific path: the interactive G1 demo, G1 skeleton meshes, and BONES-SEED's G1 MuJoCo trajectories. The gap is that MotionBricks is kinematic, not physics-simulated. It generates poses, not torques, and it has no awareness of whether a motion is dynamically feasible or within the robot's joint limits. It also assumes ground-truth object poses and terrain geometry, which a real robot does not have. You need a perception stack and a physical feasibility layer between MotionBricks and hardware. That work is not small, and it is exactly what the SONIC side of the repo is for.</p>

<p>If you follow the site's physical-AI coverage, the split is familiar. <a href="/models/nvidia-cosmos-3.html">Cosmos 3</a> predicts what the world does next; MotionBricks decides how a body moves through it. They sit at different layers of the same stack, and neither one closes the perception gap on its own.</p>

<h2>Limitations and gotchas</h2>

<ul>
<li><strong>Preview status.</strong> Full GEAR-SONIC integration was targeted for about a month after the April release and has not landed. Plan around the demo and checkpoints, not the production pipeline.</li>
<li><strong>Kinematic, not physical.</strong> The authors state the model can produce physically implausible motion, including self-collisions and motions exceeding hardware constraints. Nothing in the model prevents this.</li>
<li><strong>No visual planning.</strong> It assumes ground-truth object poses and terrain geometry. Real robots need a vision-driven kinematic planner in front of it.</li>
<li><strong>Retargeting is unsolved.</strong> Adapting motion across different body proportions still trades runtime speed against quality. If your character is not human-proportioned, expect work.</li>
<li><strong>Dataset coverage.</strong> The authors call 350,000 motions "small" with limited coverage of rare motion types. Unusual or highly stylized motion is where it will thin out.</li>
<li><strong>Linux and X11 only, in practice.</strong> The demo uses a keyboard key-grab workaround that conflicts on Wayland, macOS, and Windows.</li>
<li><strong>Crawling modes lack side-only directions.</strong> A small but documented hole in the locomotion coverage.</li>
<li><strong>NVIDIA GPU required.</strong> CUDA only. There is no Apple Silicon or AMD path.</li>
</ul>

<h2>Who should use it, and who should wait</h2>

<p>Use it now if you are a technical animator or gameplay engineer who wants to prototype what a graph-free character controller feels like, or a robotics researcher already working with a Unitree G1 who wants a motion prior instead of per-skill policies. Also use it if you are writing a paper: the architecture is small, the code is Apache 2.0, and public benchmarks are supported.</p>

<p>Wait if you need a production engine integration, if you need to retrain on your own motion library and cannot clear a BONES-SEED license, or if you need physically guaranteed output for hardware. And skip it entirely if you are not doing character motion. This is a narrow, deep tool, not a general model.</p>

<h2>Run the demo in about 10 minutes</h2>

<p>You need a CUDA GPU, Python 3.10 or newer, and Git LFS. Budget 2.2 GB for the checkpoints. These commands are transcribed from the NVLabs README and are not independently tested here.</p>

<pre class="brush: bash">
# Git LFS first, or the checkpoints arrive as pointer files
git lfs install

git clone https://github.com/NVlabs/GR00T-WholeBodyControl.git
cd GR00T-WholeBodyControl

# Pull only what the demo needs (~2.2 GB), not the whole repo's LFS objects
git lfs pull --include="motionbricks/out/**" --exclude=""
git lfs pull --include="motionbricks/assets/skeletons/g1/meshes/**" --exclude=""

cd motionbricks
conda create -n motionbricks python=3.10 -y
conda activate motionbricks
pip install -e .
pip install pynput python-xlib   # Linux only, for the keyboard grab
</pre>

<p>Then launch the interactive G1 demo. WASD moves, the mouse controls the camera, and V/Z/X/B/R/T/C/E/F/G/Q switch motion styles at runtime. Switching styles mid-stride is the thing to try first, because that transition is exactly what you would otherwise hand-author.</p>

<pre class="brush: bash">
DISPLAY=:1 python scripts/interactive_demo_g1.py
</pre>

<p>If you want to go past the demo, the training pipeline is three scripts run in order. The tokenizer comes first because both transformers consume its codebook:</p>

<pre class="brush: python">
# 1. Motion tokenizer (VQ-VAE). Everything downstream needs this.
python scripts/train_vqvae.py

# 2. Pose model, conditioned on the tokenizer's codebook
python scripts/train_pose.py

# 3. Root model (timing plus trajectory)
python scripts/train_root.py

# Note: these default to SYNTHETIC data. Real training needs your own
# corpus or a cleared BONES-SEED license.
</pre>

<p>Short on GPU? The ten-minute version is the <a href="https://nvlabs.github.io/motionbricks/" target="_blank" rel="nofollow noopener noreferrer">project page</a>, which has video of the style transitions and the smart-object interactions. Watch the stylized gait switching and the object approach fill-in, then read section 4 of the paper on the multi-head quantization. That trick, splitting the latent across parallel codebooks, is the reason a 224M-parameter model covers 350,000 skills, and it generalizes well beyond motion.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="https://nvlabs.github.io/motionbricks/" target="_blank" rel="nofollow noopener noreferrer">MotionBricks project page (NVLabs)</a></li>
<li><a href="https://arxiv.org/abs/2604.24833" target="_blank" rel="nofollow noopener noreferrer">MotionBricks paper on arXiv (2604.24833)</a></li>
<li><a href="https://dl.acm.org/doi/10.1145/3811334" target="_blank" rel="nofollow noopener noreferrer">ACM Transactions on Graphics, SIGGRAPH 2026</a></li>
<li><a href="https://github.com/NVlabs/GR00T-WholeBodyControl/tree/main/motionbricks" target="_blank" rel="nofollow noopener noreferrer">NVlabs/GR00T-WholeBodyControl on GitHub</a></li>
<li><a href="https://huggingface.co/datasets/bones-studio/seed" target="_blank" rel="nofollow noopener noreferrer">BONES-SEED dataset on Hugging Face (gated)</a></li>
</ul>

<p><em>Tested on: not independently tested. MotionBricks needs a CUDA GPU, which is beyond our bench, and our standing policy is not to install AI tooling locally. All figures are as reported by the paper, the repository, and the project page; the 15,000 FPS and 2 ms latency numbers are NVIDIA-measured on an RTX 5090 with no independent reproduction. MotionBricks was still labelled a preview release at the date below.</em><br>
<em>Date checked: 2026-08-11</em></p>]]></description>
    <pubDate>Tue, 11 Aug 2026 16:08:28 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/models/nvidia-motionbricks-real-time-motion-generation.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/models/nvidia-motionbricks-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/models/nvidia-motionbricks-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Muse Glimmer 30B]]></title>
    <link>https://singularitybyte.com/models/meta-muse-glimmer-30b-local-agent-model.html</link>
    <description><![CDATA[ 
<p>Meta released Muse Glimmer on August 10, 2026: a 30-billion-parameter open-weight model built for one job, running agents on your own machine. The license is Apache 2.0, not a Llama-style community agreement, and the quantized weights fit in under 20 GB. That combination, a real open license plus single-GPU agentic performance, is what makes this release worth your afternoon. Here is what shipped, where it wins, where Qwen still beats it, and how to have it running before your coffee goes cold.</p>

<h2>Muse Glimmer 30B: a local agent model with a real open license</h2>

<p>Muse Glimmer is a 30B dense model. Every parameter activates for every token, so there is no Mixture-of-Experts routing (the technique where only a slice of a much larger network fires per token). Dense costs more compute per token than MoE, but it also means predictable memory use and no expert-routing overhead, which matters when the whole model has to live on one consumer GPU.</p>

<p>The model was not trained from scratch at this size. Meta distilled it from Muse Spark, its larger flagship, using logit distillation: the small model learns to match the big model's full output distribution instead of just its final answers. It also carries a dedicated perception encoder for image input, a context window of 120K+ tokens, and coverage of 100+ languages.</p>

<p>The headline for builders is the license. Apache 2.0 means commercial use, modification, and redistribution with no acceptable-use policy, no monthly-active-user cutoff, and no lawyer required. After years of "open-ish" Llama community licenses, Meta shipping a straight Apache 2.0 model is the actual news here.</p>

<h2>How a 30B model fits in under 20 GB</h2>

<p>Full-precision Muse Glimmer needs 55+ GB of memory, which rules out every consumer card. Meta's answer is two official quantized variants, K-Quant-Dynamic and K-Quant-17GB, that compress the weights to roughly 4-bit precision and land under 20 GB with what Meta describes as minimal accuracy loss. That fits a 24 GB card like an RTX 3090 or 4090, or unified memory on an Apple Silicon Mac.</p>

<p>Speed comes from DFlash, a small companion drafter model for speculative decoding. The drafter guesses several tokens ahead and the main model verifies the batch in one pass, so you get identical output faster. Meta reports 3.1x faster generation on an RTX 5090, 1.8x on an M5-Max MacBook, and 1.5x on an M4-Max. NVIDIA separately reports 20+ tokens per second per GPU at BF16/NVF4 precision on its Blackwell Ultra hardware.</p>

<h2>Benchmarks: wins the agent tests, not everything</h2>

<p>Meta compared Muse Glimmer against the two open-weight models in its size class, Gemma 4-31B and Qwen3.6-27B. These are Meta-reported numbers from the launch post; we have not independently tested them, and you should read them the way you read any vendor deck.</p>

<table class="styled-table">
<thead>
<tr><th>Benchmark (Meta-reported)</th><th>Muse Glimmer 30B</th><th>Gemma 4-31B</th><th>Qwen3.6-27B</th></tr>
</thead>
<tbody>
<tr><td>MCP-Atlas (tool calling)</td><td><strong>75.5</strong></td><td>54.2</td><td>62.5</td></tr>
<tr><td>DeepSearch QA (agentic search)</td><td><strong>74.6</strong></td><td>61.7</td><td>71.1</td></tr>
<tr><td>AIME 2026 (math)</td><td><strong>94.7</strong></td><td>89.2</td><td>94.1</td></tr>
<tr><td>SWE-Bench Verified (coding)</td><td>76.0</td><td>n/a</td><td><strong>77.2</strong></td></tr>
</tbody>
</table>

<p>The pattern is clear and Meta, to its credit, publishes it. Muse Glimmer wins the agentic benchmarks, tool calling by 13 points over its nearest rival, and agentic search by 3.5. On raw coding it does not: Qwen3.6-27B edges it on SWE-Bench Verified and also leads on OSWorld-Verified and TerminalBench 2.1 in Meta's own table. Meta additionally reports strong results on tau-Bench, its published agent-workflow suite.</p>

<p>So the honest summary: if your workload is an agent loop, browsing, searching, calling MCP tools, recovering from failures, this is now the model to beat at 30B. If your workload is pure code generation, <a href="/models/glm-5-2.html">GLM-5.2</a> class coders and Qwen3.6 still have the edge.</p>

<h2>Get it running in under 10 minutes</h2>

<p>Launch-day ecosystem support is unusually complete. Official weights, an official GGUF conversion, and an ExecuTorch build are on Hugging Face, Unsloth has its usual quant spread, and there is a first-party Ollama library entry. If you have <a href="/news/ollama-v0-32-interactive-agent-2026.html">Ollama v0.32 or newer</a>, this is the whole install:</p>

<pre class="brush: bash">ollama run muse-glimmer</pre>

<p>For llama.cpp or LM Studio, pull a GGUF directly. The Unsloth repo carries the full quant ladder if you want something smaller than Meta's official 4-bit:</p>

<pre class="brush: bash"># official Meta GGUF
huggingface-cli download meta-models/Muse-Glimmer-30B-GGUF

# or Unsloth's quant spread
huggingface-cli download unsloth/Muse-Glimmer-30B-GGUF</pre>

<p>Mac users get MLX support at launch, so LM Studio on an M-series machine works day one; Meta's own test hardware was an M4-Max and M5-Max. If you are serving the model rather than chatting with it, vLLM and SGLang recipes shipped alongside the release, and NVIDIA has a prebuilt NIM container plus NeMo AutoModel support for fine-tuning with SFT, LoRA, and RL. We covered the same local-first release pattern when <a href="/news/run-kimi-k3-locally-unsloth-gguf.html">Kimi K3 GGUFs landed</a>, but at 594 GB that one was a server toy. This one actually fits.</p>

<h2>Limitations and gotchas</h2>

<p>A few things to know before you rearrange your stack. First, the 20 GB figure is the quantized model; full BF16 needs 55+ GB, so serious fine-tuning still wants workstation or cloud hardware. Second, the DFlash speedups assume you run the drafter alongside the main model, which costs extra memory; budget for that on a 24 GB card. Third, cards below 16 GB are out of luck locally, though Together AI, Fireworks, and OpenRouter all have hosted endpoints live.</p>

<p>And the benchmark caveat bears repeating: every number above is vendor-run. Independent replications will land within days for a release this big. We would treat the agentic wins as directionally real, since the margins are wide, and the coding parity claims as wait-and-see.</p>

<h2>Who should use it, and what comes next</h2>

<p><strong>Use it now if</strong> you are building local agent workflows: MCP tool servers, research agents, browser automation, anything with a loop and a failure mode. A 30B Apache 2.0 model that wins tool-calling benchmarks and runs on a 4090 is exactly the gap the open ecosystem had, sitting between small models like <a href="/models/deepseek-v4-flash.html">DeepSeek-V4 Flash</a> and the 100B+ giants nobody runs at home.</p>

<p><strong>Skip it if</strong> you mainly need a code-completion model, where Qwen3.6 is cheaper to run at 27B and slightly better, or if you need vision output rather than vision input.</p>

<p>What comes next is the bigger story. Meta says an open release of Muse Spark 1.2, the teacher model Glimmer was distilled from, is on the roadmap. Zuckerberg framed the release around distributing capable models widely rather than centralizing them, and whatever you think of the framing, Apache 2.0 weights are the receipts. If Spark ships under the same license, the open-weight landscape shifts again.</p>

<p>Your under-10-minute move: run <code>ollama run muse-glimmer</code>, point it at an MCP server you already use, and see whether that 75.5 tool-calling score survives contact with your own stack.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="https://research.meta.ai/blog/introducing-muse-glimmer-open-agentic-model" target="_blank" rel="nofollow noopener noreferrer">Meta: Introducing Muse Glimmer</a></li>
<li><a href="https://huggingface.co/meta-models/Muse-Glimmer-30B" target="_blank" rel="nofollow noopener noreferrer">Muse Glimmer 30B on Hugging Face</a></li>
<li><a href="https://huggingface.co/unsloth/Muse-Glimmer-30B-GGUF" target="_blank" rel="nofollow noopener noreferrer">Unsloth GGUF quantizations</a></li>
<li><a href="https://ollama.com/library/muse-glimmer" target="_blank" rel="nofollow noopener noreferrer">Muse Glimmer on Ollama</a></li>
<li><a href="https://developer.nvidia.com/blog/run-local-agentic-ai-workflows-with-metas-muse-glimmer-on-nvidia/" target="_blank" rel="nofollow noopener noreferrer">NVIDIA: Muse Glimmer local agent workflows</a></li>
<li><a href="https://www.constellationr.com/insights/news/meta-releases-open-weight-muse-glimmer-model-open-muse-spark-12-tap" target="_blank" rel="nofollow noopener noreferrer">Constellation Research: Muse Spark 1.2 on tap</a></li>
</ul>

<p><em>Tested on: not independently tested. All benchmark and performance figures are Meta- or NVIDIA-reported from the launch materials linked above.</em><br>
<em>Date checked: 2026-08-10</em></p>]]></description>
    <pubDate>Mon, 10 Aug 2026 15:43:29 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/models/meta-muse-glimmer-30b-local-agent-model.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/models/meta-muse-glimmer-30b-local-agent-model-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/models/meta-muse-glimmer-30b-local-agent-model-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[DeepSeek-V4-Flash]]></title>
    <link>https://singularitybyte.com/models/deepseek-v4-flash.html</link>
    <description><![CDATA[ 

<p>On July 31, 2026, DeepSeek promoted <strong>DeepSeek-V4-Flash</strong> out of preview. The official build, tagged <strong>V4-Flash-0731</strong>, keeps the exact same 284B-parameter architecture we covered in <a href="/models/deepseek-v4.html">our April V4 Preview breakdown</a> and changes only one thing: the post-training. That one thing was apparently the whole story. On every one of the nine agent and coding benchmarks DeepSeek published, the retrained Flash now beats not just its own preview but <strong>V4-Pro-Preview</strong>, the 1.6T flagship it was supposed to sit under. Weights are on Hugging Face under MIT, API pricing stays at $0.14 in and $0.28 out per million tokens, and the model name is simply <code>deepseek-v4-flash</code>.</p>

<h2>TL;DR</h2>

<ul>
<li><strong>What it is:</strong> the official release of DeepSeek's small V4 variant, a 284B Mixture-of-Experts model with 13B active parameters and a native 1M-token context, re-post-trained for agents and released under MIT on <a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-0731" target="_blank" rel="nofollow noopener noreferrer">Hugging Face</a>.</li>
<li><strong>Why it matters:</strong> on DeepSeek's own benchmark table, the 0731 build beats V4-Pro-Preview everywhere, and third-party <a href="https://artificialanalysis.ai/models/deepseek-v4-flash" target="_blank" rel="nofollow noopener noreferrer">Artificial Analysis</a> puts it one point behind OpenAI's budget GPT-5.6 Luna at roughly 60% lower cost per task.</li>
<li><strong>The catch:</strong> 284B total parameters still means server-class hardware for self-hosting, the preview's high hallucination rate has no published 0731 re-measurement yet, and the API is labeled public beta.</li>
</ul>

<h2>What Actually Landed in DeepSeek-V4-Flash-0731</h2>

<p>The <a href="https://api-docs.deepseek.com/updates/" target="_blank" rel="nofollow noopener noreferrer">official changelog</a> is unusually direct about what changed: nothing in the architecture. "DeepSeek-V4-Flash-0731 keeps the same model architecture and size as DeepSeek-V4-Flash-Preview, and was only re-post-trained." Same hybrid CSA plus HCA attention, same FP4 expert weights, same 1M context. If you want the architecture tour, read <a href="/models/deepseek-v4.html">the April article</a>; all of it still applies.</p>

<p>Three things are genuinely new:</p>

<ul>
<li><strong>A full agentic retraining pass.</strong> The gains below came entirely from post-training, which is a quiet argument that open-weight labs still have large headroom without touching pretraining budgets.</li>
<li><strong>Native Responses API support.</strong> The changelog notes the model "natively supports the Responses API format and is specifically adapted for Codex," so it drops into OpenAI-shaped agent harnesses without adapter glue.</li>
<li><strong>The DSpark checkpoint.</strong> The 0731 release ships with a <a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-DSpark" target="_blank" rel="nofollow noopener noreferrer">speculative-decoding module attached</a>, which is also why the Hugging Face parameter counter reads 304B instead of 284B: the extra ~20B is the draft module, not the model growing.</li>
</ul>

<h2>Benchmarks: The Small Model Ate the Big One</h2>

<p>All numbers below are DeepSeek-reported, from the <a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-0731" target="_blank" rel="nofollow noopener noreferrer">0731 model card</a>. We have not run these ourselves.</p>

<table class="styled-table">
<thead>
<tr><th>Benchmark (DeepSeek-reported)</th><th>V4-Flash-0731</th><th>V4-Flash-Preview</th><th>V4-Pro-Preview</th><th>Opus 4.8</th></tr>
</thead>
<tbody>
<tr><td>Terminal Bench 2.1</td><td>82.7</td><td>61.8</td><td>72.1</td><td>85.0</td></tr>
<tr><td>NL2Repo</td><td>54.2</td><td>39.4</td><td>38.5</td><td>69.7</td></tr>
<tr><td>Cybergym</td><td>76.7</td><td>38.7</td><td>52.7</td><td>83.1</td></tr>
<tr><td>DeepSWE</td><td>54.4</td><td>7.3</td><td>12.8</td><td>58.0</td></tr>
<tr><td>Toolathlon-Verified</td><td>70.3</td><td>49.7</td><td>55.9</td><td>76.2</td></tr>
</tbody>
</table>

<p>Read the DeepSWE row twice. The preview scored 7.3. The same architecture, after retraining, scores 54.4. The changelog adds four more agent evals in the same pattern: DSBench-FullStack 68.7, DSBench-Hard 59.6, Toolathlon verified 70.3, and the still-hard tail of Agent Last Exam at 25.2 and Automation Bench (Public) at 25.1. Across all nine published benchmarks the 0731 build lands above V4-Pro-Preview, which makes the current DeepSeek lineup mildly absurd: the cheap model is the good one until V4-Pro gets the same retraining pass.</p>

<p>Third-party numbers point the same direction. <a href="https://the-decoder.com/new-deepseek-flash-model-matches-openais-gpt-5-6-luna-at-roughly-60-percent-lower-cost/" target="_blank" rel="nofollow noopener noreferrer">The Decoder reports</a> an Artificial Analysis Intelligence Index of 50 versus 51 for GPT-5.6 Luna, "about 60 percent less per task, even after OpenAI's 80 percent price cut," a GDPval jump from 1,189 to 1,559 Elo, and 12% fewer tokens used than the preview. For context, when we covered the preview in April, V4-Pro led the open-weights GDPval board at 1,554. The Flash just walked past that too.</p>

<h2>Pricing: Still the Cheapest Seat at the Table</h2>

<p>API pricing is unchanged from the preview, per the <a href="https://api-docs.deepseek.com/updates/" target="_blank" rel="nofollow noopener noreferrer">DeepSeek platform docs</a>:</p>

<table class="styled-table">
<thead>
<tr><th>Model</th><th>Input (cache miss)</th><th>Input (cache hit)</th><th>Output</th></tr>
</thead>
<tbody>
<tr><td>deepseek-v4-flash</td><td>$0.14 / 1M</td><td>$0.0028 / 1M</td><td>$0.28 / 1M</td></tr>
</tbody>
</table>

<p>The cache-hit price is a 98% discount, which matters more than it looks for agents: long-horizon loops re-read the same context constantly, so a well-structured agent pays the cache-hit rate for most of its input tokens. Combine that with the 1M-token window and the KV-cache compression from the V4 architecture, and this stays the cheapest way to run serious long-context agent workloads on someone else's GPUs.</p>

<h2>What It Takes to Run It Yourself</h2>

<p>Honesty section: 13B active parameters does not mean 13B-sized hardware. The full FP4 plus FP8 checkpoint still wants a single big-memory accelerator or a small tensor-parallel group.</p>

<table class="styled-table">
<thead>
<tr><th>Setup</th><th>What you need</th><th>Notes</th></tr>
</thead>
<tbody>
<tr><td>Hosted API</td><td>An API key</td><td>Public beta, OpenAI-compatible plus Responses API</td></tr>
<tr><td>Full weights, vLLM</td><td>1x GB300-class (288GB) or 4x large GPUs</td><td>Official <a href="https://recipes.vllm.ai/deepseek-ai/DeepSeek-V4-Flash" target="_blank" rel="nofollow noopener noreferrer">vLLM recipe</a>, vLLM 0.20.0+, fused checkpoints need 0.25.0</td></tr>
<tr><td>4-bit community quants</td><td>~80GB+ VRAM (H200, or 96GB+ unified memory)</td><td>Quality unverified, FP4-trained experts compress poorly below Q4</td></tr>
</tbody>
</table>

<p>The vLLM single-GPU config from the official recipe is a useful reference for the moving parts (FP8 KV cache, the V4 tokenizer mode, and MTP speculative decoding at 3 draft tokens):</p>

<pre class="brush: bash">
vllm serve deepseek-ai/DeepSeek-V4-Flash \
  --tensor-parallel-size 1 --kv-cache-dtype fp8 \
  --trust-remote-code --gpu-memory-utilization 0.92 \
  --tokenizer-mode deepseek_v4 --tool-call-parser deepseek_v4 \
  --enable-auto-tool-choice --reasoning-parser deepseek_v4 \
  --speculative-config '{"method":"mtp","num_speculative_tokens":3}'
</pre>

<h2>Hands-On: Point Your Agent at It in Under 10 Minutes</h2>

<p>The API is OpenAI-compatible, so switching an existing agent stack is a one-line change:</p>

<pre class="brush: python">
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_DEEPSEEK_API_KEY",
    base_url="https://api.deepseek.com/v1",
)

response = client.chat.completions.create(
    model="deepseek-v4-flash",
    messages=[
        {"role": "user", "content": "Read this repo and propose a fix plan."},
    ],
)
print(response.choices[0].message.content)
</pre>

<p>For self-hosting, grab the weights and follow the vLLM recipe above:</p>

<pre class="brush: bash">
pip install -U "huggingface_hub[cli]"
huggingface-cli download deepseek-ai/DeepSeek-V4-Flash-0731
</pre>

<p>If you are on the Codex or Responses API side of the fence, the 0731 build is explicitly tuned for that harness, which is the first time DeepSeek has shipped a model adapted for a specific third-party agent frontend.</p>

<h2>Limitations and Gotchas</h2>

<ul>
<li><strong>Hallucination is an open question.</strong> The preview measured a 96% hallucination rate on Artificial Analysis's AA-Omniscience eval, among the worst of its peers. Nobody has published a 0731 re-measurement yet. Until someone does, keep retrieval grounding in fact-heavy pipelines.</li>
<li><strong>No Jinja chat template.</strong> Prompt encoding still goes through DeepSeek's Python encoder scripts in the repo. Day-one preview users tripped on this; nothing changed.</li>
<li><strong>The agent ceiling is real.</strong> Beating V4-Pro-Preview is impressive, but Agent Last Exam at 25.2 and Automation Bench at 25.1 are absolute scores. Long-horizon autonomy is still mostly unsolved, for everyone.</li>
<li><strong>Param-count confusion.</strong> Hugging Face shows 304B for the 0731 repo because the DSpark speculative-decoding module ships attached. The model itself is unchanged at 284B.</li>
<li><strong>Public beta API.</strong> DeepSeek labels the 0731 API a public beta, so expect endpoint behavior to shift.</li>
</ul>

<h2>Who Should Use It</h2>

<p>If you run coding or tool-use agents against a hosted API and your bill matters, this is now the default open-weight choice: near-Luna scores at 40% of the price, MIT weights as your exit hatch if the API terms ever change. That exit hatch is not theoretical; we made <a href="/news/anthropic-export-ban-case-for-open-weight-ai-2026.html">the case for open-weight fallbacks</a> when a US export order switched off a closed frontier model overnight. If you self-host, V4-Flash on a single H200-class card with quantization remains the practical play, same as the preview. And if you were waiting on <a href="/models/deepseek-v3-0324.html">the V3 line</a> to get a proper successor for agent work, this is it.</p>

<p>What to watch next: a V4-Pro build with the same post-training recipe. If retraining alone took Flash from 7.3 to 54.4 on DeepSWE, the same pass over the 1.6T model is the obvious next shoe to drop.</p>

<h2>Sources and Further Reading</h2>

<ul>
<li><a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-0731" target="_blank" rel="nofollow noopener noreferrer">deepseek-ai/DeepSeek-V4-Flash-0731 on Hugging Face (weights, benchmark table)</a></li>
<li><a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-DSpark" target="_blank" rel="nofollow noopener noreferrer">DeepSeek-V4-Flash-DSpark (speculative-decoding checkpoint)</a></li>
<li><a href="https://api-docs.deepseek.com/news/news260731" target="_blank" rel="nofollow noopener noreferrer">DeepSeek official release announcement (V4-Flash-0731)</a></li>
<li><a href="https://api-docs.deepseek.com/updates/" target="_blank" rel="nofollow noopener noreferrer">DeepSeek API changelog (official release notes and benchmark list)</a></li>
<li><a href="https://arxiv.org/abs/2606.19348" target="_blank" rel="nofollow noopener noreferrer">DeepSeek-V4 technical report (arXiv)</a></li>
<li><a href="https://recipes.vllm.ai/deepseek-ai/DeepSeek-V4-Flash" target="_blank" rel="nofollow noopener noreferrer">vLLM serving recipe for DeepSeek-V4-Flash</a></li>
<li><a href="https://artificialanalysis.ai/models/deepseek-v4-flash" target="_blank" rel="nofollow noopener noreferrer">Artificial Analysis: DeepSeek V4 Flash 0731 analysis</a></li>
<li><a href="https://the-decoder.com/new-deepseek-flash-model-matches-openais-gpt-5-6-luna-at-roughly-60-percent-lower-cost/" target="_blank" rel="nofollow noopener noreferrer">The Decoder: Flash matches GPT-5.6 Luna at 60% lower cost</a></li>
<li><a href="/models/deepseek-v4.html">SingularityByte: DeepSeek-V4 Preview breakdown (April launch, full architecture tour)</a></li>
</ul>

<p><em>Tested on: not independently benchmarked. Every score in this article is DeepSeek-reported or third-party (Artificial Analysis, The Decoder) as labeled; we have not run the 0731 build locally.</em><br>
<em>Date checked: 2026-08-01</em></p>]]></description>
    <pubDate>Sat, 01 Aug 2026 18:08:59 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/models/deepseek-v4-flash.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/models/deepseek-v4-flash.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/models/deepseek-v4-flash.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Open-Source Video Models Are 262 Elo Behind. One Weight Drop Closes It.]]></title>
    <link>https://singularitybyte.com/tutorials/open-weight-video-models-262-elo-gap.html</link>
    <description><![CDATA[ 
<p>This is the fifth entry in our open-source AI video series. <a href="/tutorials/open-source-video-models-mid-2026-what-changed.html">Part four</a> ended with a line we expected to sit on for months: if Alibaba opens Wan 2.7, that becomes the story. It has not happened yet.</p>

<p>Nine days later, two other labs made the same promise. Black Forest Labs announced FLUX 3 on July 23 with an open-weight backbone to follow. MiniMax announced H3 on July 31 and said the weights ship "in the coming days." Neither has published a file.</p>

<p>That sounds like more of the same, and in one sense it is. But the arithmetic underneath changed, and it is worth looking at directly, because the distance between open and closed video is now small enough to be measured in a single number.</p>

<h2>TL;DR</h2>

<ul>
<li><strong>The open-weights video gap is 262 Elo.</strong> The best downloadable text-to-video model with audio is LTX-2.3 Fast at 980 on the Artificial Analysis arena. MiniMax H3, announced last week, sits at 1242.</li>
<li><strong>Three labs are holding the trigger.</strong> FLUX 3 Dev, MiniMax H3, and Wan 3.0 are all announced as open-weight. As of today, none of the three exists on Hugging Face.</li>
<li><strong>One weight drop closes almost the entire gap.</strong> If MiniMax ships what it announced, open-weight video goes from "good enough to iterate with" to second place in the world overnight.</li>
<li><strong>The catch is the license, not the capability.</strong> Nobody at the frontier is shipping Apache 2.0 anymore. Revenue-capped community licenses are the new default.</li>
</ul>

<h2>The 262-Elo gap in open-weight video models, measured</h2>

<p>Artificial Analysis runs a blind arena for video: two clips from the same prompt, users vote, Elo comes out the other end. It has a filter for open weights, which makes it the cleanest available read on how far behind downloadable models are.</p>

<p>Comparing like for like on the with-audio board, because H3 and FLUX 3 both generate native audio:</p>

<table class="styled-table">
<thead>
<tr><th>Model</th><th>Elo</th><th>Weights</th></tr>
</thead>
<tbody>
<tr><td>Gemini Omni Flash</td><td>1245</td><td>Closed</td></tr>
<tr><td>MiniMax H3</td><td><strong>1242</strong></td><td>Announced as open, not shipped</td></tr>
<tr><td>Dreamina Seedance 2.0 720p</td><td>1225</td><td>Closed</td></tr>
<tr><td>Wan2.7-260612</td><td>1163</td><td>API only</td></tr>
<tr><td>HappyHorse-1.1</td><td>1151</td><td>Closed</td></tr>
<tr><td>Kling 3.0 1080p (Pro)</td><td>1113</td><td>Closed</td></tr>
<tr><td>SkyReels V4</td><td>1109</td><td>Closed</td></tr>
<tr><td><strong>LTX-2.3 Fast</strong></td><td><strong>980</strong></td><td><strong>Downloadable today</strong></td></tr>
<tr><td>LTX-2.3 Pro</td><td>963</td><td>Downloadable today</td></tr>
<tr><td>LTX-2 Fast</td><td>948</td><td>Downloadable today</td></tr>
</tbody>
</table>

<p>Two things stand out. The top ten is entirely closed or unshipped. And the entire open-weights leaderboard, every position of it, is Lightricks. There is no second open lab in the running right now.</p>

<p>1242 minus 980 is 262. That is the number this article is about. It is the amount of quality that would transfer from the closed column to the open column if exactly one company followed through on exactly one announcement.</p>

<p>For scale: 262 Elo in a preference arena is not a rounding error and not an unbridgeable chasm. It is roughly the distance between "usable for previz and social clips" and "usable for the shot you actually deliver."</p>

<h2>Three promises, zero files</h2>

<p>Part four published a one-command check for whether a model is genuinely released. Here it is pointed at all three claims at once, run on the date below:</p>

<pre class="brush: bash">
for q in Wan3 Wan2.7 MiniMax-H3 FLUX.3; do
  echo -n "$q -> "
  curl -s "https://huggingface.co/api/models?search=$q&amp;limit=5" \
    | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d), [m['modelId'] for m in d])"
done
</pre>

<p>Every one of them comes back empty, or with unrelated community repos that happen to match the string. Checking what the three labs have actually published, newest first:</p>

<table class="styled-table">
<thead>
<tr><th>Organization</th><th>Newest published model</th><th>Date</th></tr>
</thead>
<tbody>
<tr><td><code>Wan-AI</code></td><td>Wan-Dancer-14B (plus the Wan 2.2 family)</td><td>2026-07-17</td></tr>
<tr><td><code>MiniMaxAI</code></td><td>MiniMax-M3, a language model. No video model at all.</td><td>2026-07-23</td></tr>
<tr><td><code>black-forest-labs</code></td><td>FLUX.2-small-decoder</td><td>2026-04-07</td></tr>
<tr><td><code>Lightricks</code></td><td>LTX-2.3-22b-IC-LoRA-DubIt</td><td>2026-07-30</td></tr>
</tbody>
</table>

<p>That last row is the contrast worth sitting with. While three labs were announcing open weights, Lightricks pushed 17 repository updates in July alone, including eight new IC-LoRAs in the final four days of the month: dubbing, relighting, in/outpainting, spatial upscaling, deblur, decompression, water simulation, and one that shaves beards. Announcements are cheap. Adapters are not.</p>

<h2>What each drop would actually change</h2>

<h3>MiniMax H3: the one that moves the number</h3>

<p>H3 is a multimodal video model that takes text, images, video, and audio in one context and returns up to 15 seconds at 2K with native stereo sound. Artificial Analysis ranks it first in the world for video editing and second for text-to-video with audio.</p>

<p>MiniMax has committed to the MiniMax Community License: free for non-commercial use, free for commercial use by organizations under 20 million dollars in annual revenue, with attribution required. As of today there is no H3 repository on the MiniMaxAI org.</p>

<p>If it ships, this is the whole story. Everything else in this article is a footnote to it.</p>

<h3>FLUX 3: the one that changes the shape</h3>

<p>FLUX 3 is Black Forest Labs' first video model, and it is not only a video model. It is jointly trained on image, video, audio, and action prediction in one architecture, which is why it also powers FLUX-mimic for robotics. Video output runs up to 20 seconds with native audio.</p>

<p>The open-weight piece is called FLUX 3 Dev, described in BFL's own announcement as "open-weight access to a multimodal backbone, for content creation (video, audio and image) and action prediction." What the announcement does not contain is a date or a license name.</p>

<p>Worth being precise about what this would mean if it lands. It would be the first downloadable model that generates video, audio, images, and robot actions from one set of weights. That is a different kind of release from H3, and for anyone building agents that need to both see and act, it is arguably the more interesting one. It is also the vaguest of the three promises.</p>

<h3>Wan 3.0: the one to discount</h3>

<p>Wan 3.0 is pre-announced as an Apache 2.0 open-weight release for mid-2026. Treat that with more caution than the other two, for reasons that are entirely evidence-based.</p>

<p>We could not find a primary Alibaba source for Wan 3.0 at all. The specifications circulating contradict each other, with the same "confirmed" model described as 60B dense in one place and a 27B mixture-of-experts with 14B active in another. Those pages trace back to single-purpose domains built around the model name, the same pattern part four documented for Wan 2.7.</p>

<p>The track record does not help either. Wan 2.5 was pre-announced as open and never appeared. Wan 2.6 shipped closed. Wan 2.7 is on the arena at 1163 and remains API only. Official Wan open weights still stop at 2.2, where they have been since August 2025.</p>

<p>None of that makes Wan 3.0 fake. It makes it unverifiable, which for planning purposes is the same thing.</p>

<h2>The licenses are the real story</h2>

<p>The reflex reading of an open-weights wave is that the field is getting more permissive. It is getting more available, which is not the same thing.</p>

<table class="styled-table">
<thead>
<tr><th>Model</th><th>License</th><th>Free commercial use up to</th></tr>
</thead>
<tbody>
<tr><td>Wan 2.2</td><td>Apache-2.0</td><td>No limit</td></tr>
<tr><td>LTX-2.3</td><td>LTX-2 Community License</td><td>10M dollars ARR</td></tr>
<tr><td>MiniMax H3 (announced)</td><td>MiniMax Community License</td><td>20M dollars revenue, attribution required</td></tr>
<tr><td>FLUX 3 Dev (announced)</td><td>Not yet named</td><td>Unknown</td></tr>
</tbody>
</table>

<p>The only genuinely permissive entry is the oldest one. Every model that has landed or been announced since is a revenue-capped community license, and the caps come with details worth reading before you assume you are under them. The LTX threshold counts subsidiaries, affiliates, and companies under common control collectively, so a small studio inside a large group may already be over it.</p>

<p>For most people reading this, a 10 or 20 million dollar cap is functionally no cap. That is exactly why it works as a strategy, and exactly why it is worth naming: the industry has found a license that feels open to almost everyone who downloads it while staying commercially closed to everyone who matters to revenue.</p>

<h2>The lawsuit nobody is pricing in</h2>

<p>One complication sits underneath the MiniMax promise specifically.</p>

<p>Disney, Marvel, Lucasfilm, Twentieth Century Fox, Universal, DreamWorks Animation, and Warner Bros. Discovery sued MiniMax on 2025-09-16 in the Central District of California, alleging Hailuo was trained on unauthorized copies of their work and reproduces recognizable characters on simple prompts. On 2026-05-26, Judge Stanley Blumenfeld denied MiniMax's motion to dismiss, finding the studios had plausibly alleged widespread intentional infringement. The case is live.</p>

<p>So the scenario on the table is a lab open-sourcing the weights of a video model whose predecessor is under active infringement litigation from most of Hollywood. We are not aware of a precedent for that, and the honest answer about downstream exposure for people who fine-tune and ship products on those weights is that nobody knows yet.</p>

<p>Factor it into planning, not into panic. It is a reason to read the license text when it lands rather than a reason to skip the download.</p>

<h2>What you can actually run today</h2>

<p>One model in this entire article is downloadable, and it is the same one as last time. LTX-2.3: 22 billion parameters, synchronized audio and video from a single model, 2.13 million downloads on the base repository.</p>

<p>The shortest path from nothing to a clip:</p>

<pre class="brush: bash">
pip install -U diffusers transformers accelerate

python3 - &lt;&lt;'PY'
import torch
from diffusers import DiffusionPipeline
from diffusers.utils import load_image, export_to_video

pipe = DiffusionPipeline.from_pretrained(
    "Lightricks/LTX-2.3", torch_dtype=torch.bfloat16, device_map="cuda"
)
image = load_image("your-still.png")
out = pipe(image=image, prompt="A man with short gray hair plays a red electric guitar.").frames[0]
export_to_video(out, "output.mp4")
PY
</pre>

<p>Budget 24GB of VRAM with the int8 build for 1080p work. Community reports put a 10-second 1080p clip at roughly 4 to 6 minutes on an RTX 4090. Two constraints will bite you on the first run: width and height must be divisible by 32, and frame count must be divisible by 8 plus 1. Ask for 100 frames and you get an error rather than a video.</p>

<p>If you are on Apple Silicon, our <a href="/tutorials/run-ltx-2-locally-mac-pinokio-phosphene.html">LTX-2 on Mac walkthrough</a> still applies, and <a href="/tutorials/self-hosted-ai-video-generator-stack-hardware-guide-2026.html">the hardware stack guide</a> covers where a 22B model sits in memory terms.</p>

<h2>What to watch in the next 90 days</h2>

<p>Three checks, in descending order of how much they matter:</p>

<ol>
<li><strong>Does <code>MiniMaxAI/MiniMax-H3</code> appear on Hugging Face?</strong> "Coming days" was July 31. If it is still empty at the end of August, the promise has entered Wan territory.</li>
<li><strong>Does FLUX 3 Dev get a date and a license name?</strong> The capability claim is the most interesting of the three. The commitment behind it is currently the thinnest.</li>
<li><strong>Does Lightricks stay alone at the top?</strong> If both promises slip, the open-weights leaderboard remains a single-vendor board for another quarter, and the 262 stays where it is.</li>
</ol>

<p>The optimistic case here is real, and it is narrower than the coverage suggests. Open-weight video does not need three labs to follow through. It needs one. The gap has never been this close to closing on a single upload.</p>

<p>Set a reminder for two weeks out and run the check yourself. It takes ten seconds:</p>

<pre class="brush: bash">
curl -s "https://huggingface.co/api/models?author=MiniMaxAI&amp;sort=lastModified&amp;direction=-1&amp;limit=5" \
  | python3 -c "import sys,json; [print(m['modelId'], str(m['lastModified'])[:10]) for m in json.load(sys.stdin)]"
</pre>

<h2>Sources and further reading</h2>

<ul>
<li><a href="/tutorials/open-source-video-models-mid-2026-what-changed.html">Part four: what actually shipped in mid-2026, and what did not</a></li>
<li><a href="/tutorials/ai-video-generator-comparison-2026-open-source-models-tested.html">Part one: our tested open-source video model comparison</a></li>
<li><a href="https://artificialanalysis.ai/video/leaderboard/text-to-video/open-weights" target="_blank" rel="nofollow noopener noreferrer">Artificial Analysis open-weights text-to-video leaderboard</a></li>
<li><a href="https://artificialanalysis.ai/video/leaderboard/text-to-video" target="_blank" rel="nofollow noopener noreferrer">Artificial Analysis text-to-video leaderboard (all models)</a></li>
<li><a href="https://bfl.ai/blog/flux-3" target="_blank" rel="nofollow noopener noreferrer">Black Forest Labs: FLUX 3 announcement</a></li>
<li><a href="https://www.scmp.com/tech/article/3362540/video-ai-minimax-challenges-bytedance-low-price-open-weights-new-h3-model" target="_blank" rel="nofollow noopener noreferrer">SCMP: MiniMax challenges ByteDance with open weights for H3</a></li>
<li><a href="https://www.courtlistener.com/docket/71357247/disney-enterprises-inc-v-minimax/" target="_blank" rel="nofollow noopener noreferrer">Disney Enterprises, Inc. v. MiniMax, 2:25-cv-08768 (C.D. Cal.)</a></li>
<li><a href="https://huggingface.co/Lightricks/LTX-2.3" target="_blank" rel="nofollow noopener noreferrer">Lightricks/LTX-2.3 on Hugging Face</a></li>
<li><a href="https://github.com/Lightricks/LTX-2/blob/main/LICENSE" target="_blank" rel="nofollow noopener noreferrer">The LTX-2 Community License Agreement</a></li>
</ul>

<p><em>Tested on: not independently tested. We did not run LTX-2.3, H3, or FLUX 3. Every release claim above was verified directly against the public Hugging Face API on the date below, using the commands published in this article: model existence, organization publishing history, download counts, and last-modified dates. Elo figures are read from the Artificial Analysis video arena on the same date and are user-vote preference scores, not capability benchmarks. Capability descriptions, license terms, and release intentions are the projects' own. VRAM and generation-time figures for LTX-2.3 are community-reported.</em><br>
<em>Date checked: 2026-08-01</em></p>]]></description>
    <pubDate>Sat, 01 Aug 2026 11:19:12 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/open-weight-video-models-262-elo-gap.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/open-weight-video-models-262-elo-gap-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/open-weight-video-models-262-elo-gap-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[MCP 2026-07-28 Spec: Stateless Core, Auth Hardening, RufRoot Fallout]]></title>
    <link>https://singularitybyte.com/news/mcp-spec-2026-07-28-stateless-auth-hardening.html</link>
    <description><![CDATA[ 
<p>Two MCP stories landed inside one 48-hour window, and they belong in the same article. On July 28, the Agentic AI Foundation published the 2026-07-28 revision of the <a href="/tools/opencode.html">Model Context Protocol</a>, the standard your agents use to call external tools. It is the largest change since remote MCP servers arrived: the handshake is gone, sessions are gone, and OAuth grows teeth. A day or two later, researchers went public with CVE-2026-59726, a CVSS 10.0 hole in Ruflo's MCP bridge that handed 233 tools, shell execution included, to anyone who could reach port 3001.</p>

<p>If you build or run MCP servers, both stories are about you. The protocol you target changed shape this week, and the failure mode the new auth rules exist to prevent just got a name, a nickname, and a patch you should already be running.</p>

<h2>The MCP 2026-07-28 spec: what shipped</h2>

<ul>
<li>The stateless core removes the initialize handshake and the Mcp-Session-Id header. Every request describes itself, so any server instance can answer it (SEP-2575, SEP-2567).</li>
<li>Authorization gets hardened: RFC 9207 issuer validation becomes mandatory, client credentials are bound to the server that issued them, and Dynamic Client Registration is deprecated in favor of Client ID Metadata Documents.</li>
<li>Deprecations now run on a formal clock: a feature keeps working at least 12 months after deprecation, shortened to 90 days only for security emergencies.</li>
</ul>

<p>The spec <a href="https://blog.modelcontextprotocol.io/posts/2026-07-28/" target="_blank" rel="nofollow noopener noreferrer">went final on July 28</a> under the Agentic AI Foundation, the Linux Foundation directed fund that now stewards the protocol Anthropic open-sourced in late 2024. The release candidate was locked on May 21 and then sat through ten weeks of validation by SDK maintainers and client implementers before publication. Lead maintainer David Soria Parra is not underselling it: "The new release is MCP's most important since remote MCP first launched over a year ago."</p>

<p>The scale explains the caution. The Tier 1 SDKs (TypeScript, Python, Go and C#) pull close to half a billion downloads a month, with TypeScript and Python each past one billion total. All four speak 2026-07-28 as of publication day with migration notes included, Rust support is in beta, and FastMCP 4.0 ships stateless out of the box.</p>

<h2>Stateless core: the handshake is gone</h2>

<p>Until now, every MCP connection opened with an initialize/initialized exchange that negotiated versions and capabilities, and remote transports pinned the result to an Mcp-Session-Id header. That made every server stateful by default. Load balancers needed sticky sessions, a restart dropped your clients, and scaling horizontally meant shared session storage.</p>

<p>2026-07-28 deletes the ceremony. The handshake and the session header are gone, and each request carries its protocol version, client identity and capabilities in the _meta field, so the server learns everything it needs from the request itself:</p>

<pre class="brush: json">
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientInfo": { "name": "ExampleClient", "version": "1.0.0" },
      "io.modelcontextprotocol/clientCapabilities": { "elicitation": {} }
    },
    "name": "confirmThenGreet",
    "arguments": {}
  }
}
</pre>

<p>That wire format is lifted straight from the Go SDK's 2026-07-28 conformance suite, not paraphrased. A version mismatch returns UnsupportedProtocolVersionError, and clients that want to probe first can call the new server/discover RPC, which advertises supported versions and capabilities. The payoff: any instance can answer any request, so a plain round-robin load balancer is enough. The servers you already wire into <a href="/tutorials/claude-ai-tutorial-claude-code.html">Claude Code</a> get simpler to deploy, not harder to use.</p>

<h2>Multi round-trip requests replace server-initiated calls</h2>

<p>MCP servers could previously call the client mid-request: elicitation/create to ask the user something, sampling/createMessage to request a completion, roots/list to inspect the workspace. Server-initiated calls are the natural enemy of statelessness, so SEP-2322 inverts the flow. A server that needs input finishes its response instead, returning resultType "input_required" plus a machine-readable list of what it needs:</p>

<pre class="brush: json">
{
  "resultType": "input_required",
  "requestState": "step=1",
  "inputRequests": {
    "who": {
      "method": "elicitation/create",
      "params": {
        "mode": "form",
        "message": "What is your name?",
        "requestedSchema": {
          "type": "object",
          "properties": { "name": { "type": "string" } }
        }
      }
    }
  }
}
</pre>

<p>The client gathers answers and retries the original call, attaching "inputResponses": {"who": {"action": "accept", "content": {"name": "MCP Go"}}} and echoing the opaque requestState token back. The server then completes with resultType "complete". No channel held open to the client, no state parked on the server between the two calls, and the SDKs run the retry loop for you by default.</p>

<h2>Routing headers and cacheable lists</h2>

<p>Two smaller changes matter to anyone running MCP behind real infrastructure. SEP-2243 requires clients to send Mcp-Method and Mcp-Name HTTP headers with each call, so gateways, WAFs and metering proxies can route on the operation without parsing JSON bodies. Your rate limiter can treat a shell-adjacent tools/call differently from a harmless resources/read without deep packet inspection.</p>

<p>SEP-2549 makes list results cacheable: tools/list, prompts/list, resources/list and resources/read responses now carry ttlMs and cacheScope fields. Caching a tool catalog used to be pointless because lists could vary per connection. Stateless servers return the same lists to everyone, so a CDN can finally hold them for the advertised lifetime.</p>

<h2>Auth hardening: issuer checks, bound credentials, CIMD</h2>

<p>The authorization changes read like a direct response to a year of agent-security incidents. Clients must validate the iss parameter of an authorization response before redeeming the code (RFC 9207, SEP-2468). That blocks mix-up attacks, where a malicious server maneuvers a client into spending its credentials at the wrong authorization server. Client credentials are also bound to the server that issued them (SEP-2352): if a resource migrates, the client re-registers instead of reusing credentials across servers.</p>

<p>Token audience is enforced at protocol level through RFC 8707 resource indicators: a token minted for server A is dead on arrival at server B, closing the confused-deputy replay that <a href="https://workos.com/blog/mcp-2026-spec-agent-authentication" target="_blank" rel="nofollow noopener noreferrer">security write-ups have warned about</a> since 2025. Operators must publish RFC 9728 metadata at /.well-known/oauth-protected-resource. Dynamic Client Registration is formally deprecated in favor of Client ID Metadata Documents (CIMD), with backward compatibility for authorization servers that have not caught up, and the new application_type parameter finally makes localhost redirects behave for desktop and CLI apps (SEP-837).</p>

<p>All of this assumes one thing: that your bridge has authentication to harden. Last week showed how low the ecosystem's floor still sits.</p>

<h2>RufRoot: the CVSS 10.0 argument for all of this</h2>

<p>Ruflo is the multi-agent orchestration platform that started life as Claude Flow, with more than 66,500 GitHub stars. Its MCP bridge, the Express.js server that fronts all tool invocations, shipped a default docker-compose.yml that bound port 3001 to 0.0.0.0 and answered POST /mcp with no authentication of any kind. <a href="https://noma.security/blog/rufroot-the-mcp-bridge-vulnerability-that-turns-agents-into-rogue-admins-cve-2026-59726/" target="_blank" rel="nofollow noopener noreferrer">Noma Labs researcher Eli Ainhorn found</a> that one unauthenticated HTTP POST reached 233 tools, including ruflo__terminal_execute.</p>

<table class="styled-table">
<thead>
<tr><th>Item</th><th>Detail</th></tr>
</thead>
<tbody>
<tr><td>CVE</td><td>CVE-2026-59726 "RufRoot"</td></tr>
<tr><td>CVSS</td><td>10.0</td></tr>
<tr><td>Affected</td><td>Ruflo (ex Claude Flow), all versions before 3.16.3</td></tr>
<tr><td>Exposure</td><td>MCP bridge on port 3001, bound to 0.0.0.0 by default docker-compose</td></tr>
<tr><td>Auth</td><td>None on POST /mcp and POST /mcp/:group</td></tr>
<tr><td>Surface</td><td>233 tools: shell execution, database ops, agent management, memory store</td></tr>
<tr><td>Found by</td><td>Noma Labs (Eli Ainhorn), reported June 30</td></tr>
<tr><td>Fix</td><td>v3.16.3 within 24 hours: loopback bind, terminal_execute gated, MongoDB auth on</td></tr>
</tbody>
</table>

<p>From that single request an attacker could run shell commands inside the container, read every LLM provider key from the environment, dump stored conversations from the bundled MongoDB, drop a payload into /app for persistence, and poison the AgentDB pattern store so the platform's agents learn attacker-chosen behavior. Spawning agent swarms billed to the victim's API keys was the closing insult. <a href="https://thehackernews.com/2026/07/ruflo-mcp-flaw-lets-unauthenticated.html" target="_blank" rel="nofollow noopener noreferrer">The public write-ups landed this week</a>.</p>

<p>Credit where due: maintainer Reuven Cohen shipped 3.16.3 within 24 hours of the June 30 report. The lesson is not that one project was uniquely careless. The lesson is that "an MCP bridge on 0.0.0.0 with no auth" was a shippable default in 2026 at all. A spec cannot patch a door that ships open, but audience-bound tokens and mandatory issuer checks are the same class of failure finally taken seriously at protocol level.</p>

<h2>Extensions, deprecations, and the 12-month clock</h2>

<p>Tasks leave the experimental core and become the io.modelcontextprotocol/tasks extension. The blocking tasks/result call is removed, long-running work is polled through tasks/get, and notification streams collapse into a single subscriptions/listen per type (SEP-2663). Roots, sampling and logging are deprecated (SEP-2577), and the legacy HTTP+SSE transport starts a one-year goodbye in favor of stateless Streamable HTTP.</p>

<p>Deprecated does not mean dead. The new feature lifecycle guarantees at least twelve months between deprecation and the earliest possible removal, with a 90-day exception reserved for security emergencies. Nothing switches off on you today: servers speaking 2025-11-25 keep working, and nobody is forced to upgrade this quarter. The clock is real, though, and it started on Monday.</p>

<h2>What this means for your server</h2>

<p>We run MCP servers in production ourselves, so here is the migration map we are actually working from, not a rewording of the changelog.</p>

<table class="styled-table">
<thead>
<tr><th>Change</th><th>SEP</th><th>If you run a server today</th><th>Do this</th></tr>
</thead>
<tbody>
<tr><td>Handshake removed</td><td>2575</td><td>Requests carry version and capabilities in _meta; mismatches return UnsupportedProtocolVersionError</td><td>Read _meta per request; implement server/discover</td></tr>
<tr><td>Sessions removed</td><td>2567</td><td>List results no longer vary per connection; sticky routing is pointless</td><td>Mint explicit handles, pass them as ordinary tool arguments</td></tr>
<tr><td>Server-initiated calls gone</td><td>2322</td><td>elicitation/create, sampling/createMessage, roots/list no longer originate server-side</td><td>Return resultType "input_required", handle inputResponses retries</td></tr>
<tr><td>Blocking tasks/result removed</td><td>2663</td><td>Long-running calls no longer block</td><td>Adopt the tasks extension, poll tasks/get</td></tr>
<tr><td>OAuth tightened</td><td>2468, 2352</td><td>Clients validate iss; credentials stop working across auth servers</td><td>Serve RFC 9728 protected-resource metadata; publish a CIMD</td></tr>
<tr><td>HTTP+SSE deprecated</td><td>transport</td><td>Works for one more year</td><td>Move to stateless Streamable HTTP</td></tr>
</tbody>
</table>

<p>The session removal is the one that changes your code. If your server stashes per-connection state behind Mcp-Session-Id, that pattern is dead: mint explicit handles and pass them as ordinary tool arguments, the way REST APIs have passed resource IDs forever. It is more honest anyway, since hidden session state is exactly how list results ended up varying per connection. Read _meta on every request, implement server/discover, and delete your handshake path with prejudice.</p>

<h3>Your 10-minute audit</h3>

<p>RufRoot's root cause was not exotic. It was a listener on the wrong interface with nothing in front of it. Check your own machines tonight:</p>

<pre class="brush: bash">
# Anything bound to 0.0.0.0 on these ports answers the internet, not just you
ss -tlnp | grep -E ':(3001|27017)'

# Probe your own bridge: anything but 401, 403 or connection refused
# means it talks to strangers
curl -s -o /dev/null -w '%{http_code}\n' -X POST http://localhost:3001/mcp \
  -H 'Content-Type: application/json' -d '{}'
</pre>

<p>If you run Ruflo, upgrade to 3.16.3, close ports 3001 and 27017 at the firewall, rotate every LLM key the container could read, and audit the AgentDB store for patterns you did not put there. If you <a href="/tutorials/n8n-mcp-server-expose-workflow-as-ai-tool-2026.html">exposed an n8n workflow as an MCP tool</a>, ask the same question: who can reach that endpoint, and what tells them no? Run the two commands above before you close this tab. That is the whole ten minutes.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="https://blog.modelcontextprotocol.io/posts/2026-07-28/" target="_blank" rel="nofollow noopener noreferrer">The 2026-07-28 Specification, official announcement</a></li>
<li><a href="https://modelcontextprotocol.io/specification/2026-07-28" target="_blank" rel="nofollow noopener noreferrer">MCP specification 2026-07-28, full text</a></li>
<li><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/releases" target="_blank" rel="nofollow noopener noreferrer">modelcontextprotocol releases on GitHub</a></li>
<li><a href="https://noma.security/blog/rufroot-the-mcp-bridge-vulnerability-that-turns-agents-into-rogue-admins-cve-2026-59726/" target="_blank" rel="nofollow noopener noreferrer">Noma Security: RufRoot advisory (CVE-2026-59726)</a></li>
<li><a href="https://thehackernews.com/2026/07/ruflo-mcp-flaw-lets-unauthenticated.html" target="_blank" rel="nofollow noopener noreferrer">The Hacker News: Ruflo MCP flaw report</a></li>
<li><a href="https://workos.com/blog/mcp-2026-spec-agent-authentication" target="_blank" rel="nofollow noopener noreferrer">WorkOS: what the 2026 spec changes for agent authentication</a></li>
<li><a href="/tutorials/n8n-mcp-server-expose-workflow-as-ai-tool-2026.html">SingularityByte: turn an n8n workflow into an MCP tool</a></li>
</ul>

<p><em>Tested on: not independently tested. No 2026-07-28 SDK ran on our bench long enough for a compliance pass; spec details are read from the official announcement and spec text, the JSON wire formats are copied verbatim from the Go SDK's conformance suite, and RufRoot details come from the Noma Labs advisory and The Hacker News reporting, not reproduced by us.</em><br>
<em>Date checked: 2026-07-31</em></p>]]></description>
    <pubDate>Fri, 31 Jul 2026 12:08:56 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/news/mcp-spec-2026-07-28-stateless-auth-hardening.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/news/mcp-spec-2026-07-28-stateless-auth-hardening-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/news/mcp-spec-2026-07-28-stateless-auth-hardening-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Run Kimi K3 Locally: Unsloth GGUFs Land at 594 GB]]></title>
    <link>https://singularitybyte.com/news/run-kimi-k3-locally-unsloth-gguf.html</link>
    <description><![CDATA[ 
<p>When the <a href="/news/kimi-k3-open-weights.html">Kimi K3 weights landed on July 27</a>, our take was blunt: 1,561 GB, multi-node or nothing, and any day-one community quant deserves scrutiny. Three days later, the scrutiny has a serious target. <a href="https://unsloth.ai/docs/models/kimi-k3" target="_blank" rel="nofollow noopener noreferrer">Unsloth published Dynamic GGUFs of Kimi K3</a> starting at 594 GB, plus a llama.cpp branch that runs the model with its vision tower intact. The largest open-weight model ever shipped is now a single-box problem. A very large box.</p>

<h2>Run Kimi K3 locally: what shipped</h2>

<ul>
<li><a href="https://huggingface.co/unsloth/Kimi-K3-GGUF" target="_blank" rel="nofollow noopener noreferrer">unsloth/Kimi-K3-GGUF</a> holds six Dynamic quants of the 2.8T-parameter MoE, from a 594 GB 1-bit (UD-IQ1_S) to a near-lossless 1,560 GB Q8, shipped as split GGUF files that llama.cpp loads directly.</li>
<li>Vision works. You build Unsloth's llama.cpp branch <code>kimi-k3-fullsize-vision</code> and pass the bundled <code>mmproj-BF16.gguf</code> projector file alongside the model.</li>
<li>Moonshot's recommended settings carry over: temperature 1.0 with top_p 0.95, or top_p 1.0 for agent work. Thinking is always on, with low, high and max effort levels.</li>
</ul>

<h2>The hardware bill</h2>

<p>Unsloth's rule of thumb: combined RAM plus VRAM roughly equal to the quant size. Less still works through disk offloading, just much slower. Here is the honest table.</p>

<table class="styled-table">
<thead>
<tr><th>Quant</th><th>Disk size</th><th>RAM+VRAM for full speed</th></tr>
</thead>
<tbody>
<tr><td>UD-IQ1_S (Dynamic 1-bit)</td><td>594 GB</td><td>610 GB</td></tr>
<tr><td>UD-IQ1_M</td><td>648.9 GB</td><td>665 GB</td></tr>
<tr><td>UD-IQ2_XXS</td><td>711.1 GB</td><td>726 GB</td></tr>
<tr><td>UD-Q2_K_XL</td><td>861.3 GB</td><td>880 GB</td></tr>
<tr><td>UD-Q4_K_XL</td><td>1,510 GB</td><td>not listed</td></tr>
<tr><td>UD-Q8_K_XL (near-lossless)</td><td>1,560 GB</td><td>1.6 TB</td></tr>
</tbody>
</table>

<p>So "locally" means an NVIDIA DGX Station, a fat EPYC box, or, per Unsloth, "a Mac Studio connected to a 128GB RAM device". That last one adds up: a 512 GB M3 Ultra plus one 128 GB machine totals 640 GB, which clears the 1-bit line. On B200-class hardware that fits the whole quant, Unsloth reports about 20 tokens per second generation and over 120 tokens per second throughput. Your 4090 is not in this story, and we respect you too much to pretend otherwise.</p>

<h2>Run it today</h2>

<p>Build the branch, then pull the 1-bit quant and the vision projector. The 1-bit alone is 14 split files, so budget the disk and the weekend.</p>

<pre class="brush: bash">
git clone https://github.com/unslothai/llama.cpp
cd llama.cpp
git fetch origin pull/48/head:kimi-k3-fullsize-vision
git checkout kimi-k3-fullsize-vision
cd ..
cmake llama.cpp -B llama.cpp/build -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON
cmake --build llama.cpp/build --config Release -j --clean-first

pip install -U "huggingface_hub[cli]"
hf download unsloth/Kimi-K3-GGUF --local-dir unsloth/Kimi-K3-GGUF \
    --include "*mmproj-BF16*" --include "*UD-IQ1_S*"
</pre>

<p>Then point llama-cli at the first shard and the projector:</p>

<pre class="brush: bash">
./llama.cpp/build/bin/llama-cli \
    --model unsloth/Kimi-K3-GGUF/UD-IQ1_S/Kimi-K3-UD-IQ1_S-00001-of-00014.gguf \
    --mmproj unsloth/Kimi-K3-GGUF/mmproj-BF16.gguf \
    --temp 1.0 --top-p 0.95
</pre>

<p>One gotcha for agent builders, straight from the model card: K3 always thinks and returns <code>reasoning_content</code>, and multi-turn calls must feed the complete assistant message back into history, reasoning and tool calls included, not just the final text.</p>

<h2>Why this matters, and the caveat</h2>

<p>Three days ago, self-hosting K3 meant roughly 19 H100s just to load the raw MXFP4 weights. A 610 GB RAM+VRAM target moves that to one serious workstation, and K3's linear-attention design keeps the KV cache tame if you push the 1M context. The caveat: a Dynamic 1-bit is not uniformly 1-bit. <a href="/tools/unsloth-the-indie-fine-tuning-backbone.html">Unsloth, the two-person outfit we profiled</a>, mixes bit-widths per tensor, and nobody has published quality numbers for these exact files yet. The Hugging Face counter already shows 12,178 downloads, which is a lot of terabytes pulled on faith.</p>

<p>Your under-10-minutes move: check whether any machine you own clears the line before you burn 594 GB of disk finding out.</p>

<pre class="brush: bash">
# Your RAM + VRAM in GB, against the 610 GB the 1-bit wants.
echo "$(( $(free -g | awk '/Mem:/ {print $2}') + $(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits 2>/dev/null | awk '{s+=$1} END {print int(s/1024)}') )) GB available"
</pre>

<p>If the number is a few hundred GB short, <a href="/models/kimi-k3.html">the hosted API remains the sane path</a>, and <a href="/models/kimi-k2-7-code.html">Kimi K2.7 Code</a> still covers the single-node crowd.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="https://unsloth.ai/docs/models/kimi-k3" target="_blank" rel="nofollow noopener noreferrer">Unsloth: Kimi K3 local deployment guide (sizes, settings, commands)</a></li>
<li><a href="https://huggingface.co/unsloth/Kimi-K3-GGUF" target="_blank" rel="nofollow noopener noreferrer">unsloth/Kimi-K3-GGUF on Hugging Face (all six quants + mmproj)</a></li>
<li><a href="https://github.com/unslothai/llama.cpp" target="_blank" rel="nofollow noopener noreferrer">unslothai/llama.cpp, branch kimi-k3-fullsize-vision</a></li>
<li><a href="https://huggingface.co/moonshotai/Kimi-K3" target="_blank" rel="nofollow noopener noreferrer">moonshotai/Kimi-K3 (original weights)</a> and <a href="https://huggingface.co/moonshotai/Kimi-K3/blob/main/LICENSE" target="_blank" rel="nofollow noopener noreferrer">the Kimi K3 License</a>, which applies to these quants too</li>
<li><a href="/news/kimi-k3-open-weights.html">SingularityByte: what actually shipped in the K3 weights drop</a></li>
<li><a href="/models/kimi-k3.html">SingularityByte: Kimi K3 model breakdown</a></li>
</ul>

<p><em>Tested on: not independently tested. The smallest Kimi K3 quant needs about 610 GB of combined RAM and VRAM, which is beyond our bench. Quant sizes, hardware guidance and throughput figures are Unsloth-reported; sampling settings and the multi-turn rule are from the model card; file sizes and download counts were read from the Hugging Face repo.</em><br>
<em>Date checked: 2026-07-30</em></p>]]></description>
    <pubDate>Thu, 30 Jul 2026 14:20:40 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/news/run-kimi-k3-locally-unsloth-gguf.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/news/run-kimi-k3-locally-unsloth-gguf-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/news/run-kimi-k3-locally-unsloth-gguf-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Kimi K3 Open Weights Are Live: What Actually Shipped]]></title>
    <link>https://singularitybyte.com/news/kimi-k3-open-weights.html</link>
    <description><![CDATA[ 
<p>Moonshot AI made the Kimi K3 weights public on July 27, 2026, and the largest open-weight model anyone has shipped is now a download. The repo is <code>moonshotai/Kimi-K3</code>: 114 files, 1,561 GB, one custom license. That last part matters, because most of what got published about this release before it happened was wrong, including the repository name, the license, the file size, and the hardware you need. We read the actual repo. Here is what shipped.</p>

<h2>TL;DR</h2>

<ul>
<li><strong>What it is:</strong> a 2.8-trillion-parameter Mixture-of-Experts model with 104B active parameters, 93 layers, a 1,048,576-token context window, and native text, image and video input. Quantization-aware trained in MXFP4.</li>
<li><strong>Why it matters:</strong> the first open 3T-class model, and on Moonshot's own numbers it trades the lead with Claude Fable 5 and GPT-5.6 Sol across coding and agentic suites. You can audit it, fine-tune it, and serve it yourself.</li>
<li><strong>The catch:</strong> 1,561 GB of weights. That is roughly 19 H100s just to hold the model, before you allocate a single token of KV cache. And the license is not Apache 2.0.</li>
</ul>

<h2>What actually landed</h2>

<p>One repository, not the family of base, instruct and quantized variants that usually accompanies a release. Everything is in <code>moonshotai/Kimi-K3</code>, and the weights are already quantized: there is no separate FP16 checkpoint to download.</p>

<table class="styled-table">
<thead>
<tr><th>Property</th><th>Value (read from the repo)</th></tr>
</thead>
<tbody>
<tr><td>Repository</td><td><code>moonshotai/Kimi-K3</code>, public, not gated</td></tr>
<tr><td>Files / total size</td><td>114 files, 1,561 GB (1,453.8 GiB)</td></tr>
<tr><td>License</td><td>Kimi K3 License (custom, <code>license: other</code>)</td></tr>
<tr><td>Total parameters</td><td>2.8T</td></tr>
<tr><td>Activated parameters</td><td>104B</td></tr>
<tr><td>Layers</td><td>93 (1 dense), 69 KDA plus 24 Gated MLA</td></tr>
<tr><td>Experts</td><td>896 routed, 16 selected per token, 2 shared</td></tr>
<tr><td>Context window</td><td>1,048,576 tokens</td></tr>
<tr><td>Vocabulary</td><td>163,840</td></tr>
<tr><td>Modalities</td><td>Text, image, video in; text out</td></tr>
<tr><td>Quantization</td><td>MXFP4 weights, MXFP8 activations, QAT from the SFT stage</td></tr>
</tbody>
</table>

<h3>The license is custom, and clause 2 has teeth</h3>

<p>It is not Apache 2.0, despite that being reported widely in the days before the drop. It is a bespoke "Kimi K3 License", MIT-shaped at the core with two commercial conditions bolted on. Read it yourself, it is short, but here is the shape of it.</p>

<p>Clause 2 targets Model-as-a-Service specifically. If you give third parties access to inference or fine-tuning in a way that lets them control inputs, parameters or training data, and you or your affiliates clear 20 million US dollars in aggregate revenue over any consecutive 12 months, you must sign a separate agreement with Moonshot before any commercial use. Note the trigger is total company revenue, not revenue from the model.</p>

<p>Clause 3 is an attribution rule. Ship a product with more than 100 million monthly active users or more than 20 million US dollars in monthly revenue, and "Kimi K3" has to appear prominently in your user interface.</p>

<p>Clause 4 is the escape hatch most readers will land in: neither condition applies to internal use, defined as use that does not expose the model, its outputs, or its capabilities to third parties. Run it inside your own company and you are clear. Resell inference at scale and you are negotiating.</p>

<h2>The numbers everyone published before the file listing existed</h2>

<p>This is worth your attention as a builder, because it is now a pattern. In the week before the drop, a wave of posts appeared with hardware tables, vLLM commands, and download instructions for a file that did not exist yet. We checked the Hugging Face API repeatedly across that window: the <code>moonshotai</code> org held 18 models, newest Kimi K2.7 Code from June 15, and the K3 page was a countdown placeholder with a notify button.</p>

<p>Now that the real repo is up, we can score the claims.</p>

<table class="styled-table">
<thead>
<tr><th>Widely published claim</th><th>Reality</th></tr>
</thead>
<tbody>
<tr><td>Download from <code>moonshotai/Kimi-K3-MXFP4</code></td><td>Never existed. The repo is <code>moonshotai/Kimi-K3</code></td></tr>
<tr><td>About 594 GB</td><td>1,561 GB. Off by 2.6x</td></tr>
<tr><td>About 1.4 TB</td><td>Closer. Actual is 1.45 TiB, so right if you meant tebibytes</td></tr>
<tr><td>Apache 2.0 license</td><td>Custom Kimi K3 License with revenue-triggered clauses</td></tr>
<tr><td>Roughly 50B active parameters</td><td>104B</td></tr>
<tr><td>8x H100 minimum to load it</td><td>640 GiB against 1,453.8 GiB of weights. Short by 2.3x</td></tr>
</tbody>
</table>

<p>None of these were malicious. They were written ahead of a traffic event and nobody checked, because there was nothing to check against. The practical lesson for anyone about to pull a terabyte and a half: ask the API, not a blog. It takes one command. We went through the same exercise when <a href="/tutorials/open-source-video-models-mid-2026-what-changed.html">Wan 2.7 was widely reported as open-weights and was not</a>, and the method there works for any release claim.</p>

<pre class="brush: bash">
# What has a lab actually published? No repo, no download,
# regardless of what any article says.
curl -s "https://huggingface.co/api/models?author=moonshotai" \
  | python3 -c "import sys,json;[print(m['modelId'], m.get('lastModified')) for m in json.load(sys.stdin)]"

# Real file list, real byte total, real license field:
curl -s "https://huggingface.co/api/models/moonshotai/Kimi-K3?blobs=true" \
  | python3 -c "import sys,json;d=json.load(sys.stdin);s=d.get('siblings',[]);\
print('license:', d.get('cardData',{}).get('license_name'));\
print('files:', len(s));\
print('total GB:', round(sum(f.get('size') or 0 for f in s)/1e9, 1))"
</pre>

<h2>The architecture, and why 1M context is affordable here</h2>

<p>K3 runs 93 layers, and the attention is split: 69 layers use Kimi Delta Attention (KDA), Moonshot's linear attention variant, and only 24 use Gated MLA, the full-attention path. That ratio is the interesting part. Linear attention carries a fixed-size recurrent state instead of a KV cache that grows with sequence length, so at a 1M-token context only those 24 layers accumulate a conventional cache. That is roughly a quarter of the model paying full freight for long context, which is how a 1M window becomes tractable at all.</p>

<p>The MoE side is unusually sparse: 896 routed experts with 16 selected per token, plus 2 shared experts that run every time, routed by a sigmoid gate. Moonshot claims about 2.5x better overall scaling efficiency than K2 from this combination. Activated parameters land at 104B, so you store 2.8T and compute roughly 104B per token.</p>

<p>The tech report published alongside the weights adds a detail worth flagging: K3 uses no explicit positional embedding at all. There is no RoPE, and therefore no RoPE rescaling or interpolation to reach long context. Position is encoded implicitly through KDA's recurrent gating and decay, which is why the model extrapolates to 1M tokens without the usual positional surgery. Training grew the window in four stages, 8K to 64K during pre-training and 256K to 1M during cooldown, which keeps the expensive long-sequence compute inside a small slice of the budget.</p>

<p>Here is the part almost nobody covering the drop mentioned: both headline architecture pieces have been open on GitHub for months. <a href="https://github.com/MoonshotAI/FlashKDA" target="_blank" rel="nofollow noopener noreferrer">FlashKDA</a>, the KDA kernels, went up April 20, 2026 under MIT and sits at 473 stars. <a href="https://github.com/MoonshotAI/Attention-Residuals" target="_blank" rel="nofollow noopener noreferrer">Attention-Residuals</a> has been public since March 15, 2026, now past 3,390 stars. You could read and benchmark K3's attention design roughly four months before you could download K3. If you build your own long-context stack, those repos are worth more to you than the checkpoint.</p>

<h3>What MXFP4 actually covers</h3>

<p>Moonshot applied quantization-aware training from the supervised fine-tuning stage onward, using MXFP4 weights with MXFP8 activations. This is not a post-training squeeze, so the usual "the quant broke it" caveat does not apply the same way.</p>

<p>But the 4-bit format does not cover the whole model. The config's ignore list keeps self-attention, the shared experts, the dense MLP projections, the LM head, the vision tower and the multimodal projector out of MXFP4. Only the routed expert Linear layers are packed to 4 bits, at group size 32. That is exactly why 2.8T parameters still weigh 1,561 GB rather than the ~1.4 TB a naive 4-bit calculation gives you.</p>

<h2>What it takes to run</h2>

<p>Blunt version: this is a multi-node deployment or nothing. The weights alone need 1,453.8 GiB resident before you allocate KV cache, activations, or any headroom for fragmentation.</p>

<table class="styled-table">
<thead>
<tr><th>Accelerator</th><th>GPUs for weights only</th><th>Realistic with headroom</th><th>Nodes of 8</th></tr>
</thead>
<tbody>
<tr><td>H100 80GB</td><td>19</td><td>23</td><td>3</td></tr>
<tr><td>H200 141GB</td><td>11</td><td>13</td><td>2</td></tr>
<tr><td>B200 192GB</td><td>8</td><td>10</td><td>2</td></tr>
<tr><td>MI300X 192GB</td><td>8</td><td>10</td><td>2</td></tr>
</tbody>
</table>

<p>So a single 8x H100 node does not load this model, and the widely repeated "8x H100 minimum" figure is short by more than a factor of two. On B200s you can technically fit the weights across eight cards, but you are leaving almost nothing for a 1M-token KV cache, so plan for two nodes.</p>

<p>Moonshot lists three supported inference engines in the model card: <a href="https://github.com/vllm-project/vllm" target="_blank" rel="nofollow noopener noreferrer">vLLM</a>, <a href="https://github.com/sgl-project/sglang" target="_blank" rel="nofollow noopener noreferrer">SGLang</a>, and TokenSpeed, each with a published K3 recipe. Day one there are no community GGUF, AWQ or Unsloth conversions, which is unsurprising: requantizing a QAT MXFP4 MoE of this size is not a weekend job, and anything that appears in the next few days deserves scrutiny before you trust it.</p>

<p>For scale, here is how much the previous open Kimi models actually get pulled, straight from the Hugging Face API. These are 30-day counts, and most of them are quantization pipelines, mirrors and eval harnesses rather than production deployments, which is worth remembering whenever a release gets called widely deployed. K3 is too fresh to compare: its counter had not meaningfully moved at the time of writing, and Hugging Face updates these on a lag.</p>

<table class="styled-table">
<thead>
<tr><th>Model</th><th>Total params</th><th>HF downloads (30 day)</th></tr>
</thead>
<tbody>
<tr><td>Kimi K2.5</td><td>1T</td><td>973,001</td></tr>
<tr><td>Kimi K2.6</td><td>1T</td><td>907,081</td></tr>
<tr><td>Kimi K2.7 Code</td><td>1T</td><td>695,744</td></tr>
<tr><td>Kimi K2 Thinking</td><td>1T</td><td>73,772</td></tr>
<tr><td>Kimi K3</td><td>2.8T</td><td>just published</td></tr>
</tbody>
</table>

<h2>Benchmarks, with the usual asterisk</h2>

<p>Every number below comes from Moonshot's own model card, run on their harness. We have not reproduced any of it, and K3 is far beyond what we can bench locally. Treat this as a vendor claim until third parties replicate it. The pattern across all 46 reported benchmarks is that K3 and Fable 5 trade wins, with GPT-5.6 Sol close behind.</p>

<p>Credit where it is due: Moonshot says so itself. The tech report's abstract states that K3's overall performance "still trails the most powerful proprietary models, namely Claude Fable 5 and GPT-5.6 Sol", while beating every other model in their suite. A lab publishing that sentence in its own launch paper is worth more than any leaderboard screenshot, and it is a useful corrective to the week's louder claims that K3 simply beats everything.</p>

<table class="styled-table">
<thead>
<tr><th>Benchmark (Moonshot-reported)</th><th>Kimi K3</th><th>Claude Fable 5</th><th>GPT-5.6 Sol</th><th>GLM-5.2</th></tr>
</thead>
<tbody>
<tr><td>GPQA Diamond</td><td>93.5</td><td>92.6</td><td>94.1</td><td>91.2</td></tr>
<tr><td>Terminal-Bench 2.1</td><td>88.3</td><td>88.0</td><td>88.8</td><td>82.7</td></tr>
<tr><td>FrontierSWE</td><td>81.2</td><td>86.6</td><td>71.3</td><td>67.3</td></tr>
<tr><td>SWE-Marathon</td><td>42.0</td><td>35.0</td><td>39.0</td><td>13.0</td></tr>
<tr><td>BrowseComp</td><td>91.2</td><td>88.0</td><td>90.4</td><td>not reported</td></tr>
<tr><td>MCPMark-Verified</td><td>94.5</td><td>87.4</td><td>92.9</td><td>not reported</td></tr>
<tr><td>GDPval-AA v2 (Elo)</td><td>1686</td><td>1747</td><td>1736</td><td>1510</td></tr>
<tr><td>AA-Briefcase (Elo)</td><td>1548</td><td>1583</td><td>1495</td><td>1260</td></tr>
<tr><td>OSWorld-Verified</td><td>84.8</td><td>85.0</td><td>83.0</td><td>not reported</td></tr>
<tr><td>Video-MME (with subtitles)</td><td>90.0</td><td>not reported</td><td>89.5</td><td>not reported</td></tr>
</tbody>
</table>

<p>K3 leads on SWE-Marathon by 7 points, on MCPMark-Verified by 7.1, and on BrowseComp by 3.2. It trails on FrontierSWE, GDPval and AA-Briefcase. Long-horizon agentic work is where it looks strongest, which lines up with what it was built for. For the launch-week pricing and arena context, see our <a href="/models/kimi-k3.html">Kimi K3 model breakdown</a>.</p>

<h2>What it actually built</h2>

<p>The most concrete evidence in the report is not a benchmark, it is two artifacts you can go read. Both are Apache 2.0 on GitHub, published July 23.</p>

<p><a href="https://github.com/MoonshotAI/nano-kpu" target="_blank" rel="nofollow noopener noreferrer">nano-kpu</a> is an inference-chip prototype that K3 designed, optimized and verified in a single 48-hour autonomous run driving open-source EDA tools. Inside a 4 mm2 area budget it closes timing at 100 MHz and simulates decode throughput above 8,700 tokens per second, with 1.46M standard cells and an INT4 MAC array. <a href="https://github.com/MoonshotAI/minitriton" target="_blank" rel="nofollow noopener noreferrer">MiniTriton</a> is a compact Triton-like GPU compiler K3 wrote end to end, from a tile-level Python frontend through MLIR passes to PTX code generation, with autograd and distributed primitives on top.</p>

<p>On kernel optimization, Moonshot reports K3 cutting AttnRes latency from 283.6 ms to 114.4 ms and reducing KDA runtime by 73.6 percent, and says an early K3 checkpoint was already doing most of their kernel work during late development. These are still first-party claims, but unlike a benchmark score the output is sitting in a public repo where you can judge it yourself.</p>

<h2>Limitations and gotchas</h2>

<ul>
<li>Read the LICENSE before you build a business on it. The 20 million dollar Model-as-a-Service threshold is aggregate company revenue, not model revenue, and it is easy to misread as the latter.</li>
<li>Benchmarks are entirely first-party at this point, produced on Moonshot's own agent harness. Nothing has been independently replicated yet.</li>
<li>Size is the wall, not a temporary inconvenience. There is no path where this runs on one GPU, and MXFP4 is already applied, so there is no easy 2x saving left on the table.</li>
<li>No community quants on day one. Early conversions of a QAT MXFP4 MoE this large are likely to be broken. Check the repo discussions before trusting one.</li>
<li>The vision tower and multimodal projector are unquantized, so multimodal serving carries more memory than the headline 4-bit number suggests.</li>
<li>Using the hosted API instead means sending your code to a China-hosted endpoint. Self-hosting is the entire point of this release for anyone with a data residency constraint.</li>
</ul>

<h2>Who should use it</h2>

<p>Pull the weights if you already run multi-node inference, you need frontier-class agentic coding you fully control, and license terms or data residency matter more than convenience. Pull them too if you research architectures, because a 69/24 linear-to-full attention split at 2.8T scale is the most interesting thing in this release regardless of the benchmark table.</p>

<p>Skip it if you have one GPU, or one node. That is arithmetic, not a judgment. For open coding models you can actually run this week, <a href="/models/kimi-k2-7-code.html">Kimi K2.7 Code</a> and <a href="/models/glm-5-2.html">GLM-5.2</a> remain the sane picks, and our <a href="/news/open-weight-wave-june-2026.html">June 2026 open-weight roundup</a> covers the smaller end of the field.</p>

<h2>Get started in under 10 minutes</h2>

<p>If you have the hardware, start the download and read the model card while it runs. Check the license and the layer split first, both are small files.</p>

<pre class="brush: bash">
pip install -U "huggingface_hub[cli]"

# Read the license and architecture before committing 1.5 TB of disk.
hf download moonshotai/Kimi-K3 LICENSE config.json --local-dir ./kimi-k3
python3 -c "import json;c=json.load(open('./kimi-k3/config.json'))['text_config'];\
la=c['linear_attn_config'];\
print('layers:', c['num_hidden_layers']);\
print('KDA:', len(la['kda_layers']), 'full attention:', len(la['full_attn_layers']));\
print('experts:', c['num_experts'], 'active:', c['num_experts_per_token'])"

# Then the weights. Budget the disk and the time.
hf download moonshotai/Kimi-K3 --local-dir ./kimi-k3
</pre>

<p>No cluster? The API is OpenAI-compatible, so you can point an agent you already run at K3 by changing two lines.</p>

<pre class="brush: python">
# Any OpenAI-style SDK works; change base_url and model, keep the rest.
from openai import OpenAI

client = OpenAI(
    api_key="sk-...",                      # key from platform.kimi.ai
    base_url="https://api.moonshot.ai/v1",
)

resp = client.chat.completions.create(
    model="kimi-k3",
    messages=[{"role": "user",
               "content": "Refactor this repo's auth module and add tests."}],
)
print(resp.choices[0].message.content)
</pre>

<p>Long single-shot builds are where a 1M-token context earns its keep. Hand it an entire spec, let it run, and compare the result against whatever you pay for now.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="https://huggingface.co/moonshotai/Kimi-K3" target="_blank" rel="nofollow noopener noreferrer">moonshotai/Kimi-K3 on Hugging Face (weights, model card, config)</a></li>
<li><a href="https://huggingface.co/moonshotai/Kimi-K3/blob/main/LICENSE" target="_blank" rel="nofollow noopener noreferrer">The Kimi K3 License, full text</a></li>
<li><a href="https://github.com/MoonshotAI/Kimi-K3/blob/main/k3_tech_report.pdf" target="_blank" rel="nofollow noopener noreferrer">Kimi K3 technical report (PDF): architecture, training recipe, infrastructure, case studies</a></li>
<li><a href="https://www.kimi.com/blog/kimi-k3" target="_blank" rel="nofollow noopener noreferrer">Moonshot: official Kimi K3 tech blog</a></li>
<li><a href="https://github.com/MoonshotAI/nano-kpu" target="_blank" rel="nofollow noopener noreferrer">MoonshotAI/nano-kpu: the inference chip K3 designed autonomously</a> and <a href="https://github.com/MoonshotAI/minitriton" target="_blank" rel="nofollow noopener noreferrer">MoonshotAI/minitriton: the GPU compiler it wrote</a></li>
<li><a href="https://github.com/MoonshotAI/FlashKDA" target="_blank" rel="nofollow noopener noreferrer">MoonshotAI/FlashKDA: Kimi Delta Attention kernels (MIT)</a></li>
<li><a href="https://github.com/MoonshotAI/Attention-Residuals" target="_blank" rel="nofollow noopener noreferrer">MoonshotAI/Attention-Residuals</a></li>
<li><a href="https://github.com/vllm-project/vllm" target="_blank" rel="nofollow noopener noreferrer">vLLM</a> and <a href="https://github.com/sgl-project/sglang" target="_blank" rel="nofollow noopener noreferrer">SGLang</a>, the two supported open inference engines</li>
<li><a href="/models/kimi-k3.html">SingularityByte: Kimi K3 model breakdown (launch week)</a></li>
</ul>

<p><em>Tested on: not independently benchmarked. Kimi K3 is a 2.8T-parameter MoE requiring multi-node inference, which is beyond our local bench, so every benchmark figure here is Moonshot-reported. Repository contents, file count, byte total, license text, architecture parameters, quantization config and download counts were read directly from the Hugging Face and GitHub APIs, not from secondary reporting. Hardware figures are computed from the measured 1,453.8 GiB weight total.</em><br>
<em>Date checked: 2026-07-27</em></p>]]></description>
    <pubDate>Mon, 27 Jul 2026 15:17:22 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/news/kimi-k3-open-weights.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/news/kimi-k3-open-weights-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/news/kimi-k3-open-weights-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Ollama vs llama.cpp vs vLLM vs LM Studio: Which Local AI Server Should You Run?]]></title>
    <link>https://singularitybyte.com/tutorials/ollama-vs-llama-cpp-vs-vllm-local-inference-server-2026.html</link>
    <description><![CDATA[ 
<p>This is another entry in our Local AI Stack series. We have covered <a href="/tutorials/run-full-local-ai-stack-with-local-ai-packaged.html">running a full local stack</a>, <a href="/tutorials/ods-private-ai-server-one-command.html">turning a PC into a private AI server</a>, and plenty of models to run on them. What we have never answered is the question that comes first: which server actually runs the model.</p>

<p>Search for that and you get the same list every time. Ollama, llama.cpp, LM Studio, vLLM, SGLang, ranked by tokens per second as though they were five competitors doing the same job. They are not. Understanding why makes the choice obvious in about a minute.</p>

<h2>TL;DR</h2>

<ul>
<li><strong>There are two families, not five competitors.</strong> Ollama and LM Studio both embed llama.cpp, so they are close cousins. vLLM and SGLang are a different architecture entirely.</li>
<li><strong>Picking between Ollama and LM Studio is a UX decision. Picking between Ollama and vLLM is an architecture decision.</strong> Only one of those is worth agonising over.</li>
<li>Everything here is MIT or Apache 2.0 except LM Studio, which is closed source but free, including at work.</li>
</ul>

<table class="styled-table">
<thead>
<tr><th>You are</th><th>Run this</th><th>Why</th></tr>
</thead>
<tbody>
<tr><td>One developer, any OS, want it working now</td><td><strong>Ollama</strong></td><td>One command to pull and run. Sane defaults.</td></tr>
<tr><td>One person who wants a GUI and a model browser</td><td><strong>LM Studio</strong> or <strong>Jan</strong></td><td>LM Studio is more polished, Jan is open source.</td></tr>
<tr><td>Serving concurrent users in production</td><td><strong>vLLM</strong></td><td>Continuous batching. This is the actual dividing line.</td></tr>
<tr><td>Serving RAG or heavy shared-prefix traffic</td><td><strong>SGLang</strong></td><td>Optimised for reused prompt prefixes.</td></tr>
<tr><td>Odd hardware, embedded, or CPU-only</td><td><strong>llama.cpp</strong></td><td>Runs where nothing else will.</td></tr>
<tr><td>On Apple Silicon</td><td><strong>MLX</strong>, or LM Studio</td><td>Built for the unified memory architecture.</td></tr>
</tbody>
</table>

<h2>The split that explains everything</h2>

<p><strong>Family one is built on llama.cpp.</strong> llama.cpp is the inference engine: a C++ implementation that runs GGUF-quantised models on almost anything, including CPUs and Apple Silicon. Ollama wraps it in a daemon with a model registry. LM Studio wraps it in a desktop GUI.</p>

<p>This is why throughput comparisons between Ollama and LM Studio are close to meaningless. Community benchmarks put them within roughly five percent of each other, and that is exactly what you would expect from two programs running the same engine underneath. The differences that matter are ergonomics and how quickly each one ships upstream llama.cpp improvements, not speed.</p>

<p><strong>Family two is built for concurrency.</strong> vLLM and SGLang use continuous batching and PagedAttention. Instead of processing requests one at a time, they keep the GPU saturated by continuously slotting new requests into the batch as older ones finish, and they manage the KV cache in pages rather than contiguous blocks, which cuts the memory waste that otherwise limits how many requests fit at once.</p>

<p>Ollama and LM Studio do not do this. For a single user that costs you nothing, because there is only one request in flight. Under concurrent load it is the whole ballgame. Community benchmarks report vLLM at more than an order of magnitude above Ollama's concurrent throughput, and while the exact multiple depends entirely on your workload, the mechanism is not in dispute.</p>

<p>So the honest framing is: <strong>if you are one person on one machine, benchmark differences between these tools are noise. If you are serving multiple users, Ollama is the wrong shape, not the slower option.</strong></p>

<h2>Family one: the llama.cpp lineage</h2>

<h3>llama.cpp</h3>

<p>The engine everything else in this family is built on, at 121,567 stars and MIT licensed. Note it now lives under the <code>ggml-org</code> organisation rather than the original <code>ggerganov</code> account.</p>

<p>Use it directly when you need control or when your hardware is unusual. It runs on CPUs, on Apple Silicon, on modest GPUs, and on things that are not really meant to run language models at all. Its quantisation format, GGUF, is the one you keep seeing on Hugging Face, and if you want to understand what those suffixes mean, we broke that down in <a href="/tutorials/quantization-formats-explained.html">quantization formats explained</a>.</p>

<p>The cost is ergonomics. You manage model files, flags and server processes yourself.</p>

<h3>Ollama</h3>

<p>The most popular project in this entire comparison at 176,859 stars, MIT licensed, and the reason most people's first local model ever ran. It hides llama.cpp behind a daemon and a registry:</p>

<pre class="brush: bash">
ollama run qwen3
</pre>

<p>That is the whole onboarding. It also exposes an OpenAI-compatible endpoint, which is why nearly every local AI tutorial, including our own <a href="/tutorials/build-your-own-ai-generator-n8n-ollama-claude-api-2026.html">n8n generator build</a>, assumes it. It has been moving fast lately, picking up an <a href="/news/ollama-v0-32-interactive-agent-2026.html">interactive agent mode in v0.32</a>.</p>

<p>Its limitation is the one above: no continuous batching. Excellent for one user, wrong tool for fifty.</p>

<h3>LM Studio, and Jan</h3>

<p>LM Studio is the polished desktop app: browse models, click, chat, with a local server when you want one. It bundles both llama.cpp and MLX, so it handles Apple Silicon natively.</p>

<p>It is also the one closed-source tool here, and that deserves a precise statement rather than a warning. LM Studio is proprietary, developed by Element Labs, but it is <strong>free for personal and commercial use</strong>. The separate work licence was removed in July 2025, so using it at your job requires no form and no fee. Its <code>lms</code> CLI is MIT.</p>

<p>So the reason to prefer an alternative is auditability, not cost. If you want a GUI and open source, <strong>Jan</strong> is the Apache 2.0 option covering the same ground. Closed source does not mean paid here, and it is worth being clear about which objection actually applies to you.</p>

<h2>Family two: built for concurrency</h2>

<h3>vLLM</h3>

<p>The default choice for serving, at 87,140 stars and Apache 2.0. It originated PagedAttention, supports a very wide range of model architectures, and exposes an OpenAI-compatible API so most clients work unchanged.</p>

<p>It is what you reach for when requests arrive in parallel. It is also what the wider ecosystem assumes: both the <a href="/tutorials/run-open-agent-stack-openshell-langchain-deep-agents-2026.html">NemoClaw agent stack</a> and <a href="/tutorials/qwen3-asr-open-whisper-alternative-local-2026.html">Qwen3-ASR</a> document vLLM as their serving path.</p>

<p>The tradeoff is that it wants a real GPU and more setup than <code>ollama run</code>. There is no CPU-only story worth having.</p>

<h3>SGLang</h3>

<p>The younger sibling at 30,736 stars, also Apache 2.0, also continuously batched. Its specialisation is workloads where many requests share a long common prefix, which describes RAG almost exactly: the same retrieved context and system prompt in front of many different questions. On that shape it can edge out vLLM.</p>

<p>For general serving with wide model support, vLLM remains the shorter path. Reach for SGLang when your traffic actually has that prefix-heavy shape rather than on principle.</p>

<h2>The one that quietly fell behind</h2>

<p>Hugging Face's Text Generation Inference used to appear in every list like this. It is worth checking whether it still should. Repository activity, read from the GitHub API on the date below:</p>

<table class="styled-table">
<thead>
<tr><th>Project</th><th>Stars</th><th>License</th><th>Last pushed</th></tr>
</thead>
<tbody>
<tr><td>Ollama</td><td>176,859</td><td>MIT</td><td>2026-07-25</td></tr>
<tr><td>llama.cpp</td><td>121,567</td><td>MIT</td><td>2026-07-25</td></tr>
<tr><td>vLLM</td><td>87,140</td><td>Apache-2.0</td><td>2026-07-25</td></tr>
<tr><td>SGLang</td><td>30,736</td><td>Apache-2.0</td><td>2026-07-25</td></tr>
<tr><td>Text Generation Inference</td><td>10,882</td><td>Apache-2.0</td><td><strong>2026-03-21</strong></td></tr>
</tbody>
</table>

<p>Four of the five pushed commits the same day we checked. TGI last saw a push four months earlier and sits at roughly an eighth of vLLM's stars. We are not calling it dead, and Apache 2.0 code does not stop working. But if you are choosing a serving stack to build on in 2026, that row is the one to think hardest about, and the dates say more than any opinion would.</p>

<h2>Apple Silicon</h2>

<p>MLX is Apple's array framework built for unified memory, and <code>mlx-lm</code> runs language models on it. On an M-series Mac it is generally the fastest path, because it is designed for the architecture rather than ported to it.</p>

<p>You do not necessarily need to touch it directly. LM Studio bundles MLX alongside llama.cpp and picks appropriately, which is a large part of why it is the common recommendation for Mac users who do not want to think about any of this. We used a Mac-native path in <a href="/tutorials/run-ltx-2-locally-mac-pinokio-phosphene.html">running LTX-2 locally on Mac</a> for the same reason.</p>

<h2>So which one</h2>

<p><strong>Just starting, or one developer:</strong> Ollama. The onboarding is genuinely one command and the OpenAI-compatible endpoint means nothing you build against it is wasted if you migrate later.</p>

<p><strong>You want a GUI:</strong> LM Studio if you want the most polished experience and do not mind closed source, Jan if you would rather stay open. Both are free.</p>

<p><strong>Building a product with real users:</strong> vLLM. Not because Ollama is slow, but because concurrent serving is a different problem and Ollama does not attempt to solve it. Migrating later is not painful, since both speak the same API shape, so starting on Ollama and moving when you have traffic is a reasonable plan rather than a mistake.</p>

<p><strong>RAG at volume:</strong> benchmark SGLang against vLLM on your own traffic before committing. The prefix-sharing advantage is real but workload-specific.</p>

<p><strong>Weird hardware, or no GPU:</strong> llama.cpp, and see <a href="/tools/airllm-running-massive-70b-llms-on-a-4gb-gpu.html">AirLLM</a> for the extreme end of low-VRAM tricks.</p>

<p>The ten-minute move: if you have never run a local model, install Ollama and pull one. If you already have and are wondering whether to switch, the useful question is not which is faster but whether you have concurrent users. If you do not, you are already on the right tool.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="/tutorials/quantization-formats-explained.html">Quantization formats explained: what GGUF and the rest actually mean</a></li>
<li><a href="/tutorials/run-full-local-ai-stack-with-local-ai-packaged.html">Run a full local AI stack on your own hardware</a></li>
<li><a href="https://github.com/ggml-org/llama.cpp" target="_blank" rel="nofollow noopener noreferrer">ggml-org/llama.cpp on GitHub (MIT)</a></li>
<li><a href="https://github.com/ollama/ollama" target="_blank" rel="nofollow noopener noreferrer">ollama/ollama on GitHub (MIT)</a></li>
<li><a href="https://github.com/vllm-project/vllm" target="_blank" rel="nofollow noopener noreferrer">vllm-project/vllm on GitHub (Apache 2.0)</a></li>
<li><a href="https://github.com/sgl-project/sglang" target="_blank" rel="nofollow noopener noreferrer">sgl-project/sglang on GitHub (Apache 2.0)</a></li>
<li><a href="https://lmstudio.ai/blog/free-for-work" target="_blank" rel="nofollow noopener noreferrer">LM Studio: free for use at work</a></li>
<li><a href="https://github.com/ml-explore/mlx" target="_blank" rel="nofollow noopener noreferrer">Apple MLX on GitHub</a></li>
</ul>

<p><em>Tested on: not independently tested. Our bench has no NVIDIA GPU, so we ran no throughput benchmarks and quote none as our own. The star counts, licences and last-push dates in the table above were read directly from the GitHub API on the date below and are the load-bearing facts in this article. Throughput comparisons are community-reported and workload-dependent; we describe the architectural mechanism, continuous batching and PagedAttention, rather than repeating a specific multiplier as though it were universal. LM Studio's licensing is quoted from its own announcement.</em><br>
<em>Date checked: 2026-07-25</em></p>]]></description>
    <pubDate>Sat, 25 Jul 2026 17:49:53 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/ollama-vs-llama-cpp-vs-vllm-local-inference-server-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/ollama-vs-llama-cpp-vs-vllm-local-inference-server-2026-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/ollama-vs-llama-cpp-vs-vllm-local-inference-server-2026-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Qwen3-ASR: The Open Whisper Alternative You Can Run Locally]]></title>
    <link>https://singularitybyte.com/tutorials/qwen3-asr-open-whisper-alternative-local-2026.html</link>
    <description><![CDATA[ 
<p>This is another entry in our Local AI Stack series. In <a href="/tutorials/whisper-ai-local-transcription-guide.html">the Whisper guide</a> we set up local speech-to-text with the model everyone reaches for by default. Whisper is still excellent. It is also no longer the only serious open option, and for a lot of real audio it is no longer the best one.</p>

<p>Qwen3-ASR is Apache 2.0, comes in 0.6B and 1.7B sizes, and the two Transformers-native builds have pulled over 206,000 downloads. The headline you will see is "it beats Whisper." That is too simple, and the real picture is more useful.</p>

<h2>TL;DR</h2>

<ul>
<li>Two models, <strong>Apache 2.0</strong>, 0.6B and 1.7B, covering <strong>52 languages and dialects</strong> (30 languages plus 22 Chinese dialects).</li>
<li><strong>It is not a Whisper killer, it is a Whisper complement.</strong> Whisper still edges it on pristine English audio. Qwen wins on noisy audio, accents, Mandarin and Cantonese, sometimes by enormous margins.</li>
<li>Not new, despite the recent buzz: released 2026-01-29. What changed is <strong>native Transformers support on 2026-06-26</strong>, which is what made it a two-line install and drove the download numbers.</li>
</ul>

<h2>What Qwen3-ASR actually is</h2>

<p>Two all-in-one speech recognition models from the Qwen team, built on the Qwen3-Omni foundation model. They do language identification and transcription in a single pass, and they handle more than clean dictation: speech, singing voice, and songs with background music are all in scope. Offline and streaming inference run through one unified architecture rather than separate models.</p>

<p>Sizes and adoption, from the Hugging Face API:</p>

<table class="styled-table">
<thead>
<tr><th>Model</th><th>Downloads</th><th>What it is for</th></tr>
</thead>
<tbody>
<tr><td>Qwen3-ASR-0.6B</td><td>135,557</td><td>The efficiency pick. 0.8B params on disk. Claims 2000x throughput at a concurrency of 128.</td></tr>
<tr><td>Qwen3-ASR-1.7B</td><td>71,136</td><td>The accuracy pick, and the one in the benchmark table below.</td></tr>
<tr><td>Qwen3-ForcedAligner-0.6B</td><td>20,422</td><td>Separate model for word-level timestamps and alignment.</td></tr>
</tbody>
</table>

<p>On the Hugging Face Open ASR Leaderboard the 0.6B posts a mean WER of 6.31 percent and the 1.7B posts 5.59 percent. Those are aggregate English numbers, and on their own they undersell the model, because the interesting behaviour is in the spread rather than the mean.</p>

<h2>Where it beats Whisper, and where it does not</h2>

<p>Here is the project's own benchmark table against Whisper-large-v3. Word error rate, so lower is better, and the winner in each row is bold.</p>

<table class="styled-table">
<thead>
<tr><th>Benchmark</th><th>Whisper-large-v3</th><th>Qwen3-ASR-1.7B</th></tr>
</thead>
<tbody>
<tr><td>Librispeech clean</td><td><strong>1.51</strong></td><td>1.63</td></tr>
<tr><td>Librispeech other</td><td>3.97</td><td><strong>3.38</strong></td></tr>
<tr><td>GigaSpeech</td><td>9.76</td><td><strong>8.45</strong></td></tr>
<tr><td>Accented English</td><td>21.30</td><td><strong>16.07</strong></td></tr>
<tr><td>AISHELL-2 (Mandarin)</td><td>5.06</td><td><strong>2.71</strong></td></tr>
<tr><td>Mandarin</td><td>10.61</td><td><strong>3.81</strong></td></tr>
<tr><td>Cantonese</td><td>31.04</td><td><strong>4.12</strong></td></tr>
</tbody>
</table>

<p>The two Librispeech rows are the ones worth sitting with, because they are the same corpus split by difficulty. "Clean" is studio-quality read speech, and Whisper wins it. "Other" is the harder, noisier split, and Qwen wins that. That single pair tells you the shape of the whole comparison: <strong>Whisper is marginally better on pristine audio, and Qwen is better as soon as the audio gets difficult.</strong></p>

<p>Then look at Cantonese. Whisper posts 31.04 percent WER, which is roughly one word in three wrong, meaning it is not usable. Qwen posts 4.12 percent. That is not an incremental gain, it is the difference between a feature you can ship and one you cannot. Mandarin shows the same pattern less dramatically, and accented English sits in between.</p>

<p>So the honest summary is not "Qwen3-ASR is better." It is that Whisper was trained in a way that made clean English its strongest case, and Qwen3-ASR is much more robust everywhere else. If your audio is podcast-quality American English, your existing Whisper pipeline is fine. If it is phone calls, accented speakers, background noise, or anything Chinese, this is a meaningful upgrade.</p>

<h2>Running it</h2>

<p>Native Transformers support is the whole reason this is now easy. One install:</p>

<pre class="brush: bash">
pip install "transformers>=5.13.0"
</pre>

<p>Then transcribe. The processor has a dedicated transcription-request helper, so you do not hand-build the prompt:</p>

<pre class="brush: python">
from transformers import AutoProcessor, AutoModelForMultimodalLM

model_id = "Qwen/Qwen3-ASR-0.6B-hf"   # or Qwen/Qwen3-ASR-1.7B-hf
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForMultimodalLM.from_pretrained(model_id, device_map="auto")

inputs = processor.apply_transcription_request(
    audio="https://example.com/audio.wav",
).to(model.device, model.dtype)

output_ids = model.generate(**inputs, max_new_tokens=256)
generated_ids = output_ids[:, inputs["input_ids"].shape[1]:]

transcription = processor.decode(
    generated_ids, return_format="transcription_only",
)[0]
print(transcription)
</pre>

<p><code>audio=</code> takes a local path as readily as a URL. Language identification is automatic, so there is no language flag to set unless you want to pin one.</p>

<p>If you are pushing volume, the project documents <code>torch.compile</code> giving roughly a 2.4x speedup on an A100 at batch size 4, and supports vLLM for serving.</p>

<h3>Word-level timestamps</h3>

<p>The ASR models transcribe but do not align. If you need per-word timings, for subtitles or for seeking into a recording, that is the separate <code>Qwen3-ForcedAligner-0.6B</code> model. This is a design decision worth knowing before you plan a subtitle pipeline: Whisper gives you segment timestamps in the same pass, whereas Qwen splits transcription and alignment into two models. Two steps, but the alignment model is small and you only pay for it when you need it.</p>

<h2>Hardware reality</h2>

<p>Be careful here, because the parameter counts invite a wrong assumption. A 0.6B model sounds like something that runs comfortably on a laptop CPU, and it may well. But <strong>the project does not document CPU inference at all.</strong> Every piece of guidance is GPU-shaped: <code>cuda:0</code> in the examples, vLLM for serving, FlashAttention 2 for speed, A100 numbers for the benchmarks.</p>

<p>That does not mean CPU is impossible. It means nobody has published what to expect, so if your plan is CPU-only transcription, budget time to find out for yourself rather than treating it as a supported path. The 0.6B is the obvious candidate if you try.</p>

<p>For comparison, this is a real advantage Whisper retains: years of community work has produced <a href="https://github.com/ggml-org/whisper.cpp" target="_blank" rel="nofollow noopener noreferrer">whisper.cpp</a> and a mature quantized CPU story. Qwen3-ASR has the better model on hard audio; Whisper has the better ecosystem on constrained hardware. That trade is the actual decision.</p>

<h2>Which should you use</h2>

<p>Stay on Whisper if your audio is clean English, if you are running CPU-only or on a Raspberry Pi class device, or if you depend on the surrounding tooling (whisper.cpp, faster-whisper, the many wrappers). None of that is displaced.</p>

<p>Switch to Qwen3-ASR if you transcribe Mandarin or Cantonese, where the gap is not close. Also switch if your English audio is accented, noisy, or recorded over a phone, where the Librispeech "other" and accented-English rows say you will measurably do better.</p>

<p>Run both if you are building a product. They are both Apache 2.0, both small, and routing by detected language costs you almost nothing.</p>

<p>The ten-minute move: take the worst piece of audio you have, the one your current pipeline mangles, and run it through the 0.6B with the snippet above. The aggregate benchmarks will not tell you whether this helps your data. That one file will.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="/tutorials/whisper-ai-local-transcription-guide.html">Our guide to running Whisper locally</a></li>
<li><a href="https://github.com/QwenLM/Qwen3-ASR" target="_blank" rel="nofollow noopener noreferrer">QwenLM/Qwen3-ASR on GitHub (Apache 2.0, benchmark tables)</a></li>
<li><a href="https://huggingface.co/Qwen/Qwen3-ASR-0.6B-hf" target="_blank" rel="nofollow noopener noreferrer">Qwen3-ASR-0.6B on Hugging Face</a></li>
<li><a href="https://huggingface.co/Qwen/Qwen3-ASR-1.7B-hf" target="_blank" rel="nofollow noopener noreferrer">Qwen3-ASR-1.7B on Hugging Face</a></li>
<li><a href="https://huggingface.co/Qwen/Qwen3-ForcedAligner-0.6B-hf" target="_blank" rel="nofollow noopener noreferrer">Qwen3-ForcedAligner-0.6B on Hugging Face</a></li>
<li><a href="https://arxiv.org/html/2601.21337v1" target="_blank" rel="nofollow noopener noreferrer">Qwen3-ASR technical report (arXiv 2601.21337)</a></li>
</ul>

<p><em>Tested on: not independently tested. Our bench has no NVIDIA GPU, and the project documents no CPU path, so we did not run inference. Every WER figure above is quoted from the project's own published benchmark table against Whisper-large-v3, not from a third-party summary, and the download counts and Apache 2.0 licensing were read directly from the Hugging Face API on the date below. Release dates come from the repository's own changelog.</em><br>
<em>Date checked: 2026-07-25</em></p>]]></description>
    <pubDate>Sat, 25 Jul 2026 14:30:13 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/qwen3-asr-open-whisper-alternative-local-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/qwen3-asr-open-whisper-alternative-local-2026-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/qwen3-asr-open-whisper-alternative-local-2026-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Open-Source Video Models Mid-2026: What Actually Shipped, and What Did Not]]></title>
    <link>https://singularitybyte.com/tutorials/open-source-video-models-mid-2026-what-changed.html</link>
    <description><![CDATA[ 
<p>This is the fourth entry in our open-source AI video series. In <a href="/tutorials/ai-video-generator-comparison-2026-open-source-models-tested.html">the April comparison</a> we tested Wan 2.1 and 2.2, HunyuanVideo and Mochi on real hardware and named a winner per use case. Three months on, the obvious follow-up was "here are the new models." We started writing that piece and the facts did not cooperate.</p>

<p>The headline change since April is not a new open model. It is that the web filled up with confident, well-ranked claims about a model that was never opened at all.</p>

<h2>TL;DR</h2>

<ul>
<li><strong>Wan 2.7 is not open source.</strong> Official Wan open weights still stop at 2.2. There is no <code>Wan2.7</code> repository and no weights on Hugging Face, despite a cluster of sites saying otherwise.</li>
<li><strong>LTX-2.3 is the real story.</strong> 22B parameters, synchronized audio and video from one model, and over 2.1 million downloads. It is the most-downloaded open video model we can find by a wide margin.</li>
<li><strong>None of the leaders is Apache 2.0 at the frontier.</strong> The "they all went permissive" claim is wrong in three different ways, laid out below.</li>
</ul>

<h2>The Wan 2.7 problem</h2>

<p>Search for open-source video models today and you will be told, repeatedly and confidently, that Wan 2.7 shipped under Apache 2.0 in April 2026 with first/last-frame control and 9-grid image input. Several of those pages give install instructions and download links.</p>

<p>We went looking for the weights. They are not there:</p>

<table class="styled-table">
<thead>
<tr><th>Check</th><th>Result</th></tr>
</thead>
<tbody>
<tr><td>Hugging Face search for <code>Wan2.7</code></td><td>0 models</td></tr>
<tr><td><code>Wan-Video/Wan2.7</code> on GitHub</td><td>404</td></tr>
<tr><td>Newest video model in the <code>Wan-AI</code> org</td><td>Wan-Dancer-14B, plus the Wan 2.2 family</td></tr>
<tr><td>Newest official Wan repo</td><td><code>Wan-Video/Wan2.2</code>, Apache-2.0, last pushed 2026-03-17</td></tr>
</tbody>
</table>

<p>Wan 2.7 does exist. It is a real model with real capabilities, available through Alibaba's cloud and API. What it is not is downloadable. Alibaba's pattern with Wan has been cloud first, open weights later, and for 2.7 the second half has not happened.</p>

<p>The sites saying otherwise share a tell: many are single-purpose domains built around the model name, publishing "open source guide" and "how to download" pages for something with nothing behind them. They rank well because nobody else was competing for those terms.</p>

<p>The practical consequence for readers of our April piece is reassuring. We tested Wan 2.1 and 2.2 because that was the open Wan, and <strong>2.2 is still the open Wan</strong>. That article did not age out. The newer content did.</p>

<h2>LTX-2.3 is what actually shipped</h2>

<p>The model that genuinely changed the picture came from Lightricks. LTX-2 was open-sourced in January 2026; the current release is <strong>LTX-2.3</strong>, a 22-billion-parameter diffusion transformer that generates video and synchronized audio together from a single model rather than bolting a soundtrack on afterwards. It handles text-to-video, image-to-video, and video-to-video.</p>

<p>The adoption numbers are what stand out. Set against the other open contenders:</p>

<table class="styled-table">
<thead>
<tr><th>Model</th><th>Hugging Face downloads</th><th>Last updated</th></tr>
</thead>
<tbody>
<tr><td>Lightricks/LTX-2.3</td><td><strong>2,117,254</strong></td><td>2026-07-09</td></tr>
<tr><td>Wan-AI/Wan2.2-TI2V-5B-Diffusers</td><td>153,577</td><td>2025-08-09</td></tr>
<tr><td>Wan-AI/Wan2.2-I2V-A14B-Diffusers</td><td>128,077</td><td>2025-08-09</td></tr>
<tr><td>tencent/HunyuanVideo-1.5</td><td>4,009</td><td>2025-12-25</td></tr>
</tbody>
</table>

<p>Downloads measure interest rather than quality, and the Wan totals are split across many repository variants, so do not read this as a capability ranking. But a 500x gap over HunyuanVideo-1.5 is not noise, and it lines up with the other signal: an active adapter ecosystem. Lightricks has shipped LoRAs through June and July for video-to-audio foley, cinemagraphs, in/outpainting, clean-plate removal, and spatial upscaling. That is what a model people actually build on looks like.</p>

<h3>Requirements</h3>

<p>LTX-2.3 wants Python 3.12 or newer, CUDA above 12.7, and PyTorch 2.7 or later. Resolution has to be divisible by 32, and frame count divisible by 8 plus 1, which will bite you the first time you request 100 frames and get an error.</p>

<h2>The licensing claim, corrected</h2>

<p>The tidiest version of the mid-2026 story is that the open video leaders converged on Apache 2.0. We were ready to write that. It is wrong three times over:</p>

<table class="styled-table">
<thead>
<tr><th>Model</th><th>Actual license</th><th>The catch</th></tr>
</thead>
<tbody>
<tr><td>Wan 2.2</td><td>Apache-2.0</td><td>Genuinely permissive, but this is 2.2. The newer 2.7 has no weights at all.</td></tr>
<tr><td>LTX-2.3</td><td>LTX-2 Community License Agreement</td><td>Not Apache. Free for research and for commercial use under 10 million dollars ARR; above that you negotiate.</td></tr>
<tr><td>HunyuanVideo-1.5</td><td>Other (GitHub reports NOASSERTION)</td><td>A Tencent community license, not a standard open-source one.</td></tr>
</tbody>
</table>

<p>The LTX threshold has a detail worth reading before you assume you are under it: subsidiaries, affiliates, and companies under common control are counted <strong>collectively</strong>. A small studio owned by a large group may be over the line. Lightricks states there are no retroactive charges, so crossing the threshold is a conversation rather than a penalty.</p>

<p>For most readers of this site, "free under 10 million ARR" is functionally free. It is still not Apache 2.0, and if you are choosing a model on license terms the difference matters.</p>

<h2>Check any model claim yourself in about a minute</h2>

<p>The useful takeaway is not the specific facts above, which will move again. It is that both Hugging Face and GitHub expose public APIs that settle "is this actually released" in one command, with no key and no account.</p>

<p>Does the model exist on Hugging Face?</p>

<pre class="brush: bash">
curl -s "https://huggingface.co/api/models?search=LTX-2.3&amp;limit=5" \
  | python3 -c "import sys,json; [print(m['modelId'], m.get('downloads')) for m in json.load(sys.stdin)]"
</pre>

<p>An empty result is your answer. That single check is what showed us Wan 2.7 had no weights.</p>

<p>What has an organization actually published, most recent first?</p>

<pre class="brush: bash">
curl -s "https://huggingface.co/api/models?author=Wan-AI&amp;sort=lastModified&amp;direction=-1&amp;limit=10" \
  | python3 -c "import sys,json; [print(m['modelId'], str(m['lastModified'])[:10]) for m in json.load(sys.stdin)]"
</pre>

<p>And the repository's real license, rather than what a blog says it is:</p>

<pre class="brush: bash">
curl -s https://api.github.com/repos/Wan-Video/Wan2.2 \
  | python3 -c "import sys,json; j=json.load(sys.stdin); print(j['license']['spdx_id'], j['pushed_at'])"
</pre>

<p>A <code>NOASSERTION</code> here means GitHub could not match the LICENSE file to a standard license, which is a strong hint you are looking at a custom community license rather than Apache or MIT. That is exactly what HunyuanVideo-1.5 returns.</p>

<h2>What this changes about the April comparison</h2>

<p>Less than you would expect, which is the point.</p>

<p>Our tested numbers for Wan 2.2 and HunyuanVideo still describe the current open field, because the open field did not move as much as the coverage suggests. The genuine gap is LTX-2.3, which we have not benchmarked and which did not appear in that article at all. If you want the hardware side, <a href="/tutorials/self-hosted-ai-video-generator-stack-hardware-guide-2026.html">the self-hosted stack guide</a> still applies; a 22B model sits above the Wan 2.2 5B variant and below the heavier A14B configurations in memory terms.</p>

<h2>What we would test next</h2>

<p>Three things for the next entry. LTX-2.3 against Wan 2.2 on the same prompts and hardware as the April run, so the comparison is like for like. Whether the single-model synchronized audio actually beats generating video and audio separately, which is LTX's core architectural bet. And whether the foley and upscaler LoRAs hold up outside the demos, since an adapter ecosystem is only worth something if the adapters work.</p>

<p>If Alibaba does open Wan 2.7, that becomes the story and we will cover it. It has not happened yet.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="/tutorials/ai-video-generator-comparison-2026-open-source-models-tested.html">Part one: our tested open-source video model comparison</a></li>
<li><a href="/tutorials/self-hosted-ai-video-generator-stack-hardware-guide-2026.html">The self-hosted video stack hardware guide</a></li>
<li><a href="https://huggingface.co/Lightricks/LTX-2.3" target="_blank" rel="nofollow noopener noreferrer">Lightricks/LTX-2.3 on Hugging Face</a></li>
<li><a href="https://github.com/Lightricks/LTX-2/blob/main/LICENSE" target="_blank" rel="nofollow noopener noreferrer">The LTX-2 Community License Agreement</a></li>
<li><a href="https://github.com/Wan-Video/Wan2.2" target="_blank" rel="nofollow noopener noreferrer">Wan-Video/Wan2.2 on GitHub (Apache-2.0)</a></li>
<li><a href="https://github.com/Tencent-Hunyuan/HunyuanVideo-1.5" target="_blank" rel="nofollow noopener noreferrer">Tencent HunyuanVideo-1.5 on GitHub</a></li>
</ul>

<p><em>Tested on: not independently tested. We did not run LTX-2.3, which needs an NVIDIA GPU our bench does not have. Every release claim above was verified directly against the Hugging Face and GitHub public APIs on the date below, using the exact commands published in this article: model existence and download counts, organization publishing history, repository licenses, and last-push dates. Capability descriptions are the projects' own. Where our findings contradict widely-published claims, we have shown the check so you can repeat it.</em><br>
<em>Date checked: 2026-07-25</em></p>]]></description>
    <pubDate>Sat, 25 Jul 2026 13:13:15 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/open-source-video-models-mid-2026-what-changed.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/open-source-video-models-mid-2026-what-changed-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/open-source-video-models-mid-2026-what-changed-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[StableDAW Is Now theDAW: What Changed and How to Move Your Setup]]></title>
    <link>https://singularitybyte.com/tutorials/stabledaw-is-now-thedaw-whats-new-2026.html</link>
    <description><![CDATA[ 
<p>This is part two of our local AI music studio series. In <a href="/tools/stabledaw-ai-music-studio-pinokio.html">part one</a> we covered StableDAW, the browser-based AI music studio built on Stable Audio 3 that installed in one click through Pinokio and ran the small model on a plain CPU. Nine days after that article went up, the project was archived. It did not die, it moved and grew: the repo is now <a href="https://github.com/gantasmo/theDAW" target="_blank" rel="nofollow noopener noreferrer">gantasmo/theDAW</a>, it went from seven workspaces to ten, and it picked up VST3 hosting, stem separation, and MIDI transcription along the way.</p>

<p>There is a catch, and it is the reason this article exists. The one-click install path still works, and that is the problem. It silently gives you the old build.</p>

<h2>TL;DR</h2>

<ul>
<li>StableDAW is archived and superseded by theDAW. Same author, same MIT license, roughly twice the application.</li>
<li><strong>The Pinokio launcher has not been updated.</strong> It still clones the archived repo, so the install succeeds and hands you the June build. There is no Pinokio path to theDAW right now.</li>
<li>Latest release is v0.1.3 (2026-07-06). Use the Windows script, a release installer, the container image, or a source checkout instead.</li>
</ul>

<table class="styled-table">
<thead>
<tr><th>Workspace</th><th>Status</th><th>What it does</th></tr>
</thead>
<tbody>
<tr><td>MAKE</td><td>Carried over</td><td>Text-to-audio, audio-to-audio, inpainting, continuation, Chimera fusion</td></tr>
<tr><td>EDIT</td><td>Carried over</td><td>Multitrack timeline, waveform editing, trims and fades</td></tr>
<tr><td>MIX</td><td>Expanded</td><td>25 FFmpeg effects, now hosts VST3 and .gan web-plugins</td></tr>
<tr><td>DJ</td><td>Expanded</td><td>Two decks, plus stems, key-lock and automix</td></tr>
<tr><td>VJ</td><td>Carried over</td><td>WebGL reactive visuals, shaders, camera sources</td></tr>
<tr><td>LEARN</td><td>Carried over</td><td>Genealogy graph of track lineage</td></tr>
<tr><td>TRAIN</td><td>Renamed to Underfit</td><td>LoRA adapter training, eight adapter types</td></tr>
<tr><td>Perform</td><td>New</td><td>Live clip launcher driven from imported projects</td></tr>
<tr><td>Foundry</td><td>New</td><td>Plugin-interface designer, exports .gan web-plugins</td></tr>
<tr><td>Audimate</td><td>New</td><td>Node-graph editor for generation pipelines</td></tr>
</tbody>
</table>

<h2>What happened to StableDAW</h2>

<p>The numbers tell the story plainly. The StableDAW repo took its final commit on 2026-06-13 and was archived later that month, sitting at 44 stars. theDAW is a separate, active repo: last push 2026-07-10, 116 stars, and four tagged releases in July. Both are MIT.</p>

<p>This was not a GitHub rename, which matters more than it sounds. A rename leaves a redirect, so old clone URLs quietly follow you to the new project. Here the old repo still exists as a read-only archive at its original address. Anything pointing at it keeps working and keeps serving June code.</p>

<p>Not sure which one you are running? The fastest check is the tab bar. Seven tabs ending in TRAIN means the archived build. Ten tabs including Foundry and Audimate means theDAW. Or ask git directly:</p>

<pre class="brush: bash">
cd /path/to/your/install
git remote -v
# .../gantasmo/stabledaw  -> archived June build
# .../gantasmo/theDAW     -> current
</pre>

<h2>The Pinokio problem</h2>

<p>Part one told you to install through Pinokio, because at the time that was the best path available. That advice is now stale, and it fails in the most annoying way possible: quietly.</p>

<p>The launcher at <code>cocktailpeanut/stabledaw.pinokio</code> took its last commit on 2026-06-12, the day before StableDAW's final commit and before the archive. It has not been touched since. Its install step is a single hardcoded clone:</p>

<pre class="brush: bash">
git clone https://github.com/gantasmo/stabledaw app
</pre>

<p>Because the archived repo is still readable, that clone returns 0. Pinokio reports a clean install. You get a working music studio. It is simply the June build, missing Foundry, Audimate, Perform, VST3 hosting, Demucs stems and MIDI transcription, and it will never update.</p>

<p>We checked for a replacement and there is not one yet: <code>cocktailpeanut/thedaw.pinokio</code> and the obvious variants all 404 as of 2026-07-25. So if you want theDAW today, you install it another way. Below are the paths that actually land on the current code.</p>

<h2>Installing theDAW</h2>

<p>Four options, roughly easiest first. Requirements across all of them: Python 3.10 or newer, Node.js 20.19+ or 22.12+, FFmpeg on your PATH, and for the Medium model or Magenta RealTime 2, an NVIDIA driver at 550 or later. The Small model still runs on CPU, Apple Silicon included.</p>

<h3>Windows: the batch script</h3>

<p>Double-click <code>theDAW.bat</code>. It inspects the machine, installs whatever is missing after one confirmation, and opens the app in your browser. There is also <code>theDAW-desktop.bat</code> for the Electron shell rather than a browser tab, and <code>install/setup.ps1</code> if you would rather drive PowerShell yourself.</p>

<h3>Release installers</h3>

<p>Every GitHub release ships a Windows installer and a macOS disk image, which is new since part one. Grab <code>theDAW-Setup-&lt;version&gt;.exe</code> or <code>theDAW-&lt;version&gt;.dmg</code> from the releases page. Current version is v0.1.3.</p>

<h3>Container</h3>

<p>There is now an official image, which is the cleanest option if you already run containers and do not want Python and Node on your host:</p>

<pre class="brush: bash">
docker pull ghcr.io/gantasmo/thedaw
# the repo also ships a docker-compose.yml
</pre>

<h3>From source</h3>

<p>The one to use if you want to track development. Note the submodules flag, the checkout is incomplete without it:</p>

<pre class="brush: bash">
git clone --recurse-submodules https://github.com/gantasmo/theDAW
cd theDAW

# backend
uv run uvicorn backend.server:app --host 0.0.0.0 --port 8600 --reload

# frontend, in a second terminal
cd frontend && npm run dev
</pre>

<p>Port 8600 is not negotiable: the frontend proxies <code>/api/*</code> to it and that address is baked into the Vite config. The frontend takes 5173, and the launcher also clears 5187. Same port story as part one, so if you had those free before, you still do.</p>

<h2>The four new workspaces</h2>

<p><strong>Underfit</strong> is TRAIN with a new name and more depth. It fits LoRA adapters to the Stable Audio 3 RF base models across eight adapter types: <code>lora</code>, <code>dora-rows</code>, <code>dora-cols</code>, <code>bora</code>, and an <code>-xs</code> variant of each. You can filter which layers get adapted with <code>--include</code> and <code>--exclude</code>, adjust adapter strength at runtime rather than retraining, and stack multiple adapters additively. Still needs an NVIDIA GPU.</p>

<p><strong>Foundry</strong> is the one with no obvious equivalent anywhere else. It is an infinite-canvas designer for plugin interfaces: you lay out the controls, and the finished design exports as a <code>.gan</code> web-plugin that hosts inside the MIX chain right next to VST3 plugins and the built-in effects. Designing your own plugin UI is not something local AI audio tools normally let you do.</p>

<p><strong>Audimate</strong> is a node-graph editor for building generation pipelines. Nodes cover library sources, generation (Stable Audio or Magenta), effects, merges and feedback stages, wired together with bezier edges on a pannable canvas. If you have used ComfyUI for images, the shape will be familiar.</p>

<p><strong>Perform</strong> is a live clip launcher fed from imported projects, aimed at playing a set rather than arranging one. Together with the DJ tab's new stems, key-lock and automix, the live half of the app got most of this release's attention.</p>

<h2>What else came along</h2>

<p>Three additions are worth knowing about even though they do not have their own tabs. theDAW ships a CUDA port of Google's <strong>Magenta RealTime 2</strong>, which the project describes as the first non-Mac port. <strong>Demucs</strong> handles stem separation, so you can pull a track apart rather than only generating new material. And audio can now be transcribed to MIDI and rendered as notation, which closes the loop between generated audio and something you can actually edit as music.</p>

<h2>Moving your existing setup</h2>

<p>There is no migration tool, so treat this as a fresh install alongside the old one rather than an upgrade in place. Keep the archived install until you have confirmed the new one works.</p>

<p>Your generated audio is just files, so copy them out of the old install's data directory. LoRA adapters you trained in TRAIN target the same Stable Audio 3 RF base models that Underfit uses, so they should carry over, though verify strength settings after loading rather than assuming they match. The one thing you cannot bring is the LEARN genealogy graph, which is tied to the old install's library database.</p>

<h2>Limitations and gotchas</h2>

<ul>
<li><strong>No Pinokio path.</strong> The headline issue. Until someone updates the launcher, the one-click route lands on archived code.</li>
<li><strong>Early version numbers.</strong> v0.1.3, with four releases in two days, and the repo carries a file named <code>ERRORS-AND-FIXES-2026-07-05.md</code>. This moves fast and breaks.</li>
<li><strong>The GPU line moved.</strong> More of the interesting surface now needs NVIDIA: Medium model, Magenta RT2, Underfit training. CPU users still get the Small model and the whole edit, mix and perform side.</li>
<li><strong>Licensing is unchanged.</strong> App code MIT, model weights under the Stability AI Community License. Commercial use is fine under 1 million dollars in annual revenue. Still no vocals: Stable Audio 3 makes instrumental music and sound effects.</li>
<li><strong>Submodules.</strong> A plain <code>git clone</code> gives you a broken checkout. Use <code>--recurse-submodules</code>.</li>
</ul>

<h2>Who should move, and when</h2>

<p>If you installed through Pinokio after part one and have been happy, you are on the June build and you are missing a lot. Moving is worth it, but do it as a parallel install.</p>

<p>If you never installed it, skip StableDAW entirely and start at theDAW with a release installer or the container.</p>

<p>If you only ever wanted a local text-to-audio sketchpad on a laptop with no GPU, the archived build genuinely still does that. There is no urgency.</p>

<p>The ten-minute move: run <code>git remote -v</code> in your install directory. If it says <code>stabledaw</code>, you know where you stand, and the container pull above gets you current without touching your existing setup.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="/tools/stabledaw-ai-music-studio-pinokio.html">Part one: StableDAW, the one-click AI music studio</a></li>
<li><a href="https://github.com/gantasmo/theDAW" target="_blank" rel="nofollow noopener noreferrer">gantasmo/theDAW on GitHub (MIT)</a></li>
<li><a href="https://github.com/gantasmo/theDAW/releases" target="_blank" rel="nofollow noopener noreferrer">theDAW releases</a></li>
<li><a href="https://github.com/gantasmo/StableDAW" target="_blank" rel="nofollow noopener noreferrer">gantasmo/StableDAW, archived</a></li>
<li><a href="https://github.com/cocktailpeanut/stabledaw.pinokio" target="_blank" rel="nofollow noopener noreferrer">The unmaintained Pinokio launcher</a></li>
<li><a href="https://huggingface.co/stabilityai/stable-audio-3-medium" target="_blank" rel="nofollow noopener noreferrer">Stable Audio 3 Medium on Hugging Face</a></li>
</ul>

<p><em>Tested on: not independently tested. Our bench has no NVIDIA GPU, so we did not run theDAW end to end. Everything above comes from the project's own repositories and release artifacts, verified against the GitHub API on the date below: archive status and commit dates on both repos, the release tags and timestamps, the launcher's clone target read from its install.js, and the absence of a theDAW Pinokio launcher. Feature descriptions are the project's own.</em><br>
<em>Date checked: 2026-07-25</em></p>]]></description>
    <pubDate>Sat, 25 Jul 2026 12:44:55 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/stabledaw-is-now-thedaw-whats-new-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/stabledaw-is-now-thedaw-whats-new-2026-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/stabledaw-is-now-thedaw-whats-new-2026-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Run a Fully Open Agent Stack: OpenShell, LangChain Deep Agents, and Nemotron 3]]></title>
    <link>https://singularitybyte.com/tutorials/run-open-agent-stack-openshell-langchain-deep-agents-2026.html</link>
    <description><![CDATA[ 
<p>This is part two of our Nemotron series. In <a href="/models/nvidia-nemotron-3-ultra.html">part one</a> we looked at Nemotron 3 Ultra and argued that the interesting thing was not the 550 billion parameters, it was the license: NVIDIA shipped the weights, the pretraining data, the post-training recipes, and the RL environments under OpenMDW-1.1. We ended that piece by telling you to point a LangChain Deep Agents loop at the endpoint. On July 8, 2026, NVIDIA and LangChain did exactly that and packaged it. The result is called NemoClaw, and it is the first time every layer of an agent stack (model, harness, and runtime) has been open at the same time.</p>

<h2>TL;DR</h2>

<ul>
<li>NemoClaw is a blueprint, not a product: Nemotron 3 Ultra for the model, LangChain Deep Agents Code for the harness, NVIDIA OpenShell for the sandboxed runtime.</li>
<li>All three layers are open, and OpenShell is Apache 2.0. Despite the NVIDIA branding, <strong>none of it requires an NVIDIA GPU</strong>, because GPU support in OpenShell is optional and the model can sit behind any OpenAI-compatible endpoint.</li>
<li>The headline "10x cheaper" number comes from LangChain's own eval suite, run by the two companies announcing the product, against an unnamed competitor. Treat it as vendor-reported.</li>
</ul>

<table class="styled-table">
<thead>
<tr><th>Layer</th><th>Component</th><th>License</th></tr>
</thead>
<tbody>
<tr><td>Model</td><td>Nemotron 3 Ultra (550B total, 55B active, 1M context)</td><td>OpenMDW-1.1</td></tr>
<tr><td>Harness</td><td>LangChain Deep Agents Code (<code>dcode</code>)</td><td>Open source</td></tr>
<tr><td>Runtime</td><td>NVIDIA OpenShell</td><td>Apache 2.0</td></tr>
</tbody>
</table>

<h2>What changed since part one</h2>

<p>Part one covered a model. This covers the two pieces that were missing around it.</p>

<p>An agent is not a model. It is a model plus a loop that plans, calls tools, remembers things, and keeps going for hours. That loop is the harness. And because the loop runs shell commands and touches files, it needs somewhere safe to do that, which is the runtime. Until now you could get an open model easily and an open harness fairly easily, but the runtime layer was where you quietly ended up on somebody's hosted platform.</p>

<p>NemoClaw fills that gap. The harness is LangChain's Deep Agents Code, shipped as a terminal agent called <code>dcode</code>, in the same category as Claude Code or Codex. The runtime is NVIDIA OpenShell. Both are open, both are self-hostable, and that is the whole story.</p>

<h2>OpenShell is the part worth paying attention to</h2>

<p>The model gets the headlines, but OpenShell is the piece that did not exist before.</p>

<p>It is a sandbox for autonomous agents, written in Rust, that runs a K3s Kubernetes cluster inside a single Docker container. You do not install Kubernetes separately. Agents run unmodified inside it while OpenShell enforces filesystem, network, and process rules from a declarative YAML policy, and it keeps an audit trail of every allow and deny decision it makes.</p>

<p>That last part matters more than it sounds. Most people running coding agents today either give them full access to a real machine and hope, or run them in a container and lose track of what they actually did. An audit log of denied actions tells you what your agent tried to do, which is exactly the thing you want to know before you let it run unattended for eight hours.</p>

<p>It is also honest about its maturity. NVIDIA describes it as alpha and calls it "single-player mode": one developer, one environment, one gateway. That is not a stack you put in front of a team this quarter.</p>

<h2>Getting it running</h2>

<p>OpenShell supports Linux, Apple Silicon macOS, and WSL2 (experimental). There are two install paths. The PyPI one:</p>

<pre class="brush: bash">
uv tool install -U openshell
</pre>

<p>And the official installer, which fetches a release package from GitHub:</p>

<pre class="brush: bash">
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh
</pre>

<p>Then you create a sandbox and run an agent inside it:</p>

<pre class="brush: bash">
openshell sandbox create -- claude
openshell sandbox connect
openshell policy set default --policy policy.yaml
</pre>

<h3>The gotcha nobody documents</h3>

<p>The two install paths do not have the same requirements, and we hit this the hard way. The PyPI wheels are built for <code>manylinux_2_39</code>, which means glibc 2.39 or newer. On Debian 11 (glibc 2.31) <code>uv</code> refuses to resolve:</p>

<pre class="brush: bash">
× No solution found when resolving dependencies:
╰─▶ Because all versions of openshell have no wheels with a matching
    platform tag (e.g., `manylinux_2_31_x86_64`) ...
    hint: Wheels are available for `openshell` (v0.0.91) on the following
    platforms: `manylinux_2_39_aarch64`, `manylinux_2_39_x86_64`,
    `macosx_13_0_arm64`
</pre>

<p>The shell installer is more forgiving. Read the script and it sets its own floor at glibc 2.28, because it installs a Debian or RPM package rather than a Python wheel. So on an older distro the <code>uv</code> path fails and the <code>install.sh</code> path works. The tradeoff is that the package install needs root and registers a systemd user service, which is a bigger commitment than a user-local tool.</p>

<p>If you are on Ubuntu 24.04 or later, or a current Fedora, both paths work and this never comes up.</p>

<h2>Pointing the harness at Nemotron</h2>

<p>Deep Agents Code installs with its own script:</p>

<pre class="brush: bash">
curl -LsSf https://langch.in/dcode | bash
</pre>

<p>It is model-agnostic, which is the useful bit. Any provider that speaks tool calling works, and providers are declared in <code>config.toml</code>. Since Nemotron 3 Ultra is served over an OpenAI-compatible API, you register it like any other provider. Adapted from LangChain's documented schema:</p>

<pre class="brush: toml">
[models]
default = "openrouter:nvidia/nemotron-3-ultra-550b-a55b:free"

[models.providers.openrouter]
display_name = "OpenRouter"
api_key_env = "OPENROUTER_API_KEY"
base_url = "https://openrouter.ai/api/v1"
models = ["nvidia/nemotron-3-ultra-550b-a55b:free"]
enabled = true

[models.providers.openrouter.params]
temperature = 0
</pre>

<p>One useful detail: <code>dcode</code> checks <code>DEEPAGENTS_CODE_{NAME}</code> before falling back to <code>{NAME}</code> for credentials. So you can set <code>DEEPAGENTS_CODE_OPENROUTER_API_KEY</code> and give the agent its own key without touching what every other tool on your machine uses.</p>

<h3>Putting the harness inside the sandbox</h3>

<p>Here is the part the announcement glosses over. OpenShell's four headline agents (Claude Code, OpenCode, Codex, Copilot CLI) are not a whitelist, they are the ones that come pre-installed in the base image with credentials auto-discovered from your shell. Everything after <code>--</code> on <code>sandbox create</code> is passed verbatim to the container, so any binary runs. <code>dcode</code> simply is not one of the pre-baked ones, which means you put it in the image yourself.</p>

<p>That is what <code>--from</code> is for. It takes a community image name, a local directory with a Dockerfile, or any container image reference:</p>

<pre class="brush: bash">
# build a sandbox image that has dcode installed
openshell sandbox create --from ./my-dcode-sandbox --name nemo -- dcode

# register the model endpoint explicitly, since auto-discovery
# only covers the four pre-installed agents
openshell provider create
</pre>

<p>Two flags worth knowing while you are here. <code>--policy</code> attaches your YAML rules at creation time, and <code>--gpu</code> requests GPU passthrough, which is opt-in. That last one is the clearest evidence that the GPU is genuinely optional rather than quietly assumed.</p>

<p>You do not need to self-host 550B to try this. OpenRouter carries a free Nemotron 3 Ultra endpoint at 200 requests per day with the full 1M context, which is enough to see whether the harness fits how you work. Paid pricing is $0.50 per million input tokens and $2.20 per million output. The free tier logs requests, so keep anything confidential off it.</p>

<h2>About that 10x number</h2>

<p>The announcement's headline claim is that Nemotron 3 Ultra under Deep Agents scored an aggregate 0.86 at $4.48 of inference cost, against $43.48 for "the next closest model."</p>

<p>Read that carefully. It is LangChain's own eval suite. It was run by the two companies announcing the product. The competitor is not named, and no third party has replicated it. None of that makes it false, and the underlying economics are plausible, since a 55B-active MoE really is cheaper to serve than a dense frontier model. But an unnamed baseline in a vendor benchmark is a number you quote with attribution, not one you plan a budget around.</p>

<p>The claim we would actually stand behind is the boring one: you can run this stack yourself, inspect every layer, and swap any of them out. That does not need a benchmark.</p>

<h2>Limitations and gotchas</h2>

<ul>
<li><strong>OpenShell is alpha.</strong> NVIDIA says so directly. Single developer, single environment, single gateway.</li>
<li><strong>The glibc split above.</strong> Old distro, use the shell installer, expect to need root.</li>
<li><strong><code>dcode</code> is not a pre-installed OpenShell agent,</strong> though it still runs. Only Claude Code, OpenCode, Codex and Copilot CLI ship in the base image with credentials auto-discovered, so getting the harness into the sandbox is on you. See the section above.</li>
<li><strong>Self-hosting the model is a datacenter problem.</strong> Nemotron 3 Ultra needs a multi-GPU node even at NVFP4, as covered in part one. The realistic setup for most people is open harness and open runtime locally, model over an API.</li>
<li><strong>Free-tier limits.</strong> 200 requests per day disappears fast when an agent runs a long task with many tool calls.</li>
</ul>

<h2>Who should use it</h2>

<p>If you are building agents you intend to run unattended, on data you care about, OpenShell is worth an afternoon on its own, independent of anything NVIDIA. It is Apache 2.0 and it works with agents you already use.</p>

<p>If you are shopping for an agent stack you can audit end to end, with no layer you cannot inspect or replace, NemoClaw is currently the only complete answer. Just size the alpha warning honestly.</p>

<p>If you want a coding agent that works today, this is not that. Use what you already have and revisit when OpenShell leaves alpha.</p>

<p>The ten-minute move: install <code>dcode</code>, point it at the free Nemotron endpoint with the config block above, and give it one real task. That tells you whether the harness suits you before you invest in the runtime.</p>

<h2>What we are watching next</h2>

<p>Three things for the next entry in this series. Whether OpenShell picks up multi-user support, which is what turns it from a developer tool into infrastructure. Whether anyone independently replicates the cost claim. And whether the next Nemotron ships with the same open data and recipes, because that, not the parameter count, is what made part one worth writing.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="/models/nvidia-nemotron-3-ultra.html">Part one: Nemotron 3 Ultra, a fully open 550B agent model</a></li>
<li><a href="https://www.langchain.com/blog/langchain-and-nvidia-launch-the-nemoclaw-deep-agents-blueprint" target="_blank" rel="nofollow noopener noreferrer">LangChain: NemoClaw Deep Agents blueprint announcement</a></li>
<li><a href="https://blogs.nvidia.com/blog/nemotron-langchain-agents-open-stack/" target="_blank" rel="nofollow noopener noreferrer">NVIDIA: Nemotron with the LangChain Deep Agents harness</a></li>
<li><a href="https://github.com/NVIDIA/OpenShell" target="_blank" rel="nofollow noopener noreferrer">NVIDIA OpenShell on GitHub (Apache 2.0)</a></li>
<li><a href="https://docs.nvidia.com/openshell/about/overview" target="_blank" rel="nofollow noopener noreferrer">OpenShell documentation</a></li>
<li><a href="https://docs.nvidia.com/openshell/about/supported-agents" target="_blank" rel="nofollow noopener noreferrer">OpenShell: supported agents and base image contents</a></li>
<li><a href="https://docs.nvidia.com/openshell/sandboxes/manage-sandboxes" target="_blank" rel="nofollow noopener noreferrer">OpenShell: managing sandboxes and the --from flag</a></li>
<li><a href="https://github.com/langchain-ai/deepagents" target="_blank" rel="nofollow noopener noreferrer">LangChain deepagents on GitHub</a></li>
<li><a href="https://docs.langchain.com/oss/python/deepagents/code/overview" target="_blank" rel="nofollow noopener noreferrer">Deep Agents Code documentation</a></li>
<li><a href="https://openrouter.ai/nvidia/nemotron-3-ultra-550b-a55b:free" target="_blank" rel="nofollow noopener noreferrer">Nemotron 3 Ultra free endpoint on OpenRouter</a></li>
</ul>

<p><em>Tested on: not independently tested end to end. We verified the install paths on Debian 11 (Intel i7-10510U, 6 cores, no GPU) and confirmed the glibc 2.39 wheel requirement and the installer's 2.28 floor from the release script. We did not run an agent under OpenShell: the PyPI path will not resolve on glibc 2.31, and the package path requires a root install of alpha software. Benchmark figures are vendor-reported by LangChain and NVIDIA and are labeled as such above.</em><br>
<em>Date tested: 2026-07-25</em></p>]]></description>
    <pubDate>Sat, 25 Jul 2026 11:22:00 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/run-open-agent-stack-openshell-langchain-deep-agents-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/run-open-agent-stack-openshell-langchain-deep-agents-2026-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/run-open-agent-stack-openshell-langchain-deep-agents-2026-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Free AI Showdown 2026: Claude vs GPT vs Gemini Developer Tiers]]></title>
    <link>https://singularitybyte.com/news/free-ai-showdown-claude-gpt-gemini-developer-tiers-2026.html</link>
    <description><![CDATA[<p>Here is the uncomfortable truth about building open-source AI agents in 2026: you almost always start by burning a closed-model free tier. You sketch the agent loop against Claude, you generate the synthetic training set with Gemini, you benchmark your Qwen fine-tune against GPT. Then you move the hot path to Ollama and call it a day. The question this deep dive answers is practical, not philosophical: which free AI tier from Anthropic, OpenAI, and Google actually lets an open-source builder ship without burning prepaid credits?</p>

<p>This is not a closed-model review. SingularityByte's editorial line is that we cover closed models only when they directly impact how the open-source ecosystem ships. Claude, GPT, and Gemini pass that test three ways: they subsidize prototype work that later runs on open weights, they generate the synthetic data that trains the next Qwen or Llama fine-tune, and they provide the evaluation baseline that every open-weights release measures itself against. If any of those pipelines breaks, the open-source flywheel slows down.</p>

<h2>The Framing Question</h2>

<p>A working definition for this piece: a "useful" free AI tier for open-source work is one that lets you run a weekend-scale prototype (roughly ten to twenty thousand tokens a day of real agent traffic) without funding a card, without losing the right to ship the code under an open-source license, and without getting your prompts ingested into the provider's next training run. Measured on those three axes, none of the big three is perfect, and the rankings change depending on what you are actually building.</p>

<p>We are not asking "which model is smartest." We are asking "which one lets you ship open-source code in 24 hours for zero dollars without a compliance headache."</p>

<h2>Anthropic Claude Free Tier: Starter Credits, Not a Tier</h2>

<p>Claude's free offering is the thinnest of the three, and Anthropic is upfront about it. A new account at platform.claude.com gets a small starter credit (community reports put it around five dollars at current Haiku 4.5 pricing) and no recurring monthly free allocation. Once the credit burns, the API returns HTTP 402 until you prepay. There is no "always free" Claude endpoint.</p>

<p>Where this stops mattering is the Claude for Open Source program, launched in late February 2026 and <strong>expanded on 2026-07-08</strong>. Qualifying maintainers get six months of Claude Max 20x free, roughly 1,200 dollars of value, across up to 10,000 spots. That is effectively unlimited Opus 5, Sonnet 5, and Haiku 4.5 traffic for anyone maintaining a reasonably active public project.</p>

<p>The July expansion widened eligibility past library authors to core contributors and critical packages. There are now four qualification tracks, and you only need one:</p>

<ul>
<li><strong>Maintainers and library authors:</strong> 500+ dependent repos, 100+ dependent packages, or 200,000+ combined monthly downloads across npm, PyPI, crates.io, RubyGems or similar.</li>
<li><strong>Core contributors:</strong> a listed committer or maintainer on a recognized foundation or language project (CPython, the Rust team, Node.js TSC, Apache PMC, CNCF, Kubernetes, the Linux kernel, Django, Rails).</li>
<li><strong>Active contributors:</strong> 100+ pull requests merged into repos you do not own in the last 12 months.</li>
<li><strong>Community builders:</strong> one of your repos has had 20+ unique external contributors with merged PRs in the last 12 months.</li>
</ul>

<p>Applications are reviewed on a rolling basis against that 10,000 cap, so check the official page for current status before you plan around it. None of these flows are self-serve: you fill in a form and wait.</p>

<p>For an open-source builder, the practical read is this. Use the starter credit to prove the agent loop works. If you clear any of the four tracks above, apply the same week and budget zero dollars after that. If you are a solo dev on a fresh GitHub account, your Claude free tier will last two days.</p>

<p>For sizing the starter credit, current API pricing per million tokens is Opus 5 at 5 dollars in and 25 out, Sonnet 5 at 3 and 15 (with an introductory 2 and 10 running through 2026-08-31), and Haiku 4.5 at 1 and 5. Haiku is what makes a small credit stretch.</p>

<h3>What You Can Actually Build In 24 Hours (Claude)</h3>

<ul>
<li>Full agent loop with Sonnet 5 and tool calling, enough tokens to run roughly 200 to 400 real agent turns.</li>
<li>A synthetic instruction-tuning dataset of a few thousand examples for a Qwen or Llama fine-tune, if you use Haiku 4.5 as the generator.</li>
<li>Evaluation harness comparing your open-weights model to Sonnet 5 on a benchmark of a couple of hundred prompts.</li>
</ul>

<h2>OpenAI GPT Free Tier: The Smallest Gate</h2>

<p>OpenAI's free API story is the weakest of the three for open-source developers. There is no standing free tier on the API. New accounts get a small trial credit (historically three to eighteen dollars, now usually nothing unless you qualify for a promotional code) and the rest is prepaid. ChatGPT Free is a product, not an API: it does not give you an OpenAI API key, and you cannot call it from code.</p>

<p>The one thing that has moved the needle for open-source builders in 2026 is GPT-OSS, OpenAI's first open-weights release in years. The 120B and 20B variants are now hosted free on Groq, Cerebras, and OpenRouter. That is genuinely useful: you can evaluate against a GPT-adjacent model without touching OpenAI's API at all. GPT-OSS 120B is MIT licensed and runs on two H100s or the Cerebras free tier. If your angle is "I want to benchmark open-weights against the closest thing to a GPT we are allowed to see," go straight to Cerebras and skip OpenAI entirely.</p>

<p>For closed-source GPT-5 and o3-mini access, the answer for free is: use it through Microsoft's Azure AI Foundry free credits (one hundred dollars for students, one fifty for new Azure accounts), or wait for a marketing promo. The OpenAI free API tier that builders actually want does not exist.</p>

<h3>What You Can Actually Build In 24 Hours (GPT)</h3>

<ul>
<li>On OpenAI direct: nothing meaningful for free. Assume you need credits.</li>
<li>On Groq or Cerebras via GPT-OSS 120B: a full agent loop, synthetic data generation, and benchmark harness with a million tokens a day headroom on Cerebras alone.</li>
<li>Via Azure AI Foundry credits: GPT-5 access for the duration of the promo, with a clock attached.</li>
</ul>

<h2>Google Gemini Free Tier: The Volume Leader</h2>

<p>Gemini is the answer if you want volume without a card. As of 2026-07-16 Google's pricing page lists free-tier rows for <strong>Gemini 3.5 Flash</strong> and <strong>Gemini 3.1 Flash-Lite</strong> on the standard tier. The practical quota for Flash lands around 15 requests per minute, 1 million tokens per minute, and 1,500 requests per day. Google Search grounding is included at 5,000 prompts per month.</p>

<p>One caveat that trips people up: <strong>Google no longer publishes a universal rate-limit table.</strong> Quotas are assigned per project and vary by region, account age, and whether billing is attached, so the numbers above are the commonly reported shape rather than a contractual floor. Your actual quota is visible in the AI Studio console, and that is the only figure worth planning against.</p>

<p>There is a price tag that is not measured in dollars. Google's pricing page is explicit: free-tier content is used to improve their products, paid-tier content is not. For open-source developers this is a two-way trade. If your prompts contain customer data, proprietary code, or anything under NDA, Gemini free tier is disqualified. If your prompts are public test harnesses, synthetic data generation on open datasets, or evaluation runs against open-weights models, the trade is fine, and you get the most generous free tier on the market.</p>

<p>Gemini Pro is not free on the standard tier. If you want Pro, you pay. Flash is the free workhorse, and it is strong enough to prototype against Qwen3 235B, GPT-OSS 120B, or Llama 3.3 70B with results you can learn from.</p>

<h3>What You Can Actually Build In 24 Hours (Gemini)</h3>

<ul>
<li>A high-throughput synthetic dataset generator running at the RPM cap for several hours, producing tens of thousands of training examples for an open-weights fine-tune.</li>
<li>A multimodal RAG prototype using Gemini 3.5 Flash for text and image inputs, no credit card.</li>
<li>An evaluation harness that benchmarks your Qwen or Llama output against Flash on thousands of prompts per day.</li>
</ul>

<h2>Head-to-Head: Open-Source-Friendly Ranking</h2>

<p>Ranking for the specific question "which free AI lets me ship open-source in 24 hours for zero dollars?":</p>

<table class="styled-table">
<thead><tr><th>Use case</th><th>Winner</th><th>Runner-up</th><th>Why</th></tr></thead>
<tbody>
<tr><td>Prototype an OSS agent you will later run on Ollama</td><td>Gemini 3.5 Flash</td><td>Claude Haiku 4.5 (starter credit)</td><td>Gemini's free tier actually recurs; Claude burns out by Monday</td></tr>
<tr><td>Generate synthetic training data for a Llama/Qwen fine-tune</td><td>Gemini 3.5 Flash</td><td>Mistral free tier (1B tokens/month)</td><td>Highest volume, multimodal input, no per-request cap headaches</td></tr>
<tr><td>Evaluate open-weights output against a closed baseline</td><td>Claude Haiku 4.5 via starter credit</td><td>Gemini 3.5 Flash</td><td>Claude Haiku 4.5 is still the strongest small-model judge for eval harnesses</td></tr>
<tr><td>Benchmark your fine-tune against a "GPT-class" model</td><td>GPT-OSS 120B on Cerebras</td><td>Gemini 3.5 Flash</td><td>No OpenAI key required, and it is actually open-weights</td></tr>
<tr><td>Production traffic without surprise bills</td><td>None</td><td>None</td><td>All three reserve the right to yank free access. Move to open weights before launch.</td></tr>
</tbody>
</table>

<h2>How These Free AI Tiers Subsidize Open-Source Builders</h2>

<p>There is a real, measurable economic story hidden in the free-tier data. Every open-weights fine-tune shipped in the last eighteen months (Qwen, DeepSeek, Hermes, OpenHermes, Dolphin, Nous) used synthetic data generated from a closed model at some step of the pipeline. The free AI tiers from Anthropic, OpenAI, and Google are, indirectly, the R&D budget of the open-source fine-tuning community. When Google gives away Gemini 3.5 Flash for free, a dozen hobbyist fine-tunes that would never get built at three dollars per million tokens get built at zero. When Anthropic gives Claude Max away to open-source maintainers, the agentic framework ecosystem (CrewAI, Letta, LangGraph) gets its prototyping subsidy.</p>

<p>This is not charity. It is a distribution play. Every free-tier token is an impression: "our model is the one you reach for first." The builders who stay in the ecosystem eventually pay. The open-source community benefits from the overflow.</p>

<p>What this means operationally: do not feel guilty about using a free tier to prototype open-source code. Do feel responsible about citing the tier you used, and about publishing your evaluation harness so other builders can replicate it on the same free quotas.</p>

<h2>The Rate-Limit Reduction Warning</h2>

<p>One prediction for the next ninety days. Free AI tiers always shrink. Groq cut its Llama 70B daily token budget twice in 2025. Google silently reduced Flash free-tier RPM once already in 2026. Anthropic may narrow the open-source program eligibility when the first cohort reviews. OpenAI has trended toward less free access, not more. Build your agent with a fallback chain from day one: if Gemini free throws a 429, fall back to Groq, then Cerebras, then a local Ollama on Qwen3. Tools like LiteLLM, OpenRouter, and custom routers make this a three-line change in your client code.</p>

<h2>Actionable Framework: The Free-Tier OSS Workflow</h2>

<p>A checklist for using closed-model free tiers to ship open-source code without regret:</p>

<ul>
<li><strong>Pick one closed tier per pipeline stage.</strong> Prototype on Gemini, eval on Claude Haiku 4.5, benchmark against GPT-OSS on Cerebras. Do not blend them.</li>
<li><strong>Log every prompt and response.</strong> Use Langfuse or Phoenix. When the free tier shrinks, your logs become a replay harness on open weights.</li>
<li><strong>Never ship a closed dependency into production.</strong> Closed-model calls belong in the notebook, not in the Docker image.</li>
<li><strong>Publish your evals on open weights.</strong> Your closed-model baseline is private infrastructure. Your Qwen or Llama numbers are the public artifact.</li>
<li><strong>Apply to open-source programs the same week you start a project.</strong> Claude for Open Source, GitHub Models, Azure AI Foundry credits. A ten-minute form can save six months of compute spend.</li>
</ul>

<h2>Risks and Open Questions</h2>

<p>Three things to watch in the next ninety days. First, Gemini's data-for-compute trade gets tightened or loosened (it has moved twice in 2025). Second, Anthropic expands or contracts the open-source maintainer program based on cost. Third, OpenAI ships (or does not ship) a recurring free API tier to compete with Gemini. Any one of those three moves reshuffles this ranking.</p>

<p>The deeper question: as open-weights models close the gap with Claude and Gemini on instruction following and coding, does the free AI tier lose its value for open-source builders? Probably not for another 18 months. Gemini 3.5 Flash still catches failure modes that Qwen3 235B Instruct misses, and Claude Opus 5 still writes cleaner reasoning chains than any open model we have tested. Free closed-model tiers will stay useful as long as the frontier sits inside those APIs.</p>

<h2>Sources and Further Reading</h2>

<ul>
<li><a href="https://platform.claude.com/docs/en/about-claude/pricing" target="_blank" rel="nofollow noopener noreferrer">Claude API pricing and free credits</a></li>
<li><a href="https://www.anthropic.com/news/claude-for-open-source" target="_blank" rel="nofollow noopener noreferrer">Claude for Open Source program</a></li>
<li><a href="https://ai.google.dev/pricing" target="_blank" rel="nofollow noopener noreferrer">Google Gemini API pricing</a></li>
<li><a href="https://openai.com/api/pricing/" target="_blank" rel="nofollow noopener noreferrer">OpenAI API pricing</a></li>
<li><a href="https://huggingface.co/openai" target="_blank" rel="nofollow noopener noreferrer">GPT-OSS open-weights release on Hugging Face</a></li>
</ul>

<p>Open Google AI Studio, grab a free Gemini 3.5 Flash key, set it as GEMINI_API_KEY, run the starter example at ai.google.dev, and you have a multimodal free AI endpoint in the terminal in under ten minutes.</p>

<p><em>Free tiers and model lineups move fast. Every figure above was verified against the providers' own pricing and program pages on the date below; check the linked sources before planning around any single number.</em><br>
<em>Date checked: 2026-07-25</em></p>]]></description>
    <pubDate>Sat, 25 Jul 2026 07:00:00 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/news/free-ai-showdown-claude-gpt-gemini-developer-tiers-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/news/free-ai-showdown-claude-gpt-gemini-developer-tiers-2026.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/news/free-ai-showdown-claude-gpt-gemini-developer-tiers-2026.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[How a 28.9M-Parameter LLM Runs on an $8 ESP32-S3 Microcontroller]]></title>
    <link>https://singularitybyte.com/tutorials/run-28m-llm-on-esp32-s3-microcontroller-2026.html</link>
    <description><![CDATA[ 
<p>This is part two of our microcontroller AI series. In <a href="/tutorials/edge-ai-on-microcontrollers.html">part one</a> we argued the honest version of "AI on a microcontroller": a real sensor node runs TinyML classifiers, not language models, and the closest anyone had come to an LLM on an ESP32 was a 260K-parameter toy that "generates story fragments" and little else. Well, someone just moved that line. The developer slvDev shipped <a href="https://github.com/slvDev/esp32-ai" target="_blank" rel="nofollow noopener noreferrer">esp32-ai</a>, a 28.9-million-parameter language model that runs on an $8 ESP32-S3 at about 9.5 tokens per second and writes coherent little stories. That is roughly 100 times bigger than the toy. Here is the trick that makes it fit, what the numbers actually say, and why it still does not overturn part one.</p>

<h2>What changed since part one</h2>

<p>Part one drew a hard line between two things people both call "edge." A microcontroller like the ESP32 has kilobytes to low megabytes of usable memory and runs TinyML: tiny quantized classifiers that spot a keyword, a sound, or an anomaly. A single-board computer like a Raspberry Pi has gigabytes and can run a small language model on its CPU. The gap between them is three orders of magnitude, and no amount of quantization closes it.</p>

<p>The esp32-ai project does not break that rule. It bends the memory question instead. The previous ESP32 language-model demo we cited held a 260K-parameter network. This one holds 28.9M parameters, coherent enough to finish a sentence and keep a short story on track, on the same class of $8 chip. The output is the same category as before, short synthetic stories, but the model behind it is two orders of magnitude larger. The interesting part is not the story. It is how 28.9M parameters fit somewhere that cannot hold them in RAM.</p>

<table class="styled-table">
<thead>
<tr><th>Spec</th><th>Value</th></tr>
</thead>
<tbody>
<tr><td>Total parameters</td><td>28.9M (25M live in flash)</td></tr>
<tr><td>Dense compute core</td><td>~559K params (273KB at 4-bit, fits SRAM)</td></tr>
<tr><td>Config</td><td>d_model 96, 6 layers, ple_dim 128, vocab 32,768</td></tr>
<tr><td>Model file</td><td>14.9MB (group-128 ragged-int4)</td></tr>
<tr><td>Board</td><td>ESP32-S3 N16R8 (16MB flash / 8MB PSRAM), ~$8</td></tr>
<tr><td>Speed</td><td>~9.5 tok/s end to end (author-reported)</td></tr>
<tr><td>Training data</td><td>TinyStories</td></tr>
</tbody>
</table>

<h2>The trick: Per-Layer Embeddings from flash</h2>

<p>Start with the constraint. Transformer inference wants its weights in fast memory, because it touches them on every token. The ESP32-S3 has 512KB of on-chip SRAM. A 28.9M-parameter model at 4-bit is roughly 14.5MB. It cannot live in RAM. Bolting on the 8MB of PSRAM does not fix it either, and PSRAM is slow anyway, which matters later.</p>

<p>The move is to notice that not every parameter is a compute parameter. Per-Layer Embeddings (PLE) is a design from Google's Gemma models. The idea: give each token, at each layer, its own learned embedding vector pulled from a big lookup table, instead of folding all that capacity into the dense weights the math runs over. The table is huge in parameter count but you only ever read the handful of rows a given token needs. It is a dictionary, not a computation.</p>

<p>That property is what makes it fit a microcontroller. The esp32-ai project splits the model across all three memory tiers by what each part actually needs:</p>

<table class="styled-table">
<thead>
<tr><th>Memory tier</th><th>Size</th><th>What lives there</th><th>Why</th></tr>
</thead>
<tbody>
<tr><td>SRAM</td><td>512KB</td><td>Dense compute core (~559K params, 273KB at 4-bit)</td><td>Touched every token, must be fast</td></tr>
<tr><td>PSRAM</td><td>8MB</td><td>Output head and working buffers</td><td>Big, scanned once per token</td></tr>
<tr><td>Flash</td><td>16MB</td><td>25M-param PLE lookup table (12MB), memory-mapped</td><td>Only a few rows read per token</td></tr>
</tbody>
</table>

<p>The dense math the chip runs on every token is tiny, about 559K parameters, and it fits in fast SRAM. The 25M parameters of extra capacity sit in flash as a memory-mapped table. Per token the model reads about 450 bytes from that table, six rows, in roughly 0.12 milliseconds. The author measures the table at about 0.7 percent of per-token memory time. You get the model quality of 28.9M parameters while paying, on the hot path, for about half a million.</p>

<p>This is the same family of idea as the memory-saving quantization tricks we covered in our <a href="/tools/google-turboquant.html">Google TurboQuant writeup</a>. The theme is consistent: on constrained hardware, the wall is memory, and the wins come from not holding things you do not need in the fast tier.</p>

<h2>Does the table actually help, or is it plumbing?</h2>

<p>A fair objection: maybe the gain comes from the extra wiring, not from the 25M-parameter table itself. The author ran the ablation to check, measuring perplexity (lower is better, it is how well the model predicts held-out text) across four configurations.</p>

<table class="styled-table">
<thead>
<tr><th>Configuration</th><th>Compute core</th><th>Total params</th><th>Perplexity</th></tr>
</thead>
<tbody>
<tr><td>Baseline</td><td>559K</td><td>3.7M</td><td>12.58</td></tr>
<tr><td><strong>PLE</strong></td><td>558K</td><td><strong>28.9M</strong></td><td><strong>11.41</strong></td></tr>
<tr><td>FatEmbed</td><td>559K</td><td>28.9M</td><td>11.94</td></tr>
<tr><td>ple_notable (control)</td><td>558K</td><td>3.7M</td><td>worse than baseline</td></tr>
</tbody>
</table>

<p>PLE cuts perplexity from 12.58 to 11.41, about 9.3 percent, while keeping the compute core the same size. FatEmbed, a simpler way to spend the same parameter budget, does worse. The control run, ple_notable, wires up the same plumbing but without a real lookup table, and it lands worse than baseline. The author's summary is the right one: "the table does the work, not the plumbing." And the gain survives quantization. The PLE advantage measured in full precision actually holds or grows after 4-bit post-training quantization, at 124 to 126 percent retention, so the technique is not a floating-point artifact that evaporates on the shipping format.</p>

<h2>Where the time goes: the bottleneck moved, it did not vanish</h2>

<p>Fitting the model is one problem. Running it fast enough to be bearable is another, and this is where the honest engineering shows. At ~9.5 tok/s a token takes about 105 milliseconds. Here is where that time goes, per the author's profiling on the dual-core chip.</p>

<table class="styled-table">
<thead>
<tr><th>Stage</th><th>Time per token</th><th>Bound by</th></tr>
</thead>
<tbody>
<tr><td>Output head</td><td>57.6 ms</td><td>PSRAM bandwidth</td></tr>
<tr><td>Attention</td><td>25.6 ms</td><td>Compute</td></tr>
<tr><td>PLE lookup</td><td>8.5 ms</td><td>Flash reads</td></tr>
<tr><td>Feed-forward</td><td>6.9 ms</td><td>Compute</td></tr>
<tr><td>Input processing</td><td>4.4 ms</td><td>Compute</td></tr>
</tbody>
</table>

<p>Read that top row twice. The output head, the layer that turns the model's internal state into a probability over all 32,768 vocabulary tokens, eats 57.6 ms, more than half the budget. It lives in PSRAM, and PSRAM reads at about 60.7 MB/s. Scanning the 2.43MB of head weights once takes roughly 40 ms just to move the bytes, before any math. Compute gets the leftover ~17 ms. The flash lookup table everyone worries about? 8.5 ms, and most of that is not the table reads themselves.</p>

<p>So the PLE trick did not make the model free. It moved the bottleneck. The dense core no longer bounds you; PSRAM bandwidth does. The author's own math puts the theoretical ceiling around 58 tok/s if you were perfectly bandwidth-bound, and the current runtime sits well under that because the compute stages have not all been overlapped with the reads yet. This is the useful lesson for anyone building on constrained hardware: solve the memory-capacity wall and you often just meet the memory-bandwidth wall behind it.</p>

<h2>Running it yourself</h2>

<p>The project ships everything: the training and quantization code in Python, the ESP32 firmware, and the exported model. You do not need a training run to try it, the repo includes a pre-exported model you can flash. The firmware builds with the Arduino ESP32 core (3.3.10) driven by arduino-cli, not ESP-IDF or PlatformIO. The one wrinkle worth knowing is that the model binary is flashed to its own partition, separate from the firmware, so firmware-only changes do not force you to rewrite the 15MB model.</p>

<pre class="brush: bash"># 1. Export and verify the model against a golden reference on your host
cd src && uv run python export.py && cd ..
cc -O3 -o /tmp/esp32-llm-verify firmware/host_verify/verify.c -lm
/tmp/esp32-llm-verify firmware/model/model.bin firmware/model/golden.txt

# 2. Compile and upload the firmware to an ESP32-S3
arduino-cli compile --fqbn esp32:esp32:esp32s3 firmware/esp32_llm
arduino-cli upload   --fqbn esp32:esp32:esp32s3 -p /dev/ttyUSB0 firmware/esp32_llm

# 3. Write the model binary to its own flash partition (only needed after export)
esptool.py --chip esp32s3 write_flash 0x110000 firmware/model/model.bin

# 4. Watch it generate
arduino-cli monitor -p /dev/ttyUSB0 -c baudrate=115200</pre>

<p>What comes out is a stream of short TinyStories-style prose at about 9.5 tokens per second, rendered on a small attached display. The repo has a demo GIF if you want to see it move before you buy a board. Treat the code and weights as an experiment: this is a research demo of a storage technique, not a maintained product, so pin your toolchain versions and expect to read the source.</p>

<h2>What it proves, and what it does not</h2>

<p>Here is the honest verdict, and it is two-sided on purpose.</p>

<p>What it proves: you can hold a 28.9M-parameter model on a $8 microcontroller and run it, if you are willing to store most of it as a memory-mapped flash table and read only the rows each token needs. Per-Layer Embeddings, pulled from a research idea into a working ESP32 firmware, is a real and reusable technique. If your problem is "this model is a bit too big for the fast memory I have," moving the embedding capacity to a slower tier you read sparsely is a lever worth knowing. The ablation shows the capacity is doing real work, and it survives 4-bit quantization.</p>

<p>What it does not prove: that a microcontroller can run a useful language model. This model writes toy stories. It will not answer a question, follow an instruction, call a tool, or know a single fact, because TinyStories does not teach any of that, and 28.9M parameters could not hold much of it anyway. The output category is exactly what part one described, just bigger and more coherent. And the moment you chase real capability you need a real vocabulary, a real instruction-tuned model, and a KV cache for context, and every one of those pushes you straight back off the microcontroller and onto a Raspberry Pi or a phone. Part one's cheat sheet still stands: put the reflex on the sensor, keep the brain where the memory is.</p>

<h2>Who should care, and what to watch</h2>

<p>If you build products on constrained hardware, this is not a component you ship. It is a technique you file away. The people who should actually clone the repo are hobbyists who want to see an LLM breathe on an $8 chip, and researchers hunting for ways to fit more capacity into fixed memory budgets. The one thing worth watching: whether anyone applies the same flash-resident PLE trick to a small instruction-tuned model rather than a story generator. That is the experiment that would test whether this is a curiosity or a path. Until then, it is a very good curiosity, and a clean demonstration that on tiny hardware the binding constraint is always memory.</p>

<h2>A community fork put it on an 8MB board</h2>

<p>Since this series is about what actually runs, here is a data point from the wild. A developer forked the project to get it onto a Seeed XIAO ESP32-S3, a board with only 8MB of flash instead of the 16MB the stock 14.9MB model needs. The full model does not fit, so the fork retrains a smaller variant with an 8,192-token vocabulary instead of 32,768. That drops the model to about 8 million parameters and a 4.12MB file, which fits an 8MB board with room to spare. Same Per-Layer Embeddings architecture, same TinyStories training, just a smaller tokenizer.</p>

<p>It works, and here is the twist: on the XIAO ESP32-S3 the fork reports about 11.97 tokens per second (82.9 ms per token), faster than the original's 9.5 tok/s. The reason is exactly the bottleneck described above. The output head is PSRAM-bandwidth-bound, and a smaller vocabulary means a smaller head: 0.82MB staged versus 2.43MB in the original. Shrink the thing that dominates the per-token memory scan and the whole model speeds up. It is this article's thesis confirmed on real silicon: on this hardware the binding constraint is memory bandwidth, so the size of the vocabulary head moves the number more than anything else.</p>

<p>A sample of what the 8MB build wrote, unedited:</p>

<blockquote><p>Once upon a time, there was a little girl named Lily. She loved to play with her toys and run around in the park. One day, she found a big, red ball in the park. She wanted to play with it, but her mom said no.</p></blockquote>

<p>The fork, with an 8MB partition table, a PlatformIO build, and the smaller re-export, is on GitHub: <a href="https://github.com/karamble/esp32-ai/tree/xiao-esp32s3-8mb-variant" target="_blank" rel="nofollow noopener noreferrer">karamble/esp32-ai</a>.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="https://github.com/slvDev/esp32-ai" target="_blank" rel="nofollow noopener noreferrer">esp32-ai repository (slvDev)</a></li>
<li><a href="https://github.com/slvDev/esp32-ai/blob/main/RESULTS.md" target="_blank" rel="nofollow noopener noreferrer">RESULTS.md: methodology, ablations, and measurements</a></li>
<li><a href="https://huggingface.co/datasets/roneneldan/TinyStories" target="_blank" rel="nofollow noopener noreferrer">TinyStories dataset (Hugging Face)</a></li>
<li><a href="https://ai.google.dev/gemma/docs/core/model_card_3" target="_blank" rel="nofollow noopener noreferrer">Gemma 3 model card (Per-Layer Embeddings)</a></li>
<li><a href="https://documentation.espressif.com/esp32-s3_datasheet_en.html" target="_blank" rel="nofollow noopener noreferrer">ESP32-S3 datasheet (Espressif)</a></li>
<li><a href="/tutorials/edge-ai-on-microcontrollers.html">Part one: edge AI on microcontrollers, what actually fits</a></li>
</ul>

<p><em>The original 28.9M model's figures are author-reported from the repository's RESULTS.md (2026-07-21). The 8MB-board figures (Seeed XIAO ESP32-S3, vocab-8192 re-export, about 11.97 tok/s) are reported by the community fork linked above.</em><br>
<em>Date checked: 2026-07-24</em></p>]]></description>
    <pubDate>Fri, 24 Jul 2026 08:45:41 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/run-28m-llm-on-esp32-s3-microcontroller-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/run-28m-llm-on-esp32-s3-microcontroller-2026-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/run-28m-llm-on-esp32-s3-microcontroller-2026-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Scale Your n8n Chatbot With a Supabase Vector Database (RAG)]]></title>
    <link>https://singularitybyte.com/tutorials/scale-n8n-chatbot-supabase-vector-database-rag-2026.html</link>
    <description><![CDATA[<p>A folder of markdown files makes a fine chatbot right up until it does not. Add enough documents and the agent can no longer keep every file name in its head, and it starts answering from the wrong one. The fix is not a bigger prompt. It is retrieval by meaning: embed your documents into vectors, store them in a database, and let the agent search for the most relevant chunks instead of guessing a file name. This is retrieval-augmented generation, and Supabase gives you the vector database for it without leaving the stack you already run.</p>
<p>This is part two of a two part thread. Part one built <a href="tutorials/build-website-knowledge-chatbot-n8n-markdown-2026.html">a website chatbot backed by markdown files</a>. Everything there still stands: the same AI Agent, the same Chat Trigger, the same website widget. We change exactly one thing, the tool the agent uses to find information, and in return the chatbot scales from a dozen documents to thousands.</p>
<h2>What Actually Changes</h2>
<table class="styled-table">
<thead>
<tr>
<th>Part</th>
<th>Markdown chatbot</th>
<th>Vector RAG chatbot</th>
</tr>
</thead>
<tbody>
<tr>
<td>Knowledge store</td>
<td>Files on disk</td>
<td>Supabase table of embedded chunks</td>
</tr>
<tr>
<td>Ingestion</td>
<td>None, just edit files</td>
<td>A workflow that embeds and upserts</td>
</tr>
<tr>
<td>Retrieval</td>
<td>Read a whole named file</td>
<td>Semantic search for top matching chunks</td>
</tr>
<tr>
<td>Agent, memory, Chat Trigger, website embed</td>
<td colspan="2">Identical. Only the retrieval tool is swapped.</td>
</tr>
</tbody>
</table>
<p>Because only the tool changes, you can run both side by side and migrate when you are ready. The website embed from part one does not change at all.</p>
<h2>Prerequisites</h2>
<p>You need n8n, Ollama, and Supabase. The <a href="tutorials/run-full-local-ai-stack-with-local-ai-packaged.html">local-ai-packaged stack</a> ships all three together, which is why we recommend it for this series. Pull an embedding model alongside your chat model:</p>
<pre class="brush: bash">ollama pull nomic-embed-text
ollama pull qwen2.5:7b-instruct-q4_K_M</pre>
<p><code>nomic-embed-text</code> turns text into 768 dimensional vectors and runs comfortably on a CPU. It is the embedding model the reference workflows use, and the vector width matters in the next step.</p>
<h2>Step 1: Turn Supabase Into a Vector Store</h2>
<p>Supabase is Postgres, and Postgres becomes a vector database with the <code>pgvector</code> extension. In the Supabase SQL editor, enable the extension, create a table for embedded chunks, and add the search function n8n calls. Run this once:</p>
<pre class="brush: sql">create extension if not exists vector;

create table documents (
  id bigserial primary key,
  content text,
  metadata jsonb,
  embedding vector(768)
);

create function match_documents (
  query_embedding vector(768),
  match_count int default null,
  filter jsonb default '{}'
) returns table (
  id bigint,
  content text,
  metadata jsonb,
  similarity float
) language plpgsql as $$
begin
  return query
  select id, content, metadata,
    1 - (documents.embedding &lt;=&gt; query_embedding) as similarity
  from documents
  where metadata @&gt; filter
  order by documents.embedding &lt;=&gt; query_embedding
  limit match_count;
end;
$$;</pre>
<p>Two details decide whether this works. The vector width, <code>768</code>, must match your embedding model exactly, or inserts fail. And <code>match_documents</code> is the function n8n's Supabase Vector Store node calls by name, so do not rename it without updating the node.</p>
<h2>Step 2: The Ingestion Loop</h2>
<p>Now build a second workflow whose only job is to get documents into that table. This is the part markdown lookup did not have. A production version, like the one behind the Decred knowledge assistant, walks a folder, skips anything it has already embedded, and re-embeds only what changed. The node chain looks like this:</p>
<pre class="brush: json">[
  "Manual or Schedule Trigger",
  "Read Files from Disk (glob /data/shared/**/*.md)",
  "Loop Over Items (Split in Batches)",
  "Hash File (crypto, SHA-256)",
  "Check hash against document_metadata (Supabase)",
  "Switch: new file / unchanged / changed",
  "Extract Document Text",
  "Supabase Vector Store (insert)"
]</pre>
<p>The Supabase Vector Store node in insert mode does the heavy lifting. Attach three sub-nodes to it:</p>
<ul>
<li><strong>Embeddings Ollama</strong> pointed at <code>nomic-embed-text</code>. This turns each chunk into the 768 dimensional vector the table expects.</li>
<li><strong>Default Data Loader</strong> to carry document metadata (file name, source URL, hash) alongside the text.</li>
<li><strong>Recursive Character Text Splitter</strong> with a chunk size around <code>400</code> and a small overlap. Chunking is what makes semantic search precise: the agent retrieves a paragraph, not a whole file.</li>
</ul>
<p>The dedup step is what keeps a growing knowledge base cheap. Hash each file, store the hash in a <code>document_metadata</code> table, and on the next run compare. Unchanged files are skipped, changed files get their old vectors deleted and re-inserted. Without this, every run re-embeds everything.</p>
<h2>Step 3: Swap the Retrieval Tool</h2>
<p>Back in the chatbot workflow from part one, delete the <code>lookup_document</code> tool and add a <strong>Supabase Vector Store</strong> node in <code>retrieve-as-tool</code> mode. Give it the same <code>documents</code> table, the <code>match_documents</code> query name, and its own Embeddings Ollama sub-node, again <code>nomic-embed-text</code>, so the query is embedded the same way the documents were.</p>
<p>Name the tool something the agent will understand, like <code>search_knowledge</code>, and set a <code>topK</code> of 4 or 5 to start. That is the number of chunks the search returns per question. The system prompt gets simpler than the markdown version, because the agent no longer needs a list of file names:</p>
<pre class="brush: plain">You answer questions about MySite from a knowledge base.
Use search_knowledge to find relevant information before answering.
Answer only from what the search returns. If it returns nothing useful,
say you do not have that information. Never invent product details.</pre>
<p>The chat model, the memory with <code>Session ID</code> set to <code>From input</code>, and the Chat Trigger are untouched. Reactivate the workflow. The website widget from part one keeps talking to the same chat URL, and now every answer is backed by semantic search.</p>
<h2>Why the Numbers Matter</h2>
<p>Three settings shape answer quality, and all three are worth a moment.</p>
<table class="styled-table">
<thead>
<tr>
<th>Setting</th>
<th>Start with</th>
<th>What it trades</th>
</tr>
</thead>
<tbody>
<tr>
<td>Chunk size</td>
<td>400 characters</td>
<td>Smaller is more precise but loses context; larger keeps context but blurs the match</td>
</tr>
<tr>
<td>Chunk overlap</td>
<td>40 to 80 characters</td>
<td>Overlap stops ideas from being cut in half at a boundary</td>
</tr>
<tr>
<td>topK</td>
<td>4 to 5</td>
<td>More chunks give the model more to work with, but add noise and tokens</td>
</tr>
</tbody>
</table>
<p>If answers feel thin, raise topK before you touch chunk size. If answers wander, lower it. Retrieval tuning is empirical, so change one number at a time and re-test the same handful of questions.</p>
<h2>Local or Cloud</h2>
<p>Everything above runs locally on Ollama, which keeps your documents and your queries on your own hardware and costs nothing per call. If you would rather trade privacy for a bit more accuracy, swap the two Ollama sub-nodes for OpenAI equivalents: an OpenAI Embeddings node (remember to change the table to <code>vector(1536)</code> to match) and an OpenAI Chat Model. The rest of the workflow, and the entire website embed, stay exactly the same. That is the point of building it this way: the pieces are independent, so you can upgrade one without rebuilding the others.</p>
<h2>Where You Land</h2>
<p>You now have a chatbot on your website that searches a real vector database by meaning, dedupes its own ingestion, and runs on hardware you control. It scales to thousands of documents, answers from specific paragraphs rather than whole files, and shares its plumbing with anything else in your n8n instance that reads the same <code>documents</code> table.</p>
<p>The natural next step is to let other systems reach this knowledge base, not just the website widget. That is exactly what <a href="tutorials/n8n-mcp-server-expose-workflow-as-ai-tool-2026.html">turning the workflow into an MCP tool</a> does, so an AI agent elsewhere can query your knowledge base directly.</p>
<h2>Sources and Further Reading</h2>
<ul>
<li><a href="https://supabase.com/docs/guides/ai/vector-columns" target="_blank" rel="nofollow noopener noreferrer">Supabase vector columns and pgvector</a></li>
<li><a href="https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.vectorstoresupabase/" target="_blank" rel="nofollow noopener noreferrer">n8n Supabase Vector Store node</a></li>
<li><a href="https://ollama.com/library/nomic-embed-text" target="_blank" rel="nofollow noopener noreferrer">nomic-embed-text on Ollama</a></li>
<li><a href="https://github.com/coleam00/local-ai-packaged" target="_blank" rel="nofollow noopener noreferrer">local-ai-packaged on GitHub</a></li>
</ul>
<p>Back to the start of the thread: <a href="tutorials/build-website-knowledge-chatbot-n8n-markdown-2026.html">the simple markdown chatbot</a>, if you skipped straight here. Build that first, then come back and swap in the vector tool. It is a fifteen minute change once the ingestion loop is running.</p>
<p></p>]]></description>
    <pubDate>Thu, 23 Jul 2026 22:21:00 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/scale-n8n-chatbot-supabase-vector-database-rag-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/models/scale-n8n-chatbot-supabase-vector-database-rag-2026-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/models/scale-n8n-chatbot-supabase-vector-database-rag-2026-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Build a Website Knowledge Chatbot With n8n (No Vector Database Needed)]]></title>
    <link>https://singularitybyte.com/tutorials/build-website-knowledge-chatbot-n8n-markdown-2026.html</link>
    <description><![CDATA[<p>You do not need a vector database to put a useful AI chatbot on your website. If your knowledge fits in a folder of markdown files, an n8n agent can read the right file on demand and answer from it, and a small JavaScript snippet drops the chat window onto any page. This is the fastest path from "I have some docs" to "there is a chatbot on my site that knows them," and it runs entirely on your own machine.</p>
<p>This is the first of a two part thread in the n8n Automation Stack series. Here we build the simple version: markdown files as the knowledge base, a chat widget on your site. The <a href="tutorials/scale-n8n-chatbot-supabase-vector-database-rag-2026.html">follow up swaps the markdown lookup for a Supabase vector database</a> when your knowledge outgrows a handful of files. If you are new to n8n, start with <a href="tutorials/what-is-n8n-developer-introduction-2026.html">what n8n is</a> and <a href="tutorials/how-to-install-n8n-docker-npm-bundled-stacks-2026.html">how to install it</a>.</p>
<h2>What You Are Building</h2>
<p>Three pieces, wired together in one n8n workflow:</p>
<table class="styled-table">
<thead>
<tr>
<th>Piece</th>
<th>n8n node</th>
<th>Job</th>
</tr>
</thead>
<tbody>
<tr>
<td>Knowledge base</td>
<td>Files on disk</td>
<td>One markdown file per topic in a shared folder</td>
</tr>
<tr>
<td>Lookup tool</td>
<td>Sub-workflow + Tool node</td>
<td>Reads the file the agent asks for and returns its text</td>
</tr>
<tr>
<td>Brain</td>
<td>AI Agent + Chat model</td>
<td>Picks a document, reads it, answers the question</td>
</tr>
<tr>
<td>Front door</td>
<td>Chat Trigger</td>
<td>A public webhook the website chat widget talks to</td>
</tr>
</tbody>
</table>
<p>No embeddings, no database migrations. The agent does keyword-level reasoning over whole documents, which is plenty when you have a dozen or two well-named files.</p>
<h2>Prerequisites</h2>
<p>You need a running n8n with a local model runtime. The easiest way to get both, plus everything the follow up article needs, is the bundled stack we covered in <a href="tutorials/run-full-local-ai-stack-with-local-ai-packaged.html">our local-ai-packaged guide</a>. It brings up n8n, Ollama, and Postgres together in one command. Pull a small instruct model once it is running:</p>
<pre class="brush: bash">ollama pull qwen2.5:7b-instruct-q4_K_M</pre>
<p>That is the model doing the talking in this build. Anything in the 7B to 14B instruct range works; smaller is faster, larger follows instructions more reliably.</p>
<h2>Step 1: The Knowledge Base Is Just Files</h2>
<p>Create a folder that n8n can read and drop one markdown file per topic into it. n8n containers usually mount a shared directory at <code>/data/shared</code>, so a clean layout looks like this:</p>
<pre class="brush: bash">/data/shared/mysite/docs/
  getting-started.md
  pricing.md
  returns-policy.md
  api-authentication.md</pre>
<p>The file name is the lookup key, so name files after the questions people ask. There is no ingestion step and nothing to rebuild. Edit a file, save it, and the next answer uses the new text. That immediacy is the whole appeal of this approach.</p>
<h2>Step 2: A Sub-Workflow That Reads One Document</h2>
<p>The agent should not touch the filesystem directly. Instead, build a small second workflow that takes a document name and returns its text, then hand that workflow to the agent as a tool. Keeping it separate means the agent can only read files through this one narrow door, and you can test the door on its own.</p>
<p>The sub-workflow is three nodes behind an Execute Workflow Trigger whose input is a single field, <code>document</code>:</p>
<pre class="brush: json">{
  "nodes": [
    { "name": "When Called", "type": "n8n-nodes-base.executeWorkflowTrigger" },
    { "name": "Build File Path", "type": "n8n-nodes-base.set" },
    { "name": "Read Document", "type": "n8n-nodes-base.readWriteFile" },
    { "name": "Extract Text", "type": "n8n-nodes-base.extractFromFile" }
  ]
}</pre>
<p>The Set node turns the document name into a safe path. Sanitising the name matters: it stops the agent from walking out of your docs folder with a crafted value. Use an expression on a single string field named <code>filePath</code>:</p>
<pre class="brush: js">=/data/shared/mysite/docs/{{ $json.document.toLowerCase().replace(/[^a-z0-9_-]/g, '-') }}.md</pre>
<p>Read Document points at <code>{{ $json.filePath }}</code>, and Extract Text runs in <code>text</code> mode so the output is plain markdown the model can read. That is the entire tool.</p>
<h2>Step 3: The Agent</h2>
<p>Now the main workflow. Drop in an <strong>AI Agent</strong> node and give it three attachments: a chat model, a memory, and the tool you just built.</p>
<ul>
<li><strong>Chat model:</strong> an Ollama Chat Model node pointed at <code>qwen2.5:7b-instruct-q4_K_M</code>.</li>
<li><strong>Memory:</strong> a Simple Memory (or Postgres Chat Memory) node with <code>Session ID</code> set to <code>From input</code>, so each website visitor keeps their own conversation.</li>
<li><strong>Tool:</strong> a Call n8n Workflow Tool node pointing at the sub-workflow from step 2. Name it <code>lookup_document</code> and describe it clearly.</li>
</ul>
<p>The description is what the agent reads to decide when to call the tool, so it earns its keep. A system prompt on the agent ties it together:</p>
<pre class="brush: plain">You answer questions about MySite using a document library.
Available documents: getting-started, pricing, returns-policy, api-authentication.
To answer, call lookup_document with the single most relevant document name,
then answer only from what it returns. If no document fits, say so plainly.
Never invent product details.</pre>
<p>Listing the available document names in the prompt is the trick that makes file-based lookup work. The model maps the question to a file, calls the tool, and answers from the returned text.</p>
<h2>Step 4: The Front Door</h2>
<p>Replace any manual trigger with a <strong>Chat Trigger</strong> node (<code>When chat message received</code>). This node is what the website widget talks to. Two settings matter:</p>
<table class="styled-table">
<thead>
<tr>
<th>Setting</th>
<th>Value</th>
<th>Why</th>
</tr>
</thead>
<tbody>
<tr>
<td>Make Chat Publicly Available</td>
<td>On</td>
<td>The widget calls it from a browser with no n8n login</td>
</tr>
<tr>
<td>Allowed Origins (CORS)</td>
<td>https://yoursite.com</td>
<td>Only your site may open the chat; blocks everyone else</td>
</tr>
</tbody>
</table>
<p>Leave the response mode at the default so the Chat Trigger streams the agent's answer straight back to the widget. Turn off <strong>Append n8n Attribution</strong> in the node options for a clean embed. Activate the workflow, then open the node and copy its chat URL. It has this shape:</p>
<pre class="brush: bash">https://your-n8n-host/webhook/&lt;chat-webhook-id&gt;/chat</pre>
<p>Test it from n8n's built-in chat panel before touching your website. Ask something that should hit a document and confirm the agent calls <code>lookup_document</code> and answers from the file.</p>
<h2>Step 5: Put the Chat on Your Website</h2>
<p>n8n publishes an official chat widget, <code>@n8n/chat</code>, under an MIT license. You load it from a CDN and initialise it with one function call. Add this to any page:</p>
<pre class="brush: html">&lt;link href="https://cdn.jsdelivr.net/npm/@n8n/chat/dist/style.css" rel="stylesheet"&gt;
&lt;script type="module"&gt;
  import { createChat } from 'https://cdn.jsdelivr.net/npm/@n8n/chat/dist/chat.bundle.es.js';

  createChat({
    webhookUrl: 'https://your-n8n-host/webhook/&lt;chat-webhook-id&gt;/chat',
    mode: 'window',
    chatInputKey: 'chatInput',
    chatSessionKey: 'sessionId',
    showWelcomeScreen: false,
    initialMessages: ['Hi! Ask me anything about MySite.'],
    i18n: {
      en: {
        title: 'Ask us',
        subtitle: '',
        inputPlaceholder: 'Type your question...',
        getStarted: 'New conversation'
      }
    }
  });
&lt;/script&gt;</pre>
<p>That is the exact shape a real deployment uses. A few options are worth understanding:</p>
<table class="styled-table">
<thead>
<tr>
<th>Option</th>
<th>Effect</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>webhookUrl</code></td>
<td>The Chat Trigger URL from step 4. This is the only required option.</td>
</tr>
<tr>
<td><code>mode</code></td>
<td><code>window</code> gives a floating bubble in the corner; <code>fullscreen</code> mounts the chat into a target element.</td>
</tr>
<tr>
<td><code>chatSessionKey</code></td>
<td>Must match the Chat Trigger. The widget generates a session id so returning visitors keep context, which is why the agent memory used <code>From input</code>.</td>
</tr>
<tr>
<td><code>initialMessages</code> / <code>i18n</code></td>
<td>The greeting bubble and the widget labels. Set them to your brand voice.</td>
</tr>
</tbody>
</table>
<p>If the widget loads but every message fails, the cause is almost always CORS. The origin you are embedding on must be listed in the Chat Trigger's <strong>Allowed Origins</strong>. That single field is the most common reason a working chat looks broken on the live site.</p>
<h2>Where This Runs Out of Road</h2>
<p>File-based lookup is honest about what it is. The agent matches the question to a file name and reads the whole file, so it works best when documents are short, topics are cleanly separated, and there are not too many of them. Past roughly a few dozen files, listing every name in the system prompt stops being practical and the model starts guessing the wrong file.</p>
<p>It also cannot answer across documents or find a paragraph buried in a long one. There is no semantic search, only whole-file retrieval. When you hit that wall, you do not throw this away: you keep the same agent, the same Chat Trigger, and the same website embed, and you swap the file-reading tool for a vector search tool. That is exactly what <a href="tutorials/scale-n8n-chatbot-supabase-vector-database-rag-2026.html">part two</a> does with Supabase and embeddings.</p>
<h2>Sources and Further Reading</h2>
<ul>
<li><a href="https:&#x2f;&#47;&#x77;&#119;w&#46;&#110;&#x70;m&#x6a;&#x73;&#46;&#99;o&#109;&#x2f;&#x70;&#97;&#x63;&#107;&#x61;&#x67;&#x65;&#x2f;&#x40;&#110;&#x38;n/&#99;&#x68;&#97;t" target="_blank" rel="nofollow noopener noreferrer">@n8n/chat widget on npm</a></li>
<li><a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.chattrigger/" target="_blank" rel="nofollow noopener noreferrer">n8n Chat Trigger node documentation</a></li>
<li><a href="https://docs.n8n.io/advanced-ai/intro-tutorial/" target="_blank" rel="nofollow noopener noreferrer">n8n AI Agent and tools tutorial</a></li>
<li><a href="https://github.com/coleam00/local-ai-packaged" target="_blank" rel="nofollow noopener noreferrer">local-ai-packaged on GitHub</a></li>
</ul>
<p>Next in the series: <a href="tutorials/scale-n8n-chatbot-supabase-vector-database-rag-2026.html">scaling this chatbot with a Supabase vector database</a>, so it can search thousands of documents by meaning instead of matching file names. The website widget does not change. Only the tool behind it does.</p>
<p></p>]]></description>
    <pubDate>Thu, 23 Jul 2026 22:20:00 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/build-website-knowledge-chatbot-n8n-markdown-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/models/build-website-knowledge-chatbot-n8n-markdown-2026-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/models/build-website-knowledge-chatbot-n8n-markdown-2026-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[How to Install n8n: Docker, npm, and Two Bundled AI Stacks]]></title>
    <link>https://singularitybyte.com/tutorials/how-to-install-n8n-docker-npm-bundled-stacks-2026.html</link>
    <description><![CDATA[<p>There are five realistic ways to get n8n running, and the one you pick determines how much pain you feel later. A throwaway Docker container takes 30 seconds and loses everything on restart. A Compose file with Postgres takes ten minutes and survives reboots, upgrades, and backups. Two bundled stacks install n8n alongside a local model runtime in one command, at the cost of pulling in a lot of software you may not want.</p>

<p>This is part two of the n8n Automation Stack series. Part one covered <a href="/tutorials/what-is-n8n-developer-introduction-2026.html">what n8n is and the four concepts behind it</a>. Here we get it installed properly, including the environment variables that decide whether your webhooks work behind a reverse proxy. Part three depends on getting that last part right.</p>

<h2>The Five Paths Compared</h2>

<table class="styled-table">
<thead>
<tr><th>Path</th><th>Setup time</th><th>Database</th><th>Best for</th></tr>
</thead>
<tbody>
<tr><td>Docker, throwaway</td><td>30 seconds</td><td>SQLite, discarded</td><td>Clicking around for the first time</td></tr>
<tr><td>Docker with a volume</td><td>2 minutes</td><td>SQLite, persisted</td><td>Personal use, homelab, single user</td></tr>
<tr><td>Compose with Postgres</td><td>10 minutes</td><td>PostgreSQL</td><td>Anything you would be annoyed to lose</td></tr>
<tr><td>npm</td><td>5 minutes</td><td>SQLite</td><td>Node developers, custom node work</td></tr>
<tr><td>Bundled AI stack</td><td>One command</td><td>PostgreSQL</td><td>You want a local model runtime too</td></tr>
</tbody>
</table>

<h2>Path 1: Docker With a Volume</h2>

<p>This is the right default for a single user. The only change from the throwaway command in part one is a named volume and dropping <code>--rm</code>:</p>

<pre class="brush: bash">docker volume create n8n_data

docker run -d --name n8n \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n</pre>

<p>Everything lives in that volume: the SQLite database, your credentials, and the encryption key. Back up the volume and you have backed up the instance.</p>

<h2>Path 2: Docker Compose With Postgres</h2>

<p>n8n defaults to SQLite. It supports PostgreSQL as the alternative, and MySQL and MariaDB were deprecated back in v1.0, so Postgres is the only real choice once you outgrow a single file.</p>

<p>Move to Postgres when you want concurrent writes, a backup story that is not a file copy, or queue mode later.</p>

<pre class="brush: yaml">services:
  postgres:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_DB: n8n
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: change_me
    volumes:
      - pg_data:/var/lib/postgresql/data

  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: change_me
      N8N_ENCRYPTION_KEY: put_a_long_random_string_here
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      - postgres

volumes:
  pg_data:
  n8n_data:</pre>

<p>Bring it up with <code>docker compose up -d</code>. One refinement worth knowing: n8n supports a <code>_FILE</code> suffix on individual variables, so <code>DB_POSTGRESDB_PASSWORD_FILE</code> can point at a file instead of putting the password in the Compose file.</p>

<h2>Path 3: npm</h2>

<p>Useful if you are writing custom nodes and want the code on your host rather than inside a container:</p>

<pre class="brush: bash">npm install n8n -g
n8n start</pre>

<p>Data goes to <code>~/.n8n</code> by default. You can move it with <code>N8N_USER_FOLDER</code>. You are responsible for the service manager, the Node version, and the upgrade path, which is why most people end up on Docker anyway.</p>

<h2>Back Up the Encryption Key Before You Do Anything Else</h2>

<p>This is the single highest-consequence detail on this page.</p>

<p>n8n encrypts stored credentials with a key. If you do not set <code>N8N_ENCRYPTION_KEY</code>, n8n generates a random one on first launch and writes it into the user folder. Restore your database onto a fresh instance without that key and every stored credential is unreadable. The workflows come back, the connections do not.</p>

<p>Set it explicitly from the start and store it wherever you keep secrets. Note also that key rotation exists but is gated behind <code>N8N_ENV_FEAT_ENCRYPTION_KEY_ROTATION</code>, and the docs describe it as a one-way change that wants a full database backup first. Getting it right on day one is much cheaper.</p>

<h2>The Variables That Decide Whether Webhooks Work</h2>

<p>Run n8n on localhost and everything works. Put it behind nginx, Caddy, or Apache with TLS, and webhooks start handing out URLs nobody can reach. The cause is always the same: n8n does not know its own public address.</p>

<table class="styled-table">
<thead>
<tr><th>Variable</th><th>Default</th><th>What it does</th></tr>
</thead>
<tbody>
<tr><td><code>N8N_HOST</code></td><td><code>localhost</code></td><td>Host name n8n believes it is served from</td></tr>
<tr><td><code>N8N_PORT</code></td><td><code>5678</code></td><td>Port it binds</td></tr>
<tr><td><code>N8N_PROTOCOL</code></td><td><code>http</code></td><td>Protocol it advertises</td></tr>
<tr><td><code>WEBHOOK_URL</code></td><td>none</td><td>Public webhook base URL when behind a proxy</td></tr>
<tr><td><code>N8N_EDITOR_BASE_URL</code></td><td>none</td><td>Public URL of the editor front end</td></tr>
</tbody>
</table>

<p>For an instance served at <code>https://automation.example.com</code>, the working set looks like this:</p>

<pre class="brush: bash">N8N_HOST=automation.example.com
N8N_PROTOCOL=https
N8N_PORT=5678
WEBHOOK_URL=https://automation.example.com/
N8N_EDITOR_BASE_URL=https://automation.example.com/</pre>

<p>TLS terminates at the proxy. n8n keeps speaking plain HTTP on 5678 behind it, and <code>N8N_PROTOCOL=https</code> only tells n8n what to advertise in the URLs it generates.</p>

<p>One more proxy setting matters, and it is the one that breaks part three of this series: <strong>response buffering must be off</strong>. n8n's MCP server transport uses Server-Sent Events, and a buffering proxy will hold the stream until it times out. In nginx that is <code>proxy_buffering off;</code> on the relevant location block.</p>

<h2>Path 4: local-ai-packaged</h2>

<p>If you want n8n and a local model runtime together, local-ai-packaged bundles n8n, Ollama, Postgres, Qdrant, and a few other services behind a single command. You get a working local RAG setup without wiring five containers yourself.</p>

<p>The trade-off is that you inherit the whole stack, including parts you may not use, and its upgrade cadence rather than n8n's. We walked through the full install, the hardware acceleration profiles, and a first local RAG agent in <a href="/tutorials/run-full-local-ai-stack-with-local-ai-packaged.html">our local-ai-packaged guide</a>.</p>

<h2>Path 5: ODS</h2>

<p>ODS takes the same idea further and installs a private AI server in one command, with hardware auto-detection choosing a model tier for you. n8n is one of the services it brings up, alongside llama-server, Open WebUI, Whisper, Qdrant, and SearXNG.</p>

<p>Pick this when the goal is a private AI server that happens to include automation, rather than an automation server that happens to include AI. Details, including what the installer actually does, are in <a href="/tutorials/ods-private-ai-server-one-command.html">our ODS write-up</a>.</p>

<h2>Lock It Down Before You Expose It</h2>

<p>An n8n instance holds credentials for every service it touches. Treat it as one of the more sensitive boxes you run.</p>

<p>Do not publish port 5678 to the internet directly. Bind it to localhost or a private network and let the reverse proxy be the only public listener. In Compose that means <code>127.0.0.1:5678:5678</code> instead of <code>5678:5678</code>.</p>

<p>Three settings are worth knowing about:</p>

<table class="styled-table">
<thead>
<tr><th>Variable</th><th>Default</th><th>Why you care</th></tr>
</thead>
<tbody>
<tr><td><code>N8N_SECURE_COOKIE</code></td><td><code>true</code></td><td>Cookies only over HTTPS. The usual reason people turn this off is testing over plain HTTP. Turn it back on.</td></tr>
<tr><td><code>N8N_BLOCK_ENV_ACCESS_IN_NODE</code></td><td><code>false</code></td><td>Off by default, meaning expressions can read the host environment. Set it to <code>true</code> if anyone else edits workflows.</td></tr>
<tr><td><code>N8N_RESTRICT_FILE_ACCESS_TO</code></td><td>none</td><td>Confines filesystem access to directories you name.</td></tr>
</tbody>
</table>

<p>That second one deserves emphasis. With the default setting, anyone who can edit a workflow can read your environment variables, which is where your database password lives.</p>

<h2>Upgrading and Rolling Back</h2>

<p>On Docker, an upgrade is a pull and a recreate:</p>

<pre class="brush: bash">docker compose pull
docker compose up -d</pre>

<p>Two habits make this safe. Pin a specific image tag rather than tracking latest, so an upgrade is a deliberate act you can reverse by editing one line. And snapshot the database before a major version jump, because n8n runs schema migrations on start and those do not roll back cleanly.</p>

<h2>Which Path Should You Pick</h2>

<p>Running it for yourself on a homelab box: Docker with a volume. Anything other people depend on: Compose with Postgres, an explicit encryption key, and pinned tags. Writing custom nodes: npm. Already planning to run local models: one of the bundled stacks, which saves you a day of container wiring.</p>

<p>Whichever you choose, set <code>N8N_ENCRYPTION_KEY</code> now and put it somewhere you will still be able to find it in a year.</p>

<h2>Sources and Further Reading</h2>

<ul>
<li><a href="https://docs.n8n.io/hosting/" target="_blank" rel="nofollow noopener noreferrer">n8n self-hosting documentation</a></li>
<li><a href="https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/" target="_blank" rel="nofollow noopener noreferrer">n8n environment variable reference</a></li>
<li><a href="https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/database.md" target="_blank" rel="nofollow noopener noreferrer">n8n database configuration</a></li>
<li><a href="https://github.com/coleam00/local-ai-packaged" target="_blank" rel="nofollow noopener noreferrer">local-ai-packaged on GitHub</a></li>
</ul>

<p>Next in the series: <a href="/tutorials/n8n-mcp-server-expose-workflow-as-ai-tool-2026.html">turning one of these workflows into an MCP tool</a> an AI agent can call directly. If your instance sits behind a proxy, check <code>proxy_buffering</code> before you start.</p>

]]></description>
    <pubDate>Thu, 23 Jul 2026 16:55:51 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/how-to-install-n8n-docker-npm-bundled-stacks-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/how-to-install-n8n-docker-npm-bundled-stacks-2026.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/how-to-install-n8n-docker-npm-bundled-stacks-2026.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[What Is n8n? A Developer Introduction to Workflow Automation]]></title>
    <link>https://singularitybyte.com/tutorials/what-is-n8n-developer-introduction-2026.html</link>
    <description><![CDATA[<p>n8n is a workflow automation tool you run on your own hardware. You wire together triggers, API calls, and code steps on a canvas, and it executes them on a schedule, on a webhook, or on demand. If you have ever glued three services together with a cron job and a 200-line Python script that nobody else can maintain, n8n is aimed squarely at you.</p>
<p>This is the first article in our n8n Automation Stack series. It covers what n8n is, the four concepts you need before anything else makes sense, what changed in 2026, and when reaching for n8n is the wrong call. No workflow building yet. That starts in the next two parts.</p>
<h2>What n8n Actually Is, and What It Is Not</h2>
<p>n8n is a node-based automation engine with several hundred built-in integrations. You self-host it, your credentials stay in your database, and every workflow is JSON you can export and commit to git. That last property is the one that matters most for developers, and it is the main thing hosted automation tools do not give you.</p>
<p>Here is the part most introductions skip: <strong>n8n is not open source</strong>. It is source-available under the Sustainable Use License v1.0. You can read the code, modify it, and self-host it, but the licence sets explicit boundaries:</p>
<blockquote>
<p>You may use or modify the software only for your own internal business purposes or for non-commercial or personal use. You may distribute the software or provide it to others only if you do so free of charge for non-commercial purposes.</p>
</blockquote>
<p>In practice that means running n8n for your own company or your own projects is fine. Wrapping it up and reselling it as a hosted service is not. Separately, any source file with <code>.ee.</code> in its filename or <code>.ee</code> in its directory name sits outside that licence entirely and needs a commercial Enterprise licence.</p>
<p>We cover open-weights models and genuinely open tooling here, so it is worth being precise rather than calling everything self-hostable "open source". n8n is fair-code. For most readers that distinction changes nothing. If you are building a product on top of it, read the licence before you write the business plan.</p>
<h2>The Four Concepts That Make n8n Click</h2>
<p>Almost every point of confusion for new users comes from missing one of these four ideas.</p>
<h3>Nodes</h3>
<p>A node is one step. It might call an HTTP endpoint, run a snippet of JavaScript or Python, branch on a condition, or talk to Postgres. Data flows between nodes as an array of JSON items, and this is the single most important thing to internalise: a node does not receive one object, it receives a list. If your workflow mysteriously runs five times, it is because the node upstream handed it five items.</p>
<h3>Triggers</h3>
<p>A trigger is how a workflow starts. The common ones are schedule (cron), webhook (an inbound HTTP request), and manual execution from the editor. A workflow has exactly one active trigger path. Getting the trigger right is most of the design work.</p>
<h3>Credentials</h3>
<p>Credentials are stored separately from workflows and referenced by name. This is why you can export a workflow to JSON and share it without leaking your API keys. It also means the encryption key that protects those credentials is the single most important thing to back up. Lose it and every stored credential becomes unreadable, even with an intact database. We come back to this in part two.</p>
<h3>Executions</h3>
<p>Every run is recorded with its input and output at each node. When something breaks at 3am, the execution log tells you which node failed and exactly what data it received. This is the feature that makes n8n worth using over a shell script, and it is the one people discover last.</p>
<h2>Test Runs and Production Runs Are Not the Same Thing</h2>
<p>n8n distinguishes between executing a workflow from the editor and running a published one. They use different URLs, and this trips up almost everyone the first time they build a webhook.</p>
<p>A test execution shows live data in the editor, which is what you want while building. A production execution does not display in the editor at all. You inspect it afterwards through the Executions tab. If you have ever pointed an external service at an n8n webhook and watched nothing happen, you were almost certainly still on the test URL, which only listens for a single request.</p>
<p>Remember this one. It becomes load-bearing in part three, when we expose a workflow as a tool over the network.</p>
<h2>What Changed in n8n During 2026</h2>
<p>If your mental model of n8n is from 2024, several things are different.</p>
<ul>
<li><strong>The AI Agent node was rebuilt</strong> with tool calling across Claude, GPT-4o, Gemini, Mistral, Groq, and any OpenAI-compatible endpoint. That last one is what lets you point it at a local model.</li>
<li><strong>Four memory node types</strong> shipped: in-memory, Redis, Postgres, and Motorhead. Conversation state no longer has to be something you hand-roll.</li>
<li><strong>The Canvas UI</strong> arrived in version 1.30 and replaced the flat left-to-right builder. Nodes can be grouped into labelled clusters and collapsed, which matters once a workflow passes about 20 nodes.</li>
<li><strong>Per-node retry with exponential backoff</strong> is now built in, instead of being something you construct out of error branches.</li>
<li><strong>Execution replay</strong> landed in June 2026 and lets you trace variables line by line through JavaScript and Python nodes on a failed run.</li>
<li><strong>MCP support</strong> means n8n can act as a Model Context Protocol server or client. This is the subject of part three.</li>
</ul>
<h2>When n8n Is the Right Tool</h2>
<p>It is not always. Being honest about this saves you a rewrite later.</p>
<table class="styled-table">
<thead>
<tr>
<th>Approach</th>
<th>Best when</th>
<th>Falls down when</th>
</tr>
</thead>
<tbody>
<tr>
<td>Cron plus a script</td>
<td>One trigger, one action, no credentials to manage</td>
<td>You need retries, logging, or a second maintainer</td>
</tr>
<tr>
<td>n8n</td>
<td>Several services, scheduled or event-driven, you want run history and self-hosting</td>
<td>Sub-second latency, or logic better expressed as plain code</td>
</tr>
<tr>
<td>Zapier or Make</td>
<td>You want zero infrastructure and the volume is low</td>
<td>Per-task pricing at scale, or data that cannot leave your network</td>
</tr>
<tr>
<td>Application code</td>
<td>The logic is the product</td>
<td>You are rebuilding retries, scheduling, and an audit log by hand</td>
</tr>
</tbody>
</table>
<p>The honest failure mode of n8n is complex branching business logic. Once a workflow has 40 nodes and six conditional paths, it is harder to read than the equivalent 100 lines of code, and much harder to diff in review. Use it as glue between systems, not as a programming language.</p>
<h2>What Self-Hosting Actually Costs</h2>
<p>n8n itself is free to self-host under the terms above. The community edition has no execution limits, so the cost is your hardware and your time.</p>
<p>A small instance handling a few thousand executions a month runs comfortably on 1 vCPU and 1 GB of RAM. Add Postgres instead of the default SQLite once you care about concurrent writes or want backups that are not a file copy. If you plan to run local models alongside it, the memory budget is dominated by the model, not by n8n. Our <a href="tutorials/run-full-local-ai-stack-with-local-ai-packaged.html">full local AI stack guide</a> covers those numbers in detail.</p>
<h2>Your First Ten Minutes</h2>
<p>The fastest way to get a feel for the editor is a throwaway container. This is not how you should run it permanently, and part two explains why, but it is enough to click around:</p>
<pre class="brush: bash">docker run -it --rm --name n8n -p 5678:5678 docker.n8n.io/n8nio/n8n</pre>
<p>Open <code>http://localhost:5678</code>, create the owner account, and build the smallest possible workflow: a Schedule Trigger into a Code node that returns <code>{ hello: "world" }</code>. Execute it, then open the Executions tab and look at the recorded input and output. That loop of build, run, inspect is the whole tool in miniature.</p>
<p>Note the <code>--rm</code> flag. Everything you build in that container disappears when you stop it, credentials included. That is deliberate for a first look and unacceptable for anything else.</p>
<h2>What Comes Next in This Series</h2>
<p><a href="tutorials/how-to-install-n8n-docker-npm-bundled-stacks-2026.html">Part two</a> covers setting n8n up properly: the barebones Docker and npm paths, the environment variables that decide whether your webhooks work behind a reverse proxy, and the two bundled harnesses that install n8n alongside a local model stack. <a href="tutorials/n8n-mcp-server-expose-workflow-as-ai-tool-2026.html">Part three</a> turns a workflow into an MCP tool that an AI agent can call directly.</p>
<p>If you would rather jump straight to building something, our <a href="tutorials/build-your-own-ai-generator-n8n-ollama-claude-api-2026.html">AI generator tutorial</a> wires n8n to Ollama and the Claude API end to end.</p>
<h2>Sources and Further Reading</h2>
<ul>
<li><a href="https://docs.n8n.io/" target="_blank" rel="nofollow noopener noreferrer">n8n documentation</a></li>
<li><a href="https://github.com/n8n-io/n8n/blob/master/LICENSE.md" target="_blank" rel="nofollow noopener noreferrer">n8n Sustainable Use License</a></li>
<li><a href="https://docs.n8n.io/hosting/" target="_blank" rel="nofollow noopener noreferrer">n8n self-hosting documentation</a></li>
<li><a href="https://docs.n8n.io/release-notes/" target="_blank" rel="nofollow noopener noreferrer">n8n release notes</a></li>
</ul>
<p></p>]]></description>
    <pubDate>Thu, 23 Jul 2026 16:55:00 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/what-is-n8n-developer-introduction-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/what-is-n8n-developer-introduction-2026.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/what-is-n8n-developer-introduction-2026.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Turn an n8n Workflow Into an MCP Tool Your AI Agent Can Call]]></title>
    <link>https://singularitybyte.com/tutorials/n8n-mcp-server-expose-workflow-as-ai-tool-2026.html</link>
    <description><![CDATA[<p>An AI agent that has to click through your admin panel is slow, brittle, and breaks the moment you move a button. An agent that can call <code>get_order_status(order_id)</code> and get structured JSON back does not. The Model Context Protocol, or MCP, is the open standard that describes those callable tools, and n8n can now act as an MCP server: any workflow you build becomes a tool an agent can invoke over the network.</p>

<p>This is part three of the n8n Automation Stack series. Part one covered <a href="/tutorials/what-is-n8n-developer-introduction-2026.html">the core concepts</a>, part two covered <a href="/tutorials/how-to-install-n8n-docker-npm-bundled-stacks-2026.html">installing n8n properly</a>. That second one matters here more than usual, because the MCP transport is the one thing a default reverse proxy configuration will silently break.</p>

<h2>What You Get</h2>

<ul>
<li>One n8n workflow exposed as an MCP tool with a typed input schema.</li>
<li>Bearer-authenticated access from Claude Desktop, Cursor, or any MCP client.</li>
<li>The four self-hosting failures that stop it working, and the fix for each.</li>
<li>A tested look at the second, instance-level MCP server: what it exposes, what it costs to run, and the security boundary you are trusting.</li>
</ul>

<h2>Two Directions, Do Not Mix Them Up</h2>

<p>n8n sits on both sides of MCP, and the node names are easy to confuse.</p>

<table class="styled-table">
<thead>
<tr><th>Node</th><th>Direction</th><th>Use it when</th></tr>
</thead>
<tbody>
<tr><td><strong>MCP Server Trigger</strong></td><td>n8n exposes tools</td><td>An external agent should call your workflow</td></tr>
<tr><td><strong>MCP Client Tool</strong></td><td>n8n consumes tools</td><td>Your n8n AI Agent needs a third-party MCP server</td></tr>
</tbody>
</table>

<p>This article builds the first one. The second gets a paragraph at the end.</p>

<h2>Prerequisites</h2>

<p>A self-hosted n8n instance you can reach over HTTPS, an MCP client, and a workflow worth exposing. Pick something with a clear input and a clear output. A lookup against a database, a status check against an internal API, or a search over your own content all work well. Anything that takes ten parameters and returns prose does not.</p>

<h2>Step 1: Add the MCP Server Trigger</h2>

<p>Create a new workflow and add the <strong>MCP Server Trigger</strong> node. It replaces the usual trigger, so this workflow will not have a Schedule or Webhook node.</p>

<p>The node gives you a path, which becomes part of the URL agents connect to, and an authentication choice. Two options are available, both configured through HTTP request credentials:</p>

<ul>
<li><strong>Bearer auth</strong>: a token in the <code>Authorization</code> header. Use this unless you have a reason not to.</li>
<li><strong>Header auth</strong>: a custom header name and value, for fitting an existing scheme.</li>
</ul>

<p>Set a path you will recognise later. The node then shows you two URLs, and the difference between them is the same test versus production split from part one.</p>

<h2>Step 2: Attach a Tool</h2>

<p>The trigger on its own exposes nothing. Tools attach to it as sub-nodes, and two kinds can connect:</p>

<ul>
<li><strong>Custom n8n Workflow Tool</strong>, which exposes another of your workflows as a callable tool.</li>
<li><strong>MCP Client Tool</strong>, which re-exposes tools from another MCP server.</li>
</ul>

<p>Use the first. Attach a Custom n8n Workflow Tool, point it at the workflow doing the actual work, and then spend your time on the two fields that decide whether an agent uses your tool correctly: the name and the description.</p>

<p>The description is not documentation. It is the prompt the model reads when deciding whether to call your tool. Write it for the model:</p>

<pre class="brush: json">{
  "name": "get_order_status",
  "description": "Look up the current status of a customer order by its ID. Returns status, carrier and tracking number. Use when the user asks where an order is.",
  "parameters": {
    "order_id": "The order ID, format ORD-12345"
  }
}</pre>

<p>Vague descriptions produce agents that either never call the tool or call it constantly with nonsense arguments. Say what it returns and when to use it.</p>

<h2>Step 3: Test Before You Publish</h2>

<p>Click <strong>Listen for Test Event</strong> and the node hands you a test URL. Point your MCP client at it and call the tool once.</p>

<p>The test URL displays live data in the editor, which is the whole reason to use it. You can see the arguments the model sent and the data each node returned. Note that it listens for a single event, so if a second call appears to hang, that is why.</p>

<h2>Step 4: Publish and Connect for Real</h2>

<p>Publishing the workflow activates the production URL. Production executions do not display in the editor at all. To inspect them you open the Executions tab, which is where all your debugging happens from this point on.</p>

<p>Point your MCP client at the production URL with the same credentials. In Claude Desktop that is an entry in the MCP servers section of the config; in Cursor and other clients it is equivalent. The tool should appear in the client's tool list with the name and description you set in step 2.</p>

<h2>Step 5: The Self-Hosting Reality Check</h2>

<p>This is the part that is not in most walkthroughs, and it is where a self-hosted instance behind a proxy stops working.</p>

<h3>There is no stdio transport</h3>

<p>Many MCP servers run as a local subprocess and speak over standard input and output. The n8n MCP Server Trigger does not support stdio. It is SSE and HTTP only, meaning your n8n instance has to be reachable over the network from wherever the client runs. If your client only supports stdio, you need a bridge process, not this node.</p>

<h3>Proxy buffering breaks it</h3>

<p>Server-Sent Events depend on the server pushing bytes as they happen. A reverse proxy that buffers responses will hold those bytes until the buffer fills or the connection times out, and the symptom is a connection that appears to open and then never delivers anything. The n8n documentation is explicit that a reverse proxy in front of the MCP endpoint must have buffering disabled and compression settings adjusted.</p>

<p>In nginx that is <code>proxy_buffering off;</code> on the location handling the MCP path. In Apache, <code>SetEnv proxy-sendchunked 1</code> and no output filters on that path. This is the same setting part two flagged, and it is the first thing to check when a connection opens but no tools appear.</p>

<h3>Multiple replicas break it differently</h3>

<p>If you run n8n with more than one webhook replica behind a load balancer, SSE connections fail when a follow-up request lands on a different replica than the one holding the stream. The fix is routing: send every request matching <code>/mcp*</code> to one dedicated replica. Single-container deployments are unaffected, which is most self-hosted setups.</p>

<h3>Fire tool calls one at a time</h3>

<p>We connected a real MCP client to a self-hosted instance and the first thing that broke was concurrency. Sending several tool calls in one parallel batch returned transport errors, some coming back as a bare "not connected" even though the server was up. Running the same calls one after another worked every time.</p>

<p>This is the SSE transport doing exactly what the buffering and replica warnings above predict: a single streamed connection does not want several requests racing through it at once. If your client or your agent framework likes to fan out tool calls in parallel, throttle it to one in flight. A call that fails this way is worth a single sequential retry before you assume anything is actually wrong with the server.</p>

<h2>The Other Direction: Consuming MCP Servers</h2>

<p>The <strong>MCP Client Tool</strong> node is the mirror image. Attach it to an n8n AI Agent and the agent gains the tools of an external MCP server. It connects over an SSE endpoint, and it supports bearer, single or multiple custom headers, OAuth2, or no authentication at all.</p>

<p>The useful detail is tool filtering. You can expose <em>All</em> tools from the server, a <em>Selected</em> subset, or <em>All Except</em> a blocklist. Handing a model 40 tools when it needs 3 measurably degrades tool choice, so select deliberately.</p>

<h2>A Third Thing, Which Is Not This</h2>

<p>n8n also has an instance-level MCP server, a different feature with a confusingly similar name. It lets an MCP client connect to n8n itself at <code>/mcp-server/http</code> and build, search, test, and publish workflows by prompting. Authentication is OAuth2 or a personal access token. We wired one into a client and used it, so the rest of this section is from that rather than from the docs.</p>

<p>This is a development tool, not a runtime one. It is how you build workflows by talking to a model, not how an agent calls your workflow in production.</p>

<h3>What it actually exposes</h3>

<p>Connecting turns n8n into a toolbox with four kinds of tool, and the difference between them is entirely about blast radius:</p>

<table class="styled-table">
<thead>
<tr><th>Family</th><th>Does</th><th>Cost of a mistake</th></tr>
</thead>
<tbody>
<tr><td>Read</td><td>List and inspect workflows, executions, credentials, tags</td><td>None</td></tr>
<tr><td>Build</td><td>SDK reference, node search, config validation</td><td>None, it only reads and checks</td></tr>
<tr><td>Write</td><td>Create, update, publish, archive, restore versions</td><td>Mutates your instance</td></tr>
<tr><td>Execute</td><td>Run and test workflows</td><td>Runs real workflows with real credentials</td></tr>
</tbody>
</table>

<p>That last row is the one to respect. An execute call is not a dry run. If the workflow it triggers calls a paid model API, hits a database, or posts to a webhook, it does all of that for real. Point an agent at this server and "test my workflow" can mean spending money and sending outbound requests.</p>

<h3>Two things it does right</h3>

<p>Listing credentials returns names and types only, never secret values. You can let a model see that an OpenAI credential and a Postgres credential exist, and reference them by ID when building, without ever exposing the keys. That is the correct design and it held up in practice.</p>

<p>It also refuses to let you guess. The server makes you pull the SDK reference and the best-practices guidance for a technique before it will accept workflow code, so a model cannot hallucinate node parameters straight into your instance. Building is slower as a result, and correct more often.</p>

<h3>The opt-in is real, and stricter than you expect</h3>

<p>Workflows are exposed individually. On the instance we connected to, a small minority of the total were flagged available over MCP; the rest were invisible to the connected client even though the same token could list them through the management tools. The exposure is also not client-scoped: every client using that token sees the same enabled set. Treat "enabled for MCP" as a deliberate per-workflow decision, not a default.</p>

<h3>The token is the whole security boundary</h3>

<p>A personal access token here is a long-lived bearer credential. The one we generated was a JWT with no expiry claim, so it does not time out on its own, and it grants read, build, write, and execute across everything the issuing user can reach. It sits in your client's config file in plain text.</p>

<p>Which means: store it like a password, do not commit the config that holds it, and rotate it in n8n's settings if it ever leaks. Anyone who reads that file can drive your instance.</p>

<p>One more caveat. Several third-party guides cite an enablement environment variable and a minimum version that do not match the official documentation, which describes the module as enabled by default and disabled with <code>N8N_DISABLED_MODULES=mcp</code>. Check your own instance before copying either claim.</p>

<h2>What This Is Actually Good For</h2>

<p>Two directions, two audiences.</p>

<p>The <strong>Server Trigger</strong> from steps one through five is for exposing what you already built. If you run n8n and have workflows an agent should be able to trigger, an internal lookup, a status check, a search over your own content, wrapping them as tools is a thin layer over work that already exists.</p>

<p>The <strong>instance-level server</strong> is the inversion: it is for building and auditing n8n from a chat window. Asking a model which workflows are active, which have not run since last quarter, or which are exposed over MCP is a fast way to take stock of an instance that has grown past what you remember. Building a new workflow through it means the model discovers nodes and validates them against your real credentials before anything is saved. It is the most useful when your instance is large enough that clicking through the editor has become the slow path.</p>

<h2>Limitations and Gotchas</h2>

<ul>
<li>No stdio transport. The instance must be network-reachable from the client.</li>
<li>SSE needs an unbuffered path end to end, including any CDN in front.</li>
<li>Concurrent tool calls over the SSE transport fail. Send one at a time.</li>
<li>Production executions are invisible in the editor. Use the Executions tab.</li>
<li>The tool description is prompt text and drives model behaviour. Treat it as code.</li>
<li>An execute call on the instance-level server runs the real workflow with real credentials. It is not a dry run.</li>
<li>The bearer token is the whole security boundary, is long-lived, and sits in a config file in plain text. Anyone who reads it can drive your instance.</li>
</ul>

<h2>When Not To Bother</h2>

<p>Skip the Server Trigger if you only need an agent to call one HTTP endpoint. An MCP server wrapping a single API call adds a hop and a service to maintain. Point the agent at the API.</p>

<p>Skip the instance-level server on a small instance you already know by heart. Its payoff scales with how many workflows you have forgotten about, and on a handful of workflows the editor is faster than a chat window.</p>

<h2>Sources and Further Reading</h2>

<ul>
<li><a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.mcptrigger/" target="_blank" rel="nofollow noopener noreferrer">n8n MCP Server Trigger node docs</a></li>
<li><a href="https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolmcp/" target="_blank" rel="nofollow noopener noreferrer">n8n MCP Client Tool node docs</a></li>
<li><a href="https://docs.n8n.io/connect/connect-to-n8n-mcp-server/" target="_blank" rel="nofollow noopener noreferrer">Connect to the n8n MCP server</a></li>
<li><a href="https://modelcontextprotocol.io/" target="_blank" rel="nofollow noopener noreferrer">Model Context Protocol specification</a></li>
</ul>

<p>Ten minute version: add an MCP Server Trigger to any existing workflow, set bearer auth, attach a Custom n8n Workflow Tool, and call the test URL from your client. If nothing arrives, check <code>proxy_buffering</code> first.</p>

]]></description>
    <pubDate>Thu, 23 Jul 2026 16:55:00 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/n8n-mcp-server-expose-workflow-as-ai-tool-2026.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/n8n-mcp-server-expose-workflow-as-ai-tool-2026.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/n8n-mcp-server-expose-workflow-as-ai-tool-2026.f04862e0.webp" type="image/webp" length="0"/>
</item>
<item>
    <title><![CDATA[Turn Your PC Into a Private AI Server in One Command with ODS]]></title>
    <link>https://singularitybyte.com/tutorials/ods-private-ai-server-one-command.html</link>
    <description><![CDATA[ 
<p>You have assembled this stack by hand before. Ollama or llama.cpp for inference, Open WebUI on top, Whisper for voice, a vector database for RAG, n8n to wire it together, ComfyUI because why not. It takes a weekend, and it breaks the next time you touch a driver. ODS does the assembly for you: one command, hardware auto-detection, and a chat window in about two minutes. It is Apache 2.0, 3,446 stars, and it was still getting commits the day we wrote this. Here is what it actually installs, and what that install script actually does to your machine.</p>

<h2>First, the name confusion</h2>

<p>If you went looking for this project after seeing it in a July roundup, you were probably sent to a repo called DreamServer under an org called Light-Heart-Labs. That link still works, but it is a redirect. The project renamed itself: <code>github.com/Light-Heart-Labs/DreamServer</code> now returns an HTTP 301 to <code>github.com/Osmantic/ODS</code>, which stands for Osmantic Deployment System. Several aggregators have not caught up. If a tutorial tells you to clone DreamServer, it is stale but harmless.</p>

<h2>What you get</h2>

<p>ODS is a Docker Compose stack with a CLI wrapped around it. The pitch is turning a PC, Mac or Linux box into a private AI server, and the component list is genuinely broad:</p>

<table class="styled-table">
<thead>
<tr><th>Layer</th><th>What ships</th></tr>
</thead>
<tbody>
<tr><td>Inference and chat</td><td>llama-server, LiteLLM gateway, Open WebUI, TEI embeddings</td></tr>
<tr><td>Voice</td><td>Whisper (speech to text), Kokoro (text to speech)</td></tr>
<tr><td>Agents and automation</td><td>Hermes Agent, n8n, OpenCode, Agent Policy Engine</td></tr>
<tr><td>Knowledge and search</td><td>Qdrant, SearXNG, Perplexica</td></tr>
<tr><td>Creative</td><td>ComfyUI</td></tr>
<tr><td>Operations</td><td>Dashboard with GPU metrics, Privacy Shield, Token Spy, Langfuse</td></tr>
</tbody>
</table>

<p>Most of these we have covered individually. <a href="/tools/opencode.html">OpenCode</a> is in there as the coding assistant, and the inference layer is the same llama.cpp lineage that sits under <a href="/news/ollama-v0-32-interactive-agent-2026.html">Ollama</a>. The value here is not any single component, it is that they come pre-wired with a gateway in front and one config file behind.</p>

<h2>The part that matters: what the installer does</h2>

<p>The documented install is a pipe from the internet into your shell, which should always make you pause:</p>

<pre class="brush: bash">
curl -fsSL https://install.osmantic.com/ods.sh | bash
</pre>

<p>So we downloaded it and read it instead of running it. It is 507 lines of Bash. Here is the honest audit.</p>

<p><strong>Network calls.</strong> The only external hosts in the entire script are <code>github.com</code> (to clone the repo), <code>install.osmantic.com</code> (itself), and <code>git-scm.com</code> in a help message. <strong>There is no telemetry.</strong> We grepped for the usual suspects, analytics endpoints, PostHog, Segment, and any stray curl to a reporting URL. Nothing.</p>

<p><strong>Privilege.</strong> It runs as your user. <code>sudo</code> appears in exactly two situations: installing <code>git</code> if you do not have it, and force-removing root-owned container data during cleanup. It does not ask for root to run the stack.</p>

<p><strong>Where it lands.</strong> The install directory and repo URL are both environment variables, so you can redirect it before it touches anything:</p>

<pre class="brush: bash">
# Read it first, then run it deliberately
curl -fsSL https://install.osmantic.com/ods.sh -o ods.sh
less ods.sh

# Point it wherever you want
ODS_INSTALL_DIR="$HOME/ai/ods" bash ods.sh
</pre>

<p>That is a clean bill of health for a curl-pipe-bash installer, which is not something we get to write often. It still deserves the same treatment as any other: download, read, then run.</p>

<h2>Hardware tiers</h2>

<p>ODS detects your accelerator and picks a default model rather than making you guess a quantization. The mapping, from the project's own table:</p>

<table class="styled-table">
<thead>
<tr><th>Hardware</th><th>Memory</th><th>Default model</th><th>Context</th></tr>
</thead>
<tbody>
<tr><td>NVIDIA</td><td>8 GB</td><td>Qwen3.5 2B (Q4_K_M)</td><td>8K</td></tr>
<tr><td>NVIDIA</td><td>12 GB</td><td>Phi-4 14B (Q4_K_M)</td><td>16K</td></tr>
<tr><td>NVIDIA</td><td>24 GB</td><td>Qwen3.5 27B (Q4_K_M)</td><td>32K</td></tr>
<tr><td>NVIDIA</td><td>48 GB</td><td>DeepSeek R1 Distill Llama 70B</td><td>32K</td></tr>
<tr><td>Apple Silicon</td><td>8 GB</td><td>Phi-4 Mini (Q4_K_M)</td><td>128K</td></tr>
<tr><td>Apple Silicon</td><td>16 GB</td><td>Qwen3.5 9B (Q4_K_M)</td><td>32K</td></tr>
<tr><td>Apple Silicon</td><td>64 GB+</td><td>Qwen3.6 35B-A3B (UD-Q4_K_M)</td><td>128K</td></tr>
<tr><td>AMD Strix Halo</td><td>64 GB unified</td><td>Qwen3.6 35B-A3B (UD-Q4_K_M)</td><td>128K</td></tr>
<tr><td>Intel Arc</td><td>6 to 8 GB</td><td>Phi-4 Mini / Qwen3.5 9B</td><td>128K / 32K</td></tr>
</tbody>
</table>

<p><em>Tiers as documented by the project. We did not verify model selection on each backend.</em></p>

<p>Bootstrap mode is the nice touch: it starts you on a small model so the chat UI answers within a couple of minutes, then pulls the full tier model in the background.</p>

<h2>Driving it</h2>

<p>The <code>ods</code> CLI is the reason this beats a hand-rolled compose file. Services are toggles, not YAML edits:</p>

<pre class="brush: bash">
ods status              # health checks and GPU state
ods list                # every service and whether it is up
ods enable n8n          # turn a service on
ods disable whisper     # turn one off
ods logs llm            # tail a service
ods model swap T3       # jump to another hardware tier
ods mode local          # local, cloud or hybrid inference
ods preset save         # snapshot the whole config
</pre>

<p>Open WebUI lands on <code>localhost:3000</code>. The llama-server API is on <code>11434</code> under Docker on Linux, or <code>8080</code> when it runs natively on macOS and Windows, and every port is overridable through the environment.</p>

<p>Local is the default mode. Cloud providers are opt-in, either with <code>--cloud</code> at install time or <code>ods mode</code> later, and the project is explicit that your prompts stay on your machine unless you choose otherwise. Given how the local-first label has been stretched lately, including by Ollama shipping a cloud-hosted default agent in v0.32, an installer that ships local-only and makes you ask for the cloud is worth noting.</p>

<h2>Requirements and gotchas</h2>

<ul>
<li>Docker is mandatory everywhere. On Windows that means Docker Desktop with the WSL2 backend; on macOS, Docker Desktop plus Apple Silicon, since Intel Macs are not supported.</li>
<li>On macOS, llama-server runs natively for Metal while everything else runs in containers, so it is a hybrid deployment rather than a pure container stack.</li>
<li>The tier selector deliberately avoids Qwen3 Coder Next on unified-memory hosts, citing correctness issues on those backends.</li>
<li>187 open issues against 3,446 stars. Normal for a young project moving fast, but this is not a set-and-forget appliance yet.</li>
<li>The last tagged release is v2.5.3 from May 26, while commits landed as recently as the day we published. Running from <code>main</code> gets you fixes the tag does not have, with the usual tradeoff.</li>
<li>Disk usage is not documented, and it will be substantial: a dozen container images plus a quantized model in the tens of gigabytes.</li>
<li>No GPU means CPU fallback, which works but is slow enough that the project recommends cloud mode instead.</li>
</ul>

<h2>Who should run it</h2>

<p>Run ODS if you want the whole private-AI stack rather than one piece of it, and you would rather spend the evening using it than wiring it. It suits a homelab box, a spare workstation with a decent GPU, or an Apple Silicon machine with memory to spare. The service toggles make it a reasonable way to try Perplexica or Qdrant without committing to another compose file you will maintain forever.</p>

<p>Skip it if you only need inference, where plain llama.cpp or Ollama is less machinery for the same result, or if you are on hardware without an accelerator, where the whole point evaporates. And if you are on a shared or production server, read those 507 lines yourself before running them. We found nothing alarming, but "some blog checked it" is not an audit.</p>

<h2>Sources and further reading</h2>

<ul>
<li><a href="https://github.com/Osmantic/ODS" target="_blank" rel="nofollow noopener noreferrer">GitHub: Osmantic/ODS (formerly DreamServer)</a></li>
<li><a href="https://install.osmantic.com/ods.sh" target="_blank" rel="nofollow noopener noreferrer">The install script, in full</a></li>
<li><a href="https://github.com/Osmantic/ODS/releases" target="_blank" rel="nofollow noopener noreferrer">ODS releases (latest tag v2.5.3)</a></li>
<li><a href="https://docs.openwebui.com" target="_blank" rel="nofollow noopener noreferrer">Open WebUI documentation</a></li>
<li><a href="https://github.com/ggml-org/llama.cpp" target="_blank" rel="nofollow noopener noreferrer">llama.cpp, the inference engine underneath</a></li>
</ul>

<p><em>Tested on: not deployed. We statically audited the 507-line installer (network calls, privilege escalation, telemetry, install paths) on Linux 6.1, and verified the repository metadata, redirect and release history against the GitHub API on 2026-07-22. We did not run the full stack: this bench has 8 GB of RAM and no GPU, which is below the lowest documented tier, so any performance numbers from it would have been misleading. Component lists, hardware tiers and port defaults are as documented by the project.</em><br>
<em>Date checked: 2026-07-22</em></p>]]></description>
    <pubDate>Wed, 22 Jul 2026 18:19:52 UTC</pubDate>
    <guid isPermaLink="true">https://singularitybyte.com/tutorials/ods-private-ai-server-one-command.html</guid>
    <dc:creator>singularitybyte.com</dc:creator>
    <media:content url="https://singularitybyte.com/assets/image-cache/images/tutorials/ods-private-ai-server-hero.f04862e0.webp" medium="image" type="image/webp"/>
    <enclosure url="https://singularitybyte.com/assets/image-cache/images/tutorials/ods-private-ai-server-hero.f04862e0.webp" type="image/webp" length="0"/>
</item>
    </channel>
</rss>
