<?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/">
  <channel>
    <title>DEV Community: Rijul Rajesh</title>
    <description>The latest articles on DEV Community by Rijul Rajesh (@rijultp).</description>
    <link>https://dev.to/rijultp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1207862%2F60f14114-548d-4857-87c3-87cd2e09375d.png</url>
      <title>DEV Community: Rijul Rajesh</title>
      <link>https://dev.to/rijultp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rijultp"/>
    <language>en</language>
    <item>
      <title>Continuous Batching: How Do LLM Servers Handle Many Users at Once?</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Fri, 23 Oct 2026 08:18:21 +0000</pubDate>
      <link>https://dev.to/rijultp/continuous-batching-how-do-llm-servers-handle-many-users-at-once-4fnj</link>
      <guid>https://dev.to/rijultp/continuous-batching-how-do-llm-servers-handle-many-users-at-once-4fnj</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;When you use an AI chatbot, have you ever wondered how it can respond to thousands of users with a limited number of GPUs?&lt;/p&gt;

&lt;p&gt;One technique that makes this possible is &lt;strong&gt;continuous batching&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To understand how it works, let's first look at why processing one request at a time is inefficient, and how continuous batching helps LLM servers serve more users with the same hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why Generating Tokens Can Be Wasteful
&lt;/h2&gt;

&lt;p&gt;A language model generates its response &lt;strong&gt;one token at a time&lt;/strong&gt;. For each generation step, the GPU must perform computations using the model's weights.&lt;/p&gt;

&lt;p&gt;For many models during token generation, moving these weights from memory can take more time than performing the calculations themselves. This means the GPU's computing power may not be fully utilized.&lt;/p&gt;

&lt;p&gt;Think of a chef who walks to a distant pantry to collect ingredients but prepares only one dish per trip. Much of the time is spent walking instead of cooking.&lt;/p&gt;

&lt;p&gt;The obvious solution is to prepare several dishes during each trip.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The First Fix: Batching
&lt;/h2&gt;

&lt;p&gt;Instead of processing one user's request at a time, an LLM server can process multiple requests together. This is called &lt;strong&gt;batching&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0d3jfbtciqdfocr392ng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0d3jfbtciqdfocr392ng.png" alt=" " width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The server loads and uses the model's weights to process several requests during the same generation step. Although processing a larger batch requires additional computation, the cost does not necessarily increase in proportion to the number of requests.&lt;/p&gt;

&lt;p&gt;The result is that the server can generate tokens for multiple users during the same step.&lt;/p&gt;

&lt;p&gt;This improves &lt;strong&gt;throughput&lt;/strong&gt;, which means the total number of tokens generated per second across all users.&lt;/p&gt;

&lt;p&gt;However, batching introduces another problem: different users' requests finish at different times.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Problem With Static Batching
&lt;/h2&gt;

&lt;p&gt;A simple batching strategy, called &lt;strong&gt;static batching&lt;/strong&gt;, works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collect a group of requests, such as four.&lt;/li&gt;
&lt;li&gt;Process them together.&lt;/li&gt;
&lt;li&gt;Wait until all four requests finish before starting the next group.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Consider these four requests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Request&lt;/th&gt;
&lt;th&gt;Tokens to generate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Request A finishes after generating 10 tokens. Requests C and D finish at steps 40 and 60, respectively. But request B continues generating tokens until step 500.&lt;/p&gt;

&lt;p&gt;In a conventional static batch, the completed requests cannot simply be replaced with new ones while the batch is running. Their slots may remain unused until the longest request finishes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9r0vxujvs275imivz52a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9r0vxujvs275imivz52a.png" alt=" " width="799" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For most of the generation process, the server could be working on request B while the other three slots sit idle.&lt;/p&gt;

&lt;p&gt;Meanwhile, new users may be waiting in a queue, even though some of the batch's capacity is no longer being used.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Solution: Continuous Batching
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Continuous batching&lt;/strong&gt; solves this problem by reconsidering the batch after every generation iteration instead of waiting for the entire group to finish.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpennbi44dsddhu6gvpce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpennbi44dsddhu6gvpce.png" alt=" " width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The process works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The server generates the next token for the active requests.&lt;/li&gt;
&lt;li&gt;When a request finishes, the server releases its slot.&lt;/li&gt;
&lt;li&gt;If another request is waiting, the server can schedule it into the available capacity.&lt;/li&gt;
&lt;li&gt;The process repeats while requests continue arriving and finishing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's return to our example.&lt;/p&gt;

&lt;p&gt;Request A finishes at step 10. The server can schedule a new request, E, to use the available capacity in a subsequent iteration. When request C finishes at step 40, another waiting request, F, can take its place.&lt;/p&gt;

&lt;p&gt;Instead of keeping the original group fixed, the server continuously adapts to the requests that are still running and the requests waiting to start.&lt;/p&gt;

&lt;p&gt;The goal is to keep the GPU productively occupied and improve overall throughput.&lt;/p&gt;

&lt;p&gt;Think of a restaurant. With static batching, the restaurant waits for every table in a group to become empty before seating another group of customers. With continuous batching, a new party can be seated as soon as a table becomes available.&lt;/p&gt;

&lt;p&gt;You may also encounter the terms &lt;strong&gt;in-flight batching&lt;/strong&gt; and &lt;strong&gt;iteration-level scheduling&lt;/strong&gt;. These are commonly used to describe this general approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. What Happens When a New Request Arrives?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9momx4kmcz2n9agotvs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd9momx4kmcz2n9agotvs.png" alt=" " width="799" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A new request does not immediately start generating its answer. It first needs to pass through two distinct stages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prefill: Reading the prompt
&lt;/h3&gt;

&lt;p&gt;During &lt;strong&gt;prefill&lt;/strong&gt;, the model processes the user's input prompt. Unlike generation, where the model produces one new token per step, prefill can process the prompt's tokens in parallel within the model's sequence computation.&lt;/p&gt;

&lt;p&gt;Long prompts can require substantial computation and memory, so prefill can temporarily compete with the decoding work of existing requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decode: Generating the answer
&lt;/h3&gt;

&lt;p&gt;During &lt;strong&gt;decode&lt;/strong&gt;, the model generates the response one token at a time. Each new token depends on the preceding context.&lt;/p&gt;

&lt;p&gt;Continuous batching is especially useful for keeping multiple requests' decode steps moving together.&lt;/p&gt;

&lt;h3&gt;
  
  
  The challenge of long prompts
&lt;/h3&gt;

&lt;p&gt;Suppose a new user submits a very long document while several other users are waiting for their next tokens.&lt;/p&gt;

&lt;p&gt;Processing the entire prompt in one large prefill operation could delay the decoding of existing requests.&lt;/p&gt;

&lt;p&gt;One technique used to manage this is &lt;strong&gt;chunked prefill&lt;/strong&gt;. The server splits a long prompt into smaller chunks and schedules those chunks alongside ongoing decode work.&lt;/p&gt;

&lt;p&gt;This can help balance prompt processing and token generation, improving scheduling efficiency. The exact behavior depends on the serving system and its configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Where Can You Try Continuous Batching?
&lt;/h2&gt;

&lt;p&gt;You generally do not need to implement continuous batching from scratch. Modern LLM serving systems provide batching and request-scheduling mechanisms.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;vLLM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA TensorRT-LLM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugging Face Text Generation Inference (TGI)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The specific implementation and available configuration options differ between systems and versions. If you deploy a model using one of these servers, check its documentation to understand how continuous batching is enabled and configured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Serving many users with a limited number of GPUs is not just about using a bigger model or adding more hardware. It is also about making better use of the hardware already available.&lt;/p&gt;

&lt;p&gt;Static batching groups requests together but can waste capacity when shorter requests finish before longer ones. Continuous batching addresses this by allowing new requests to join as existing requests complete.&lt;/p&gt;

&lt;p&gt;By adapting the batch at each generation iteration, LLM servers can use their available capacity more efficiently and improve throughput.&lt;/p&gt;

&lt;p&gt;The key idea is simple: &lt;strong&gt;don't wait for every request to finish before making room for the next one.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Risk-Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Risk-Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;LiveReview is built for engineering teams that ship often, but also care about keeping production stable for customers. It approves some 40-50% of low-risk changes automatically, and it gives your team the tools to handle the rest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understand risky changes faster.&lt;/li&gt;
&lt;li&gt;Fix problems in those changes, with human attention directed to the work that needs it.&lt;/li&gt;
&lt;li&gt;Enforce your engineering standards.&lt;/li&gt;
&lt;li&gt;Learn from production outcomes, such as incidents, rollbacks, and queue wait times.&lt;/li&gt;
&lt;li&gt;Improve the review process over time and make it more efficient.&lt;/li&gt;
&lt;li&gt;Connect to the major engineering tools that your team already uses.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Auto-Approve: Ship the Safe 50% Without a Human&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Auto-Approve Upto 50% of Your Pull Requests, Safely.&lt;/strong&gt; Risk scoring decides which MRs/PRs are safe enough to ship without a human, so your team only spends review time on risky and critical changes.&lt;/p&gt;

  
    
    &lt;span class="m-1"&gt;demo.mp4&lt;/span&gt;
    
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview auto-approving a low-risk change while&lt;/i&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>You Speak to AI, and It Speaks Back. What Happens in Between?</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Thu, 22 Oct 2026 04:04:27 +0000</pubDate>
      <link>https://dev.to/rijultp/you-speak-to-ai-and-it-speaks-back-what-happens-in-between-3i0h</link>
      <guid>https://dev.to/rijultp/you-speak-to-ai-and-it-speaks-back-what-happens-in-between-3i0h</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;You might have heard of audio-to-audio AI models. But have you wondered how they work behind the scenes?&lt;/p&gt;

&lt;p&gt;An audio-to-audio model listens to your voice and responds with a voice. Unlike a traditional speech pipeline, it does not necessarily need to convert your speech into text before generating a response.&lt;/p&gt;

&lt;p&gt;Instead, it can represent sound as a sequence of small codes. The model processes these codes to understand the input and generate a response, then converts the output codes back into audio.&lt;/p&gt;

&lt;p&gt;Let's break down how this works.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Sound Is Just Numbers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhswex7dkxmvl02h3du8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhswex7dkxmvl02h3du8l.png" alt=" " width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Consider a microphone.&lt;/p&gt;

&lt;p&gt;When you speak, sound waves travel through the air. The microphone captures these vibrations and converts them into an electrical signal. An audio system then samples that signal many times per second, storing each measurement as a number.&lt;/p&gt;

&lt;p&gt;For example, audio sampled at &lt;strong&gt;24,000 samples per second&lt;/strong&gt; contains 24,000 numerical samples for every second of audio.&lt;/p&gt;

&lt;p&gt;That means a 10-second voice message contains 240,000 samples.&lt;/p&gt;

&lt;p&gt;That's a lot of numbers for a model to process directly. More importantly, the raw waveform contains far more detail than the model needs to represent speech efficiently.&lt;/p&gt;

&lt;p&gt;We need a way to compress the sound while preserving the information that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Compression Tool: A Neural Audio Codec
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb7v1ll00lxw6i716kny2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb7v1ll00lxw6i716kny2.png" alt=" " width="794" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;codec&lt;/strong&gt; is a system that encodes data into a representation and decodes it back. Think of it as a tool for compressing and reconstructing information.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;neural audio codec&lt;/strong&gt; does this for sound using neural networks. Examples include SoundStream, EnCodec, and Mimi.&lt;/p&gt;

&lt;p&gt;A neural audio codec has two main components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encoder:&lt;/strong&gt; Converts the audio waveform into a compact sequence of codes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decoder:&lt;/strong&gt; Uses those codes to reconstruct an audio waveform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of a song and its sheet music. The recording contains a huge amount of information, while the sheet music provides a more compact representation of what needs to be played. A musician can use it to recreate the song, although the performance may not be identical to the original recording.&lt;/p&gt;

&lt;p&gt;Audio codes serve a somewhat similar purpose. They represent the sound in a form that a model can process more efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Turning Sound Into Frames
&lt;/h2&gt;

&lt;p&gt;The encoder does not necessarily represent the entire recording as one giant code. Instead, it divides the audio into small time steps called &lt;strong&gt;frames&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Consider a codec that produces 12.5 frames per second. Each frame corresponds to approximately 80 milliseconds of audio.&lt;/p&gt;

&lt;p&gt;The encoder converts each frame into a compact representation. The model can then process these representations in sequence, much like a language model processes tokens.&lt;/p&gt;

&lt;p&gt;But there is another detail: a frame can contain more than one code.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Why Each Frame Can Have a Stack of Codes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxtebe03oip3yiru53w86.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxtebe03oip3yiru53w86.png" alt=" " width="783" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some neural audio codecs use a technique called &lt;strong&gt;Residual Vector Quantization (RVQ)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The name sounds complicated, but the basic idea is straightforward: represent the audio using several layers of codes, with each layer refining the representation provided by the previous layers.&lt;/p&gt;

&lt;p&gt;Imagine approximating the number 7.34:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code 1:&lt;/strong&gt; Represents approximately 7.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code 2:&lt;/strong&gt; Adds a correction of approximately 0.3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code 3:&lt;/strong&gt; Adds another correction of approximately 0.04.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these values represent 7.34 more accurately than the first approximation alone.&lt;/p&gt;

&lt;p&gt;RVQ works with learned codebooks and vector representations rather than literally adding decimal numbers like this. The example illustrates the idea of progressively refining a representation.&lt;/p&gt;

&lt;p&gt;Each frame can therefore contain a stack of codes, with each code contributing additional information about the audio.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. How Much Does the Representation Shrink?
&lt;/h2&gt;

&lt;p&gt;Let's use a simplified example for one second of audio.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measurement&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raw audio at 24 kHz&lt;/td&gt;
&lt;td&gt;24,000 samples&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoded frames at 12.5 frames per second&lt;/td&gt;
&lt;td&gt;12.5 frames&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codes per frame&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total audio codes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;With these assumptions, the audio is represented by approximately 100 discrete codes instead of 24,000 waveform samples.&lt;/p&gt;

&lt;p&gt;That is a reduction of roughly &lt;strong&gt;240 to 1 in the number of represented values&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The decoder can use the resulting codes to reconstruct speech that preserves much of the original audio's important characteristics.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Speech Contains Meaning and Sound Details
&lt;/h2&gt;

&lt;p&gt;When someone speaks, the audio carries more than the words themselves.&lt;/p&gt;

&lt;p&gt;There are two useful ways to think about this information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Semantic information:&lt;/strong&gt; What is being communicated. For example, "Please close the door."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acoustic information:&lt;/strong&gt; How the message sounds, including voice characteristics, intonation, speaking rate, pauses, and emotional expression.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A voice assistant needs to handle both. Understanding the words is not enough if the goal is to produce natural, expressive speech. Sound details matter too.&lt;/p&gt;

&lt;p&gt;Different audio models organize this information in different ways. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Separate representations:&lt;/strong&gt; A system may use distinct representations for semantic information and acoustic details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layered representations:&lt;/strong&gt; Some codec designs arrange multiple code sequences so that different layers capture different levels of detail.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, these are not universal rules. In an RVQ codec, the first code is not automatically a semantic representation, and later codes are not necessarily dedicated to emotion or voice characteristics. That behavior depends on the model's architecture and training.&lt;/p&gt;

&lt;p&gt;The key idea is that a model must represent enough information to understand the input and generate the kind of audio response it is designed to produce.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. How an Audio-to-Audio Model Responds
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnbjwopqvfubexi60mpa9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnbjwopqvfubexi60mpa9.png" alt=" " width="795" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the input speech has been encoded into codes, the main model can process them and generate codes for its response.&lt;/p&gt;

&lt;p&gt;The overall process has three main stages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Listen
&lt;/h3&gt;

&lt;p&gt;The audio encoder converts the incoming waveform into a sequence of audio codes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Predict
&lt;/h3&gt;

&lt;p&gt;The main model processes the input representation and generates a sequence of output codes. Depending on the architecture, it may also use text tokens, separate audio representations, or other intermediate information.&lt;/p&gt;

&lt;p&gt;Like an autoregressive language model, an audio model may generate tokens one step at a time. Other architectures can organize generation differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Speak
&lt;/h3&gt;

&lt;p&gt;The audio decoder converts the generated codes back into a waveform, producing the model's spoken response.&lt;/p&gt;

&lt;p&gt;The simplified pipeline looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input waveform → Encoder → Audio codes → Model generates response codes → Decoder → Output waveform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The model does not have to treat audio as raw numbers throughout the entire process. The codec gives it a compact representation that is more suitable for modeling.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Why Not Convert Speech to Text First?
&lt;/h2&gt;

&lt;p&gt;A traditional speech-based assistant might use a three-stage pipeline:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speech → Speech recognition → Text model → Text-to-speech → Spoken response&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This approach works well for many applications. However, converting speech into text can discard information that is not represented in the transcript.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Emotion:&lt;/strong&gt; A transcript may preserve the words but lose much of the excitement, frustration, or uncertainty in the speaker's voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timing:&lt;/strong&gt; Pauses, speaking rhythm, and interruptions may not be fully represented in the text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-speech sounds:&lt;/strong&gt; Laughter, sighs, and other vocal sounds may be omitted or represented only with additional labels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An audio-to-audio model can preserve and process more of this information when its architecture and training support it. That can help it produce responses with more natural timing and vocal expression.&lt;/p&gt;

&lt;p&gt;It may also reduce the need for separate speech-recognition and speech-synthesis stages, potentially lowering latency. The actual speed advantage depends on the model and the system in which it runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Audio-to-audio AI models do not have to process an entire sound waveform directly. A neural audio codec converts the waveform into compact codes, a model processes those codes to generate a response, and a decoder reconstructs the output as sound.&lt;/p&gt;

&lt;p&gt;The important idea is that &lt;strong&gt;audio codes give AI models a compact representation of sound that they can learn to understand and generate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is one of the building blocks behind more natural voice interactions, where an AI system can respond to spoken input without relying entirely on a speech-to-text-to-speech pipeline.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Risk-Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Risk-Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;LiveReview is built for engineering teams that ship often, but also care about keeping production stable for customers. It approves some 40-50% of low-risk changes automatically, and it gives your team the tools to handle the rest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understand risky changes faster.&lt;/li&gt;
&lt;li&gt;Fix problems in those changes, with human attention directed to the work that needs it.&lt;/li&gt;
&lt;li&gt;Enforce your engineering standards.&lt;/li&gt;
&lt;li&gt;Learn from production outcomes, such as incidents, rollbacks, and queue wait times.&lt;/li&gt;
&lt;li&gt;Improve the review process over time and make it more efficient.&lt;/li&gt;
&lt;li&gt;Connect to the major engineering tools that your team already uses.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Auto-Approve: Ship the Safe 50% Without a Human&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Auto-Approve Upto 50% of Your Pull Requests, Safely.&lt;/strong&gt; Risk scoring decides which MRs/PRs are safe enough to ship without a human, so your team only spends review time on risky and critical changes.&lt;/p&gt;

  
    
    &lt;span class="m-1"&gt;demo.mp4&lt;/span&gt;
    
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview auto-approving a low-risk change while&lt;/i&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What If a Small AI Model Could Speed Up a Big One Without Changing Its Answers?</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Tue, 20 Oct 2026 05:28:54 +0000</pubDate>
      <link>https://dev.to/rijultp/what-if-a-small-ai-model-could-speed-up-a-big-one-without-changing-its-answers-3n07</link>
      <guid>https://dev.to/rijultp/what-if-a-small-ai-model-could-speed-up-a-big-one-without-changing-its-answers-3n07</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Language models generate text one token at a time. Each new token depends on the tokens generated before it, so the model usually needs another forward pass before it can produce the next token.&lt;/p&gt;

&lt;p&gt;For a small model, this may be fast enough. For a large model, however, generating text can feel slow. The reason is not always what you might expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why Generating Tokens Can Be Slow
&lt;/h2&gt;

&lt;p&gt;You might assume the GPU spends all its time performing heavy computations. In many inference workloads, that isn't the case.&lt;/p&gt;

&lt;p&gt;To generate a token, a large language model must access its weights, which can occupy many gigabytes of memory. For models limited by memory bandwidth, moving these weights from memory to the GPU's compute units can take longer than performing the calculations themselves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgzfcaqafwcv93ffh3inu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgzfcaqafwcv93ffh3inu.png" alt=" " width="792" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a result, the GPU's compute units may sit underutilized while waiting for data.&lt;/p&gt;

&lt;p&gt;Think of a chef who spends 10 minutes fetching ingredients from a distant pantry and only 10 seconds cooking. Faster cooking wouldn't solve the main problem. Fewer trips to the pantry would.&lt;/p&gt;

&lt;p&gt;This is similar to &lt;strong&gt;memory-bound inference&lt;/strong&gt;: the bottleneck is moving data, not necessarily performing calculations.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Opportunity: Process Multiple Tokens at Once
&lt;/h2&gt;

&lt;p&gt;During autoregressive generation, the model typically processes one new token at a time. But when processing multiple known tokens together, the model can reuse the weights it has loaded instead of repeatedly loading them for each token.&lt;/p&gt;

&lt;p&gt;Processing five tokens together can therefore cost much less than running five separate single-token steps, especially when inference is memory-bound.&lt;/p&gt;

&lt;p&gt;This does not mean five tokens always cost the same as one. The exact cost depends on the model, hardware, sequence length, and workload. But processing several tokens in parallel can make better use of the available computing resources.&lt;/p&gt;

&lt;p&gt;Now imagine you already had a good guess for the next five tokens. The large model could check those guesses together rather than generating every token sequentially.&lt;/p&gt;

&lt;p&gt;But where would those guesses come from?&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Idea: A Small Draft Model
&lt;/h2&gt;

&lt;p&gt;Speculative decoding uses a second, smaller model called a &lt;strong&gt;draft model&lt;/strong&gt; to propose upcoming tokens.&lt;/p&gt;

&lt;p&gt;The larger model, called the &lt;strong&gt;target model&lt;/strong&gt;, then verifies those proposals.&lt;/p&gt;

&lt;p&gt;Think of it this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Draft model:&lt;/strong&gt; A quick intern who prepares a rough draft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target model:&lt;/strong&gt; An expert editor who checks the draft.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The editor can review an existing draft more efficiently than writing every word from scratch. If most of the draft is correct, the editor can approve several words at once and correct the first mistake.&lt;/p&gt;

&lt;p&gt;That is the basic idea behind speculative decoding.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. How Speculative Decoding Works
&lt;/h2&gt;

&lt;p&gt;Let's use this prompt as an example:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“The capital of France is”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Suppose the draft model proposes four tokens:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“ Paris”, “,”, “ a”, “ city”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvg8lwp7ahn7qn8ozk14o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvg8lwp7ahn7qn8ozk14o.png" alt=" " width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what happens next.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Guess: The small model quickly guesses the next four words: “ Paris”, “,”, “ a”, “ city”.&lt;/li&gt;
&lt;li&gt;Check: The big model looks at all four guesses at the same time. For each spot, it figures out which word it would have picked itself.&lt;/li&gt;
&lt;li&gt;Keep the good ones: Going from left to right, we keep each guess that matches the big model’s choice. Here, the big model agrees with “ Paris”, “,”, and “ a”. But for the fourth spot, it would have picked “ major” instead of “ city”.&lt;/li&gt;
&lt;li&gt;Fix the first mistake: We swap “ city” for the big model’s word, “ major”. If there were any guesses after the wrong one, we throw them away, because they were built on a mistake.&lt;/li&gt;
&lt;li&gt;Start again: The small model takes the corrected sentence and guesses the next few words.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this example, the target model produces three accepted tokens plus its correction in one verification round. That gives four new tokens instead of the single token it would ordinarily produce in a standard autoregressive step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvfp2rf5xphvtj5vxbsvt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvfp2rf5xphvtj5vxbsvt.png" alt=" " width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If all four draft tokens are accepted, the target can also contribute a bonus token, potentially producing five new tokens in that round.&lt;/p&gt;

&lt;p&gt;The important point is that the target model verifies several proposed tokens together rather than generating each one separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. What Happens When a Draft Is Wrong?
&lt;/h2&gt;

&lt;p&gt;Sometimes the very first guess is wrong. When that happens, the big model rejects it and picks the word itself.&lt;/p&gt;

&lt;p&gt;So you still get one correct word, just like you would without this trick. The only cost is a little wasted time: the small model made a guess, and the big model checked it, but the guess was thrown away.&lt;/p&gt;

&lt;p&gt;If the small model is wrong more often, each check produces fewer words, so you save less time.&lt;/p&gt;

&lt;p&gt;But here’s the important part: if it’s set up correctly, the final text is exactly what the big model would have written on its own.&lt;/p&gt;

&lt;p&gt;In other words, this trick makes writing faster without changing the quality or the style of the answer. Only the speed changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Greedy decoding
&lt;/h3&gt;

&lt;p&gt;When a model writes, it gives a score to every possible next word. There are two common ways to pick one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Greedy: always pick the word with the highest score. No randomness.&lt;/li&gt;
&lt;li&gt;Sampling: pick randomly, with higher-scoring words more likely to be chosen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This section is about the first way, where the big model always picks its top choice.&lt;/p&gt;

&lt;p&gt;In that case, checking the small model’s guess is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the guess is the word the big model would have picked, we keep it.&lt;/li&gt;
&lt;li&gt;If the guess is a different word, we throw it away and use the big model’s word instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, say the sentence so far is “The capital of France is”. The small model guesses “ Paris”, and the big model’s top choice is also “ Paris”. Match, so we keep it. If the small model had guessed “ Lyon”, we would replace it with “ Paris”.&lt;/p&gt;

&lt;p&gt;Result: the final text is exactly the same as what the big model would have written alone, just faster. (This holds as long as you use the same big model and the same settings.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Sampling
&lt;/h3&gt;

&lt;p&gt;Sometimes the big model adds a bit of randomness when it picks a word. If we kept every guess from the small model just because it sounds reasonable, the final text would start to follow the small model’s habits instead of the big model’s.&lt;/p&gt;

&lt;p&gt;So we don’t keep guesses automatically. Each guess gets a chance of being kept, based on how much the big model likes it. If a guess is rejected, the big model picks a replacement.&lt;/p&gt;

&lt;p&gt;This way, the final text still matches what the big model would have written on its own.&lt;/p&gt;

&lt;p&gt;In short: the small model suggests, but the big model decides.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. How Much Faster Can It Be?
&lt;/h2&gt;

&lt;p&gt;The speedup depends heavily on how often the target model accepts the draft model's proposals.&lt;/p&gt;

&lt;p&gt;Let:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;k be the number of drafted tokens per round.&lt;/li&gt;
&lt;li&gt;alpha be the probability that an individual draft token is accepted, assuming a simplified constant acceptance rate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Under this simplified model, the expected number of tokens produced per target-model verification pass is:&lt;/p&gt;

&lt;p&gt;(1 − α^(k+1)) / (1 − α)&lt;/p&gt;

&lt;p&gt;For k=4, the expected number of tokens per verification pass is approximately:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Acceptance rate&lt;/th&gt;
&lt;th&gt;Expected tokens per pass&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;1.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;2.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;3.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb1jkzzy0go6p07y3i3bi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb1jkzzy0go6p07y3i3bi.png" alt=" " width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These numbers show how many words we get each time the big model checks the small model’s guesses. They do not show how much faster the whole thing runs.&lt;/p&gt;

&lt;p&gt;The real speed also depends on other things: how fast the small model is, how long the checking takes, and the extra work of running two models together.&lt;/p&gt;

&lt;p&gt;So getting more words per check doesn’t mean you get the same amount of speedup overall. To know the real gain, you have to test it on your own model, computer, and task.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. When Does Speculative Decoding Work Best?
&lt;/h2&gt;

&lt;p&gt;Speculative decoding works best when the draft model can predict the target model's next tokens accurately.&lt;/p&gt;

&lt;p&gt;It can be especially useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code and boilerplate:&lt;/strong&gt; Common patterns and repeated structures can be predictable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summaries and rewrites:&lt;/strong&gt; Some continuations closely follow the input text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured or formulaic text:&lt;/strong&gt; Repetitive formats can make the next tokens easier to predict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable factual answers:&lt;/strong&gt; Familiar phrases and common sequences can lead to higher acceptance rates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It may offer less benefit for open-ended creative writing, where many continuations are plausible and the draft model may disagree with the target more often.&lt;/p&gt;

&lt;p&gt;The task alone doesn't determine the outcome. The acceptance rate between the particular draft and target models is what matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Trying Speculative Decoding
&lt;/h2&gt;

&lt;p&gt;Several inference frameworks support speculative decoding. In Hugging Face Transformers, one approach is called &lt;strong&gt;assisted generation&lt;/strong&gt;, which allows a smaller assistant model to help a target model generate tokens.&lt;/p&gt;

&lt;p&gt;A simplified example looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;assistant_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;draft_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Here, &lt;code&gt;target_model&lt;/code&gt; is the model whose output you want, and &lt;code&gt;draft_model&lt;/code&gt; proposes candidate tokens for it to verify.&lt;/p&gt;

&lt;p&gt;This is an illustrative example. The models and inputs must be loaded and configured appropriately, and the selected model combination must be supported by the Transformers version you use.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Speculative decoding addresses a key bottleneck in language model inference: generating tokens sequentially can repeatedly incur the cost of accessing a large model's weights.&lt;/p&gt;

&lt;p&gt;A smaller model proposes several tokens, and the larger model verifies them together. When the proposals are accepted frequently enough, the target can produce multiple tokens per verification pass while preserving its original output distribution.&lt;/p&gt;

&lt;p&gt;The central trade-off is simple: &lt;strong&gt;the more accurately the draft model predicts the target, the more opportunity there is to accelerate generation.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Risk-Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Risk-Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;LiveReview is built for engineering teams that ship often, but also care about keeping production stable for customers. It approves some 40-50% of low-risk changes automatically, and it gives your team the tools to handle the rest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand risky changes faster.&lt;/li&gt;
&lt;li&gt;Fix problems in those changes, with human attention directed to the work that needs it.&lt;/li&gt;
&lt;li&gt;Enforce your engineering standards.&lt;/li&gt;
&lt;li&gt;Learn from production outcomes, such as incidents, rollbacks, and queue wait times.&lt;/li&gt;
&lt;li&gt;Improve the review process over time and make it more efficient.&lt;/li&gt;
&lt;li&gt;Connect to the major engineering tools that your team already uses.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Auto-Approve: Ship the Safe 50% Without a Human&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Auto-Approve Upto 50% of Your Pull Requests, Safely.&lt;/strong&gt; Risk scoring decides which MRs/PRs are safe enough to ship without a human, so your team only spends review time on risky and critical changes.&lt;/p&gt;


  
    
    &lt;span class="m-1"&gt;demo.mp4&lt;/span&gt;
    
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview auto-approving a low-risk change while&lt;/i&gt;…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What If You Could Boost or Ban Specific Tokens in an LLM?</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Mon, 19 Oct 2026 05:23:13 +0000</pubDate>
      <link>https://dev.to/rijultp/what-if-you-could-boost-or-ban-specific-tokens-in-an-llm-106l</link>
      <guid>https://dev.to/rijultp/what-if-you-could-boost-or-ban-specific-tokens-in-an-llm-106l</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Sometimes, you may want a specific word to appear more often in an LLM's output. In other cases, you may want to prevent the model from generating certain words altogether.&lt;/p&gt;

&lt;p&gt;Prompting is one way to influence the model's choices. But there is another approach: &lt;strong&gt;logit bias&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Logit bias lets you adjust the likelihood of specific tokens being selected during text generation. Let's understand how it works and how to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. How a Language Model Generates Text
&lt;/h2&gt;

&lt;p&gt;When you type on your phone, it suggests the next word. Language models work similarly, but on a much larger scale.&lt;/p&gt;

&lt;p&gt;A language model generates text one token at a time. A token can be a complete word, part of a word, punctuation, or even a space combined with a word.&lt;/p&gt;

&lt;p&gt;Suppose you ask a model to complete this sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The cat sat on the ...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model might consider several possible next tokens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;floor&lt;/li&gt;
&lt;li&gt;mat&lt;/li&gt;
&lt;li&gt;sofa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It calculates a score for each possible next token. These scores help determine which token the model selects.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. How the Model Scores Its Options
&lt;/h2&gt;

&lt;p&gt;Before choosing the next token, the model assigns a score called a &lt;strong&gt;logit&lt;/strong&gt; to each candidate token.&lt;/p&gt;

&lt;p&gt;For example, imagine the model produces these logits:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Logit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cat&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dog&lt;/td&gt;
&lt;td&gt;3.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fish&lt;/td&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A higher logit means the token is more favored relative to the other candidates.&lt;/p&gt;

&lt;p&gt;However, logits are not probabilities. A logit of 4.1 does not mean the token has a 410% probability or a 4.1% probability.&lt;/p&gt;

&lt;p&gt;The model converts these scores into probabilities using a function called &lt;strong&gt;softmax&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. From Logits to Probabilities
&lt;/h2&gt;

&lt;p&gt;Softmax converts logits into probabilities that add up to 100%.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxzty5nvm7aro8cwfc4rc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxzty5nvm7aro8cwfc4rc.png" alt=" " width="746" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the example above, the model's probabilities are approximately:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Probability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cat&lt;/td&gt;
&lt;td&gt;60.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dog&lt;/td&gt;
&lt;td&gt;30.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fish&lt;/td&gt;
&lt;td&gt;9.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model now has a probability distribution over these three candidates. Depending on its decoding settings, it can select a token from that distribution.&lt;/p&gt;

&lt;p&gt;Two settings can influence this process: temperature and logit bias.&lt;/p&gt;

&lt;h3&gt;
  
  
  How temperature changes the probabilities
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fncbb83v842l8z1dzaduq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fncbb83v842l8z1dzaduq.png" alt=" " width="595" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Temperature controls how concentrated or spread out the probability distribution becomes.&lt;/p&gt;

&lt;p&gt;Using the same logits from the previous example, here's how different temperatures affect the probabilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;T = 0.5&lt;/th&gt;
&lt;th&gt;T = 1&lt;/th&gt;
&lt;th&gt;T = 2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cat&lt;/td&gt;
&lt;td&gt;78.5%&lt;/td&gt;
&lt;td&gt;60.9%&lt;/td&gt;
&lt;td&gt;46.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dog&lt;/td&gt;
&lt;td&gt;19.4%&lt;/td&gt;
&lt;td&gt;30.2%&lt;/td&gt;
&lt;td&gt;32.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fish&lt;/td&gt;
&lt;td&gt;2.1%&lt;/td&gt;
&lt;td&gt;9.0%&lt;/td&gt;
&lt;td&gt;20.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At a lower temperature, the model favors the highest-scoring token more strongly. At a higher temperature, the probabilities become more evenly distributed, giving lower-scoring tokens a better chance of being selected.&lt;/p&gt;

&lt;p&gt;Notice that the logits stay the same. Temperature changes how the model converts those logits into probabilities.&lt;/p&gt;

&lt;p&gt;Logit bias works differently. Instead of changing the temperature, it modifies the logits of selected tokens before the probabilities are calculated.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. What Is Logit Bias?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp00kn983l8ejv0yuwec9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp00kn983l8ejv0yuwec9.png" alt=" " width="601" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logit bias lets you add a positive or negative adjustment to the logit of a specific token.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Positive bias:&lt;/strong&gt; Increases the token's logit, making it more likely to be selected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negative bias:&lt;/strong&gt; Decreases the token's logit, making it less likely to be selected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A sufficiently strong negative bias:&lt;/strong&gt; Can effectively prevent a token from being selected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's return to our example.&lt;/p&gt;

&lt;p&gt;Initially, the logits are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Original logit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cat&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dog&lt;/td&gt;
&lt;td&gt;3.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fish&lt;/td&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Suppose we apply a logit bias of &lt;code&gt;+2&lt;/code&gt; to &lt;code&gt;dog&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Its new logit becomes:&lt;/p&gt;

&lt;p&gt;(3.4 + 2 = 5.4)&lt;/p&gt;

&lt;p&gt;The adjusted logits are now:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Adjusted logit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cat&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dog&lt;/td&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fish&lt;/td&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After softmax, the approximate probabilities become:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;New probability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cat&lt;/td&gt;
&lt;td&gt;21.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dog&lt;/td&gt;
&lt;td&gt;76.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fish&lt;/td&gt;
&lt;td&gt;2.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model now strongly favors &lt;code&gt;dog&lt;/code&gt;, which previously had a lower probability than &lt;code&gt;cat&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This illustrates the core idea: &lt;strong&gt;logit bias changes the odds of selecting particular tokens without changing the model's underlying parameters.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Think of Logit Bias as a Dial
&lt;/h2&gt;

&lt;p&gt;Imagine each token has a dial controlling how strongly the model favors it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turning the dial up makes the token more likely to appear.&lt;/li&gt;
&lt;li&gt;Turning the dial down makes it less likely to appear.&lt;/li&gt;
&lt;li&gt;Turning it all the way down can prevent the token from being selected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The adjustment applies to the token's logit, not directly to its final probability. Therefore, the resulting probability change depends on the logits of the other candidates too.&lt;/p&gt;

&lt;p&gt;A positive bias does not guarantee that a token will appear. It only changes its relative likelihood.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Your First Logit Bias Request
&lt;/h2&gt;

&lt;p&gt;The OpenAI Chat Completions API supports a &lt;code&gt;logit_bias&lt;/code&gt; parameter that maps token IDs to bias values.&lt;/p&gt;

&lt;p&gt;For example, in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_MODEL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a short sentence about animals.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;logit_bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3797&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In this example, &lt;code&gt;"3797"&lt;/code&gt; is an illustrative token ID, not a guaranteed ID for a particular word. You must find the correct token ID for your chosen model and tokenizer.&lt;/p&gt;

&lt;p&gt;A bias of &lt;code&gt;-100&lt;/code&gt; strongly suppresses the specified token. The API accepts bias values from &lt;code&gt;-100&lt;/code&gt; to &lt;code&gt;100&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before using this parameter, check the documentation for your chosen model to confirm that it supports &lt;code&gt;logit_bias&lt;/code&gt;.&lt;/strong&gt; Support can vary by model.&lt;/p&gt;
&lt;h3&gt;
  
  
  What does the token ID mean?
&lt;/h3&gt;

&lt;p&gt;The API does not accept a word directly as the key in the &lt;code&gt;logit_bias&lt;/code&gt; dictionary. It expects a token ID represented as a string.&lt;/p&gt;

&lt;p&gt;To find token IDs, you need to tokenize the text using a tokenizer compatible with your model.&lt;/p&gt;
&lt;h2&gt;
  
  
  7. How to Find Token IDs
&lt;/h2&gt;

&lt;p&gt;For models supported by the &lt;code&gt;tiktoken&lt;/code&gt; library, you can inspect token IDs with Python:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tiktoken&lt;/span&gt;

&lt;span class="n"&gt;enc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tiktoken&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encoding_for_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_SUPPORTED_MODEL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; cat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The output contains the token IDs corresponding to the input text.&lt;/p&gt;

&lt;p&gt;Replace the example model name with a model supported by &lt;code&gt;tiktoken&lt;/code&gt;. Do not assume that every model uses the same tokenizer or that a token ID from one model will work for another.&lt;/p&gt;

&lt;p&gt;Also, pay attention to the exact text you encode. For example, these strings may tokenize differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"cat"&lt;/li&gt;
&lt;li&gt;" cat"&lt;/li&gt;
&lt;li&gt;"Cat"&lt;/li&gt;
&lt;li&gt;"cats"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A word may consist of multiple tokens, and different capitalization or spacing may produce different token IDs.&lt;/p&gt;
&lt;h2&gt;
  
  
  8. Where Can You Use Logit Bias?
&lt;/h2&gt;

&lt;p&gt;Logit bias is useful when you want more control over the vocabulary a model uses.&lt;/p&gt;
&lt;h3&gt;
  
  
  Constraining possible answers
&lt;/h3&gt;

&lt;p&gt;Suppose you're building a classifier that should respond with &lt;code&gt;positive&lt;/code&gt;, &lt;code&gt;negative&lt;/code&gt;, or &lt;code&gt;neutral&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can use prompting to request those labels and potentially use logit bias to discourage unwanted alternatives.&lt;/p&gt;

&lt;p&gt;However, logit bias alone does not guarantee valid output. For strict structured responses, use an appropriate constrained-output or structured-output feature when available.&lt;/p&gt;
&lt;h3&gt;
  
  
  Banning specific tokens
&lt;/h3&gt;

&lt;p&gt;Suppose you don't want a model to use a particular token. A strong negative bias can suppress it.&lt;/p&gt;

&lt;p&gt;But there is an important limitation: suppressing one token does not necessarily prevent the model from generating the same word through a different tokenization.&lt;/p&gt;
&lt;h3&gt;
  
  
  Reducing common clichés
&lt;/h3&gt;

&lt;p&gt;Suppose a model repeatedly uses words such as "delve" or "tapestry" in its answers.&lt;/p&gt;

&lt;p&gt;You could apply a negative bias to the relevant token IDs to make those choices less likely.&lt;/p&gt;

&lt;p&gt;This is a form of vocabulary steering. It is not a perfect word filter, because a word may have several tokenization variants or appear as part of a larger token.&lt;/p&gt;
&lt;h3&gt;
  
  
  Steering vocabulary
&lt;/h3&gt;

&lt;p&gt;You can also use positive bias to encourage certain vocabulary. For example, a writing assistant could make selected technical terms more likely to appear.&lt;/p&gt;

&lt;p&gt;Still, positive bias does not guarantee that a word will appear. The model must also consider the surrounding context and its other candidate tokens.&lt;/p&gt;

&lt;p&gt;For important requirements, combine logit bias with clear prompting and appropriate validation.&lt;/p&gt;
&lt;h2&gt;
  
  
  9. The Tricky Part: Words Aren't Always Single Tokens
&lt;/h2&gt;

&lt;p&gt;One of the most important details about logit bias is that it operates on tokens, not complete words.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F91t1e6swi5uka2mohhqu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F91t1e6swi5uka2mohhqu.png" alt=" " width="758" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Consider the word &lt;code&gt;cat&lt;/code&gt;. Depending on the tokenizer and context, it might be represented differently from &lt;code&gt;cat&lt;/code&gt; or &lt;code&gt;Cat&lt;/code&gt;. Other words may be split into multiple tokens.&lt;/p&gt;

&lt;p&gt;This creates a limitation when you want to ban a word completely.&lt;/p&gt;

&lt;p&gt;If you suppress one token ID, you may only suppress one tokenization variant. The model might still generate the word using another sequence of tokens.&lt;/p&gt;

&lt;p&gt;Similarly, applying a positive bias to one token does not guarantee that the complete word will appear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logit bias provides token-level control, not reliable word-level enforcement.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you need to enforce a strict rule, use a mechanism designed for that purpose rather than relying on logit bias alone.&lt;/p&gt;
&lt;h2&gt;
  
  
  10. Choosing the Right Bias Value
&lt;/h2&gt;

&lt;p&gt;The API accepts bias values between &lt;code&gt;-100&lt;/code&gt; and &lt;code&gt;100&lt;/code&gt;, but the right value depends on your use case and the model's behavior.&lt;/p&gt;

&lt;p&gt;A practical approach is to start with a small adjustment and test the results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small positive or negative values:&lt;/strong&gt; Gently influence token selection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Larger adjustments:&lt;/strong&gt; Apply stronger pressure toward or away from a token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extreme negative values, such as &lt;code&gt;-100&lt;/code&gt;:&lt;/strong&gt; Strongly suppress the selected token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are general guidelines, not universal thresholds. A bias value does not correspond to a fixed percentage-point change in probability.&lt;/p&gt;

&lt;p&gt;Test your settings with representative prompts. Check whether the model follows the intended behavior and whether the adjustment introduces unwanted side effects.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Prompting lets you tell a language model what you want. Logit bias gives you another way to influence its choices by adjusting the scores of specific tokens.&lt;/p&gt;

&lt;p&gt;It can help steer vocabulary, discourage certain tokens, or make selected outputs more likely. But because it operates at the token level, it cannot reliably enforce every word-level or content-level rule.&lt;/p&gt;

&lt;p&gt;Understanding that distinction helps you use logit bias where it is useful, while choosing more suitable controls when you need stronger guarantees.&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Risk-Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Risk-Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;LiveReview is built for engineering teams that ship often, but also care about keeping production stable for customers. It approves some 40-50% of low-risk changes automatically, and it gives your team the tools to handle the rest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand risky changes faster.&lt;/li&gt;
&lt;li&gt;Fix problems in those changes, with human attention directed to the work that needs it.&lt;/li&gt;
&lt;li&gt;Enforce your engineering standards.&lt;/li&gt;
&lt;li&gt;Learn from production outcomes, such as incidents, rollbacks, and queue wait times.&lt;/li&gt;
&lt;li&gt;Improve the review process over time and make it more efficient.&lt;/li&gt;
&lt;li&gt;Connect to the major engineering tools that your team already uses.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Auto-Approve: Ship the Safe 50% Without a Human&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Auto-Approve Upto 50% of Your Pull Requests, Safely.&lt;/strong&gt; Risk scoring decides which MRs/PRs are safe enough to ship without a human, so your team only spends review time on risky and critical changes.&lt;/p&gt;


  
    
    &lt;span class="m-1"&gt;demo.mp4&lt;/span&gt;
    
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview auto-approving a low-risk change while&lt;/i&gt;…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Temperature Controls Randomness. But Why Does That Matter More for Agents?</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Sat, 17 Oct 2026 18:48:04 +0000</pubDate>
      <link>https://dev.to/rijultp/temperature-controls-randomness-but-why-does-that-matter-more-for-agents-457j</link>
      <guid>https://dev.to/rijultp/temperature-controls-randomness-but-why-does-that-matter-more-for-agents-457j</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;When you type a message to an AI, it doesn't write the entire reply at once. It generates &lt;strong&gt;one small piece of text (a "token") at a time&lt;/strong&gt;, choosing the next token based on the probabilities it assigns to possible options.&lt;/p&gt;

&lt;p&gt;Suppose the model needs to choose its next word. It might assign probabilities like these:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Next word&lt;/th&gt;
&lt;th&gt;Probability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"search"&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"calculate"&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"email"&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model then samples from this distribution, like rolling a weighted die. "Search" is the most likely choice, but "calculate" and "email" are also possible.&lt;/p&gt;

&lt;p&gt;This sampling process introduces randomness, which is one reason the same question can produce different answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does Temperature Do?
&lt;/h2&gt;

&lt;p&gt;Temperature controls how sharply or evenly the model distributes probabilities across its possible next tokens.&lt;/p&gt;

&lt;p&gt;Technically, it rescales the model's raw scores, called &lt;em&gt;logits&lt;/em&gt;, before converting them into probabilities. This changes how likely each token is to be selected.&lt;/p&gt;

&lt;p&gt;Let's look at how different temperature settings can affect the same choices.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Next word&lt;/th&gt;
&lt;th&gt;T = 0.5&lt;/th&gt;
&lt;th&gt;T = 1&lt;/th&gt;
&lt;th&gt;T = 2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"search"&lt;/td&gt;
&lt;td&gt;88%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;55%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"calculate"&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;td&gt;33%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"email"&lt;/td&gt;
&lt;td&gt;0.2%&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These values are illustrative. Actual probabilities depend on the model's raw scores and the temperature setting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low temperature:&lt;/strong&gt; The most likely options become more dominant. The model tends to produce more predictable output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High temperature:&lt;/strong&gt; The probabilities become more evenly distributed, giving less likely options a better chance of being selected. The output can become more varied and surprising.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temperature near zero:&lt;/strong&gt; The model increasingly favors the highest-probability token. At zero, many implementations use greedy decoding, which selects the top token directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of temperature as a dial that controls how much randomness influences the model's choices.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Temperature Affects a Chatbot
&lt;/h2&gt;

&lt;p&gt;In a chatbot, you ask a question, the model generates an answer, and you read the result. Temperature influences how that answer is phrased and which ideas it explores.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low temperature:&lt;/strong&gt; Answers tend to be more consistent, focused, and predictable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High temperature:&lt;/strong&gt; Answers can be more varied and creative, but may also become less focused or more prone to errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an answer is slightly off, you can notice it and ask again. &lt;strong&gt;A human is usually checking the result.&lt;/strong&gt; The cost of a poor choice might be an awkward sentence or an irrelevant suggestion.&lt;/p&gt;

&lt;p&gt;Now consider what happens when the same model operates as an agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  How an AI Agent Works
&lt;/h2&gt;

&lt;p&gt;An AI agent typically follows a loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Observe the current situation.&lt;/li&gt;
&lt;li&gt;Decide what to do next, such as searching the web, running code, calling an API, or editing a file.&lt;/li&gt;
&lt;li&gt;Execute the action.&lt;/li&gt;
&lt;li&gt;Examine the result.&lt;/li&gt;
&lt;li&gt;Repeat until the task is complete.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A single task might involve 10, 20, or even 100 steps. Some steps may run without a human checking each decision.&lt;/p&gt;

&lt;p&gt;The model still chooses tokens, but those tokens can now determine actions that influence everything that follows. This makes temperature an important setting to consider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Temperature Matters More in Agents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Small Errors Can Compound
&lt;/h3&gt;

&lt;p&gt;Suppose an agent completes a 20-step task, and each step has a 98% chance of being correct. If we assume the steps are independent and every step must be correct, the probability that all 20 steps succeed is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mf"&gt;0.98&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;  &lt;span class="c1"&gt;# approximately 67%
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;At 95% reliability per step, the probability falls to about 36%. At 99%, it is about 82%.&lt;/p&gt;

&lt;p&gt;This illustrates how reliability can decrease across a long sequence of steps.&lt;/p&gt;

&lt;p&gt;Higher temperature does not automatically make every step less reliable. However, when it increases the chance of selecting unsuitable tokens or actions, those mistakes can affect later steps. An incorrect early decision might send the agent down the wrong path, making the rest of the task harder to complete.&lt;/p&gt;

&lt;p&gt;In a chatbot, a poor choice might produce an awkward sentence. In an agent, it could derail an entire workflow.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Agents Often Produce Structured Output
&lt;/h3&gt;

&lt;p&gt;Chatbots primarily produce text for humans to read. Agents often generate structured outputs that software must interpret, such as tool calls, JSON objects, and API parameters.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_files"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invoice_2026.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"max_results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A computer processes this output according to strict rules. A misspelled tool name, an invalid parameter, or malformed JSON can cause a call to fail. Depending on the system, an incorrect but valid call could also perform an unintended action.&lt;/p&gt;

&lt;p&gt;Structured output often leaves less room for variation than ordinary prose. This makes reliable generation especially important when an agent interacts with tools.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Agent Actions Have Real Consequences
&lt;/h3&gt;

&lt;p&gt;A chatbot's response is usually text on a screen. An agent can act on that response by sending an email, deleting a file, running a command, or spending money.&lt;/p&gt;

&lt;p&gt;An unsuitable choice is no longer just an odd sentence. It might trigger an action that is difficult to reverse.&lt;/p&gt;

&lt;p&gt;Lower temperature can help make token selection more predictable, but it is not a safety mechanism by itself. Agents still need safeguards such as permission limits, input validation, human approval for sensitive actions, and checks before executing destructive operations.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Debugging Requires Repeatability
&lt;/h3&gt;

&lt;p&gt;Suppose an agent fails on step 14 of a 30-step task. You want to run it again, reproduce the failure, and identify what went wrong.&lt;/p&gt;

&lt;p&gt;At higher temperatures, sampling may send the agent down a different path on each run. The failure might disappear, making it harder to investigate. Lower temperatures can make the agent's behavior more repeatable, which helps when testing changes and comparing results.&lt;/p&gt;

&lt;p&gt;However, repeatability also depends on factors such as the model, the tools it uses, the environment, and the state of external systems. Lower temperature alone cannot guarantee identical runs.&lt;/p&gt;
&lt;h2&gt;
  
  
  Should You Always Set an Agent's Temperature to Zero?
&lt;/h2&gt;

&lt;p&gt;Not necessarily. Although predictable behavior is useful for agents, setting temperature to zero is not a universal solution.&lt;/p&gt;

&lt;p&gt;There are situations where variation is valuable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Getting stuck in a loop:&lt;/strong&gt; An agent might repeatedly choose the same failed action. Exploring an alternative approach may help it recover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exploring different solutions:&lt;/strong&gt; Tasks such as finding information, brainstorming search queries, or generating candidate solutions can benefit from variation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creative tasks within a workflow:&lt;/strong&gt; An agent writing a draft or proposing ideas may benefit from a moderate temperature, even if other steps require more predictable behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The right setting depends on the task. A workflow can also use different temperatures for different stages, favoring predictable outputs for tool calls and allowing more variation during brainstorming.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Temperature controls how randomness influences a language model's token choices. In a chatbot, this mainly affects the variety and predictability of its responses. In an agent, those choices can influence a chain of tool calls and real-world actions.&lt;/p&gt;

&lt;p&gt;That is why temperature deserves more attention in agent workflows. Small differences in individual decisions can affect the outcome of a longer task, while unpredictable behavior can make failures harder to reproduce and debug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal isn't to eliminate randomness everywhere. It's to control where variation is useful and where predictable behavior matters more.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Risk-Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Risk-Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;LiveReview is built for engineering teams that ship often, but also care about keeping production stable for customers. It approves some 40-50% of low-risk changes automatically, and it gives your team the tools to handle the rest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand risky changes faster.&lt;/li&gt;
&lt;li&gt;Fix problems in those changes, with human attention directed to the work that needs it.&lt;/li&gt;
&lt;li&gt;Enforce your engineering standards.&lt;/li&gt;
&lt;li&gt;Learn from production outcomes, such as incidents, rollbacks, and queue wait times.&lt;/li&gt;
&lt;li&gt;Improve the review process over time and make it more efficient.&lt;/li&gt;
&lt;li&gt;Connect to the major engineering tools that your team already uses.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Auto-Approve: Ship the Safe 50% Without a Human&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Auto-Approve Upto 50% of Your Pull Requests, Safely.&lt;/strong&gt; Risk scoring decides which MRs/PRs are safe enough to ship without a human, so your team only spends review time on risky and critical changes.&lt;/p&gt;


  
    
    &lt;span class="m-1"&gt;demo.mp4&lt;/span&gt;
    
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview auto-approving a low-risk change while&lt;/i&gt;…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>AI Models Can Learn from Data. But What Can They Learn from Other Models?</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Fri, 16 Oct 2026 05:23:40 +0000</pubDate>
      <link>https://dev.to/rijultp/ai-models-can-learn-from-data-but-what-can-they-learn-from-other-models-110e</link>
      <guid>https://dev.to/rijultp/ai-models-can-learn-from-data-but-what-can-they-learn-from-other-models-110e</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Imagine you've trained a huge AI model that is very good at its job, such as recognizing objects in photos or answering questions.&lt;/p&gt;

&lt;p&gt;But there's a problem. The model is enormous. It needs powerful servers, costs a lot to run, and may be too slow or too large for a phone, smartwatch, or car.&lt;/p&gt;

&lt;p&gt;You want a smaller model that performs almost as well but runs faster and costs less.&lt;/p&gt;

&lt;p&gt;One option is to train a small model from scratch using your original data. However, it may not reach the same level of performance as the larger model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge distillation&lt;/strong&gt; offers another approach. Instead of learning only from the original data, the smaller model also learns from the larger model, much like a student learning from a teacher rather than studying a textbook alone.&lt;/p&gt;

&lt;p&gt;Let's see how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Teacher and the Student
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffknlciklkooei4d9sgd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffknlciklkooei4d9sgd5.png" alt=" " width="598" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Think about two ways of learning mathematics.&lt;/p&gt;

&lt;p&gt;In the first, you get a textbook containing problems and their final answers.&lt;/p&gt;

&lt;p&gt;In the second, you also have a tutor who explains how they approach each problem. The tutor might show you that one problem resembles another, even though the answers are different.&lt;/p&gt;

&lt;p&gt;The second approach gives you additional information that can help you learn.&lt;/p&gt;

&lt;p&gt;Knowledge distillation applies a similar idea to AI models:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Teacher model:&lt;/strong&gt; The larger model that already performs well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Student model:&lt;/strong&gt; The smaller model that learns from the teacher.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The teacher provides additional learning signals that help the student reproduce some of its capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Learning from More Than the Correct Answer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fycu69y3cncunhogy6q28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fycu69y3cncunhogy6q28.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's say we have an AI model that classifies animal photos into three categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cat&lt;/li&gt;
&lt;li&gt;Dog&lt;/li&gt;
&lt;li&gt;Fox&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the model receives a photo of a cat, it produces a score for each category. These scores are called &lt;em&gt;logits&lt;/em&gt;. A function called &lt;strong&gt;softmax&lt;/strong&gt; can convert them into probabilities that add up to 100%.&lt;/p&gt;

&lt;p&gt;For example, the teacher might produce these probabilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Probability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cat&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dog&lt;/td&gt;
&lt;td&gt;9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fox&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The teacher predicts &lt;em&gt;cat&lt;/em&gt; because it assigns the highest probability to that class.&lt;/p&gt;

&lt;p&gt;But notice something else: it considers dog more likely than fox.&lt;/p&gt;

&lt;p&gt;Those smaller probabilities provide additional information about how the teacher distinguishes between the categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hard labels vs. soft labels
&lt;/h3&gt;

&lt;p&gt;In ordinary supervised classification, the training target might be a hard label:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cat = 100%, Dog = 0%, Fox = 0%&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This tells the model which category is correct, but it doesn't directly communicate how the other categories compare.&lt;/p&gt;

&lt;p&gt;The teacher's output, on the other hand, gives us a distribution:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cat = 90%, Dog = 9%, Fox = 1%&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These are called &lt;strong&gt;soft labels&lt;/strong&gt;. They provide information about the teacher's relative confidence across all three categories.&lt;/p&gt;

&lt;p&gt;The teacher is effectively saying, "This is a cat. Dog is less likely, but fox is even less likely."&lt;/p&gt;

&lt;p&gt;This information can help the student learn distinctions that a simple correct-or-incorrect label doesn't express.&lt;/p&gt;

&lt;p&gt;Geoffrey Hinton and his colleagues popularized the term &lt;strong&gt;dark knowledge&lt;/strong&gt; for the useful information contained in a teacher's output probabilities, particularly the information in the less likely alternatives.&lt;/p&gt;

&lt;p&gt;The key idea is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Train the student to learn from the teacher's full probability distribution, not just the correct answer.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. Making the Hidden Information Easier to See: Temperature
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F98dpak6e7u3byyz552wj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F98dpak6e7u3byyz552wj.png" alt=" " width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's a problem with the example above.&lt;/p&gt;

&lt;p&gt;Imagine the teacher is extremely confident and produces these probabilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Probability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cat&lt;/td&gt;
&lt;td&gt;99.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dog&lt;/td&gt;
&lt;td&gt;0.09%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fox&lt;/td&gt;
&lt;td&gt;0.01%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The probabilities for dog and fox are tiny. The difference between them may provide a useful learning signal, but the teacher's output is dominated by the cat prediction.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;temperature&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;Temperature, usually represented by (T), controls how soft or sharp the probability distribution becomes when softmax is applied to the teacher's logits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T = 1:&lt;/strong&gt; The usual softmax distribution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Higher temperature:&lt;/strong&gt; The probabilities become more evenly distributed, making the differences between less likely classes easier to observe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower temperature:&lt;/strong&gt; The distribution becomes sharper, giving more weight to the highest-scoring class.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, with a higher temperature, the teacher might produce a distribution like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Illustrative probability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cat&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dog&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fox&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These numbers are illustrative, not a guaranteed result of a particular temperature.&lt;/p&gt;

&lt;p&gt;The important point is that the ranking remains the same, while the probability distribution becomes softer.&lt;/p&gt;

&lt;p&gt;The student can now receive a more informative signal about how the teacher relates the different classes.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. How the Student Actually Learns
&lt;/h2&gt;

&lt;p&gt;The student needs to learn two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How to imitate the teacher.&lt;/li&gt;
&lt;li&gt;How to predict the correct answers from the original training data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;During training, these goals can be combined into a single loss function.&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Match the teacher
&lt;/h3&gt;

&lt;p&gt;First, the student produces its own probability distribution using the same temperature.&lt;/p&gt;

&lt;p&gt;The training process compares the student's softened probabilities with the teacher's softened probabilities.&lt;/p&gt;

&lt;p&gt;One way to measure this difference is &lt;strong&gt;KL divergence&lt;/strong&gt;. It measures how different two probability distributions are.&lt;/p&gt;

&lt;p&gt;The student is trained to reduce this difference, making its outputs more similar to the teacher's.&lt;/p&gt;

&lt;h3&gt;
  
  
  B. Match the correct labels
&lt;/h3&gt;

&lt;p&gt;The student is also trained using the actual labels in the dataset.&lt;/p&gt;

&lt;p&gt;For example, if the image contains a cat, the student should still learn that cat is the correct category.&lt;/p&gt;

&lt;p&gt;This is commonly done using cross-entropy loss, a standard method for training classification models.&lt;/p&gt;

&lt;h3&gt;
  
  
  C. Combine both learning signals
&lt;/h3&gt;

&lt;p&gt;The two losses can be combined using a weighted sum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Distillation loss:&lt;/strong&gt; Encourages the student to imitate the teacher.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Label loss:&lt;/strong&gt; Encourages the student to predict the correct answers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The weights determine how much each objective contributes to training.&lt;/p&gt;

&lt;p&gt;This combination helps the student learn from both the teacher's behavior and the original training labels.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The Knowledge Distillation Process
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpp2nv21ejw77kp91s2en.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpp2nv21ejw77kp91s2en.png" alt=" " width="799" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the overall workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prepare the teacher:&lt;/strong&gt; Train a large model or use an existing one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose the student:&lt;/strong&gt; Select a smaller model architecture suitable for your use case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepare the training data:&lt;/strong&gt; Run the examples through the teacher to obtain its outputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Train the student:&lt;/strong&gt; Use the teacher's outputs and the original labels to calculate the training loss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy the student:&lt;/strong&gt; Once training and evaluation are complete, use the smaller model for inference. The teacher usually isn't needed during deployment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is a student model that aims to retain as much of the teacher's useful behavior as possible while requiring fewer resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Does Knowledge Distillation Really Work?
&lt;/h2&gt;

&lt;p&gt;Yes. One well-known example is &lt;strong&gt;DistilBERT&lt;/strong&gt;, a smaller version of BERT developed by Hugging Face.&lt;/p&gt;

&lt;p&gt;According to its creators, DistilBERT is approximately 40% smaller and 60% faster than BERT while retaining around 97% of its language-understanding capabilities on the evaluated benchmarks.&lt;/p&gt;

&lt;p&gt;These figures describe that particular model and evaluation setup. Results vary depending on the teacher, student architecture, training data, and task.&lt;/p&gt;

&lt;p&gt;Knowledge distillation is also relevant to large language models.&lt;/p&gt;

&lt;p&gt;A smaller language model can be trained using outputs generated by a larger model. This is one form of learning from a teacher, although the exact methods differ from probability-based distillation used in classification.&lt;/p&gt;

&lt;p&gt;For example, a larger model might generate answers to a collection of questions. Those answers can then be used as training examples for a smaller model.&lt;/p&gt;

&lt;p&gt;This can help transfer some of the larger model's capabilities into a model that is cheaper to run.&lt;/p&gt;

&lt;p&gt;However, distillation doesn't guarantee that the student will match the teacher. The quality of the training data, the student architecture, and the distillation method all matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Knowledge distillation is a way to transfer useful behavior from a larger AI model to a smaller one.&lt;/p&gt;

&lt;p&gt;Instead of learning only from the correct answers, the student can also learn from the teacher's output probabilities or other signals. This gives the student additional information about how the teacher approaches a task.&lt;/p&gt;

&lt;p&gt;The goal is to preserve as much useful performance as possible while reducing the cost and resources needed to run the model.&lt;/p&gt;

&lt;p&gt;In simple terms, &lt;strong&gt;knowledge distillation helps a smaller model learn to do more with less by learning from a larger model.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Risk-Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Risk-Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;LiveReview is built for engineering teams that ship often, but also care about keeping production stable for customers. It approves some 40-50% of low-risk changes automatically, and it gives your team the tools to handle the rest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understand risky changes faster.&lt;/li&gt;
&lt;li&gt;Fix problems in those changes, with human attention directed to the work that needs it.&lt;/li&gt;
&lt;li&gt;Enforce your engineering standards.&lt;/li&gt;
&lt;li&gt;Learn from production outcomes, such as incidents, rollbacks, and queue wait times.&lt;/li&gt;
&lt;li&gt;Improve the review process over time and make it more efficient.&lt;/li&gt;
&lt;li&gt;Connect to the major engineering tools that your team already uses.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Auto-Approve: Ship the Safe 50% Without a Human&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Auto-Approve Upto 50% of Your Pull Requests, Safely.&lt;/strong&gt; Risk scoring decides which MRs/PRs are safe enough to ship without a human, so your team only spends review time on risky and critical changes.&lt;/p&gt;

  
    
    &lt;span class="m-1"&gt;demo.mp4&lt;/span&gt;
    
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview auto-approving a low-risk change while&lt;/i&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>beginners</category>
      <category>genai</category>
    </item>
    <item>
      <title>OpenCode Can Write Code. What If It Could Use Your Browser Too?</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Wed, 14 Oct 2026 05:12:41 +0000</pubDate>
      <link>https://dev.to/rijultp/opencode-can-write-code-what-if-it-could-use-your-browser-too-3lj5</link>
      <guid>https://dev.to/rijultp/opencode-can-write-code-what-if-it-could-use-your-browser-too-3lj5</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;We use AI agents for all sorts of tasks. Some agents can even interact with your browser and act as companions while you work.&lt;/p&gt;

&lt;p&gt;As someone who uses OpenCode, I wanted to bring that capability into my workflow. I wanted OpenCode to interact with my browser so it could access the relevant browser context while helping me with tasks.&lt;/p&gt;

&lt;p&gt;In this article, let's see how to connect your browser to OpenCode using Browser MCP.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What You Need
&lt;/h2&gt;

&lt;p&gt;To set this up, you need two components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browser extension:&lt;/strong&gt; Connects your browser to the MCP server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local MCP server:&lt;/strong&gt; Allows your AI client to interact with the browser through the Model Context Protocol (MCP).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's set them up.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Install the Browser Extension
&lt;/h2&gt;

&lt;p&gt;First, visit the following page to install the Browser MCP extension:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://browsermcp.io/install" rel="noopener noreferrer"&gt;https://browsermcp.io/install&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F57zk8jlmt7dr9nyku4on.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F57zk8jlmt7dr9nyku4on.png" alt="Browser MCP extension installation page" width="800" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After installing the extension, you'll be directed to a page with more information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9fcoiqingn8xj644cm3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9fcoiqingn8xj644cm3.png" alt="Browser MCP setup page" width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This page links to the official Browser MCP documentation, where you can find additional setup instructions and details about how it works:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.browsermcp.io/" rel="noopener noreferrer"&gt;https://docs.browsermcp.io/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Add the MCP Server to OpenCode
&lt;/h2&gt;

&lt;p&gt;Next, configure OpenCode to use the Browser MCP server.&lt;/p&gt;

&lt;p&gt;Open your OpenCode configuration file and add the following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://opencode.ai/config.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"browsermcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@browsermcp/mcp@latest"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This configuration tells OpenCode to start the Browser MCP server locally using &lt;code&gt;npx&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Save the configuration after adding it.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Connect and Test the Browser
&lt;/h2&gt;

&lt;p&gt;Once you've configured the MCP server, make sure Browser MCP is connected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F155ktudka17m6k21zcm9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F155ktudka17m6k21zcm9.png" alt="Browser MCP connection in OpenCode" width="430" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let's test whether it works.&lt;/p&gt;

&lt;p&gt;Go to OpenCode and give it a task that requires browser interaction. For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Go to the Wikipedia page for "Open-source software" and list the main section headings.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The Browser MCP server allows OpenCode to interact with the browser and navigate to the requested page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fenoejgpef38heyvzdynp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fenoejgpef38heyvzdynp.png" alt="Browser MCP navigating to the Wikipedia page" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the result returned by the agent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feg7h8pyaaycpqxqkss79.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feg7h8pyaaycpqxqkss79.png" alt="OpenCode agent's result" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, OpenCode can use the browser to complete the task instead of relying only on the information already available in the conversation.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;That's how you can connect Browser MCP to OpenCode.&lt;/p&gt;

&lt;p&gt;This setup lets you bring browser interaction into your AI-assisted workflow. Instead of working with your AI agent and browser separately, you can give OpenCode tasks that involve navigating web pages and gathering information through the connected browser.&lt;/p&gt;

&lt;p&gt;It can be useful when you want your AI coding assistant to work with relevant information from the web alongside your existing workflow.&lt;/p&gt;

&lt;p&gt;That's it for this article. See you in the next one!&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Risk-Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Risk-Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;LiveReview is an AI code reviewer that scores every hunk of a diff by &lt;strong&gt;blast radius&lt;/strong&gt;: how far a change reaches through your call graph, how much persistent state it touches, and how well-tested it is. A 3-line change to a shared auth check can outrank a 300-line UI tweak. Your team's attention goes to the highest-risk code first, not spread evenly across every diff.&lt;/p&gt;


  
    
    &lt;span class="m-1"&gt;blast-radius-demo.mp4&lt;/span&gt;
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview's Blast Radius &amp;amp; Review Priority scoring, live in the diff viewer.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;The exact math, not a black box&lt;/th&gt;

&lt;th&gt;Visualize blast radius at a glance&lt;/th&gt;

&lt;th&gt;Every factor that feeds the score&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-3.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-3.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-4.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-4.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-2.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-2.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;br&gt;
&lt;p&gt;&lt;/p&gt;

How does Blast Radius scoring work? (a more technical explanation)

&lt;p&gt;&lt;strong&gt;Here's the goal:&lt;/strong&gt;&lt;/p&gt;


&lt;ul&gt;

&lt;li&gt;A 3-line fix in a function used by 40 other files, that also writes to a database, should score high.&lt;/li&gt;

&lt;li&gt;A 300-line UI change in one file, fully covered by tests…&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>AI Generates Text One Token at a Time. But How Does It Know When to Stop?</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Tue, 13 Oct 2026 03:18:29 +0000</pubDate>
      <link>https://dev.to/rijultp/ai-generates-text-one-token-at-a-time-but-how-does-it-know-when-to-stop-20ln</link>
      <guid>https://dev.to/rijultp/ai-generates-text-one-token-at-a-time-but-how-does-it-know-when-to-stop-20ln</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;A language model generates text one token at a time. But how does it know when to stop?&lt;/p&gt;

&lt;p&gt;It doesn't understand completion in the same way a human does. Instead, it learns patterns that help it predict when a response should end. Special tokens, instructions, and generation settings all play a role in this process.&lt;/p&gt;

&lt;p&gt;Let's explore how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. How a Model Generates Text
&lt;/h2&gt;

&lt;p&gt;Each time a language model generates text, it predicts the next token based on the tokens that came before it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa9j3v2mg5b004vkbe11o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa9j3v2mg5b004vkbe11o.png" alt=" " width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A token can represent a word, part of a word, punctuation, or another piece of text. The model assigns probabilities to possible next tokens and selects one according to its generation settings.&lt;/p&gt;

&lt;p&gt;One possible token is a special marker that signals the end of generation. This is commonly called an &lt;em&gt;end-of-sequence (EOS) token&lt;/em&gt;. Depending on the model, it might look like &lt;code&gt;&amp;lt;/s&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;|endoftext|&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When the model generates an EOS token, generation normally ends. In chat models, a separate end-of-turn token may serve this purpose by indicating that the assistant has finished its response.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. How a Model Learns to Stop
&lt;/h2&gt;

&lt;p&gt;During training, models learn to predict the next token from examples of text. Special tokens are included in the training data to mark boundaries, such as the end of a sequence or a conversational turn.&lt;/p&gt;

&lt;p&gt;For example, a training sequence might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: What is the capital of France?
Assistant: Paris. [end-of-turn token]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;By learning from many examples, the model learns when these ending tokens tend to appear.&lt;/p&gt;

&lt;p&gt;After generating a complete answer, the model may assign a high probability to an ending token. However, the model does not explicitly verify that it has answered the question correctly or included every necessary detail. It predicts the next token based on patterns learned during training.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9b3keacsgecdzuj024v5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9b3keacsgecdzuj024v5.png" alt=" " width="439" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The exact behavior depends on how the model was trained and which ending tokens it uses.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. What Influences When a Model Stops?
&lt;/h2&gt;

&lt;p&gt;Several factors influence whether a model generates another token or ends its response.&lt;/p&gt;
&lt;h3&gt;
  
  
  Context
&lt;/h3&gt;

&lt;p&gt;The model uses the preceding text to predict what should come next. If the response resembles patterns associated with a completed answer, an ending token may become more likely.&lt;/p&gt;

&lt;p&gt;However, a response can appear complete to a reader without the model actually selecting an ending token.&lt;/p&gt;
&lt;h3&gt;
  
  
  Instructions
&lt;/h3&gt;

&lt;p&gt;Instructions such as "Answer in one sentence" or "Keep your response under 100 words" can influence the length of the generated response.&lt;/p&gt;

&lt;p&gt;Fine-tuning methods, including reinforcement learning from human feedback (RLHF), can also shape how a model responds and when it tends to finish.&lt;/p&gt;

&lt;p&gt;These factors influence the model's behavior, but they do not guarantee a particular response length.&lt;/p&gt;
&lt;h3&gt;
  
  
  Sampling settings
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F85olrxrkd3zx24ryd43i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F85olrxrkd3zx24ryd43i.png" alt=" " width="704" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Generation settings affect how the model selects its next token.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Temperature:&lt;/strong&gt; Adjusts how strongly the model favors higher-probability tokens over lower-probability ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top-p:&lt;/strong&gt; Restricts sampling to a set of tokens whose cumulative probability reaches a specified threshold.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These settings can affect whether an ending token is selected, particularly when it competes with other plausible next tokens.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. External Conditions That Stop Generation
&lt;/h2&gt;

&lt;p&gt;Not every response ends because the model generates an ending token. The application running the model can also stop generation.&lt;/p&gt;

&lt;p&gt;Common external stopping conditions include:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F71p7wcla8hq2ezd3f2xb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F71p7wcla8hq2ezd3f2xb.png" alt=" " width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Maximum token limit:&lt;/strong&gt; The application sets a maximum number of tokens the model can generate. Once the limit is reached, generation stops even if the response is incomplete.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop sequences:&lt;/strong&gt; The application can specify text sequences that trigger a stop when detected. For example, an application might stop when it encounters &lt;code&gt;"\n\nUser:"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context window limits:&lt;/strong&gt; The model can only process a limited amount of text at once. If the available context or generation capacity is exhausted, the application may be unable to continue generating.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These mechanisms are different from the model selecting an EOS token. They are stopping conditions imposed by the model's runtime or application.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Common Stopping Problems
&lt;/h2&gt;

&lt;p&gt;Understanding the difference between model-generated endings and external stopping conditions helps explain several common problems.&lt;/p&gt;
&lt;h3&gt;
  
  
  Rambling or repetitive responses
&lt;/h3&gt;

&lt;p&gt;The model continues generating because it keeps predicting additional tokens instead of selecting an ending token. It may repeat earlier points, introduce unnecessary details, or continue beyond what the user needs.&lt;/p&gt;
&lt;h3&gt;
  
  
  Premature stopping
&lt;/h3&gt;

&lt;p&gt;The model generates an ending token before fully answering the question. This can happen even when the response is incomplete because the model predicts that the sequence should end.&lt;/p&gt;
&lt;h3&gt;
  
  
  Truncation
&lt;/h3&gt;

&lt;p&gt;The application reaches its maximum generation limit and stops the response. The output may end mid-sentence, making it appear as though the model decided to stop on its own.&lt;/p&gt;

&lt;p&gt;The distinction matters: premature stopping comes from the model's generated ending, while truncation occurs because an external limit was reached.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A language model does not have a reliable, human-like understanding of when an answer is complete. It learns patterns that help it predict when to generate an ending token, while instructions and sampling settings influence its behavior. External limits can also stop generation independently of the model's predictions.&lt;/p&gt;

&lt;p&gt;This distinction matters when building AI applications. If a model stops too early, users may receive incomplete answers. If it continues for too long, it can increase token usage, latency, and cost.&lt;/p&gt;

&lt;p&gt;Understanding these mechanisms helps developers configure generation settings, choose appropriate token limits, and diagnose whether a response ended because the model generated an ending token or the application stopped it.&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Blast-Radius Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Risk-Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;LiveReview is an AI code reviewer that scores every hunk of a diff by &lt;strong&gt;blast radius&lt;/strong&gt;: how far a change reaches through your call graph, how much persistent state it touches, and how well-tested it is. A 3-line change to a shared auth check can outrank a 300-line UI tweak. Your team's attention goes to the highest-risk code first, not spread evenly across every diff.&lt;/p&gt;


  
    
    &lt;span class="m-1"&gt;blast-radius-demo.mp4&lt;/span&gt;
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview's Blast Radius &amp;amp; Review Priority scoring, live in the diff viewer.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;The exact math, not a black box&lt;/th&gt;

&lt;th&gt;Visualize blast radius at a glance&lt;/th&gt;

&lt;th&gt;Every factor that feeds the score&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-3.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-3.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-4.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-4.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-2.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-2.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;br&gt;
&lt;p&gt;&lt;/p&gt;

How does Blast Radius scoring work? (a more technical explanation)

&lt;p&gt;&lt;strong&gt;Here's the goal:&lt;/strong&gt;&lt;/p&gt;


&lt;ul&gt;

&lt;li&gt;A 3-line fix in a function used by 40 other files, that also writes to a database, should score high.&lt;/li&gt;

&lt;li&gt;A 300-line UI change in one file, fully covered by tests…&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Jev Can Make Decisions. But How Do You Work With It?</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Sat, 10 Oct 2026 21:04:19 +0000</pubDate>
      <link>https://dev.to/rijultp/jev-can-make-decisions-but-how-do-you-work-with-it-3p2h</link>
      <guid>https://dev.to/rijultp/jev-can-make-decisions-but-how-do-you-work-with-it-3p2h</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;In the &lt;a href="https://dev.to/rijultp/ai-can-generate-paragraphs-but-what-if-you-just-need-a-decision-meet-jev-4lfm"&gt;previous article&lt;/a&gt;, we explored the basic concepts behind Jev and its three decision types: Choice, Score, and Noul.&lt;/p&gt;

&lt;p&gt;Now, let's look at how to work with Jev more effectively. We'll cover the kind of input it accepts, how to structure a request, how multiple questions are evaluated, and how to design Choice questions that avoid forced or misleading answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understanding State
&lt;/h2&gt;

&lt;p&gt;In Jev, &lt;strong&gt;state is the information the model uses to evaluate your questions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A state can be provided in three formats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;String:&lt;/strong&gt; Plain text, such as a customer message or incident report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON object:&lt;/strong&gt; Structured information containing fields such as an order ID, customer status, or error message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Array:&lt;/strong&gt; A collection of context items that provide information for a decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a customer support application might provide this state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My payment failed, but I was charged twice."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"account_status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"previous_contact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"No previous complaints"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Jev can use this information to answer questions about the customer's issue, account, or next steps.&lt;/p&gt;

&lt;p&gt;However, Jev is a text-based model. It does not directly accept images, audio, video, or other binary inputs as state. If your application receives these formats, you need to extract relevant information into text or structured data before sending it to Jev.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Understanding Request Anatomy
&lt;/h2&gt;

&lt;p&gt;A Jev request consists of three main components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;model&lt;/code&gt;: The Jev model you want to use.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;state&lt;/code&gt;: The information the model should evaluate.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;questions&lt;/code&gt;: A map of named questions you want answered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each question has its own identifier and definition. The identifier helps your application locate the corresponding answer in the response.&lt;/p&gt;

&lt;p&gt;Here's an example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jev-latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"customer_message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My payment failed, but I was charged twice."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"questions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"issue_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"choice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What is the primary issue?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"criteria"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Payment failures, duplicate charges, or refunds"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"technical"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Application errors or technical failures"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Account access or account management issues"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"other"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The issue does not fit any of the other categories"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"needs_follow_up"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"noul"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Does this customer need a follow-up from support?"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In this example, the request contains two questions about the same customer message.&lt;/p&gt;

&lt;p&gt;The first uses Choice to classify the issue. The second uses Noul to evaluate whether follow-up is needed.&lt;/p&gt;

&lt;p&gt;Notice that each question has its own &lt;code&gt;type&lt;/code&gt; and &lt;code&gt;instructions&lt;/code&gt;. Choice uses a &lt;code&gt;criteria&lt;/code&gt; field to define the available options. Score uses criteria to define an ordered scale, while Noul can evaluate a yes-or-no question without requiring criteria.&lt;/p&gt;

&lt;p&gt;This structure lets you define multiple decisions in one request rather than making a separate request for every question.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Parallel, Independent Evaluation
&lt;/h2&gt;

&lt;p&gt;Jev can evaluate multiple questions in the same request. However, &lt;strong&gt;each question is evaluated independently against the shared state.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This means one question does not receive another question's answer as additional context.&lt;/p&gt;

&lt;p&gt;Consider an AI agent that needs to process a customer support ticket. You might want it to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify the issue type.&lt;/li&gt;
&lt;li&gt;Determine its severity.&lt;/li&gt;
&lt;li&gt;Decide whether it needs human intervention.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can ask all three questions in one request. But the severity question cannot use the answer from the issue classification question, and the escalation question cannot inspect the severity answer.&lt;/p&gt;

&lt;p&gt;Each question evaluates the original state independently. &lt;/p&gt;
&lt;h3&gt;
  
  
  Why does this matter?
&lt;/h3&gt;

&lt;p&gt;Suppose your application should escalate a ticket when its severity reaches the high-severity threshold.&lt;/p&gt;

&lt;p&gt;You cannot assume that asking Jev to classify the issue and score its severity will automatically connect those answers. Instead, your application needs to combine the returned values and apply the escalation rule.&lt;/p&gt;

&lt;p&gt;For example, if your Score scale defines &lt;code&gt;2&lt;/code&gt; as the severe level:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example scale: 0 = minor, 1 = moderate, 2 = severe
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;escalate_to_human&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Here, the application makes the final decision using the returned score. If the scale allows values between defined levels, establish and test the threshold against representative examples before using it in production.&lt;/p&gt;

&lt;p&gt;If a later question genuinely depends on an earlier answer, use a second request with the relevant result included in its state. Alternatively, combine independent answers in your application code when a second model evaluation is unnecessary.&lt;/p&gt;

&lt;p&gt;The key principle is to separate &lt;strong&gt;evaluating individual questions&lt;/strong&gt; from &lt;strong&gt;combining their answers into a workflow&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Designing Better Choice Questions
&lt;/h2&gt;

&lt;p&gt;Choice is useful when you need to select one answer from a predefined set of options.&lt;/p&gt;

&lt;p&gt;However, the quality of the result depends partly on how you define those options.&lt;/p&gt;

&lt;p&gt;Consider this example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"choice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What is the primary issue?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"criteria"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Payment failures or duplicate charges"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"technical"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Software bugs or application errors"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Login or account access problems"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;What happens if a customer asks about a shipping delay?&lt;/p&gt;

&lt;p&gt;None of these options fits the issue. Without a suitable fallback, the model may still select one of the available options, producing a misleading classification.&lt;/p&gt;
&lt;h3&gt;
  
  
  Include an "other" or "none" option
&lt;/h3&gt;

&lt;p&gt;When your predefined choices might not cover every possible input, include a fallback option.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"choice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What is the primary issue?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"criteria"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Payment failures or duplicate charges"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"technical"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Software bugs or application errors"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Login or account access problems"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"other"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The issue does not fit any of the categories above"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now, the application has an option for issues that fall outside the expected categories.&lt;/p&gt;

&lt;p&gt;This is especially useful when processing real-world data, where customer messages and other inputs may not always fit neatly into predefined classifications.&lt;/p&gt;
&lt;h3&gt;
  
  
  Make the options distinct
&lt;/h3&gt;

&lt;p&gt;A fallback option is only one part of good question design. The other options should also be clearly distinguishable.&lt;/p&gt;

&lt;p&gt;For example, if both &lt;code&gt;billing&lt;/code&gt; and &lt;code&gt;account&lt;/code&gt; include subscription problems, Jev may have difficulty distinguishing between them.&lt;/p&gt;

&lt;p&gt;Define each option in terms of what it covers, and avoid unnecessary overlap. If two options represent different outcomes, their descriptions should make that difference clear.&lt;/p&gt;

&lt;p&gt;Remember that Choice selects from the options you provide. It does not automatically expand the list when an unexpected case appears.&lt;/p&gt;
&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Working with Jev involves more than choosing between Choice, Score, and Noul. You also need to structure the state, define each question clearly, and understand how the answers relate to one another.&lt;/p&gt;

&lt;p&gt;Keep these principles in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide the relevant context through a string, JSON object, or array of context items.&lt;/li&gt;
&lt;li&gt;Give every question clear instructions and the appropriate criteria.&lt;/li&gt;
&lt;li&gt;Treat questions in the same request as independent evaluations.&lt;/li&gt;
&lt;li&gt;Combine their answers in your application when a workflow requires multiple decisions.&lt;/li&gt;
&lt;li&gt;Include an &lt;code&gt;other&lt;/code&gt; or &lt;code&gt;none&lt;/code&gt; option when your Choice categories may not cover every case.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these basics in place, you can build more controlled decision workflows around Jev while keeping the application logic under your control. Clear instructions and well-defined options can help, but they do not guarantee correct decisions. Evaluate your workflow against labelled examples before deployment, and continue monitoring its performance as real-world inputs change.&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Blast-Radius Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Risk-Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;LiveReview is an AI code reviewer that scores every hunk of a diff by &lt;strong&gt;blast radius&lt;/strong&gt;: how far a change reaches through your call graph, how much persistent state it touches, and how well-tested it is. A 3-line change to a shared auth check can outrank a 300-line UI tweak. Your team's attention goes to the highest-risk code first, not spread evenly across every diff.&lt;/p&gt;


  
    
    &lt;span class="m-1"&gt;blast-radius-demo.mp4&lt;/span&gt;
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview's Blast Radius &amp;amp; Review Priority scoring, live in the diff viewer.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;The exact math, not a black box&lt;/th&gt;

&lt;th&gt;Visualize blast radius at a glance&lt;/th&gt;

&lt;th&gt;Every factor that feeds the score&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-3.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-3.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-4.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-4.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-2.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-2.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;br&gt;
&lt;p&gt;&lt;/p&gt;

How does Blast Radius scoring work? (a more technical explanation)

&lt;p&gt;&lt;strong&gt;Here's the goal:&lt;/strong&gt;&lt;/p&gt;


&lt;ul&gt;

&lt;li&gt;A 3-line fix in a function used by 40 other files, that also writes to a database, should score high.&lt;/li&gt;

&lt;li&gt;A 300-line UI change in one file, fully covered by tests…&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>jev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>AI Can Generate Paragraphs. But What If You Just Need a Decision? Meet Jev</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Fri, 09 Oct 2026 17:56:47 +0000</pubDate>
      <link>https://dev.to/rijultp/ai-can-generate-paragraphs-but-what-if-you-just-need-a-decision-meet-jev-4lfm</link>
      <guid>https://dev.to/rijultp/ai-can-generate-paragraphs-but-what-if-you-just-need-a-decision-meet-jev-4lfm</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;There’s a new AI model that’s been getting people talking, and you might have heard of it. It’s called Jev.&lt;/p&gt;

&lt;p&gt;But what exactly is Jev, and what makes it different from the general-purpose LLMs we use every day?&lt;/p&gt;

&lt;p&gt;Let’s take a look at what Jev is all about.&lt;/p&gt;

&lt;p&gt;Jev is an AI model from TypeSafe AI designed to make structured decisions rather than generate long-form text.&lt;/p&gt;

&lt;p&gt;To understand why it exists, let's start with a simple problem.&lt;/p&gt;

&lt;p&gt;Imagine you're building an application that receives 100,000 customer messages. For every message, your application needs to decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this a billing problem?&lt;/li&gt;
&lt;li&gt;Is this a technical problem?&lt;/li&gt;
&lt;li&gt;Is this an account problem?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could send every message to a general-purpose LLM like GPT and ask it to classify each message. But you're using a model capable of writing essays and generating code just to select one of three options.&lt;/p&gt;

&lt;p&gt;Jev is designed for this narrower kind of task: &lt;strong&gt;making decisions based on the information provided.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Three Things Jev Can Answer
&lt;/h3&gt;

&lt;p&gt;Jev provides three types of decisions called &lt;strong&gt;Choice, Score, and Noul&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Choice
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Which option is correct?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input:&lt;/strong&gt; "My payment failed, and I was charged twice."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Options:&lt;/strong&gt; &lt;code&gt;billing&lt;/code&gt;, &lt;code&gt;technical&lt;/code&gt;, &lt;code&gt;account&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example output:&lt;/strong&gt; &lt;code&gt;billing&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is useful when you need to classify information into a predefined set of options.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Score
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;How well does this fit a defined scale?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input:&lt;/strong&gt; "The production service is down for every customer."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale:&lt;/strong&gt; &lt;code&gt;0 = minor&lt;/code&gt;, &lt;code&gt;1 = moderate&lt;/code&gt;, &lt;code&gt;2 = severe&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example output:&lt;/strong&gt; &lt;code&gt;2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is useful when you need to evaluate something against a predefined scale.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Noul
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;How likely is a particular statement to be true?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input:&lt;/strong&gt; "The production service is down."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Question:&lt;/strong&gt; "Does this incident require immediate escalation?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example output:&lt;/strong&gt; &lt;code&gt;0.95&lt;/code&gt;, meaning a 95% estimated probability of a positive answer, assuming the output represents a calibrated probability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is useful when you need a structured answer to a specific question rather than a long explanation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Take Jev for a Spin
&lt;/h3&gt;

&lt;p&gt;The fastest way to try it is through the Jev Playground.&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://jevplayground.com/" rel="noopener noreferrer"&gt;https://jevplayground.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's an independent playground where you can experiment with Jev.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhrcovpzfzyttismgv1sa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhrcovpzfzyttismgv1sa.png" alt=" " width="799" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Score&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1xg8f6ezs0rq13qvevpx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1xg8f6ezs0rq13qvevpx.png" alt=" " width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Noul (Boolean)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9h6x0h9bicrc8pfubkjy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9h6x0h9bicrc8pfubkjy.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping Up
&lt;/h3&gt;

&lt;p&gt;So, that's Jev.&lt;/p&gt;

&lt;p&gt;For decision-based tasks in an AI agent, Jev could be an option to consider instead of relying entirely on general-purpose LLMs. Using a model designed for structured decisions can help diversify your setup and may make specific decision-making tasks more efficient.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Blast-Radius Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Blast-Radius Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;LiveReview is an AI code reviewer that scores every hunk of a diff by &lt;strong&gt;blast radius&lt;/strong&gt;: how far a change reaches through your call graph, how much persistent state it touches, and how well-tested it is. A 3-line change to a shared auth check can outrank a 300-line UI tweak. Your team's attention goes to the highest-risk code first, not spread evenly across every diff.&lt;/p&gt;

  
    
    &lt;span class="m-1"&gt;blast-radius-demo.mp4&lt;/span&gt;
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview's Blast Radius &amp;amp; Review Priority scoring, live in the diff viewer.&lt;/i&gt;&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The exact math, not a black box&lt;/th&gt;
&lt;th&gt;Visualize blast radius at a glance&lt;/th&gt;
&lt;th&gt;Every factor that feeds the score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-3.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-3.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-4.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-4.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-2.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-2.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

How does Blast Radius scoring work? (a more technical explanation)
&lt;p&gt;&lt;strong&gt;Here's the goal:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 3-line fix in a function used by 40 other files, that also writes to a database, should score high.&lt;/li&gt;
&lt;li&gt;A 300-line UI change in one file, fully covered by…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jev</category>
      <category>ai</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What Makes a 3D Model Move? Understanding Animation Basics in Blender</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Wed, 07 Oct 2026 06:56:53 +0000</pubDate>
      <link>https://dev.to/rijultp/what-makes-a-3d-model-move-understanding-animation-basics-in-blender-4g7d</link>
      <guid>https://dev.to/rijultp/what-makes-a-3d-model-move-understanding-animation-basics-in-blender-4g7d</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;In this article, we will explore how you can animate anything in Blender.&lt;/p&gt;

&lt;p&gt;Before that, we need to understand an important concept called &lt;strong&gt;keyframes&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a Keyframe?
&lt;/h2&gt;

&lt;p&gt;Suppose you want to animate a cube by moving it from point A, to point B, and then to point C.&lt;/p&gt;

&lt;p&gt;There are three points where we want the cube to move.&lt;/p&gt;

&lt;p&gt;In software like Blender, we can set these positions as &lt;strong&gt;keyframes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When the animation is played, Blender calculates the movement between these keyframes, creating the in-between animation as the cube moves from point A to point B and then to point C.&lt;/p&gt;

&lt;p&gt;Let's start keyframing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Add a Keyframe in Blender
&lt;/h2&gt;

&lt;p&gt;First, select the object you want to animate. For this simple example, I will select a cube.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo0ijpnbnq5h5grtok6x0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo0ijpnbnq5h5grtok6x0.png" alt=" " width="799" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now press &lt;strong&gt;I&lt;/strong&gt; to insert a keyframe.&lt;/p&gt;

&lt;p&gt;Once you have inserted it, you can see the keyframe in the timeline below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvrc3dfaw1vug6gnzzmvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvrc3dfaw1vug6gnzzmvu.png" alt=" " width="799" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Simple Moving Animation
&lt;/h2&gt;

&lt;p&gt;Let's start with a simple moving animation.&lt;/p&gt;

&lt;p&gt;I want to animate the cube moving along the X axis.&lt;/p&gt;

&lt;p&gt;In the timeline, you can see that the first keyframe is placed at the 0th frame.&lt;/p&gt;

&lt;p&gt;My goal is to make the cube move towards the right by the end of the 10th frame.&lt;/p&gt;

&lt;p&gt;I have moved the playhead to the 10th frame.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhlgg8z6ek7vspdiuir3d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhlgg8z6ek7vspdiuir3d.png" alt=" " width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now go to the cube, press &lt;strong&gt;G&lt;/strong&gt;, and then &lt;strong&gt;X&lt;/strong&gt; to move it along the X axis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0qzrhxmohvdwny0ta3pi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0qzrhxmohvdwny0ta3pi.png" alt=" " width="799" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you notice, on the right, you can see &lt;strong&gt;Location X&lt;/strong&gt; highlighted in orange.&lt;/p&gt;

&lt;p&gt;This means the change has not been added as a keyframe yet.&lt;/p&gt;

&lt;p&gt;So let's apply it by pressing &lt;strong&gt;I&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now the keyframe is added, and the orange turns yellow, indicating that a keyframe has been added.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flhdyn541hcq5mr977rpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flhdyn541hcq5mr977rpi.png" alt=" " width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's play our newly created animation.&lt;/p&gt;

&lt;p&gt;Move the playhead back to the beginning and press play.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fna3d4b7xx0izmxzns7sa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fna3d4b7xx0izmxzns7sa.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The block has come to life.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7gmpbs76kagyuqt9ll2p.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7gmpbs76kagyuqt9ll2p.gif" alt=" " width="799" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Animating a Rigged Model
&lt;/h2&gt;

&lt;p&gt;Now let's try animating a rigged model.&lt;/p&gt;

&lt;p&gt;I rigged this model in my &lt;a href="https://dev.to/rijultp/how-do-you-bring-a-3d-character-to-life-6-steps-to-rigging-in-blender-38gn"&gt;previous article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1s2zqj2ugrb4m181nmpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1s2zqj2ugrb4m181nmpd.png" alt=" " width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I want to make him wave.&lt;/p&gt;

&lt;p&gt;So I select his lower arm and add a keyframe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh7noi8fa22t7vh3ljqyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh7noi8fa22t7vh3ljqyo.png" alt=" " width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, after 10 frames, I want to move his arm a bit.&lt;/p&gt;

&lt;p&gt;So I select the bone and rotate it after 10 frames.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2qgeanmx8c4hpu3lfusr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2qgeanmx8c4hpu3lfusr.png" alt=" " width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, I have to mark the keyframe by pressing &lt;strong&gt;I&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Again, I need to create a back-and-forth effect. In the 20th frame, I rotate his arm to the rightmost position.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1cg7kcj0mgwyysbuqlyc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1cg7kcj0mgwyysbuqlyc.png" alt=" " width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One back-and-forth movement is done.&lt;/p&gt;

&lt;p&gt;If I want to move his hand back to the left, I don't need to rotate it manually. I can simply copy the keyframe from frame 10 and paste it into frame 30.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpywblavxj4citv0wkc0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpywblavxj4citv0wkc0c.png" alt=" " width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's play the animation now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx4z3tb8jrezegr3cjueo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx4z3tb8jrezegr3cjueo.gif" alt=" " width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;So this is the basic idea behind animation in Blender.&lt;/p&gt;

&lt;p&gt;We alter the position, rotation, scale, or other properties of an object, mark the changes as keyframes in the timeline, and Blender creates the animation between them.&lt;/p&gt;

&lt;p&gt;See you in the next article.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Blast-Radius Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Blast-Radius Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;LiveReview is an AI code reviewer that scores every hunk of a diff by &lt;strong&gt;blast radius&lt;/strong&gt;: how far a change reaches through your call graph, how much persistent state it touches, and how well-tested it is. A 3-line change to a shared auth check can outrank a 300-line UI tweak. Your team's attention goes to the highest-risk code first, not spread evenly across every diff.&lt;/p&gt;

  
    
    &lt;span class="m-1"&gt;blast-radius-demo.mp4&lt;/span&gt;
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview's Blast Radius &amp;amp; Review Priority scoring, live in the diff viewer.&lt;/i&gt;&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The exact math, not a black box&lt;/th&gt;
&lt;th&gt;Visualize blast radius at a glance&lt;/th&gt;
&lt;th&gt;Every factor that feeds the score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-3.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-3.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-4.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-4.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-2.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-2.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

How does Blast Radius scoring work? (a more technical explanation)
&lt;p&gt;&lt;strong&gt;Here's the goal:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 3-line fix in a function used by 40 other files, that also writes to a database, should score high.&lt;/li&gt;
&lt;li&gt;A 300-line UI change in one file, fully covered by…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blender</category>
      <category>3d</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How Do You Bring a 3D Character to Life? 6 Steps to Rigging in Blender</title>
      <dc:creator>Rijul Rajesh</dc:creator>
      <pubDate>Tue, 06 Oct 2026 05:55:32 +0000</pubDate>
      <link>https://dev.to/rijultp/how-do-you-bring-a-3d-character-to-life-6-steps-to-rigging-in-blender-38gn</link>
      <guid>https://dev.to/rijultp/how-do-you-bring-a-3d-character-to-life-6-steps-to-rigging-in-blender-38gn</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Rijul, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. &lt;a href="https://github.com/HexmosTech/LiveReview/" rel="noopener noreferrer"&gt;Star us&lt;/a&gt; to help devs discover the project, give it a try, and share your feedback to help improve the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;In this article, I'll show you how to rig a character model in Blender.&lt;/p&gt;

&lt;p&gt;You can imagine rigging like adding a &lt;strong&gt;skeleton inside a character&lt;/strong&gt;. The bones give you something to control so you can move different parts of the model and eventually animate it.&lt;/p&gt;

&lt;p&gt;So, rigging is essential when you want to move parts of a character around or animate it.&lt;/p&gt;

&lt;p&gt;I'm starting with a simple character model here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5jocrvaur3trz4v4094r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5jocrvaur3trz4v4094r.png" alt=" " width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add the First Armature
&lt;/h2&gt;

&lt;p&gt;First, we need to add an armature.&lt;/p&gt;

&lt;p&gt;Press &lt;strong&gt;Shift + A&lt;/strong&gt; to add a new object.&lt;/p&gt;

&lt;p&gt;Then click &lt;strong&gt;Armature&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3565p4tzak03sbhrvwg1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3565p4tzak03sbhrvwg1.png" alt=" " width="502" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have added a bone now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpxeeeareorj5ehex4s4j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpxeeeareorj5ehex4s4j.png" alt=" " width="800" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I want the bone to always be visible, so click the bone, go to &lt;strong&gt;Data&lt;/strong&gt;, open &lt;strong&gt;Viewport Display&lt;/strong&gt;, and check &lt;strong&gt;In Front&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcqsgekklb0iaoxh9rsu9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcqsgekklb0iaoxh9rsu9.png" alt=" " width="353" height="787"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding a Bone
&lt;/h3&gt;

&lt;p&gt;A bone has three main parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Head&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tail&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv6pw8vfp8kkw4gtoj2yj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv6pw8vfp8kkw4gtoj2yj.png" alt=" " width="630" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let's move this bone into the torso.&lt;/p&gt;

&lt;p&gt;Press &lt;strong&gt;Tab&lt;/strong&gt; to go into Edit Mode.&lt;/p&gt;

&lt;p&gt;Select the bone and press &lt;strong&gt;S&lt;/strong&gt; to scale it down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo5n5gmleq1ms15v54ff5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo5n5gmleq1ms15v54ff5.png" alt=" " width="798" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then press &lt;strong&gt;G&lt;/strong&gt; to move it up.&lt;/p&gt;

&lt;p&gt;The bone now becomes the first bone in the torso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flqt14tnl79zqu1vlfvep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flqt14tnl79zqu1vlfvep.png" alt=" " width="736" height="771"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Spine
&lt;/h2&gt;

&lt;p&gt;Let's add the second bone.&lt;/p&gt;

&lt;p&gt;Select the tail of the bone and press &lt;strong&gt;E&lt;/strong&gt; to extrude.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi5seqe92r3m0rscohza2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi5seqe92r3m0rscohza2.png" alt=" " width="712" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let's add the neck.&lt;/p&gt;

&lt;p&gt;Press &lt;strong&gt;E&lt;/strong&gt; to extrude again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvwqufpfom2n0p5pr28r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvwqufpfom2n0p5pr28r.png" alt=" " width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repeat the same process for the head.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzggpfbomubva47a76xe6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzggpfbomubva47a76xe6.png" alt=" " width="799" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding the Arms and Hips
&lt;/h2&gt;

&lt;p&gt;Now let's add the arms.&lt;/p&gt;

&lt;p&gt;Extrude the bones like before, and you can get something like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6zhobu6cs39rsjnym0pz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6zhobu6cs39rsjnym0pz.png" alt=" " width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's add the hips now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp5e4i0pa7cyv2e8b80do.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp5e4i0pa7cyv2e8b80do.png" alt=" " width="800" height="694"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We now have the bones on one side, but we need the same structure on the other side.&lt;/p&gt;

&lt;p&gt;Click this button to apply the changes to the matching bones on the opposite side of the axis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxag5vm0s60rjj4285ojo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxag5vm0s60rjj4285ojo.png" alt=" " width="537" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Naming the Bones
&lt;/h2&gt;

&lt;p&gt;We also need to name our bones properly.&lt;/p&gt;

&lt;p&gt;A common naming convention is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bone_name.l&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here, &lt;code&gt;.l&lt;/code&gt; stands for &lt;strong&gt;left&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Select the bone, press &lt;strong&gt;F2&lt;/strong&gt; to rename it, and follow the naming convention.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fflaevdei7hej9iurt3ms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fflaevdei7hej9iurt3ms.png" alt=" " width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After renaming the bones, select the entire armature by pressing &lt;strong&gt;A&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmaijvctz7j3kb690nk0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmaijvctz7j3kb690nk0d.png" alt=" " width="799" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then right-click and press &lt;strong&gt;Symmetrize&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3he3y2ziqiv6tb1dw5f1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3he3y2ziqiv6tb1dw5f1.png" alt=" " width="632" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We now have the same changes on the other side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhfu55eb9g7g3bd5tuisi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhfu55eb9g7g3bd5tuisi.png" alt=" " width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding the Legs
&lt;/h2&gt;

&lt;p&gt;Now let's create the legs just like before.&lt;/p&gt;

&lt;p&gt;Switch between the views to get better positioning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl35jczvjv8olo6jvzpu1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl35jczvjv8olo6jvzpu1.png" alt=" " width="654" height="678"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9q3bpq2fblnirlx71ruf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9q3bpq2fblnirlx71ruf.png" alt=" " width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Parenting the Model
&lt;/h2&gt;

&lt;p&gt;We now need to attach the bones to the body.&lt;/p&gt;

&lt;p&gt;Switch to Object Mode.&lt;/p&gt;

&lt;p&gt;First, select the body, and then select the bones.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbiu9gfa342ke5h8nu1mm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbiu9gfa342ke5h8nu1mm.png" alt=" " width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Press &lt;strong&gt;Ctrl + P&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe9zosv4qsu9kmqd668n8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe9zosv4qsu9kmqd668n8.png" alt=" " width="680" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then click &lt;strong&gt;With Automatic Weights&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This tells Blender to automatically determine how the character's mesh should move when we move the bones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time to Pose
&lt;/h2&gt;

&lt;p&gt;Now let's see if our rig actually works.&lt;/p&gt;

&lt;p&gt;Click the armature and switch to &lt;strong&gt;Pose Mode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can use &lt;strong&gt;Ctrl + Tab&lt;/strong&gt; to switch modes.&lt;/p&gt;

&lt;p&gt;Now select any bone and change the pose.&lt;/p&gt;

&lt;p&gt;For example, select the upper arm, press &lt;strong&gt;R&lt;/strong&gt;, and rotate it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F21wv3vzt7emu1o20ucr7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F21wv3vzt7emu1o20ucr7.png" alt=" " width="799" height="690"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now try out different poses with the rig.&lt;/p&gt;

&lt;p&gt;And with that, our basic rigging is complete.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fze7coeomq4udi4fc2opy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fze7coeomq4udi4fc2opy.png" alt=" " width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can pair this up with animations as well.&lt;/p&gt;

&lt;p&gt;See you in the next article.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;br&gt;
Your team's attention is limited, and the deluge of AI-generated code is making it harder to keep production reliable and secure without slowing you down.&lt;/em&gt;&lt;/p&gt;
&lt;em&gt;

&lt;p&gt;I'm building &lt;strong&gt;LiveReview&lt;/strong&gt;, a blast-radius aware AI code review built for your business-critical systems.&lt;/p&gt;

&lt;p&gt;Instead of presenting every diff with equal emphasis, &lt;strong&gt;LiveReview scores each change by blast radius — how far its impact reaches through your call graph — so you can focus attention where it actually matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spend code review effort where business risk is highest — not spread evenly across every diff.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HexmosTech" rel="noopener noreferrer"&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;
        LiveReview
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Blast-Radius Aware AI Code Review for Business-Critical Systems
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/png/logo-with-text.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fpng%2Flogo-with-text.png" alt="LiveReview" height="80"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/LiveReview/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml" rel="noopener noreferrer"&gt;&lt;img alt="osv-scanner.yml" title="osv-scanner.yml: Dependency vulnerability scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/LiveReview/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml" rel="noopener noreferrer"&gt;&lt;img alt="semgrep.yml" title="semgrep.yml: Static analysis security scan" src="https://github.com/HexmosTech/LiveReview/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/gfx/dependabot-enabled.svg"&gt;&lt;img alt="dependabot-enabled" title="dependabot-enabled: Automated dependency updates are enabled" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml" rel="noopener noreferrer"&gt;&lt;img alt="mcp-testcases.yml" title="mcp-testcases.yml: MCP integration test suite" src="https://github.com/HexmosTech/LiveReview/actions/workflows/mcp-testcases.yml/badge.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LiveReview: Blast-Radius Aware AI Code Review for Business-Critical Systems&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;LiveReview is an AI code reviewer that scores every hunk of a diff by &lt;strong&gt;blast radius&lt;/strong&gt;: how far a change reaches through your call graph, how much persistent state it touches, and how well-tested it is. A 3-line change to a shared auth check can outrank a 300-line UI tweak. Your team's attention goes to the highest-risk code first, not spread evenly across every diff.&lt;/p&gt;

  
    
    &lt;span class="m-1"&gt;blast-radius-demo.mp4&lt;/span&gt;
  

  

  


&lt;p&gt;&lt;i&gt;LiveReview's Blast Radius &amp;amp; Review Priority scoring, live in the diff viewer.&lt;/i&gt;&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The exact math, not a black box&lt;/th&gt;
&lt;th&gt;Visualize blast radius at a glance&lt;/th&gt;
&lt;th&gt;Every factor that feeds the score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-3.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-3.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-4.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-4.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/LiveReview/./assets/screenshots/blast-radius/new-risk-score-2.webp"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHexmosTech%2FLiveReview%2FHEAD%2F.%2Fassets%2Fscreenshots%2Fblast-radius%2Fnew-risk-score-2.webp" width="280"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

How does Blast Radius scoring work? (a more technical explanation)
&lt;p&gt;&lt;strong&gt;Here's the goal:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 3-line fix in a function used by 40 other files, that also writes to a database, should score high.&lt;/li&gt;
&lt;li&gt;A 300-line UI change in one file, fully covered by…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HexmosTech/LiveReview" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;b&gt;Click below to try LiveReview with your codebase:&lt;/b&gt;&lt;/p&gt;

&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hexmos.com/livereview" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvls0pq7nymbrll98je6s.png" alt="LiveReview Banner" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blender</category>
      <category>learning</category>
      <category>3d</category>
    </item>
  </channel>
</rss>
