<?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: Shrijith Venkatramana</title>
    <description>The latest articles on DEV Community by Shrijith Venkatramana (@shrsv).</description>
    <link>https://dev.to/shrsv</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1001514%2F17b7d334-44b1-417a-9268-346e6a34988a.jpg</url>
      <title>DEV Community: Shrijith Venkatramana</title>
      <link>https://dev.to/shrsv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shrsv"/>
    <language>en</language>
    <item>
      <title>Understanding AI Code Fast: A 60-Second Habit for Institutional Memory</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Thu, 21 May 2026 09:45:03 +0000</pubDate>
      <link>https://dev.to/shrsv/understanding-ai-code-fast-a-60-second-habit-for-institutional-memory-214</link>
      <guid>https://dev.to/shrsv/understanding-ai-code-fast-a-60-second-habit-for-institutional-memory-214</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Shrijith Venkatramana. I'm building git-lrc, an AI code reviewer that runs on every commit. &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;Star Us&lt;/a&gt; to help devs discover the project. Do give it a try and share your feedback for improving the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you prefer watching a video version of this article, check out:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/jTNJXY686co"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;We are all participating in the agent era. New methodologies, ideas, experiments, and approaches are being discovered by engineers, professionals, and enthusiasts all over the world.&lt;/p&gt;

&lt;p&gt;So many new things are happening in AI, and I am particularly interested in software engineering and its future, not the way it exists today, but the way it is evolving.&lt;/p&gt;

&lt;p&gt;This article explores that question through the lens of &lt;em&gt;Understanding AI Code Fast: A 60-Second Habit for Institutional Memory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Many people think the details do not matter. Many others think they do. There is a lot of debate around this, so I want to present my perspective and a few approaches that teams may be able to adopt and benefit from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do We Need to Read AI-Generated Code?
&lt;/h2&gt;

&lt;p&gt;The foundational question is simple: does one need to read AI-generated code or not?&lt;/p&gt;

&lt;p&gt;Right now, many people claim that you may not need to read it at all. A common comparison is assembly language: once C arrived, most developers no longer needed to read assembly for everyday work.&lt;/p&gt;

&lt;p&gt;But that comparison is tricky. We prompt LLM agents, and LLM agents produce code. Yet from the code alone, I cannot derive the prompts that generated it.&lt;/p&gt;

&lt;p&gt;I may use a one-line prompt or a ten-line prompt, and they may generate different things. The same model may also generate different things across different invocations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production Systems and Responsibility
&lt;/h2&gt;

&lt;p&gt;For anything that has a running production version and many users depending on it, uptime matters.&lt;/p&gt;

&lt;p&gt;It could be school software, marketing software, ERP software, or anything else. That makes this a serious question: what happens if something is wrong, who takes responsibility, and how do we recover?&lt;/p&gt;

&lt;p&gt;Agents may help us solve these issues as well, but what if the issue is slightly bigger?&lt;/p&gt;

&lt;p&gt;What if the agent makes a wrong architectural decision?&lt;/p&gt;

&lt;p&gt;What if it uses a reward hacking mechanism to solve the issue rather than solving it correctly?&lt;/p&gt;

&lt;p&gt;What if a shallow approach was taken to implement a new feature?&lt;/p&gt;

&lt;p&gt;Those questions naturally follow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two Failure Modes of AI-Assisted Programming
&lt;/h2&gt;

&lt;p&gt;In my opinion, there are two major failure modes here, and I call them the common traps of absolutes in AI-assisted programming.&lt;/p&gt;

&lt;p&gt;Before getting into the details, it is worth mentioning something from Sunny Mishra.&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.amazonaws.com%2Fuploads%2Farticles%2Fy4hiznji052xa8uj5r34.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.amazonaws.com%2Fuploads%2Farticles%2Fy4hiznji052xa8uj5r34.png" alt="sunny mishra quote" width="753" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a public post, he proposed an interesting idea. He has been an engineering manager for nearly a decade.&lt;/p&gt;

&lt;p&gt;Why not have a bot that checks engineers' Git commits, creates daily and weekly reports, identifies where help is needed, and provides automatic updates?&lt;/p&gt;

&lt;p&gt;In other words, get an agent to read all this information and report it back to the team.&lt;/p&gt;

&lt;p&gt;The loop being proposed looks like this:&lt;/p&gt;

&lt;p&gt;Prompt → Code → Summary → Back to the team.&lt;/p&gt;

&lt;p&gt;I call this an &lt;em&gt;awareness loop&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;He recognized that large amounts of code are being generated and many things are happening very quickly, so people need help understanding how things are getting implemented.&lt;/p&gt;

&lt;p&gt;Awareness is required.&lt;/p&gt;

&lt;p&gt;He did not say, “Read every line.” He said awareness is required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading Every Line vs Reading Nothing
&lt;/h2&gt;

&lt;p&gt;My view is that reading every line of code is no longer necessary in many situations because LLMs are genuinely good at many things.&lt;/p&gt;

&lt;p&gt;They are trustworthy for a large number of products that we typically deal with, and that is great.&lt;/p&gt;

&lt;p&gt;Suppose there is some UI code. Why should I check every detail if a button click simply triggers a modal? The agent can handle that. The same applies to tasks like configuring logs.&lt;/p&gt;

&lt;p&gt;As long as the prompt is written properly, the agent can do many of these tasks effectively.&lt;/p&gt;

&lt;p&gt;So I do not think reading everything is required anymore.&lt;/p&gt;

&lt;p&gt;But there are also people arguing the opposite extreme: “Do not read anything.” Stay entirely at the abstraction layer. Never go down into the implementation details.&lt;/p&gt;

&lt;p&gt;I think that is also dangerous.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Amazon “Dive Deep” Principle
&lt;/h2&gt;

&lt;p&gt;This is where an Amazon principle is useful.&lt;/p&gt;

&lt;p&gt;Amazon is famous for its leadership principles, and one of them is &lt;em&gt;Dive Deep.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At Amazon, leadership principles apply to everyone, from a new joiner to a senior executive.&lt;/p&gt;

&lt;p&gt;The principle says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Leaders operate at all levels, stay connected to the details, audit frequently, and are skeptical when metrics and anecdotes differ. No task is beneath them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You could be a VP managing hundreds of people, and you are still expected to understand what is happening underneath.&lt;/p&gt;

&lt;p&gt;You may operate at a high abstraction layer most of the time, but you still go down regularly, audit systems, inspect details, and remain skeptical.&lt;/p&gt;

&lt;p&gt;I believe this principle exists because polished dashboards are often insufficient.&lt;/p&gt;

&lt;p&gt;Right now, with tools like Claude Code, people are generating HTML reports and summaries automatically.&lt;/p&gt;

&lt;p&gt;But is the report sufficient? What is happening underneath? Should we not check occasionally and develop some intuitive understanding of the systems we depend on?&lt;/p&gt;

&lt;h2&gt;
  
  
  Awareness Culture vs Slumber Culture
&lt;/h2&gt;

&lt;p&gt;At the end of the day, I think organizations fall into two broad categories: an awareness culture or a slumber culture.&lt;/p&gt;

&lt;p&gt;Do you want your people to stay alert and proactive, or do you want them to ignore the details completely?&lt;/p&gt;

&lt;p&gt;And remember: code review is not really about code alone.&lt;/p&gt;

&lt;p&gt;When a team performs code review, it is building institutional memory.&lt;/p&gt;

&lt;p&gt;The team is gradually understanding how the system works. It is extremely important that at least a few people understand what a subsystem is doing.&lt;/p&gt;

&lt;p&gt;If nobody understands how anything works, then what happens when things go wrong and the agents are not capable enough to solve the issue?&lt;/p&gt;

&lt;p&gt;Auditing and intuitive understanding must evolve alongside agentic development.&lt;/p&gt;

&lt;p&gt;Both should progress together.&lt;/p&gt;

&lt;p&gt;Understanding should grow while automation also grows.&lt;/p&gt;

&lt;p&gt;That way, responsibility can be taken, risk can be signed off, and somebody knows enough about the system to deal with failures when they occur.&lt;/p&gt;

&lt;p&gt;And failures always occur.&lt;/p&gt;

&lt;p&gt;Outages happen.&lt;/p&gt;

&lt;p&gt;Customers get impacted.&lt;/p&gt;

&lt;p&gt;Architectural mistakes happen. Security problems happen. Performance issues happen.&lt;/p&gt;

&lt;p&gt;This is serious work.&lt;/p&gt;

&lt;p&gt;At the end of the day, all of this understanding is about maintaining a grip on the system and, therefore, on your future.&lt;/p&gt;

&lt;p&gt;Without that grip, your future becomes uncertain.&lt;/p&gt;

&lt;p&gt;That is the essence of the Amazon principle: dive deep, audit frequently, and keep checking.&lt;/p&gt;

&lt;p&gt;A dashboard may look good, but does it actually match reality underneath?&lt;/p&gt;

&lt;p&gt;You have to verify that continuously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git-lrc and the 60-Second Review Habit
&lt;/h2&gt;

&lt;p&gt;This brings me to a tool I am working on.&lt;/p&gt;

&lt;p&gt;It provides a deck-style summary system called &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;git-lrc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When you do a Git commit, it generates a slide-style review.&lt;/p&gt;

&lt;p&gt;It takes roughly 30 to 40 seconds to go through and inspect the code.&lt;/p&gt;

&lt;p&gt;So after &lt;code&gt;git add&lt;/code&gt; and &lt;code&gt;git commit&lt;/code&gt;, this summary appears locally.&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.amazonaws.com%2Fuploads%2Farticles%2Fr6v8k4xgwyofif94c1bj.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fr6v8k4xgwyofif94c1bj.gif" alt="visual summary" width="479" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It gives a concise explanation of what is happening in the codebase, along with the actual code itself.&lt;/p&gt;

&lt;p&gt;The code is not hidden.&lt;/p&gt;

&lt;p&gt;The issues in the code are not hidden either.&lt;/p&gt;

&lt;p&gt;An engineer may do this five or ten times a day, and over a month they may perform hundreds of these micro-reviews.&lt;/p&gt;

&lt;p&gt;This allows people to stay connected to what is happening underneath the system without having to read every line manually.&lt;/p&gt;

&lt;p&gt;git-lrc highlights what is relevant, what may be important, and what deserves attention.&lt;/p&gt;

&lt;p&gt;It provides a very fast summary, so there is minimal time waste while still giving assurance and confidence that nothing strange is happening.&lt;/p&gt;

&lt;p&gt;It also reduces the burden on senior engineers because reviews happen incrementally, commit by commit.&lt;/p&gt;

&lt;p&gt;As a result, institutional memory gets built continuously.&lt;/p&gt;

&lt;p&gt;Understanding accumulates over time.&lt;/p&gt;

&lt;p&gt;People can vouch for their own changes more confidently.&lt;/p&gt;

&lt;p&gt;You move quickly while still remaining relatively safe.&lt;/p&gt;

&lt;p&gt;That is the system we are building.&lt;/p&gt;

&lt;p&gt;We believe this roughly 60-second review habit can help reduce outages while improving institutional memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;That is the core idea I wanted to highlight.&lt;/p&gt;

&lt;p&gt;I recommend checking out &lt;a href="https://hexmos.com/git-lrc?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;hexmos.com/git-lrc&lt;/a&gt; and trying it out.&lt;/p&gt;

&lt;p&gt;Installation instructions are available, and there is also a free version.&lt;/p&gt;

&lt;p&gt;So give it a try.&lt;/p&gt;




&lt;p&gt;*AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.*&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It's online, source-available, and ready for anyone to use.&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/git-lrc" rel="noopener noreferrer"&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Micro AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;| &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.da.md" rel="noopener noreferrer"&gt;🇩🇰 Dansk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.es.md" rel="noopener noreferrer"&gt;🇪🇸 Español&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fa.md" rel="noopener noreferrer"&gt;🇮🇷 Farsi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fi.md" rel="noopener noreferrer"&gt;🇫🇮 Suomi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ja.md" rel="noopener noreferrer"&gt;🇯🇵 日本語&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.nn.md" rel="noopener noreferrer"&gt;🇳🇴 Norsk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.pt.md" rel="noopener noreferrer"&gt;🇵🇹 Português&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ru.md" rel="noopener noreferrer"&gt;🇷🇺 Русский&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.sq.md" rel="noopener noreferrer"&gt;🇦🇱 Shqip&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.zh.md" rel="noopener noreferrer"&gt;🇨🇳 中文&lt;/a&gt; |&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;img width="60" alt="git-lrc logo" src="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;git-lrc&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Free, Micro AI Code Reviews That Run on Commit&lt;/h2&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt" width="200" src="https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638"&gt;&lt;/a&gt;
 &lt;/p&gt;
&lt;br&gt;
&lt;a href="https://discord.gg/sGdnKwB3qq" rel="nofollow noopener noreferrer"&gt;
  &lt;img alt="Discord Community" src="https://camo.githubusercontent.com/b8f979318aaabc8dec512b9d4e6e2a12431fba3c8a3b8738e1a97a0722d4e4bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d436f6d6d756e6974792d3538363546323f6c6f676f3d646973636f7264266c6162656c436f6c6f723d7768697465"&gt;
&lt;/a&gt; &lt;a href="https://goreportcard.com/report/github.com/HexmosTech/git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Go Report Card" src="https://camo.githubusercontent.com/e74c0651c3ee9165a2ed01cb0f6842c494029960df30eb9c24cf622d3d21bf46/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f4865786d6f73546563682f6769742d6c7263"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/git-lrc/./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%2Fgit-lrc%2FHEAD%2F.%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;

  
    
    

    &lt;span class="m-1"&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
    
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Build a&lt;/strong&gt;…&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/git-lrc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>codereview</category>
      <category>institutionalmemory</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Dependent Types for Programmers: A Practical Introduction Using Lean 4</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Tue, 19 May 2026 16:52:47 +0000</pubDate>
      <link>https://dev.to/shrsv/dependent-types-for-programmers-a-practical-introduction-using-lean-4-g9</link>
      <guid>https://dev.to/shrsv/dependent-types-for-programmers-a-practical-introduction-using-lean-4-g9</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Shrijith Venkatramana. I'm building git-lrc, an AI code reviewer that runs on every commit. &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;Star Us&lt;/a&gt; to help devs discover the project. Do give it a try and share your feedback for improving the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you are learning Lean 4, sooner or later you encounter something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;Vec&lt;/span&gt; : &lt;span class="kt"&gt;Type&lt;/span&gt; &lt;span class="o"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt; &lt;span class="o"&gt;→&lt;/span&gt; &lt;span class="kt"&gt;Type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And suddenly the tutorials start talking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proofs,&lt;/li&gt;
&lt;li&gt;propositions,&lt;/li&gt;
&lt;li&gt;type theory,&lt;/li&gt;
&lt;li&gt;dependent types,&lt;/li&gt;
&lt;li&gt;Curry–Howard correspondence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many programmers, this is where things become foggy.&lt;/p&gt;

&lt;p&gt;The strange thing is that the underlying idea is actually very practical.&lt;/p&gt;

&lt;p&gt;Dependent types are fundamentally about this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;making more program assumptions visible to the compiler.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article builds the idea gradually from an ordinary programmer’s mental model.&lt;/p&gt;
&lt;h1&gt;
  
  
  The Normal Way We Think About Types
&lt;/h1&gt;

&lt;p&gt;In most languages, we think of types like categories.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;42 : Int
"hello" : String
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A type tells us what kind of value something is.&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 plaintext"&gt;&lt;code&gt;List&amp;lt;Int&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“a list of integers.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But notice what the type does &lt;em&gt;not&lt;/em&gt; tell us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how many integers,&lt;/li&gt;
&lt;li&gt;whether the list is empty,&lt;/li&gt;
&lt;li&gt;whether it is sorted,&lt;/li&gt;
&lt;li&gt;whether it has been validated,&lt;/li&gt;
&lt;li&gt;whether authentication has happened,&lt;/li&gt;
&lt;li&gt;whether certain invariants hold.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;comments,&lt;/li&gt;
&lt;li&gt;runtime checks,&lt;/li&gt;
&lt;li&gt;tests,&lt;/li&gt;
&lt;li&gt;conventions,&lt;/li&gt;
&lt;li&gt;assumptions.&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  The Core Idea of Dependent Types
&lt;/h1&gt;

&lt;p&gt;Dependent types change one thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;types are allowed to depend on values.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why they are called &lt;em&gt;dependent&lt;/em&gt; types.&lt;/p&gt;

&lt;p&gt;Normally:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;values belong to types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With dependent types:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;values can also appear inside types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That sounds abstract initially, but the examples make it much clearer.&lt;/p&gt;
&lt;h1&gt;
  
  
  Understanding &lt;code&gt;Vec Nat 3&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Suppose you see:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;Vec&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“a vector containing exactly 3 natural numbers.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Break it apart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Vec&lt;/code&gt; → vector type constructor&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Nat&lt;/code&gt; → element type&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;3&lt;/code&gt; → required length&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;the length is part of the type itself
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;So these are different types:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;Vec&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;Vec&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The compiler can distinguish them.&lt;/p&gt;

&lt;p&gt;That is the conceptual shift.&lt;/p&gt;
&lt;h1&gt;
  
  
  “But C Arrays Already Have Sizes”
&lt;/h1&gt;

&lt;p&gt;Good observation.&lt;/p&gt;

&lt;p&gt;C already gets somewhat close:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;So what makes dependent typing different?&lt;/p&gt;

&lt;p&gt;The difference is that the values become usable inside the type system itself.&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 lean"&gt;&lt;code&gt;&lt;span class="n"&gt;append&lt;/span&gt; : &lt;span class="n"&gt;Vec&lt;/span&gt; α &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Vec&lt;/span&gt; α &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Vec&lt;/span&gt; α (&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;appending a vector of size &lt;code&gt;n&lt;/code&gt;&lt;br&gt;
to a vector of size &lt;code&gt;m&lt;/code&gt;&lt;br&gt;
produces a vector of size &lt;code&gt;n + m&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The type system is now reasoning symbolically about values.&lt;/p&gt;

&lt;p&gt;That is much more expressive than ordinary static typing.&lt;/p&gt;
&lt;h1&gt;
  
  
  Why This Matters
&lt;/h1&gt;

&lt;p&gt;Most software bugs are really violations of assumptions.&lt;/p&gt;

&lt;p&gt;Consider matrix multiplication.&lt;/p&gt;

&lt;p&gt;You might write:&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="nf"&gt;matrixMultiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;But there is an implicit rule:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a.columns == b.rows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Normally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you document this,&lt;/li&gt;
&lt;li&gt;test this,&lt;/li&gt;
&lt;li&gt;or check it at runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With dependent types, you can encode the relationship structurally:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Matrix m n
Matrix n p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now invalid multiplication does not typecheck.&lt;/p&gt;

&lt;p&gt;The compiler understands the invariant itself.&lt;/p&gt;

&lt;p&gt;That is the real promise of dependent typing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;move important assumptions from comments into machine-checked structure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;
  
  
  Non-Empty Lists
&lt;/h1&gt;

&lt;p&gt;Here is another example.&lt;/p&gt;

&lt;p&gt;In ordinary programming:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;xs&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Potential issue:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What if xs is empty?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Usually this becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a runtime exception,&lt;/li&gt;
&lt;li&gt;a defensive check,&lt;/li&gt;
&lt;li&gt;or a convention.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Lean-like systems:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;head&lt;/span&gt; : &lt;span class="n"&gt;Vec&lt;/span&gt; α (&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;) &lt;span class="o"&gt;→&lt;/span&gt; α
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;head&lt;/code&gt; only accepts non-empty vectors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;n + 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;can never be zero.&lt;/p&gt;

&lt;p&gt;The impossible case disappears from the program structure entirely.&lt;/p&gt;
&lt;h1&gt;
  
  
  “But Real Programs Use Dynamic User Input”
&lt;/h1&gt;

&lt;p&gt;This is one of the most common misunderstandings.&lt;/p&gt;

&lt;p&gt;People often assume dependent typing only helps when everything is known at compile time.&lt;/p&gt;

&lt;p&gt;But in practice, the workflow is usually:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dynamic validation
        ↓
static guarantee afterward
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Suppose a user uploads some JSON.&lt;/p&gt;

&lt;p&gt;Initially, the data may effectively have a type like:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UntrustedInput
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then validation happens.&lt;/p&gt;

&lt;p&gt;After validation, the type changes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AuthenticatedUser
ValidConfig
NonEmptyList
Vec Nat 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The important idea is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;once something has been checked, the type system remembers the fact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is incredibly useful.&lt;/p&gt;
&lt;h1&gt;
  
  
  Real-World Intuition
&lt;/h1&gt;

&lt;p&gt;Many systems already rely on informal “refined” types.&lt;/p&gt;

&lt;p&gt;For example, programmers mentally distinguish between:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;raw string
validated email
escaped SQL
sanitized HTML
authenticated user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;But in many languages, all of them are still just:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;String
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Dependent typing allows those distinctions to become explicit and enforceable.&lt;/p&gt;
&lt;h1&gt;
  
  
  What Lean Is Really Exploring
&lt;/h1&gt;

&lt;p&gt;Lean is often presented as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a theorem prover,&lt;/li&gt;
&lt;li&gt;a mathematical tool,&lt;/li&gt;
&lt;li&gt;or a proof assistant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But from a programmer’s perspective, a more useful framing is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lean explores what happens when program invariants become part of the language itself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;comments + conventions + hope
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;but:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proof + enforcement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is the deeper shift.&lt;/p&gt;
&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;When programmers first encounter dependent types, the syntax can look intimidating:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;Vec&lt;/span&gt; : &lt;span class="kt"&gt;Type&lt;/span&gt; &lt;span class="o"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt; &lt;span class="o"&gt;→&lt;/span&gt; &lt;span class="kt"&gt;Type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;But the underlying idea is surprisingly concrete.&lt;/p&gt;

&lt;p&gt;Dependent types are about expressing richer facts directly in the type system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sizes,&lt;/li&gt;
&lt;li&gt;protocol states,&lt;/li&gt;
&lt;li&gt;validation status,&lt;/li&gt;
&lt;li&gt;permissions,&lt;/li&gt;
&lt;li&gt;invariants,&lt;/li&gt;
&lt;li&gt;safety guarantees.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And once those facts become part of the type system, entire classes of bugs become much harder to represent.&lt;/p&gt;

&lt;p&gt;That is why languages like Lean are interesting even beyond theorem proving.&lt;/p&gt;

&lt;p&gt;They are exploring a different model of software correctness itself.&lt;/p&gt;



&lt;p&gt;*AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.*&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It's online, source-available, and ready for anyone to use.&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/git-lrc" rel="noopener noreferrer"&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Micro AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;| &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.da.md" rel="noopener noreferrer"&gt;🇩🇰 Dansk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.es.md" rel="noopener noreferrer"&gt;🇪🇸 Español&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fa.md" rel="noopener noreferrer"&gt;🇮🇷 Farsi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fi.md" rel="noopener noreferrer"&gt;🇫🇮 Suomi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ja.md" rel="noopener noreferrer"&gt;🇯🇵 日本語&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.nn.md" rel="noopener noreferrer"&gt;🇳🇴 Norsk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.pt.md" rel="noopener noreferrer"&gt;🇵🇹 Português&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ru.md" rel="noopener noreferrer"&gt;🇷🇺 Русский&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.sq.md" rel="noopener noreferrer"&gt;🇦🇱 Shqip&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.zh.md" rel="noopener noreferrer"&gt;🇨🇳 中文&lt;/a&gt; |&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;img width="60" alt="git-lrc logo" src="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;git-lrc&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Free, Micro AI Code Reviews That Run on Commit&lt;/h2&gt;
&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt" width="200" src="https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638"&gt;&lt;/a&gt;
 &lt;/p&gt;
&lt;br&gt;
&lt;a href="https://discord.gg/sGdnKwB3qq" rel="nofollow noopener noreferrer"&gt;
  &lt;img alt="Discord Community" src="https://camo.githubusercontent.com/b8f979318aaabc8dec512b9d4e6e2a12431fba3c8a3b8738e1a97a0722d4e4bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d436f6d6d756e6974792d3538363546323f6c6f676f3d646973636f7264266c6162656c436f6c6f723d7768697465"&gt;
&lt;/a&gt; &lt;a href="https://goreportcard.com/report/github.com/HexmosTech/git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Go Report Card" src="https://camo.githubusercontent.com/e74c0651c3ee9165a2ed01cb0f6842c494029960df30eb9c24cf622d3d21bf46/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f4865786d6f73546563682f6769742d6c7263"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/git-lrc/./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%2Fgit-lrc%2FHEAD%2F.%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;

  
    
    

    &lt;span class="m-1"&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
    
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Build a&lt;/strong&gt;…&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/git-lrc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>From Logic to Code: Understanding the Curry–Howard Correspondence in Lean</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Mon, 18 May 2026 18:38:04 +0000</pubDate>
      <link>https://dev.to/shrsv/from-logic-to-code-understanding-the-curry-howard-correspondence-in-lean-1and</link>
      <guid>https://dev.to/shrsv/from-logic-to-code-understanding-the-curry-howard-correspondence-in-lean-1and</guid>
      <description>&lt;p&gt;For many programmers, precise mathematical logic and general programming feel like different worlds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logic is about proving theorems.&lt;/li&gt;
&lt;li&gt;Programming is about making systems behave correctly.&lt;/li&gt;
&lt;li&gt;Proofs belong to mathematicians.&lt;/li&gt;
&lt;li&gt;Functions belong to engineers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But in systems like Lean, those boundaries start collapsing.&lt;/p&gt;

&lt;p&gt;One of the deepest ideas behind this is the &lt;em&gt;Curry–Howard correspondence&lt;/em&gt; -- the observation that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;logical propositions correspond to types&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;proofs correspond to programs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;proof checking corresponds to type checking&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, this sounds abstract, philosophical, or even like category theory mysticism.&lt;/p&gt;

&lt;p&gt;But once you see it expressed concretely in Lean, it becomes quite mechanical.&lt;/p&gt;

&lt;p&gt;This article walks through that transition step by step:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;from logic,&lt;/li&gt;
&lt;li&gt;to functions,&lt;/li&gt;
&lt;li&gt;to proof goals,&lt;/li&gt;
&lt;li&gt;to types carrying specifications,&lt;/li&gt;
&lt;li&gt;to a sorting function that literally contains its own correctness proof.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  The Core Idea: Propositions Behave Like Types
&lt;/h1&gt;

&lt;p&gt;Let us start with a tiny logical statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="o"&gt;∧&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt; &lt;span class="o"&gt;→&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read logically, this means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If P and Q are both true, then P is true.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Very obvious.&lt;/p&gt;

&lt;p&gt;Now let us reinterpret it computationally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logical Interpretation
&lt;/h2&gt;

&lt;p&gt;To prove:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P ∧ Q
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you must provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a proof of &lt;code&gt;P&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;and a proof of &lt;code&gt;Q&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That structure is identical to a pair:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(p, q)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similarly, to prove:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P → Q
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you must provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a method that transforms evidence of &lt;code&gt;P&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;into evidence of &lt;code&gt;Q&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is exactly what a function does.&lt;/p&gt;

&lt;p&gt;So under Curry–Howard:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Logic&lt;/th&gt;
&lt;th&gt;Programming&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;proposition&lt;/td&gt;
&lt;td&gt;type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;proof&lt;/td&gt;
&lt;td&gt;value/program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;implication&lt;/td&gt;
&lt;td&gt;function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;conjunction (&lt;code&gt;P ∧ Q&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;pair&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;proof checking&lt;/td&gt;
&lt;td&gt;type checking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is not metaphorical in Lean.&lt;/p&gt;

&lt;p&gt;It is literal.&lt;/p&gt;

&lt;h1&gt;
  
  
  A Tiny Theorem Is Also a Program
&lt;/h1&gt;

&lt;p&gt;Here is a theorem in Lean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;theorem&lt;/span&gt; &lt;span class="n"&gt;fst&lt;/span&gt; : &lt;span class="n"&gt;P&lt;/span&gt; &lt;span class="o"&gt;∧&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt; &lt;span class="o"&gt;→&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt; := &lt;span class="k"&gt;by&lt;/span&gt;
  &lt;span class="n"&gt;intro&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;
  &lt;span class="n"&gt;exact&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let us read this slowly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Goal
&lt;/h2&gt;

&lt;p&gt;Initially Lean shows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⊢ P ∧ Q → P
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything after &lt;code&gt;⊢&lt;/code&gt; is the current &lt;em&gt;proof goal&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You can think of it as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Construct something of this type.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 1: &lt;code&gt;intro h&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;intro&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This assumes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;h : P ∧ Q
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and changes the goal to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⊢ P
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So now we have evidence that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;P&lt;/code&gt; is true&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Q&lt;/code&gt; is true&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;bundled inside &lt;code&gt;h&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Extract the Left Side
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;exact&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This extracts the proof of &lt;code&gt;P&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;Now look at the exact same theorem computationally.&lt;/p&gt;

&lt;p&gt;The theorem is equivalent to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;take a pair&lt;/li&gt;
&lt;li&gt;return the first element&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;em&gt;same object&lt;/em&gt; is simultaneously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a proof,&lt;/li&gt;
&lt;li&gt;and a program.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is Curry–Howard.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lean Proof Goals Are Requests for Evidence
&lt;/h1&gt;

&lt;p&gt;A useful way to think about Lean is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lean is constantly asking you for evidence.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suppose Lean shows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⊢ Sorted ys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a boolean check.&lt;/p&gt;

&lt;p&gt;Lean is not asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Is this true?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Can you construct evidence that this is true?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction matters enormously.&lt;/p&gt;

&lt;p&gt;In ordinary programming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;correctness is often informal,&lt;/li&gt;
&lt;li&gt;hidden in comments,&lt;/li&gt;
&lt;li&gt;or validated through testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Lean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;correctness becomes part of the type system itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Types Can Express Specifications, Not Just Data Shapes
&lt;/h1&gt;

&lt;p&gt;Most programmers are used to types like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;sort&lt;/span&gt; : &lt;span class="n"&gt;List&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This only says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input: list&lt;/li&gt;
&lt;li&gt;output: list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing about correctness.&lt;/p&gt;

&lt;p&gt;The function could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reverse the list,&lt;/li&gt;
&lt;li&gt;shuffle the list,&lt;/li&gt;
&lt;li&gt;return garbage,&lt;/li&gt;
&lt;li&gt;or always return &lt;code&gt;[]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The type would still accept it.&lt;/p&gt;

&lt;p&gt;Now look at this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;sort&lt;/span&gt; :
  (&lt;span class="n"&gt;xs&lt;/span&gt; : &lt;span class="n"&gt;List&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt;) &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt; : &lt;span class="n"&gt;List&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt;
      &lt;span class="n"&gt;Sorted&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt; &lt;span class="o"&gt;∧&lt;/span&gt; &lt;span class="n"&gt;Permutation&lt;/span&gt; &lt;span class="n"&gt;xs&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This changes everything.&lt;/p&gt;

&lt;p&gt;The function is now required to produce:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;an output list &lt;code&gt;ys&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;a proof that &lt;code&gt;ys&lt;/code&gt; is sorted&lt;/li&gt;
&lt;li&gt;a proof that &lt;code&gt;ys&lt;/code&gt; contains exactly the same elements as &lt;code&gt;xs&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The type stopped describing &lt;em&gt;shape&lt;/em&gt; and started describing &lt;em&gt;truth&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  “Sorted” Becomes a Logical Object
&lt;/h1&gt;

&lt;p&gt;But where does &lt;code&gt;Sorted&lt;/code&gt; come from?&lt;/p&gt;

&lt;p&gt;It must itself be formally defined.&lt;/p&gt;

&lt;p&gt;Here is a simplified version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;inductive&lt;/span&gt; &lt;span class="n"&gt;Sorted&lt;/span&gt; : &lt;span class="n"&gt;List&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Prop&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;nil&lt;/span&gt; :
    &lt;span class="n"&gt;Sorted&lt;/span&gt; []

&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;single&lt;/span&gt; (&lt;span class="n"&gt;x&lt;/span&gt; : &lt;span class="n"&gt;Nat&lt;/span&gt;) :
    &lt;span class="n"&gt;Sorted&lt;/span&gt; [&lt;span class="n"&gt;x&lt;/span&gt;]

&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;cons&lt;/span&gt; (&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; : &lt;span class="n"&gt;Nat&lt;/span&gt;) (&lt;span class="n"&gt;xs&lt;/span&gt; : &lt;span class="n"&gt;List&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt;) :
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;≤&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;Sorted&lt;/span&gt; (&lt;span class="n"&gt;y&lt;/span&gt; :: &lt;span class="n"&gt;xs&lt;/span&gt;) &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;Sorted&lt;/span&gt; (&lt;span class="n"&gt;x&lt;/span&gt; :: &lt;span class="n"&gt;y&lt;/span&gt; :: &lt;span class="n"&gt;xs&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;empty lists are sorted&lt;/li&gt;
&lt;li&gt;single-element lists are sorted&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;larger lists are sorted if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the first element is ≤ the second&lt;/li&gt;
&lt;li&gt;and the tail is sorted&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Now suppose your implementation returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[1,2,3]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lean must construct evidence for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sorted [1,2,3]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That proof is itself a structured object.&lt;/p&gt;

&lt;p&gt;Roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 ≤ 2
2 ≤ 3
tail sorted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;all recursively assembled together.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Happens When the Function Is Wrong?
&lt;/h1&gt;

&lt;p&gt;Suppose the implementation returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[3,1,2]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lean now tries to construct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sorted [3,1,2]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But according to the definition of &lt;code&gt;Sorted&lt;/code&gt;, this eventually requires:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proof(3 ≤ 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Impossible.&lt;/p&gt;

&lt;p&gt;So the program is rejected.&lt;/p&gt;

&lt;p&gt;Notice what happened here.&lt;/p&gt;

&lt;p&gt;We did not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run tests,&lt;/li&gt;
&lt;li&gt;inspect runtime output,&lt;/li&gt;
&lt;li&gt;fuzz inputs,&lt;/li&gt;
&lt;li&gt;or hope for good behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the implementation failed to inhabit the required type.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The proof could not be constructed.&lt;/p&gt;

&lt;p&gt;So the program was invalid.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Deep Shift: Correctness Became Construction
&lt;/h1&gt;

&lt;p&gt;This is the conceptual leap Curry–Howard enabled.&lt;/p&gt;

&lt;p&gt;Traditionally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;programs were operational artifacts,&lt;/li&gt;
&lt;li&gt;proofs were human reasoning artifacts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Curry–Howard showed they share the same structure.&lt;/p&gt;

&lt;p&gt;That insight led to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proof assistants,&lt;/li&gt;
&lt;li&gt;dependently typed programming,&lt;/li&gt;
&lt;li&gt;formally verified kernels,&lt;/li&gt;
&lt;li&gt;verified compilers,&lt;/li&gt;
&lt;li&gt;machine-checked mathematics,&lt;/li&gt;
&lt;li&gt;cryptographic verification systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key shift is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A proof is not merely an argument.&lt;/p&gt;

&lt;p&gt;It is a concrete computational object.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And in Lean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;writing a program&lt;/li&gt;
&lt;li&gt;and proving it correct&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;can become the same act.&lt;/p&gt;

&lt;h1&gt;
  
  
  Closing Thoughts
&lt;/h1&gt;

&lt;p&gt;When people first hear:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“propositions are types”&lt;/p&gt;

&lt;p&gt;“proofs are programs”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;it often sounds like abstract mathematical poetry.&lt;/p&gt;

&lt;p&gt;But Lean makes the idea concrete.&lt;/p&gt;

&lt;p&gt;A theorem becomes a type.&lt;br&gt;
A proof becomes a value.&lt;br&gt;
A function becomes logical implication.&lt;br&gt;
And type checking becomes proof verification.&lt;/p&gt;

&lt;p&gt;The result is a system where correctness is not merely documented or tested after the fact.&lt;/p&gt;

&lt;p&gt;It becomes part of what the program &lt;em&gt;is&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That is the real significance of the Curry–Howard correspondence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;not philosophy for its own sake,&lt;/li&gt;
&lt;li&gt;but a bridge between logic and executable systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And once you see it inside Lean, it becomes difficult to unsee.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Designing Reliable Permission Models with Lean 4</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Sun, 17 May 2026 18:15:22 +0000</pubDate>
      <link>https://dev.to/shrsv/designing-reliable-permission-models-with-lean-4-33lc</link>
      <guid>https://dev.to/shrsv/designing-reliable-permission-models-with-lean-4-33lc</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Shrijith Venkatramana. I'm building git-lrc, an AI code reviewer that runs on every commit. &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;Star Us&lt;/a&gt; to help devs discover the project. Do give it a try and share your feedback for improving the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Most authorization systems begin simple.&lt;/p&gt;

&lt;p&gt;Then reality happens.&lt;/p&gt;

&lt;p&gt;Over time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more roles get added,&lt;/li&gt;
&lt;li&gt;exceptions accumulate,&lt;/li&gt;
&lt;li&gt;workflows become stateful,&lt;/li&gt;
&lt;li&gt;permissions become inherited,&lt;/li&gt;
&lt;li&gt;AI assistants start generating handlers and refactors,&lt;/li&gt;
&lt;li&gt;and eventually nobody is fully certain what combinations are actually possible anymore.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where many discussions around “AI-generated code safety” become unsatisfying.&lt;/p&gt;

&lt;p&gt;People often talk about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;better prompts,&lt;/li&gt;
&lt;li&gt;more tests,&lt;/li&gt;
&lt;li&gt;stronger reviews,&lt;/li&gt;
&lt;li&gt;static analysis,&lt;/li&gt;
&lt;li&gt;or safer languages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those help.&lt;/p&gt;

&lt;p&gt;But there is another direction worth exploring:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if some critical invariants were not merely &lt;em&gt;tested&lt;/em&gt;, but mathematically enforced?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“the code probably works,”&lt;/li&gt;
&lt;li&gt;or “the tests passed,”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;but:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“certain invalid states are mechanically impossible.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the interesting promise behind Lean.&lt;/p&gt;

&lt;p&gt;And permission systems are one of the best places to start because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;humans understand them intuitively,&lt;/li&gt;
&lt;li&gt;they are security-critical,&lt;/li&gt;
&lt;li&gt;and they become surprisingly difficult to reason about once complexity grows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tutorial walks through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installing Lean 4,&lt;/li&gt;
&lt;li&gt;understanding the core mathematical ideas,&lt;/li&gt;
&lt;li&gt;building a permission model,&lt;/li&gt;
&lt;li&gt;proving security invariants,&lt;/li&gt;
&lt;li&gt;intentionally breaking them,&lt;/li&gt;
&lt;li&gt;and seeing how Lean prevents unsafe changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not academic theorem proving.&lt;/p&gt;

&lt;p&gt;The goal is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;designing systems where important security assumptions become hard to accidentally violate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  1. Installing Lean 4
&lt;/h1&gt;

&lt;p&gt;Lean 4 is unusual because it is simultaneously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a programming language,&lt;/li&gt;
&lt;li&gt;a compiler,&lt;/li&gt;
&lt;li&gt;and a theorem prover.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install it using &lt;code&gt;elan&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linux/macOS
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh &lt;span class="nt"&gt;-sSf&lt;/span&gt; | sh

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Verify installation:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lean &lt;span class="nt"&gt;--version&lt;/span&gt;
lake &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  2. Install the VSCode Extension
&lt;/h1&gt;

&lt;p&gt;Install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Lean 4”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;from the VSCode marketplace.&lt;/p&gt;

&lt;p&gt;This gives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;live proof checking,&lt;/li&gt;
&lt;li&gt;inline errors,&lt;/li&gt;
&lt;li&gt;theorem goals,&lt;/li&gt;
&lt;li&gt;and interactive feedback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This interactivity matters a lot.&lt;/p&gt;

&lt;p&gt;Lean is less like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;writing static code,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and more like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;continuously negotiating with a mathematical verifier.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  3. Create a Lean Project
&lt;/h1&gt;

&lt;p&gt;Create a project with Mathlib support:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lake new VerifiedPermissions math
&lt;span class="nb"&gt;cd &lt;/span&gt;VerifiedPermissions
code &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VerifiedPermissions/Basic.lean

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This file will contain both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;executable programs,&lt;/li&gt;
&lt;li&gt;and mathematical proofs about those programs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That duality is the central idea behind Lean.&lt;/p&gt;
&lt;h1&gt;
  
  
  4. First Lean Program
&lt;/h1&gt;

&lt;p&gt;Replace the file contents with:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt; (&lt;span class="n"&gt;name&lt;/span&gt; : &lt;span class="n"&gt;String&lt;/span&gt;) : &lt;span class="n"&gt;String&lt;/span&gt; :=
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="s"&gt;"Hello, {name}"&lt;/span&gt;

&lt;span class="k"&gt;#eval&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt; &lt;span class="s"&gt;"world"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Let’s unpack this carefully.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;def&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;def&lt;/code&gt; means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;define a function or value.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is ordinary programming.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;(name : String)&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;(&lt;span class="n"&gt;name&lt;/span&gt; : &lt;span class="n"&gt;String&lt;/span&gt;)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the function accepts a parameter called &lt;code&gt;name&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;whose type is &lt;code&gt;String&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lean is statically typed.&lt;/p&gt;

&lt;p&gt;But unlike many languages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;types in Lean are deeply connected to logic itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That becomes important later.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;: String&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;: &lt;span class="n"&gt;String&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This declares:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;the function returns a string.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So mathematically:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;greet : String → String

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;greet maps one string into another string.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Functions in Lean are treated very mathematically.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;:=&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;:=

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;is defined as.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;#eval&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;#eval&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt; &lt;span class="s"&gt;"world"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Actually runs the program.&lt;/p&gt;

&lt;p&gt;This is important because Lean is not just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a proof notation system,&lt;/li&gt;
&lt;li&gt;or symbolic logic language.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is executable.&lt;/p&gt;
&lt;h1&gt;
  
  
  5. A Small Verified Function
&lt;/h1&gt;

&lt;p&gt;Now replace the file with:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt; (&lt;span class="n"&gt;x&lt;/span&gt; : &lt;span class="n"&gt;Nat&lt;/span&gt;) : &lt;span class="n"&gt;Nat&lt;/span&gt; :=
  &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;theorem&lt;/span&gt; &lt;span class="n"&gt;increment_is_larger&lt;/span&gt; (&lt;span class="n"&gt;x&lt;/span&gt; : &lt;span class="n"&gt;Nat&lt;/span&gt;) :
  &lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; := &lt;span class="k"&gt;by&lt;/span&gt;
  &lt;span class="n"&gt;exact&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lt_succ_self&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is where things become interesting.&lt;/p&gt;

&lt;p&gt;You are no longer just writing code.&lt;/p&gt;

&lt;p&gt;You are writing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code,&lt;/li&gt;
&lt;li&gt;and mathematical claims about the code.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  6. Understanding the Mathematics Line by Line
&lt;/h1&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;Nat&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;Nat&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;natural numbers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0, 1, 2, 3…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lean treats mathematics as native objects.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;increment&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt; (&lt;span class="n"&gt;x&lt;/span&gt; : &lt;span class="n"&gt;Nat&lt;/span&gt;) : &lt;span class="n"&gt;Nat&lt;/span&gt; :=
  &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is an executable function.&lt;/p&gt;

&lt;p&gt;Nothing unusual yet.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;theorem&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;theorem&lt;/span&gt; &lt;span class="n"&gt;increment_is_larger&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This changes everything conceptually.&lt;/p&gt;

&lt;p&gt;You are no longer saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I hope this property holds.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You are saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This property must be proven.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And Lean will refuse to continue unless the proof is valid.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;(x : Nat)&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The theorem applies universally.&lt;/p&gt;

&lt;p&gt;Meaning:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For every natural number x

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“for tested examples,”&lt;/li&gt;
&lt;li&gt;not “for likely inputs,”&lt;/li&gt;
&lt;li&gt;but literally all possible values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is one of the biggest conceptual differences from testing.&lt;/p&gt;

&lt;p&gt;Tests are existential:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;These cases worked.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Proofs are universal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;All valid inputs satisfy this property.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;increment x &amp;gt; x&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is the claim being proven.&lt;/p&gt;

&lt;p&gt;Meaning:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;increment always returns a larger number.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;:= by&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;:= &lt;span class="k"&gt;by&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This begins a proof block.&lt;/p&gt;

&lt;p&gt;You are now constructing evidence that the statement is true.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;exact&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;exact&lt;/span&gt; &lt;span class="n"&gt;Nat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lt_succ_self&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;use an existing theorem directly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;Nat.lt_succ_self&lt;/code&gt; is a theorem already known to Lean:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x &amp;lt; x + 1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;So Lean verifies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your theorem,&lt;/li&gt;
&lt;li&gt;by reducing it to already-proven mathematics.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  7. Breaking the Proof Intentionally
&lt;/h1&gt;

&lt;p&gt;Now change:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;increment&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You now claim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;increment makes numbers smaller.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lean immediately rejects this.&lt;/p&gt;

&lt;p&gt;This is the first important moment.&lt;/p&gt;

&lt;p&gt;The theorem is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documentation,&lt;/li&gt;
&lt;li&gt;comments,&lt;/li&gt;
&lt;li&gt;or developer intent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is mechanically enforced logic.&lt;/p&gt;
&lt;h1&gt;
  
  
  8. Building a Permission Model
&lt;/h1&gt;

&lt;p&gt;Now we move toward authorization systems.&lt;/p&gt;

&lt;p&gt;Replace the file with:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;inductive&lt;/span&gt; &lt;span class="n"&gt;Role&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Guest&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Admin&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  9. Understanding &lt;code&gt;inductive&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This line introduces a very important mathematical idea.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;inductive&lt;/span&gt; &lt;span class="n"&gt;Role&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This defines a finite set of possible values.&lt;/p&gt;

&lt;p&gt;Mathematically:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Role ∈ {Guest, User, Admin}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is powerful because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;impossible states cannot exist,&lt;/li&gt;
&lt;li&gt;invalid roles cannot appear accidentally,&lt;/li&gt;
&lt;li&gt;and all cases must be handled explicitly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This already improves reliability substantially.&lt;/p&gt;
&lt;h1&gt;
  
  
  10. Defining Permissions
&lt;/h1&gt;

&lt;p&gt;Now add:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;canDelete&lt;/span&gt; : &lt;span class="n"&gt;Role&lt;/span&gt; &lt;span class="o"&gt;→&lt;/span&gt; &lt;span class="n"&gt;Bool&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Role&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Guest&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Role&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Role&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Admin&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This means:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;canDelete maps a Role into a boolean

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;or mathematically:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Role → Bool

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every role deterministically maps to a permission decision.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  11. Why This Is Safer Than It Looks
&lt;/h1&gt;

&lt;p&gt;Notice something subtle.&lt;/p&gt;

&lt;p&gt;Lean forces all role cases to be handled.&lt;/p&gt;

&lt;p&gt;If you later add:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Moderator&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Lean immediately complains that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;canDelete&lt;/code&gt; is incomplete.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is extremely valuable operationally.&lt;/p&gt;

&lt;p&gt;In many production systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;new authorization states get introduced,&lt;/li&gt;
&lt;li&gt;old logic silently becomes incomplete,&lt;/li&gt;
&lt;li&gt;edge cases appear months later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lean forces exhaustive handling.&lt;/p&gt;

&lt;p&gt;That alone prevents many categories of policy drift.&lt;/p&gt;
&lt;h1&gt;
  
  
  12. Adding Security Invariants
&lt;/h1&gt;

&lt;p&gt;Now add:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="k"&gt;theorem&lt;/span&gt; &lt;span class="n"&gt;guests_cannot_delete&lt;/span&gt; :
  &lt;span class="n"&gt;canDelete&lt;/span&gt; &lt;span class="n"&gt;Role&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Guest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt; := &lt;span class="k"&gt;by&lt;/span&gt;
  &lt;span class="n"&gt;rfl&lt;/span&gt;

&lt;span class="k"&gt;theorem&lt;/span&gt; &lt;span class="n"&gt;users_cannot_delete&lt;/span&gt; :
  &lt;span class="n"&gt;canDelete&lt;/span&gt; &lt;span class="n"&gt;Role&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt; := &lt;span class="k"&gt;by&lt;/span&gt;
  &lt;span class="n"&gt;rfl&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  13. Understanding &lt;code&gt;rfl&lt;/code&gt;
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;rfl&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;this is true by direct reduction.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lean computes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;canDelete Role.User
→ false

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;So the theorem becomes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;false = false

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;which is trivially true.&lt;/p&gt;
&lt;h1&gt;
  
  
  14. Introducing a Security Bug
&lt;/h1&gt;

&lt;p&gt;Now simulate a future refactor.&lt;/p&gt;

&lt;p&gt;Change:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Role&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Role&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Immediately:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lean"&gt;&lt;code&gt;&lt;span class="n"&gt;users_cannot_delete&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;fails.&lt;/p&gt;

&lt;p&gt;This is where the practical value starts appearing.&lt;/p&gt;

&lt;p&gt;The proof acts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a permanently active security assertion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documentation,&lt;/li&gt;
&lt;li&gt;not review guidelines,&lt;/li&gt;
&lt;li&gt;not tribal knowledge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An enforced invariant.&lt;/p&gt;
&lt;h1&gt;
  
  
  15. Why This Matters More with AI-Generated Code
&lt;/h1&gt;

&lt;p&gt;The interesting part is not tiny examples like this.&lt;/p&gt;

&lt;p&gt;The interesting part is what happens later when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI assistants generate handlers,&lt;/li&gt;
&lt;li&gt;rewrite permission logic,&lt;/li&gt;
&lt;li&gt;refactor workflows,&lt;/li&gt;
&lt;li&gt;or modify state transitions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is no longer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Will the code compile?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Did the generated system preserve critical invariants?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Formal models become interesting because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;implementations can change repeatedly,&lt;/li&gt;
&lt;li&gt;while the invariants remain fixed and machine-checked.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  16. What Lean Is Actually Buying
&lt;/h1&gt;

&lt;p&gt;Lean does not magically create bug-free software.&lt;/p&gt;

&lt;p&gt;What it can realistically provide is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;machine-checked invariants,&lt;/li&gt;
&lt;li&gt;exhaustive handling of states,&lt;/li&gt;
&lt;li&gt;prevention of silent policy drift,&lt;/li&gt;
&lt;li&gt;stronger guarantees around transitions,&lt;/li&gt;
&lt;li&gt;and continuous enforcement of critical assumptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a narrower claim than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“formally verified applications.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But it is also much more practical.&lt;/p&gt;

&lt;p&gt;And for authorization-heavy systems, even small mechanically enforced guarantees can become surprisingly valuable over time.&lt;/p&gt;



&lt;p&gt;*AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.*&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It's online, source-available, and ready for anyone to use.&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/git-lrc" rel="noopener noreferrer"&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Micro AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;| &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.da.md" rel="noopener noreferrer"&gt;🇩🇰 Dansk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.es.md" rel="noopener noreferrer"&gt;🇪🇸 Español&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fa.md" rel="noopener noreferrer"&gt;🇮🇷 Farsi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fi.md" rel="noopener noreferrer"&gt;🇫🇮 Suomi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ja.md" rel="noopener noreferrer"&gt;🇯🇵 日本語&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.nn.md" rel="noopener noreferrer"&gt;🇳🇴 Norsk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.pt.md" rel="noopener noreferrer"&gt;🇵🇹 Português&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ru.md" rel="noopener noreferrer"&gt;🇷🇺 Русский&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.sq.md" rel="noopener noreferrer"&gt;🇦🇱 Shqip&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.zh.md" rel="noopener noreferrer"&gt;🇨🇳 中文&lt;/a&gt; |&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;img width="60" alt="git-lrc logo" src="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;git-lrc&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Free, Micro AI Code Reviews That Run on Commit&lt;/h2&gt;
&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt" width="200" src="https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638"&gt;&lt;/a&gt;
 &lt;/p&gt;
&lt;br&gt;
&lt;a href="https://discord.gg/sGdnKwB3qq" rel="nofollow noopener noreferrer"&gt;
  &lt;img alt="Discord Community" src="https://camo.githubusercontent.com/b8f979318aaabc8dec512b9d4e6e2a12431fba3c8a3b8738e1a97a0722d4e4bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d436f6d6d756e6974792d3538363546323f6c6f676f3d646973636f7264266c6162656c436f6c6f723d7768697465"&gt;
&lt;/a&gt; &lt;a href="https://goreportcard.com/report/github.com/HexmosTech/git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Go Report Card" src="https://camo.githubusercontent.com/e74c0651c3ee9165a2ed01cb0f6842c494029960df30eb9c24cf622d3d21bf46/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f4865786d6f73546563682f6769742d6c7263"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/git-lrc/./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%2Fgit-lrc%2FHEAD%2F.%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;

  
    
    

    &lt;span class="m-1"&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
    
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Build a&lt;/strong&gt;…&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/git-lrc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Rust and Zig Solve the Same Problems Very Differently</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Sat, 16 May 2026 17:12:12 +0000</pubDate>
      <link>https://dev.to/shrsv/rust-and-zig-solve-the-same-problems-very-differently-2m60</link>
      <guid>https://dev.to/shrsv/rust-and-zig-solve-the-same-problems-very-differently-2m60</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Shrijith Venkatramana. I'm building git-lrc, an AI code reviewer that runs on every commit. &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;Star Us&lt;/a&gt; to help devs discover the project. Do give it a try and share your feedback for improving the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Here are six small examples that reveal two completely different language philosophies.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With the recent &lt;a href="https://www.theregister.com/devops/2026/05/14/anthropics-bun-rust-rewrite-merged-at-speed-of-ai/5240381" rel="noopener noreferrer"&gt;Bun port to Rust&lt;/a&gt; (from Zig) with LLM assistance is setting the interwebs ablaze, I felt going a bit deeper into how Rust and Zig differ in their approaches to solving concrete problems. &lt;/p&gt;

&lt;p&gt;Most discussions about Rust and Zig become philosophical quickly.&lt;/p&gt;

&lt;p&gt;But the philosophy itself is just the starting point.&lt;/p&gt;

&lt;p&gt;A deeper understanding can come from how each philosophy shapes day to day engineering tasks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;allocating memory&lt;/li&gt;
&lt;li&gt;handling errors&lt;/li&gt;
&lt;li&gt;sharing state&lt;/li&gt;
&lt;li&gt;building binaries&lt;/li&gt;
&lt;li&gt;interfacing with C&lt;/li&gt;
&lt;li&gt;structuring dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'll walk you through a a few examples, after which, the two languages may start feeling fundamentally different.&lt;/p&gt;

&lt;p&gt;If one were to summarize, Rust keeps asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“How can the compiler make this difficult to misuse?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zig keeps asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“How can the programmer see exactly what is happening?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's go through a few examples.&lt;/p&gt;

&lt;h1&gt;
  
  
  Example 1: Creating a Dynamic Array
&lt;/h1&gt;

&lt;p&gt;Let’s start with something boring.&lt;/p&gt;

&lt;p&gt;A growable list of integers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rust
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&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;Very little ceremony.&lt;/p&gt;

&lt;p&gt;You do not think about allocation yet.&lt;/p&gt;

&lt;p&gt;You do not think about cleanup.&lt;/p&gt;

&lt;p&gt;You do not think about allocator strategy.&lt;/p&gt;

&lt;p&gt;Rust intentionally compresses those concerns away unless you need them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Zig
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight zig"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;@import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;gpa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;heap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GeneralPurposeAllocator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{}){};&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="mi"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gpa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deinit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;allocator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gpa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allocator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ArrayList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allocator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deinit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&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;The first reaction many engineers have:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why so explicit?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But after a while, the important thing becomes obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;allocator choice is visible&lt;/li&gt;
&lt;li&gt;allocation lifetime is visible&lt;/li&gt;
&lt;li&gt;cleanup is visible&lt;/li&gt;
&lt;li&gt;failure is visible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The language forces resource awareness into the code itself.&lt;/p&gt;

&lt;p&gt;That changes how systems evolve.&lt;/p&gt;

&lt;p&gt;In Rust, memory management becomes something the compiler heavily assists with.&lt;/p&gt;

&lt;p&gt;In Zig, memory management remains part of the engineering model.&lt;/p&gt;

&lt;p&gt;That difference shows up &lt;em&gt;everywhere&lt;/em&gt; later.&lt;/p&gt;
&lt;h1&gt;
  
  
  Example 2: Invalid References
&lt;/h1&gt;

&lt;p&gt;This example makes Rust’s philosophy impossible to miss.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rust
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;values&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;values&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;first&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;Rust rejects this.&lt;/p&gt;

&lt;p&gt;Because &lt;code&gt;push()&lt;/code&gt; may reallocate the vector internally, invalidating the reference.&lt;/p&gt;

&lt;p&gt;The interesting part is not the compiler error.&lt;/p&gt;

&lt;p&gt;The interesting part is what Rust optimizes for.&lt;/p&gt;

&lt;p&gt;This category of bug is historically painful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;crashes under load&lt;/li&gt;
&lt;li&gt;intermittent corruption&lt;/li&gt;
&lt;li&gt;impossible‑to‑reproduce failures&lt;/li&gt;
&lt;li&gt;security vulnerabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust treats these as unacceptable failure classes.&lt;/p&gt;

&lt;p&gt;So the compiler intervenes aggressively.&lt;/p&gt;
&lt;h2&gt;
  
  
  Zig
&lt;/h2&gt;

&lt;p&gt;Zig allows the same pattern.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight zig"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;@import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;gpa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;heap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GeneralPurposeAllocator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{}){};&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="mi"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gpa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deinit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;allocator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gpa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allocator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ArrayList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allocator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deinit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;items&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="c"&gt;// reference to first element&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;// may reallocate, invalidating 'first'&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;debug&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="s"&gt;"{}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;first&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This code compiles and runs – but the reference &lt;code&gt;first&lt;/code&gt; may become dangling after the second append. The program can crash or read garbage.&lt;/p&gt;

&lt;p&gt;Zig’s philosophy differs.&lt;/p&gt;

&lt;p&gt;Zig assumes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The programmer should understand when memory relocation is possible.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds dangerous.&lt;/p&gt;

&lt;p&gt;And sometimes it is.&lt;/p&gt;

&lt;p&gt;But there is another side.&lt;/p&gt;

&lt;p&gt;Rust scales correctness mechanically.&lt;/p&gt;

&lt;p&gt;Zig scales understanding culturally.&lt;/p&gt;

&lt;p&gt;That is a very different engineering assumption.&lt;/p&gt;
&lt;h1&gt;
  
  
  Example 3: Error Handling
&lt;/h1&gt;

&lt;p&gt;The two languages start feeling stylistically similar while still revealing very different priorities.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rust
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;read_file&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;read_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"config.json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;?&lt;/code&gt; operator keeps propagation concise.&lt;/p&gt;

&lt;p&gt;Errors stay explicit.&lt;/p&gt;

&lt;p&gt;Control flow remains visible.&lt;/p&gt;

&lt;p&gt;This is one of Rust’s best design choices.&lt;/p&gt;
&lt;h2&gt;
  
  
  Zig
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight zig"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;@import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allocator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;mem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Allocator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;openFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"config.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{});&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readToEndAlloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allocator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&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;The important difference is subtle.&lt;/p&gt;

&lt;p&gt;Zig keeps allocation visible &lt;em&gt;even during convenience APIs&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That becomes surprisingly important in large systems.&lt;/p&gt;

&lt;p&gt;Many production issues are really resource issues in disguise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;allocation spikes&lt;/li&gt;
&lt;li&gt;hidden copies&lt;/li&gt;
&lt;li&gt;unexpected buffering&lt;/li&gt;
&lt;li&gt;allocator fragmentation&lt;/li&gt;
&lt;li&gt;ownership confusion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zig keeps reminding you those things exist.&lt;/p&gt;

&lt;p&gt;Rust tries harder to abstract them safely.&lt;/p&gt;
&lt;h1&gt;
  
  
  Example 4: Shared State Across Threads
&lt;/h1&gt;

&lt;p&gt;This is where Rust becomes genuinely impressive.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rust
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&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="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;handles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="nf"&gt;.lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handles&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="nf"&gt;.join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&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;There is ceremony here.&lt;/p&gt;

&lt;p&gt;But Rust does something powerful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ownership is tracked&lt;/li&gt;
&lt;li&gt;mutation is controlled&lt;/li&gt;
&lt;li&gt;thread safety is enforced&lt;/li&gt;
&lt;li&gt;races become much harder accidentally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust’s concurrency story is restrictive because unrestricted concurrency has historically been catastrophic.&lt;/p&gt;

&lt;p&gt;The language deeply distrusts shared mutable state.&lt;/p&gt;

&lt;p&gt;For good reason.&lt;/p&gt;
&lt;h2&gt;
  
  
  Zig
&lt;/h2&gt;

&lt;p&gt;Zig provides the same primitives with less ceremony.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight zig"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;@import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;i32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unlock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;,&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="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;debug&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="s"&gt;"counter: {}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;counter&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;Zig’s approach feels much closer to C.&lt;/p&gt;

&lt;p&gt;The primitives are straightforward.&lt;/p&gt;

&lt;p&gt;The language trusts you more.&lt;/p&gt;

&lt;p&gt;That simplicity appeals – especially when debugging.&lt;/p&gt;

&lt;p&gt;But correctness depends more directly on engineer discipline.&lt;/p&gt;

&lt;p&gt;Rust tries to make dangerous concurrency difficult.&lt;/p&gt;

&lt;p&gt;Zig tries to make concurrency understandable.&lt;/p&gt;
&lt;h1&gt;
  
  
  Example 5: Interfacing With C
&lt;/h1&gt;

&lt;p&gt;This is one of Zig’s most interesting strengths.&lt;/p&gt;
&lt;h2&gt;
  
  
  Zig
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight zig"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;@cImport&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nb"&gt;@cInclude&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sqlite3.h"&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;That is basically it.&lt;/p&gt;

&lt;p&gt;Zig’s C interoperability story feels unusually direct because the language positions itself close to C semantics.&lt;/p&gt;

&lt;p&gt;Many systems engineers notice this immediately.&lt;/p&gt;

&lt;p&gt;Teams with large existing C codebases find incremental migration realistic.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rust
&lt;/h2&gt;

&lt;p&gt;Rust has strong FFI support.&lt;/p&gt;

&lt;p&gt;But it usually looks more like:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;ffi&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="nb"&gt;c_int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;c_void&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;sqlite3_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;i8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ppDb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;c_void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;c_int&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;Or it involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bindgen&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unsafe&lt;/code&gt; blocks&lt;/li&gt;
&lt;li&gt;wrapper layers&lt;/li&gt;
&lt;li&gt;ownership translation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust tries to preserve safety guarantees across language boundaries.&lt;/p&gt;

&lt;p&gt;Zig optimises for minimal friction.&lt;/p&gt;

&lt;p&gt;Again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rust prioritises correctness constraints&lt;/li&gt;
&lt;li&gt;Zig prioritises mechanical transparency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same pattern keeps reappearing.&lt;/p&gt;
&lt;h1&gt;
  
  
  Example 6: Building a Static Binary
&lt;/h1&gt;

&lt;p&gt;This example seems operationally boring until you have maintained deployment pipelines long enough.&lt;/p&gt;
&lt;h2&gt;
  
  
  Zig
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;zig build &lt;span class="nt"&gt;-Dtarget&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;x86_64-linux-musl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;The first time many infra engineers try this, the reaction is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Wait, seriously?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zig’s toolchain story feels aggressively practical.&lt;/p&gt;

&lt;p&gt;Almost as if someone tired of fighting build environments designed it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rust
&lt;/h2&gt;

&lt;p&gt;Rust’s tooling is excellent.&lt;/p&gt;

&lt;p&gt;Cargo is excellent.&lt;/p&gt;

&lt;p&gt;But static cross‑compilation in Rust often introduces real‑world friction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;linker configuration&lt;/li&gt;
&lt;li&gt;musl edge cases&lt;/li&gt;
&lt;li&gt;OpenSSL issues&lt;/li&gt;
&lt;li&gt;Dockerised builders&lt;/li&gt;
&lt;li&gt;target setup&lt;/li&gt;
&lt;li&gt;CI complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is impossible.&lt;/p&gt;

&lt;p&gt;But operationally, Zig often feels mechanically lighter.&lt;/p&gt;

&lt;p&gt;That matters more than people think – especially for small infrastructure teams.&lt;/p&gt;
&lt;h1&gt;
  
  
  One Thing That Becomes Obvious After These Examples
&lt;/h1&gt;

&lt;p&gt;Rust and Zig do not compete on syntax.&lt;/p&gt;

&lt;p&gt;They compete on &lt;em&gt;where engineering responsibility should live&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Rust says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The compiler should aggressively constrain dangerous behaviour.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zig says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The programmer should see the dangerous behaviour directly.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That difference affects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;tooling&lt;/li&gt;
&lt;li&gt;concurrency&lt;/li&gt;
&lt;li&gt;debugging&lt;/li&gt;
&lt;li&gt;deployment&lt;/li&gt;
&lt;li&gt;dependency culture&lt;/li&gt;
&lt;li&gt;architecture style&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even the ecosystems reflect it.&lt;/p&gt;

&lt;p&gt;Rust’s ecosystem is rich, abstracted, and ambitious.&lt;/p&gt;

&lt;p&gt;Zig’s ecosystem is smaller, simpler, and operationally direct.&lt;/p&gt;
&lt;h1&gt;
  
  
  The Interesting Part Is How These Philosophies Fail
&lt;/h1&gt;

&lt;p&gt;Rust failure mode:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The system became architecturally complicated because the compiler demanded precision.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zig failure mode:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The system stayed understandable, but correctness depended heavily on engineer discipline.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Both are real costs.&lt;/p&gt;

&lt;p&gt;Both become more visible as systems and teams grow.&lt;/p&gt;
&lt;h1&gt;
  
  
  What I Would Personally Optimise For
&lt;/h1&gt;

&lt;p&gt;If multiple teams will maintain critical infrastructure for years:&lt;/p&gt;

&lt;p&gt;I would strongly lean Rust.&lt;/p&gt;

&lt;p&gt;The compile‑time guarantees compound in value organisationally.&lt;/p&gt;

&lt;p&gt;If a small systems team deeply values operational simplicity and explicit control:&lt;/p&gt;

&lt;p&gt;Zig becomes extremely attractive.&lt;/p&gt;

&lt;p&gt;Especially for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tooling&lt;/li&gt;
&lt;li&gt;infrastructure utilities&lt;/li&gt;
&lt;li&gt;embedded systems&lt;/li&gt;
&lt;li&gt;lightweight services&lt;/li&gt;
&lt;li&gt;C migration layers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The deeper insight is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Rust optimises for preventing mistakes. Zig optimises for exposing reality.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Depending on the system, either property can be more valuable.&lt;/p&gt;
&lt;h1&gt;
  
  
  Practical Checklist
&lt;/h1&gt;

&lt;p&gt;Before choosing either language, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will many engineers touch this code?&lt;/li&gt;
&lt;li&gt;Is deployment simplicity a major concern?&lt;/li&gt;
&lt;li&gt;Is memory corruption a serious business risk?&lt;/li&gt;
&lt;li&gt;Is debugging or correctness the bigger pain today?&lt;/li&gt;
&lt;li&gt;Does the team already understand systems programming deeply?&lt;/li&gt;
&lt;li&gt;Will this system survive for many years?&lt;/li&gt;
&lt;li&gt;Is operational complexity already growing too quickly?&lt;/li&gt;
&lt;li&gt;Are hidden abstractions becoming a problem?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most teams answer these emotionally.&lt;/p&gt;

&lt;p&gt;The operational consequences arrive later.&lt;/p&gt;
&lt;h1&gt;
  
  
  Final Takeaway
&lt;/h1&gt;

&lt;p&gt;After enough examples, the philosophical split becomes very hard to unsee.&lt;/p&gt;

&lt;p&gt;Rust keeps moving complexity toward the compiler.&lt;/p&gt;

&lt;p&gt;Zig keeps moving complexity toward the engineer.&lt;/p&gt;

&lt;p&gt;Both choices carry costs.&lt;/p&gt;

&lt;p&gt;The real question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Which failure mode does this system tolerate better?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Over to you...
&lt;/h3&gt;

&lt;p&gt;If you have built serious systems in either language:&lt;/p&gt;

&lt;p&gt;Which part became the &lt;em&gt;actual&lt;/em&gt; long‑term cost?&lt;/p&gt;

&lt;p&gt;What became painful once the codebase, deployment surface, and team started growing?&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.amazonaws.com%2Fuploads%2Farticles%2F66tcd3mfgyuc679qf88v.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.amazonaws.com%2Fuploads%2Farticles%2F66tcd3mfgyuc679qf88v.png" alt="git-lrc" width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.*&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It's online, source-available, and ready for anyone to use.&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/git-lrc" rel="noopener noreferrer"&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Micro AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;| &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.da.md" rel="noopener noreferrer"&gt;🇩🇰 Dansk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.es.md" rel="noopener noreferrer"&gt;🇪🇸 Español&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fa.md" rel="noopener noreferrer"&gt;🇮🇷 Farsi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fi.md" rel="noopener noreferrer"&gt;🇫🇮 Suomi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ja.md" rel="noopener noreferrer"&gt;🇯🇵 日本語&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.nn.md" rel="noopener noreferrer"&gt;🇳🇴 Norsk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.pt.md" rel="noopener noreferrer"&gt;🇵🇹 Português&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ru.md" rel="noopener noreferrer"&gt;🇷🇺 Русский&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.sq.md" rel="noopener noreferrer"&gt;🇦🇱 Shqip&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.zh.md" rel="noopener noreferrer"&gt;🇨🇳 中文&lt;/a&gt; |&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;img width="60" alt="git-lrc logo" src="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;git-lrc&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Free, Micro AI Code Reviews That Run on Commit&lt;/h2&gt;
&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt" width="200" src="https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638"&gt;&lt;/a&gt;
 &lt;/p&gt;
&lt;br&gt;
&lt;a href="https://discord.gg/sGdnKwB3qq" rel="nofollow noopener noreferrer"&gt;
  &lt;img alt="Discord Community" src="https://camo.githubusercontent.com/b8f979318aaabc8dec512b9d4e6e2a12431fba3c8a3b8738e1a97a0722d4e4bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d436f6d6d756e6974792d3538363546323f6c6f676f3d646973636f7264266c6162656c436f6c6f723d7768697465"&gt;
&lt;/a&gt; &lt;a href="https://goreportcard.com/report/github.com/HexmosTech/git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Go Report Card" src="https://camo.githubusercontent.com/e74c0651c3ee9165a2ed01cb0f6842c494029960df30eb9c24cf622d3d21bf46/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f4865786d6f73546563682f6769742d6c7263"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/git-lrc/./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%2Fgit-lrc%2FHEAD%2F.%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;

  
    
    

    &lt;span class="m-1"&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
    
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Build a&lt;/strong&gt;…&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/git-lrc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>A New Method for Stable Software: Micro Code Reviews for the AI Era</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Tue, 12 May 2026 15:33:36 +0000</pubDate>
      <link>https://dev.to/shrsv/a-new-method-for-stable-software-micro-code-reviews-for-the-ai-era-4hi3</link>
      <guid>https://dev.to/shrsv/a-new-method-for-stable-software-micro-code-reviews-for-the-ai-era-4hi3</guid>
      <description>&lt;p&gt;&lt;em&gt;If you prefer watching a video version of this article, check out:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/pmxxJz8o2n4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This AI Moment Changes How We Build Software
&lt;/h2&gt;

&lt;p&gt;I have been into software for almost a decade now. I grew up with software, using software, building software, being enthusiastic about software. I thought it was the most magical thing. I still do.&lt;/p&gt;

&lt;p&gt;When I was in college, I read The Society of Mind by Marvin Minsky. It was a very famous book, at least in some research circles. I was enthralled by it. I loved that book and reread it many times.&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.amazonaws.com%2Fuploads%2Farticles%2Fnn1zn091s6ls6q1k3qxx.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.amazonaws.com%2Fuploads%2Farticles%2Fnn1zn091s6ls6q1k3qxx.png" alt="image-2026-05-12-14-39-48" width="770" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So this AI revolution is nothing unexpected to someone like me. I’m absolutely for it.&lt;/p&gt;

&lt;p&gt;But in terms of practical details, Minsky wasn’t exactly right. He initially did a lot to popularize neural networks, but later he moved toward other approaches and felt neural networks were not workable. With hindsight, we can now say neural networks were probably a very good idea, because modern deep learning is fundamentally based on neural models. And today, compute is what is making things happen for us.&lt;/p&gt;

&lt;p&gt;We have Rich Sutton’s “Bitter Lesson,” where he argued that what matters most is computation, not handcrafted methods. For 70 years, the biggest advances have come from leveraging computation. That idea has clearly played out in practice.&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.amazonaws.com%2Fuploads%2Farticles%2Fkjrt5ixj13458u2c3his.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.amazonaws.com%2Fuploads%2Farticles%2Fkjrt5ixj13458u2c3his.png" alt="image-2026-05-12-14-40-58" width="800" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So this is a wonderful time to do software in a different way.&lt;/p&gt;

&lt;p&gt;At Hexmos, we call ourselves builders of semi-autonomous agents. In a way, we are building agents that help build other agents. That is our focus.&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.amazonaws.com%2Fuploads%2Farticles%2Fsnlk6foh00jxbws26af9.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.amazonaws.com%2Fuploads%2Farticles%2Fsnlk6foh00jxbws26af9.png" alt="image-2026-05-12-14-41-33" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  If AI Writes More Code, What Becomes the Human Job?
&lt;/h2&gt;

&lt;p&gt;Practically speaking, most of us are using tools like GitHub Copilot, Cursor, Claude Code, OpenCode, or similar systems. We are all generating large amounts of code now, and that means we are constantly dealing with code we do not fully understand ourselves.&lt;/p&gt;

&lt;p&gt;There is simply too much being generated for manual checking.&lt;/p&gt;

&lt;p&gt;So more and more of software development is going to revolve around two pillars.&lt;/p&gt;

&lt;p&gt;Originally, we had three pillars:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Envisioning goals and specifying requirements&lt;/li&gt;
&lt;li&gt;Building software&lt;/li&gt;
&lt;li&gt;Deploying software, observing feedback from the world, tests, and production systems, and then improving the system&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.amazonaws.com%2Fuploads%2Farticles%2Fep499maabf3rmpjd5sgk.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.amazonaws.com%2Fuploads%2Farticles%2Fep499maabf3rmpjd5sgk.png" alt="image-2026-05-12-14-42-24" width="800" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now with AI, the middle part — the actual implementation work — is becoming increasingly automated.&lt;/p&gt;

&lt;p&gt;So envisioning and specification are still largely human responsibilities. And I think we want to keep it that way. As people like Herb Simon have argued, we want to design environments the way humans want them, not the way machines want them. We are building these systems for ourselves.&lt;/p&gt;

&lt;p&gt;And then there is verification.&lt;/p&gt;

&lt;p&gt;Specifying goals and checking whether things were done correctly is increasingly becoming the human responsibility.&lt;/p&gt;

&lt;p&gt;Historically, verification in software engineering has mainly been based on relatively lightweight techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code review&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;Fuzzing&lt;/li&gt;
&lt;li&gt;Property-based testing&lt;/li&gt;
&lt;li&gt;Formal verification&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.amazonaws.com%2Fuploads%2Farticles%2F5ascm5ykz5yoncqmkerq.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.amazonaws.com%2Fuploads%2Farticles%2F5ascm5ykz5yoncqmkerq.png" alt="image-2026-05-12-14-43-05" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.galois.com/articles/what-works-and-doesnt-selling-formal-methods" rel="noopener noreferrer"&gt;src: What works and doesn't selling formal methods&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The cheapest and most common method has been code review. You simply ask a senior engineer to look at the code.&lt;/p&gt;

&lt;p&gt;But now the volume has exploded because machines are generating code continuously. You may generate thousands of lines of code in a single day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Traditional Code Review Breaks When Code Volume Explodes
&lt;/h2&gt;

&lt;p&gt;So how do you verify all of that?&lt;/p&gt;

&lt;p&gt;We need more review, and we need better methods for doing it.&lt;/p&gt;

&lt;p&gt;To solve this, I came up with what I believe is a comparatively new technique: git-lrc.&lt;/p&gt;

&lt;p&gt;The idea is micro code reviews.&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.amazonaws.com%2Fuploads%2Farticles%2F9c6snjlqmnpxx8n2j79l.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.amazonaws.com%2Fuploads%2Farticles%2F9c6snjlqmnpxx8n2j79l.png" alt="image-2026-05-12-14-46-52" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Idea: Review Code at the Exact Moment It Matters Most
&lt;/h2&gt;

&lt;p&gt;What do I mean by “micro”?&lt;/p&gt;

&lt;p&gt;All of us already use &lt;code&gt;git commit&lt;/code&gt;. Whether you are using Copilot, Cursor, Claude Code, OpenCode, or something else, eventually you are storing code somewhere and creating commits.&lt;/p&gt;

&lt;p&gt;That is a universal workflow shared by tens of millions of developers.&lt;/p&gt;

&lt;p&gt;So I thought: why not place the review step exactly there?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Committing is already the point where you are ready to create a snapshot. So why not review the snapshot before it gets finalized?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That became the core insight.&lt;/p&gt;

&lt;p&gt;And now we are able to execute it properly.&lt;/p&gt;

&lt;p&gt;Another important aspect is understanding what the machine is generating. Sometimes AI systems make terrible architectural decisions. Sometimes they introduce ugly patterns, expensive cloud operations, sensitive data leaks, behavioral regressions, or security issues.&lt;/p&gt;

&lt;p&gt;They may:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introduce expensive infrastructure operations&lt;/li&gt;
&lt;li&gt;Expose sensitive data&lt;/li&gt;
&lt;li&gt;Change behavior unintentionally&lt;/li&gt;
&lt;li&gt;Corrupt important logic&lt;/li&gt;
&lt;li&gt;Leak credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So bad things can happen.&lt;/p&gt;

&lt;p&gt;That is why we want lightweight review systems that help produce more stable software while reducing bugs and operational issues.&lt;/p&gt;

&lt;p&gt;Of course, there are more rigorous techniques like formal specification and formal verification. But most software does not require that level of rigor.&lt;/p&gt;

&lt;p&gt;Often, we simply want a fast and cheap way to sanity-check generated code.&lt;/p&gt;

&lt;p&gt;That is what micro review is about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is an extremely cheap verification method that catches issues early.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Another important aspect is comprehension. As you commit changes, the system helps you understand what is happening.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Workflow Feels Like in Practice
&lt;/h2&gt;

&lt;p&gt;Here is what that looks like in practice.&lt;/p&gt;

&lt;p&gt;Imagine I intentionally add some obviously bad code to a small Go program. I stage the change the normal way and start a commit. Instead of letting the commit go through immediately, git-lrc opens a review window and begins analyzing the staged diff in real time. The important point is that the review happens at the exact moment I am about to preserve the change, so I do not need to remember a separate workflow or open a different tool.&lt;/p&gt;

&lt;p&gt;Within roughly 13 seconds, the first result appears. The system flags part of the change as suspicious and says that the lines look random and likely not intended for production use. That kind of feedback matters because it catches the sort of low-quality AI output that is easy to miss when you are moving quickly. Rather than forcing me to inspect every line from scratch, the review immediately tells me where to focus my attention.&lt;/p&gt;

&lt;p&gt;The interface then generates short visual summaries of the change and walks through them step by step. As I move through the review, it explains that a new Go package called &lt;code&gt;main&lt;/code&gt; has been introduced, that standard boilerplate was added, and that some of the comments look like placeholders or unfinished experimental code. It also points me directly to the affected file, &lt;code&gt;main.go&lt;/code&gt;, so I can jump straight from the review into the source.&lt;/p&gt;

&lt;p&gt;What makes this useful is that the tool does not stop at description. It also explains why the change may be risky. In this example, the review highlights that unfinished code can reduce stability and can create refactoring work later. So the system is doing two jobs at once: it is identifying a possible defect, and it is helping me understand the nature and impact of the change I just made.&lt;/p&gt;

&lt;p&gt;From there, I have a clear next step. I can let the tool attempt an automatic fix in the background, or I can pass the issue to another coding assistant such as Copilot or Claude and ask it to repair the specific problem. In the demo, Copilot recognizes the placeholder text and removes it.&lt;/p&gt;

&lt;p&gt;That is the core value proposition. In less than a minute, I get a review, a concise explanation of what changed, a warning about what might go wrong, and a straightforward path to fixing the issue.&lt;/p&gt;

&lt;p&gt;In practice, the system acts as both:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A lightweight verification layer&lt;/li&gt;
&lt;li&gt;A comprehension aid for AI-generated code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the essence of the micro review methodology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Tiny Review Step Can Improve Reliability and Revenue
&lt;/h2&gt;

&lt;p&gt;And I believe this can significantly improve code quality across engineering teams.&lt;/p&gt;

&lt;p&gt;Code quality directly impacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;li&gt;Uptime&lt;/li&gt;
&lt;li&gt;Customer experience&lt;/li&gt;
&lt;li&gt;Revenue retention&lt;/li&gt;
&lt;li&gt;Operational stability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Does the software stay available at night while engineers are asleep?&lt;/p&gt;

&lt;p&gt;Does it behave as expected?&lt;/p&gt;

&lt;p&gt;Does it annoy users?&lt;/p&gt;

&lt;p&gt;Does it create churn or revenue loss?&lt;/p&gt;

&lt;p&gt;Generated code must be checked, and we need cheap ways to do it continuously.&lt;/p&gt;

&lt;p&gt;This gives companies a way to improve engineering standards with very little effort.&lt;/p&gt;

&lt;p&gt;The overhead is tiny — often less than a minute per commit — but the quality gains can be substantial.&lt;/p&gt;

&lt;p&gt;So hopefully this has been useful.&lt;/p&gt;

&lt;p&gt;If this sounds interesting, go to &lt;a href="https://hexmos.com/git-lrc" rel="noopener noreferrer"&gt;Hexmos git-lrc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;From there, you can install it and try it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Pricing Is Meant to Stay Predictable
&lt;/h2&gt;

&lt;p&gt;Let me also briefly explain the pricing.&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.amazonaws.com%2Fuploads%2Farticles%2Fbaqko9epcxvrds65l6ws.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.amazonaws.com%2Fuploads%2Farticles%2Fbaqko9epcxvrds65l6ws.png" alt="image-2026-05-12-14-48-51" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We charge based on lines of code scanned.&lt;/p&gt;

&lt;p&gt;You can have unlimited users and unlimited team members, but usage is priced predictably based on scanning volume.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;$32 for 100,000 lines&lt;/li&gt;
&lt;li&gt;$64 for 200,000 lines&lt;/li&gt;
&lt;li&gt;$128 for 400,000 lines&lt;/li&gt;
&lt;li&gt;$256 for 800,000 lines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both price and volume scale proportionally.&lt;/p&gt;

&lt;p&gt;The important point is that there are no surprise bills.&lt;/p&gt;

&lt;p&gt;AI usage is included in the pricing, so you do not need to separately pay for models.&lt;/p&gt;

&lt;p&gt;You can onboard your entire team — whether you are a startup, small business, or larger company.&lt;/p&gt;

&lt;p&gt;We also offer enterprise plans for organizations that need custom deployments or integrations.&lt;/p&gt;

&lt;p&gt;But generally, most teams can simply start with the standard paid plans.&lt;/p&gt;

&lt;p&gt;There is also a free tier with around 30,000 lines of code included, so you can try it out before committing.&lt;/p&gt;

&lt;p&gt;So give it a try, explore it, and see whether this style of lightweight review improves your workflow.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codereview</category>
      <category>softwareengineering</category>
      <category>git</category>
    </item>
    <item>
      <title>FastMCP: Build Production-Ready MCP Servers in Python with Minimal Boilerplate</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Sun, 10 May 2026 16:57:02 +0000</pubDate>
      <link>https://dev.to/shrsv/fastmcp-build-production-ready-mcp-servers-in-python-with-minimal-boilerplate-5fgc</link>
      <guid>https://dev.to/shrsv/fastmcp-build-production-ready-mcp-servers-in-python-with-minimal-boilerplate-5fgc</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Shrijith Venkatramana. I'm building git-lrc, an AI code reviewer that runs on every commit. &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;Star Us&lt;/a&gt; to help devs discover the project. Do give it a try and share your feedback for improving the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Imagine you want your AI coding assistant or agent to actually &lt;em&gt;do&lt;/em&gt; useful things in your world—read the latest database records, run calculations against your data, update tickets, or even show an interactive dashboard—without you writing pages of glue code, managing JSON schemas by hand, or worrying about credential leaks every time you expose a capability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FastMCP&lt;/strong&gt; is the Python framework that makes this straightforward. It turns ordinary Python functions, classes, and data sources into fully compliant Model Context Protocol (MCP) servers that any compatible AI host (Claude Desktop, Cursor, custom agents, etc.) can discover and use safely.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Problem Does MCP (and FastMCP) Actually Solve?
&lt;/h3&gt;

&lt;p&gt;Traditional tool-calling approaches have friction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Raw function calling often requires manual schema definitions.&lt;/li&gt;
&lt;li&gt;CLI "skills" can expose too much (credentials, full shell access).&lt;/li&gt;
&lt;li&gt;Custom HTTP endpoints mean reinventing discovery, validation, auth, and state management.&lt;/li&gt;
&lt;li&gt;Connecting interactive UIs back to your backend is painful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MCP standardizes how LLMs discover and call tools, read dynamic resources, and use prompt templates. FastMCP implements that standard with Pythonic decorators and sensible defaults so you stay focused on business logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation and Your First Working Server (5 Minutes)
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;uv&lt;/code&gt; (recommended) or &lt;code&gt;pip&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv pip &lt;span class="nb"&gt;install &lt;/span&gt;fastmcp
&lt;span class="c"&gt;# or&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;fastmcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Create &lt;code&gt;server.py&lt;/code&gt;:&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;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;

&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;demo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Human-friendly name for the server
&lt;/span&gt;
&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Add two numbers. Useful for any math the agent needs to perform accurately.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;formal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Generate a greeting message.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mr. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;formal&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Defaults to Streamable HTTP transport
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python server.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The server starts on &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt; (configurable). You now have a live MCP endpoint with automatic schema generation from type hints and docstrings.&lt;/p&gt;
&lt;h3&gt;
  
  
  Exploring Your Server: Tools, Resources, and Prompts
&lt;/h3&gt;

&lt;p&gt;FastMCP supports three core primitives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt; — Executable functions the LLM can call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt; — Readable data (static or dynamic) the LLM can fetch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompts&lt;/strong&gt; — Reusable prompt templates with parameters.&lt;/p&gt;

&lt;p&gt;Add these to the same file:&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;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="c1"&gt;# Dynamic resource example
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resource://time/now&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;current_time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return current UTC time as ISO string.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# List resource
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resource://users&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;list_users&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return a list of sample users. In production, query your DB here.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&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;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&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;Alice&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;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;engineer&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&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;Bob&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;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;designer&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="c1"&gt;# Prompt template
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.prompt&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;research_topic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Generate a structured research prompt.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Research &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; depth.
    1. Use available tools to gather latest information.
    2. Summarize key findings.
    3. List open questions.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;These are automatically discoverable. Resources are great for live data (JIRA tickets, GitHub issues, database views) without forcing the LLM to call a tool every time.&lt;/p&gt;
&lt;h3&gt;
  
  
  Connecting Clients and Testing Locally
&lt;/h3&gt;

&lt;p&gt;FastMCP includes a rich client library. Create &lt;code&gt;client.py&lt;/code&gt;:&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;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# Adjust URL/port
&lt;/span&gt;        &lt;span class="c1"&gt;# List capabilities
&lt;/span&gt;        &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_tools&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Available tools:&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;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="c1"&gt;# Call a tool
&lt;/span&gt;        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;add&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;27&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;15 + 27 =&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Read a resource
&lt;/span&gt;        &lt;span class="n"&gt;time_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resource://time/now&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Current time:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For local development with interactive UIs, use the built-in dev server (more on that below).&lt;/p&gt;
&lt;h3&gt;
  
  
  Building Interactive Apps Inside the Conversation
&lt;/h3&gt;

&lt;p&gt;One of FastMCP’s most powerful features is &lt;strong&gt;Apps&lt;/strong&gt; — tools that return rich, interactive UIs rendered directly in the host’s conversation.&lt;/p&gt;

&lt;p&gt;Mark a tool with &lt;code&gt;app=True&lt;/code&gt; and return Prefab components (or custom HTML).&lt;/p&gt;

&lt;p&gt;Example &lt;code&gt;dashboard.py&lt;/code&gt;:&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;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;prefab&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Chart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DataTable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CallTool&lt;/span&gt;  &lt;span class="c1"&gt;# Prefab components
&lt;/span&gt;
&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sales-demo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_sales_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Simulate or query real data
&lt;/span&gt;    &lt;span class="k"&gt;return&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;month&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;Jan&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;revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12000&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;month&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;Feb&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;revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15000&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="c1"&gt;# ...
&lt;/span&gt;    &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sales_dashboard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Global&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;Interactive sales dashboard for the selected region.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_sales_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="nc"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sales Dashboard - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;Chart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Monthly Revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;DataTable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;searchable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Export CSV&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;on_click&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;CallTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;export_sales&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;region&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Backend tool used by the UI (hidden from LLM by default)
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;export_sales&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Generate and return file or link
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&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;success&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;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CSV for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; ready&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;Run with &lt;code&gt;fastmcp dev apps dashboard.py&lt;/code&gt; to preview locally. The dev UI gives you a picker, auto-generated forms, live rendering, and an MCP inspector showing all traffic. Changes hot-reload.&lt;/p&gt;
&lt;h3&gt;
  
  
  Advanced Patterns and Production Considerations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Server Composition &amp;amp; Namespacing&lt;/strong&gt;&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;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Provider&lt;/span&gt;

&lt;span class="n"&gt;main_mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Mount another server under a prefix
&lt;/span&gt;&lt;span class="n"&gt;github_provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;  &lt;span class="c1"&gt;# or another FastMCP instance
&lt;/span&gt;&lt;span class="n"&gt;main_mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;github_provider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;github&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;&lt;strong&gt;Authentication &amp;amp; Security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FastMCP supports multiple auth methods. You keep credentials server-side; the LLM only sees tool results. This is a major advantage over exposing raw API keys or full shell access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run locally or on any VPS with &lt;code&gt;mcp.run()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For production, Prefect Horizon offers managed hosting, GitHub-based deploys, branch previews, SSO, RBAC, audit logs, etc.&lt;/li&gt;
&lt;li&gt;Containerize easily with Docker for self-hosting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Debugging Tips&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;fastmcp dev apps&lt;/code&gt; for UI tools.&lt;/li&gt;
&lt;li&gt;Append &lt;code&gt;.md&lt;/code&gt; to any docs URL on gofastmcp.com for markdown.&lt;/li&gt;
&lt;li&gt;The server at &lt;code&gt;https://gofastmcp.com/mcp&lt;/code&gt; lets you query the docs via MCP itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Common Real-World Use Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Internal Tools&lt;/strong&gt;: Expose company DB queries, ticket systems, or monitoring data safely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal Agents&lt;/strong&gt;: Connect to your calendar, email summaries, or note-taking app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Analysis&lt;/strong&gt;: Dynamic resources for CSVs, live API feeds, or vector search results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow Automation&lt;/strong&gt;: Tools that trigger Prefect flows or other orchestration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-commerce / CRM Demos&lt;/strong&gt;: As seen in community examples with order management and dashboards.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Next Steps and Resources
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Read the official quickstart and tutorials at &lt;a href="https://gofastmcp.com" rel="noopener noreferrer"&gt;gofastmcp.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Explore example apps in the FastMCP GitHub repo.&lt;/li&gt;
&lt;li&gt;Try connecting your server to Claude Desktop or other MCP hosts.&lt;/li&gt;
&lt;li&gt;Experiment with &lt;code&gt;fastmcp dev apps&lt;/code&gt;—it’s the fastest way to iterate on interactive tools.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;FastMCP removes most of the repetitive work so you can focus on what the AI should actually &lt;em&gt;do&lt;/em&gt; with access to your systems. The code you write looks like normal Python, but suddenly becomes powerful, discoverable, and interactive capabilities for any MCP-compatible agent.&lt;/p&gt;
&lt;h2&gt;
  
  
  Start small with a couple of tools today. You’ll quickly see how natural it feels to give your AI real work to do. What domain or dataset will you connect first?
&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.amazonaws.com%2Fuploads%2Farticles%2F66tcd3mfgyuc679qf88v.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.amazonaws.com%2Fuploads%2Farticles%2F66tcd3mfgyuc679qf88v.png" alt="git-lrc" width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.*&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It's online, source-available, and ready for anyone to use.&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/git-lrc" rel="noopener noreferrer"&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Micro AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;| &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.da.md" rel="noopener noreferrer"&gt;🇩🇰 Dansk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.es.md" rel="noopener noreferrer"&gt;🇪🇸 Español&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fa.md" rel="noopener noreferrer"&gt;🇮🇷 Farsi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fi.md" rel="noopener noreferrer"&gt;🇫🇮 Suomi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ja.md" rel="noopener noreferrer"&gt;🇯🇵 日本語&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.nn.md" rel="noopener noreferrer"&gt;🇳🇴 Norsk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.pt.md" rel="noopener noreferrer"&gt;🇵🇹 Português&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ru.md" rel="noopener noreferrer"&gt;🇷🇺 Русский&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.sq.md" rel="noopener noreferrer"&gt;🇦🇱 Shqip&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.zh.md" rel="noopener noreferrer"&gt;🇨🇳 中文&lt;/a&gt; |&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;img width="60" alt="git-lrc logo" src="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;git-lrc&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Free, Micro AI Code Reviews That Run on Commit&lt;/h2&gt;
&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt" width="200" src="https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638"&gt;&lt;/a&gt;
 &lt;/p&gt;
&lt;br&gt;
&lt;a href="https://discord.gg/sGdnKwB3qq" rel="nofollow noopener noreferrer"&gt;
  &lt;img alt="Discord Community" src="https://camo.githubusercontent.com/b8f979318aaabc8dec512b9d4e6e2a12431fba3c8a3b8738e1a97a0722d4e4bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d436f6d6d756e6974792d3538363546323f6c6f676f3d646973636f7264266c6162656c436f6c6f723d7768697465"&gt;
&lt;/a&gt; &lt;a href="https://goreportcard.com/report/github.com/HexmosTech/git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Go Report Card" src="https://camo.githubusercontent.com/e74c0651c3ee9165a2ed01cb0f6842c494029960df30eb9c24cf622d3d21bf46/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f4865786d6f73546563682f6769742d6c7263"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/git-lrc/./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%2Fgit-lrc%2FHEAD%2F.%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;

  
    
    

    &lt;span class="m-1"&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
    
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Build a&lt;/strong&gt;…&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/git-lrc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>State of Linux Terminal Emulators in 2026</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Sat, 09 May 2026 17:19:33 +0000</pubDate>
      <link>https://dev.to/shrsv/state-of-linux-terminal-emulators-in-2026-1gh5</link>
      <guid>https://dev.to/shrsv/state-of-linux-terminal-emulators-in-2026-1gh5</guid>
      <description>&lt;p&gt;&lt;em&gt;Hello, I'm Shrijith Venkatramana. I'm building git-lrc, an AI code reviewer that runs on every commit. &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;Star Us&lt;/a&gt; to help devs discover the project. Do give it a try and share your feedback for improving the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;The Linux terminal emulator landscape has evolved into a rich ecosystem of powerful, modern tools that sometimes go overlooked. &lt;/p&gt;

&lt;p&gt;While many people are happy with their distribution's default, the last few years have brought some incredible improvements that can genuinely change your command-line workflow.&lt;/p&gt;

&lt;p&gt;This article dives into the state of terminal emulators in 2026, comparing 10 of the most popular options. &lt;/p&gt;

&lt;p&gt;It's not about declaring a single "best" terminal, but about understanding the trade-offs, the new capabilities, and finding the right tool for how &lt;em&gt;you&lt;/em&gt; work.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ A Tale of Two Terminals: The Great 2026 Divide
&lt;/h2&gt;

&lt;p&gt;The once-unified world of terminal emulators has undergone a dramatic split.&lt;/p&gt;

&lt;p&gt;On one side, we have the &lt;strong&gt;GPU-accelerated powerhouses&lt;/strong&gt; (like kitty, WezTerm, and Ghostty), which have turned the terminal into a fast, feature-rich "CLI platform". &lt;/p&gt;

&lt;p&gt;On the other, the &lt;strong&gt;mature, desktop-integrated classics&lt;/strong&gt; (like GNOME Terminal and Konsole) remain the rock-solid defaults for millions, but are they still relevant?&lt;/p&gt;

&lt;p&gt;This division is being driven by three forces in the Linux world:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Wayland's Dominance&lt;/strong&gt;: With Wayland as the default on major desktops like GNOME and Ubuntu‘s latest LTS, the era of X11 workarounds is over. Terminals must now be Wayland-native or have robust Wayland backends to perform well.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The GPU Render Transformation&lt;/strong&gt;: Offloading text rendering to your graphics card isn't just a gimmick. Applications like Alacritty, kitty, and Ghostty use OpenGL to achieve incredibly low latency and smooth scrolling, even under heavy log output. The CPU-rendered "old guard" has had to fight back with heavy optimization.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Containers, Tabs, and Inline Media&lt;/strong&gt;: The terminal of 2026 is no longer just a black box for commands. The best emulators now offer built-in container integration (like &lt;code&gt;distrobox&lt;/code&gt;), native tabs and splits (eliminating the need for &lt;code&gt;tmux&lt;/code&gt; for many), and even inline image and graphics protocol support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧩 The Top 10 Terminal Emulators of 2026
&lt;/h2&gt;

&lt;p&gt;Here's a breakdown of the most important terminal emulators in 2026, categorized by their philosophy and user types.&lt;/p&gt;

&lt;h3&gt;
  
  
  The New Guard (GPU-Accelerated &amp;amp; Feature-Rich)
&lt;/h3&gt;

&lt;p&gt;These are the terminals pushing the boundaries of what's possible.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. 🐈 &lt;strong&gt;kitty&lt;/strong&gt;: The Feature-Rich Platform
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/kovidgoyal/kitty" rel="noopener noreferrer"&gt;kitty&lt;/a&gt; is a GPU-accelerated terminal that feels more like a complete platform than a simple emulator. It's built for power users who want deep customization and advanced features baked right in.&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.amazonaws.com%2Fuploads%2Farticles%2Fayt88v45z5ve77qspusg.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.amazonaws.com%2Fuploads%2Farticles%2Fayt88v45z5ve77qspusg.png" alt="kitty" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Key Features&lt;/strong&gt;: Built-in tiling window management, a custom graphics protocol (for viewing images in the terminal with &lt;code&gt;icat&lt;/code&gt;), and a unique "kitten" system for extensible command-line tools.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance&lt;/strong&gt;: Written in C and Python, kitty is incredibly fast. Version 0.33 introduced SIMD-parallel parsing, dramatically improving throughput in real-world workloads.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Configuration&lt;/strong&gt;: Uses a simple, human-readable config file. Powerful, but there's no GUI for settings.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict&lt;/strong&gt;: The ultimate choice if you want a single, highly-capable terminal to replace your need for separate multiplexers like &lt;code&gt;tmux&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where to get it:&lt;/strong&gt; &lt;code&gt;sudo apt install kitty&lt;/code&gt; (Ubuntu/Debian) or &lt;code&gt;sudo pacman -S kitty&lt;/code&gt; (Arch). For more, see the &lt;a href="https://sw.kovidgoyal.net/kitty/" rel="noopener noreferrer"&gt;official website&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  2. 🦀 &lt;strong&gt;WezTerm&lt;/strong&gt;: The Programmable Powerhouse
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://wezterm.org/" rel="noopener noreferrer"&gt;WezTerm&lt;/a&gt; is a cross-platform Rust terminal with a superpower: a built-in multiplexer that works seamlessly across local and remote hosts.&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.amazonaws.com%2Fuploads%2Farticles%2Fr0juzqd1ohc4s2u1nl29.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.amazonaws.com%2Fuploads%2Farticles%2Fr0juzqd1ohc4s2u1nl29.png" alt="wezterm" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Key Features&lt;/strong&gt;: Its entire configuration is done in Lua, making it infinitely customizable. It supports panes, tabs, and windows that can span different machines while preserving state.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance&lt;/strong&gt;: Extremely competitive with other GPU-accelerated terminals, though some users note a slightly higher memory footprint due to its rich feature set.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Configuration&lt;/strong&gt;: Everything is configured in Lua. It has a steep learning curve, but the flexibility is unmatched for developers who want complete control.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict&lt;/strong&gt;: The best pick for developers who live in a mix of local and remote environments and want to script every aspect of their terminal.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where to get it:&lt;/strong&gt; Available via most package managers. Check the &lt;a href="https://wezterm.org/" rel="noopener noreferrer"&gt;official website&lt;/a&gt; for installation instructions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  3. 👻 &lt;strong&gt;Ghostty&lt;/strong&gt;: The New Native Kid on the Block
&lt;/h4&gt;

&lt;p&gt;Created by Mitchell Hashimoto (founder of HashiCorp), Ghostty has quickly gained a massive following for its speed and native approach.&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.amazonaws.com%2Fuploads%2Farticles%2F9wotz5khc3wrx43li1nc.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.amazonaws.com%2Fuploads%2Farticles%2F9wotz5khc3wrx43li1nc.png" alt="ghostty" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Key Features&lt;/strong&gt;: Uses platform-native UI toolkits, including GTK4 on Linux. It's GPU-accelerated and supports modern features like tabs, splits, and multiple graphics protocols (Kitty, Sixel, iTerm2) out of the box.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance&lt;/strong&gt;: Early benchmarks place it squarely in the top tier for speed. It's designed to feel "snappy" even with dozens of tabs and splits.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Adoption&lt;/strong&gt;: In a very short time, Ghostty has gathered over 45k GitHub stars and is even packaged as a snap and in the Ubuntu 26.04 LTS repositories.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict&lt;/strong&gt;: A promising, rapidly maturing terminal that is already a great daily driver for anyone who wants a modern, fast, and well-integrated experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where to get it:&lt;/strong&gt; &lt;code&gt;sudo snap install ghostty&lt;/code&gt; or &lt;code&gt;sudo apt install ghostty&lt;/code&gt; (on Ubuntu 26.04). Visit the &lt;a href="https://github.com/ghostty-org/ghostty" rel="noopener noreferrer"&gt;GitHub page&lt;/a&gt; to build from source.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  4. ⚡ &lt;strong&gt;Alacritty&lt;/strong&gt;: The Speed Minimalist
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/alacritty/alacritty" rel="noopener noreferrer"&gt;Alacritty&lt;/a&gt; set the standard for the modern, GPU-accelerated terminal. Its philosophy is laser-focused: be the fastest terminal emulator, and nothing else.&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.amazonaws.com%2Fuploads%2Farticles%2Flec7dxid16l7vfi4mta7.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.amazonaws.com%2Fuploads%2Farticles%2Flec7dxid16l7vfi4mta7.png" alt="alacritty" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Key Features&lt;/strong&gt;: It deliberately lacks built-in tabs or splits. The authors believe these features are better handled by a separate multiplexer like &lt;code&gt;tmux&lt;/code&gt; or &lt;code&gt;zellij&lt;/code&gt;, adhering to the Unix philosophy of one tool doing one job well.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance&lt;/strong&gt;: Unmatched raw speed. Its idle memory usage is incredibly low (around 20-35 MB), and input latency is among the best in the business, especially with recent Wayland improvements.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Configuration&lt;/strong&gt;: Configured via a straightforward YAML or TOML file. No GUI, no bloat.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict&lt;/strong&gt;: The perfect choice for users who love &lt;code&gt;tmux&lt;/code&gt; and want a terminal that is ruthlessly efficient and gets out of their way.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where to get it:&lt;/strong&gt; &lt;code&gt;sudo apt install alacritty&lt;/code&gt; or &lt;code&gt;sudo pacman -S alacritty&lt;/code&gt;. Find more at &lt;a href="https://github.com/alacritty/alacritty" rel="noopener noreferrer"&gt;Alacritty's GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The Trusted Workhorses (Desktop-Integrated &amp;amp; Stable)
&lt;/h3&gt;

&lt;p&gt;These are the terminals you probably already have installed. They've been improving quietly and are more capable than ever.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. 💠 &lt;strong&gt;Konsole&lt;/strong&gt;: The KDE Power User's Dream
&lt;/h4&gt;

&lt;p&gt;If you're on KDE Plasma, &lt;a href="https://apps.kde.org/konsole/" rel="noopener noreferrer"&gt;Konsole&lt;/a&gt; is a natural extension of your desktop environment. It‘s feature-rich, deeply integrated, and highly performant for what it does.&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.amazonaws.com%2Fuploads%2Farticles%2Fwwxjknk5cyur98s47uqn.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.amazonaws.com%2Fuploads%2Farticles%2Fwwxjknk5cyur98s47uqn.png" alt="konsole" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Key Features&lt;/strong&gt;: Offers native splits, tabs, bookmarks (for directories and SSH sessions), and profiles. It integrates seamlessly with Dolphin (F4 opens a terminal in the current directory) and other KDE components.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance&lt;/strong&gt;: Not GPU-accelerated, but it’s highly optimized for typical workloads and supports modern features like true color and font ligatures.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Configuration&lt;/strong&gt;: Has a full-featured GUI preferences dialog, making it very user-friendly for customization.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict&lt;/strong&gt;: Hands down the best terminal for anyone who uses KDE Plasma as their daily driver.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where to get it:&lt;/strong&gt; Already installed on KDE Plasma. For others, &lt;code&gt;sudo apt install konsole&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  6. 🐧 &lt;strong&gt;GNOME Terminal&lt;/strong&gt;: The Unkillable Classic
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/GNOME/gnome-terminal" rel="noopener noreferrer"&gt;GNOME Terminal&lt;/a&gt; is the default for millions of Linux users. While GNOME has been pushing its simpler "Console" app, GNOME Terminal remains the heavy lifter for serious work.&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.amazonaws.com%2Fuploads%2Farticles%2Fre1g4tjhyfdwunc2goag.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.amazonaws.com%2Fuploads%2Farticles%2Fre1g4tjhyfdwunc2goag.png" alt="gnome terminal" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Key Features&lt;/strong&gt;: It offers profiles, tabs (though GNOME 40+ removed the tab bar by default), transparency, and customization via &lt;code&gt;dconf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance&lt;/strong&gt;: The critical update here is the VTE (the terminal widget library) overhaul in GNOME 46. This brought substantial latency reductions, bringing GNOME Terminal's responsiveness much closer to GPU-accelerated competitors.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Configuration&lt;/strong&gt;: The dconf-based configuration system is powerful but can be clunky.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict&lt;/strong&gt;: A safe, stable, and now surprisingly fast default that is more than enough for most users. It really has come a long way.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where to get it:&lt;/strong&gt; &lt;code&gt;sudo apt install gnome-terminal&lt;/code&gt; or use your distribution's package manager.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Specialists &amp;amp; Niche Picks
&lt;/h3&gt;

&lt;p&gt;These terminals serve very specific needs with unique approaches.&lt;/p&gt;

&lt;h4&gt;
  
  
  7. ⚙️ &lt;strong&gt;Foot&lt;/strong&gt;: The Wayland-First Minimalist
&lt;/h4&gt;

&lt;p&gt;If you're using a Wayland-based tiling window manager like Sway or Hyprland, &lt;a href="https://codeberg.org/dnkl/foot" rel="noopener noreferrer"&gt;Foot&lt;/a&gt; is a must-try. It's built from the ground up for Wayland and prioritizes minimalism and efficiency above all else.&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.amazonaws.com%2Fuploads%2Farticles%2Fyn9l5h4gn9xv10wpuwa6.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.amazonaws.com%2Fuploads%2Farticles%2Fyn9l5h4gn9xv10wpuwa6.png" alt="foot terminal" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Key Features&lt;/strong&gt;: It's CPU-rendered but incredibly lean. Despite its small size, it supports true color, Sixel images, and even scrollback search.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance&lt;/strong&gt;: Incredibly low memory usage and fast startup. Its design philosophy trades feature bloat for pure, predictable performance. It's a perfect complement to a highly scripted, &lt;code&gt;tmux&lt;/code&gt;-driven workflow.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Configuration&lt;/strong&gt;: Simple, file-based configuration.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict&lt;/strong&gt;: The ultimate terminal for users of tiling window managers who want a simple, rock-solid, and fast Wayland-native experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where to get it:&lt;/strong&gt; &lt;code&gt;sudo pacman -S foot&lt;/code&gt; (Arch) or build from &lt;a href="https://codeberg.org/dnkl/foot" rel="noopener noreferrer"&gt;its Git repository&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  8. 📐 &lt;strong&gt;Tilix &amp;amp; Terminator&lt;/strong&gt;: The Classic Tilers
&lt;/h4&gt;

&lt;p&gt;Before tiling became mainstream in terminals like kitty, &lt;a href="https://gnunn1.github.io/tilix-web/" rel="noopener noreferrer"&gt;tilix&lt;/a&gt; and &lt;a href="https://gnome-terminator.org/" rel="noopener noreferrer"&gt;terminator&lt;/a&gt; were the go-to options for splitting a single window into multiple panes.&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.amazonaws.com%2Fuploads%2Farticles%2Fu6be99bqmj0sar575975.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.amazonaws.com%2Fuploads%2Farticles%2Fu6be99bqmj0sar575975.png" alt="tilix" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Features&lt;/strong&gt;: Both are VTE-based and allow you to divide a window into a grid of terminals. They can save and restore sessions, making them great for setting up a reproducible dev environment.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Maintenance&lt;/strong&gt;: This is the main concern. Tilix's development has slowed significantly (the project has explicitly sought maintainers), and Terminator has a similar, though slightly better, maintenance status.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance&lt;/strong&gt;: As VTE clients, they get the latency benefits of the GNOME 46 VTE improvements.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict&lt;/strong&gt;: Still functional and in most distro repos, but for new users, a more actively maintained solution like kitty, WezTerm, or Konsole is likely a better long-term choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  9. 📟 &lt;strong&gt;xterm&lt;/strong&gt;: The Eternal Fallback
&lt;/h4&gt;

&lt;p&gt;We should never forget &lt;code&gt;xterm&lt;/code&gt;. It is the reference implementation and is as stable as bedrock. It's the "canary in the coal mine" for terminal compatibility.&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.amazonaws.com%2Fuploads%2Farticles%2Fsrafpr5nrb5rh951lqec.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.amazonaws.com%2Fuploads%2Farticles%2Fsrafpr5nrb5rh951lqec.png" alt="xterm" width="250" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Features&lt;/strong&gt;: It‘s the most standards-compliant terminal you can find. It’s highly configurable via X resources, but it lacks modern niceties like tabs, decent theming, or Wayland support (without XWayland).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict&lt;/strong&gt;: Every Linux user should have it installed. When your fancy GPU terminal breaks in the most arcane way possible, &lt;code&gt;xterm&lt;/code&gt; will still be there for you.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where to get it:&lt;/strong&gt; It's probably already installed. If not, &lt;code&gt;sudo apt install xterm&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧠 A Framework for Your Terminal Choice
&lt;/h2&gt;

&lt;p&gt;With so many options, choosing a terminal can feel overwhelming. Here's a structured way to think about the decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Case: I Use a Desktop Environment (GNOME, KDE)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Your Best Bet:&lt;/strong&gt; &lt;strong&gt;Konsole&lt;/strong&gt; (for KDE) / &lt;strong&gt;GNOME Terminal&lt;/strong&gt; (for GNOME).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Why?&lt;/strong&gt; These terminals offer the best integration with your desktop's theming, shortcuts, and workflow. They are stable, well-supported, and get regular improvements (the recent VTE performance boost in GNOME Terminal is a great example).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Action:&lt;/strong&gt; Give your default terminal another try. You might be surprised at how good it's become. Explore its settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Case: I’m a Terminal Junkie / &lt;code&gt;tmux&lt;/code&gt; Addict
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Your Best Bet:&lt;/strong&gt; &lt;strong&gt;Alacritty&lt;/strong&gt; or &lt;strong&gt;Foot&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Why?&lt;/strong&gt; You want a terminal that is a flawless canvas for your real workflow: &lt;code&gt;tmux&lt;/code&gt;, &lt;code&gt;neovim&lt;/code&gt;, and custom scripts. You don‘t need or want your terminal emulator to also be a window manager. Alacritty is the speed king, while Foot is the Waylord’s choice.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Action:&lt;/strong&gt; Set up Alacritty with your favorite &lt;code&gt;tmux&lt;/code&gt; config. You'll likely never look back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Case: I Want One Terminal to Rule Them All
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Your Best Bet:&lt;/strong&gt; &lt;strong&gt;kitty&lt;/strong&gt; or &lt;strong&gt;WezTerm&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Why?&lt;/strong&gt; You find &lt;code&gt;tmux&lt;/code&gt; powerful but a bit of a layer on top. You want native tabs, splits, inline images, and deep scripting ability built directly into your terminal. kitty offers a battle-hardened "platform" with its kittens, while WezTerm offers infinite customizability with Lua.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Action:&lt;/strong&gt; Install both and spend a day configuring each. See which one "clicks" with your mental model.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Case: I’m a Wayland Tiling WM User (Sway, Hyprland)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Your Best Bet:&lt;/strong&gt; &lt;strong&gt;Foot&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Why?&lt;/strong&gt; It‘s made for you. It’s native, lightweight, and doesn't try to reinvent the tiling wheel (your WM handles that). It‘s a perfect match for the philosophy of a tiling environment.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Action:&lt;/strong&gt; &lt;code&gt;sudo pacman -S foot&lt;/code&gt; and set it as your primary terminal in your Sway/Hyprland config.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ❓ The Final Command Line: Which One is for You?
&lt;/h2&gt;

&lt;p&gt;This guide covers the major players, but the real answer is, as always in Linux, “it depends”. Here's a summary to help you decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Want the most features in a box?&lt;/strong&gt; → Go with &lt;strong&gt;kitty&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Need ultimate programmability and remote multiplexing?&lt;/strong&gt; → Try &lt;strong&gt;WezTerm&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Want a modern, fast, native terminal?&lt;/strong&gt; → Check out &lt;strong&gt;Ghostty&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Value pure, raw speed and minimalism?&lt;/strong&gt; → Pick &lt;strong&gt;Alacritty&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Love KDE and want deep integration?&lt;/strong&gt; → Stick with &lt;strong&gt;Konsole&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Use a distro with GNOME and want a solid, improved default?&lt;/strong&gt; → &lt;strong&gt;GNOME Terminal&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Live in a Wayland tiling window manager?&lt;/strong&gt; → Try &lt;strong&gt;Foot&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Need a rock-solid standard for debugging?&lt;/strong&gt; → Keep &lt;strong&gt;xterm&lt;/strong&gt; handy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your terminal is your home in the Linux world. It's worth the investment to find one that feels just right. For me, the improvements in speed and features over the last few years have been genuinely transformative. Whether it's a GPU-rendered giant or a newly optimized classic, the terminal of 2026 is a tool that any power user can get genuinely excited about. Give a new one a spin this weekend. You might be surprised by what you find.&lt;/p&gt;




&lt;p&gt;*What's your daily driver terminal? Let me know in the comments! &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.amazonaws.com%2Fuploads%2Farticles%2F66tcd3mfgyuc679qf88v.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.amazonaws.com%2Fuploads%2Farticles%2F66tcd3mfgyuc679qf88v.png" alt="git-lrc" width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.*&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It's online, source-available, and ready for anyone to use.&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/git-lrc" rel="noopener noreferrer"&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Micro AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;| &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.da.md" rel="noopener noreferrer"&gt;🇩🇰 Dansk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.es.md" rel="noopener noreferrer"&gt;🇪🇸 Español&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fa.md" rel="noopener noreferrer"&gt;🇮🇷 Farsi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fi.md" rel="noopener noreferrer"&gt;🇫🇮 Suomi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ja.md" rel="noopener noreferrer"&gt;🇯🇵 日本語&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.nn.md" rel="noopener noreferrer"&gt;🇳🇴 Norsk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.pt.md" rel="noopener noreferrer"&gt;🇵🇹 Português&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ru.md" rel="noopener noreferrer"&gt;🇷🇺 Русский&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.sq.md" rel="noopener noreferrer"&gt;🇦🇱 Shqip&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.zh.md" rel="noopener noreferrer"&gt;🇨🇳 中文&lt;/a&gt; |&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;img width="60" alt="git-lrc logo" src="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;git-lrc&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Free, Micro AI Code Reviews That Run on Commit&lt;/h2&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt" width="200" src="https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638"&gt;&lt;/a&gt;
 &lt;/p&gt;
&lt;br&gt;
&lt;a href="https://discord.gg/sGdnKwB3qq" rel="nofollow noopener noreferrer"&gt;
  &lt;img alt="Discord Community" src="https://camo.githubusercontent.com/b8f979318aaabc8dec512b9d4e6e2a12431fba3c8a3b8738e1a97a0722d4e4bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d436f6d6d756e6974792d3538363546323f6c6f676f3d646973636f7264266c6162656c436f6c6f723d7768697465"&gt;
&lt;/a&gt; &lt;a href="https://goreportcard.com/report/github.com/HexmosTech/git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Go Report Card" src="https://camo.githubusercontent.com/e74c0651c3ee9165a2ed01cb0f6842c494029960df30eb9c24cf622d3d21bf46/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f4865786d6f73546563682f6769742d6c7263"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/git-lrc/./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%2Fgit-lrc%2FHEAD%2F.%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;

  
    
    

    &lt;span class="m-1"&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
    
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Build a&lt;/strong&gt;…&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/git-lrc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Subsidy Era Is Over: A Reality Check on AI-Powered Dev Tool Pricing</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Fri, 08 May 2026 18:02:21 +0000</pubDate>
      <link>https://dev.to/shrsv/the-subsidy-era-is-over-a-reality-check-on-ai-powered-dev-tool-pricing-51dn</link>
      <guid>https://dev.to/shrsv/the-subsidy-era-is-over-a-reality-check-on-ai-powered-dev-tool-pricing-51dn</guid>
      <description>&lt;p&gt;&lt;em&gt;If you prefer watching a video version of this article, check out:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/YOkBQJgeKoQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You have all been using different kinds of AI tools, be it Claude, GitHub Copilot, anti-gravity, Google Gemini, or Cursor. These tools started with very generous pricing, so it felt like you could get a lot done for very little. Many people were getting things done using the free tier itself, but it seems like things are changing. In this video, I will walk through a few of these limitations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Subsidy Era Is Ending
&lt;/h2&gt;

&lt;p&gt;This discussion was prompted by a post by Kamil Krauspe, a VP of Engineering and Managing Director at a reputed AI company. Based on some interesting evidence, his conclusion is that, on the surface, it looks like nothing has changed, but in many of these providers, the amount of AI included per plan has reduced. Essentially, the subsidy is ending.&lt;/p&gt;

&lt;p&gt;He points to evidence across providers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude has reduced subsidies.&lt;/li&gt;
&lt;li&gt;Copilot has reduced subsidies.&lt;/li&gt;
&lt;li&gt;OpenAI has reduced subsidies for Codex.&lt;/li&gt;
&lt;li&gt;Google has tightened anti-gravity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also a nuance with Claude. Recently, there was news that Claude had increased its limits, or doubled them. But what actually happened is that the five-hour limit increased while the weekly and monthly limits remained the same. So the overall volume has not increased; only the hourly limit has.&lt;/p&gt;

&lt;p&gt;One reason for this, according to the argument, is that in a typical SaaS product there is an extreme user profile: someone who pays $10 and maybe, in the worst case, consumes $100 worth of value. But with agents, that multiple can become 100,000x. Cost also has multiple layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model cost&lt;/li&gt;
&lt;li&gt;Tool builder cost&lt;/li&gt;
&lt;li&gt;User behavior cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in all, because the subsidies are ending, it is very important for people to make cost-conscious decisions. The core point is that all the major providers are tightening plans and tightening steps.&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.amazonaws.com%2Fuploads%2Farticles%2Fr1os6z1szjoy6n8oidpa.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.amazonaws.com%2Fuploads%2Farticles%2Fr1os6z1szjoy6n8oidpa.png" alt="subsidy-quote" width="544" height="748"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Think in Workloads, Not Models
&lt;/h2&gt;

&lt;p&gt;The practical conclusion is that companies and individuals have to think more from a workload angle, not from a model angle. Earlier, the view was simple: there is a task, you complete the task, and you pay a particular amount. Now pricing is becoming much more granular, often at the token level.&lt;/p&gt;

&lt;p&gt;That means the workload matters far more. For example, you might be doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autocomplete&lt;/li&gt;
&lt;li&gt;A single question or query&lt;/li&gt;
&lt;li&gt;Interactive file editing&lt;/li&gt;
&lt;li&gt;An autonomous agent run&lt;/li&gt;
&lt;li&gt;Multi-agent orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The token usage profiles and the costs are totally different across these workloads. Token usage might be less than 1,000, or it could go up to a billion. The cost might be less than $0.01, or it could be $500 or more for a single task.&lt;/p&gt;

&lt;p&gt;This is a massive difference. For example, in a Claude subscription someone may pay $200, while heavy use may consume up to $4,400. On average, maybe it is $1,000. So who is paying for the 5x or even 50x cost? Right now, companies are absorbing it, but how long can they keep doing that?&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.amazonaws.com%2Fuploads%2Farticles%2Fqw4z6txipdk7hoiclk5u.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.amazonaws.com%2Fuploads%2Farticles%2Fqw4z6txipdk7hoiclk5u.png" alt="task variance" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing Models in AI Code Review
&lt;/h2&gt;

&lt;p&gt;In my own area, where I am building a portfolio, what I am seeing is that many products still use an older, seat-based pricing idea.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Code Rabbit charges $30 per month per user. If you are a startup with 10 engineers, that is $300 per month and $3,000 or more annually for the basic plan.&lt;/li&gt;
&lt;li&gt;The premium plan may be double that: $60 per user, or $6,000 per year.&lt;/li&gt;
&lt;li&gt;Code-ant is also charging similarly.&lt;/li&gt;
&lt;li&gt;Greptile is also charging similarly.&lt;/li&gt;
&lt;li&gt;Usage-based pricing, like Claude, is unbounded. It could be any number. You have no control over what the final monthly amount is going to be.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With pure usage pricing, a review could cost $15 or $25. If you are doing 10 reviews, that can become a large number in a single month, even for one user. So in the market, we are seeing a mix of pure usage pricing and seat-based pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Approach Behind git-lrc and LiveReview
&lt;/h2&gt;

&lt;p&gt;I have a tool called git-lrc and LiveReview, and we have taken a different approach. We have merged usage-based pricing with upper-limit, slab-based pricing. The reason is simple: we want usage anchoring and slab-level pricing at the same time, so you get predictability at the end.&lt;/p&gt;

&lt;p&gt;What does that mean?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We charge by how many lines of code you scan.&lt;/li&gt;
&lt;li&gt;We do not care how many engineers you have.&lt;/li&gt;
&lt;li&gt;We are not charging by token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if you are a startup with 10 engineers, you can start with just $32, as long as you are scanning only 100,000 lines. The slabs are straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$32 for 100,000 LOC&lt;/li&gt;
&lt;li&gt;$64 for 200,000 LOC&lt;/li&gt;
&lt;li&gt;$128 for 400,000 LOC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what I mean by slab-based pricing. We are not charging artificially. We are trying to charge in a fair, transparent, and predictable way. In my opinion, none of the other solutions in the market, whether Claude, Code Rabbit, or Greptile, offer this kind of sensible pricing.&lt;/p&gt;

&lt;p&gt;I think this is a major strength of our model: predictability plus usage anchoring. People do not want unbounded charges from pure token-based pricing, and they do not want seat-based pricing where they may end up paying unnecessarily because they have 10 engineers but many of them may not use the tool that actively. You end up paying for unused capacity, and that is not a good idea.&lt;/p&gt;

&lt;p&gt;So this is the pricing model we have innovated: slab-based pricing tied to usage. That is where you get predictability, simplicity, and value for money. There is no misuse of money happening. Your money goes to actual usage. I hope this subsidy discussion gives you that reality check, and I hope you check out the tool I have built.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Quick Introduction to git-lrc
&lt;/h2&gt;

&lt;p&gt;I want to take two minutes of your time to introduce git-lrc. git-lrc is a free micro AI code review tool that runs on git commit as you develop software with agents.&lt;/p&gt;

&lt;p&gt;As you know, AI can write a lot of code, but your team still owns the outcome. With AI, code generation is not the problem; consequence management is. Who has to answer for outages, security incidents, broken promises, and customer complaints? It is still the engineer, the engineering team, and engineering management. You may delegate execution to AI a little bit, but you cannot delegate responsibility.&lt;/p&gt;

&lt;p&gt;git-lrc provides micro AI code reviews on git commit. This improves production stability, security, and performance while reducing bugs, latency, and cost, and it does all this while demanding very little engineering effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Quick Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/nKq7FEo88RQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Here is a quick demo of git-lrc:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You open Git as usual.&lt;/li&gt;
&lt;li&gt;You run git status and see there are changes.&lt;/li&gt;
&lt;li&gt;You trigger a review with git commit.&lt;/li&gt;
&lt;li&gt;The updates appear in real time.&lt;/li&gt;
&lt;li&gt;You quickly get a summary of what the change is about.&lt;/li&gt;
&lt;li&gt;You get that summary in a very clear viewer web UI.&lt;/li&gt;
&lt;li&gt;The issues are categorized by severity, such as warning and critical.&lt;/li&gt;
&lt;li&gt;You can also see cost bugs, security bugs, and other issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can go to GitHub and read the entire source at &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;github.com/HexmosTech/git-lrc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For teams, the pricing is extremely affordable. You can get started at $32 and scan 100,000 lines of code per month. We do not have any headcount-based pricing, and we do not charge per engineer. The pricing is extremely simple.&lt;/p&gt;

&lt;p&gt;You can get started with $32 per month for any number of users and unlimited team members, and you get all the features for review, PR threads, GitHub, GitLab, bucket integration, AI credits, micro reviews, the VS Code extension, and other features. Everything is included in this.&lt;/p&gt;

&lt;p&gt;So for $32, this is one of the best value-for-money options you can get on the market in terms of code review. You can increase the tier if you wish. Go to &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;github.com/HexmosTech/git-lrc&lt;/a&gt; and see it for yourself.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>developertools</category>
      <category>pricing</category>
      <category>codereview</category>
    </item>
    <item>
      <title>MCP is APIs for Agents</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Thu, 07 May 2026 18:30:01 +0000</pubDate>
      <link>https://dev.to/shrsv/mcp-is-apis-for-agents-lep</link>
      <guid>https://dev.to/shrsv/mcp-is-apis-for-agents-lep</guid>
      <description>&lt;p&gt;REST APIs gave humans (and the code they wrote) a standardized way to access software over the network.&lt;/p&gt;

&lt;p&gt;MCP is trying to do the same thing for agents.&lt;/p&gt;

&lt;p&gt;That simple framing clears up a &lt;em&gt;lot&lt;/em&gt; of confusion.&lt;/p&gt;

&lt;p&gt;For nearly 20 years we built systems assuming the caller was a human developer writing code against APIs. Now the caller is increasingly an LLM-driven agent. MCP changes the interface layer accordingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  The REST Era: APIs Designed for Humans
&lt;/h3&gt;

&lt;p&gt;With REST + OpenAPI, the typical flow looked 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;Human Developer
    ↓
SDK / HTTP Client
    ↓
REST API
    ↓
Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A human would read the docs, inspect the OpenAPI spec, figure out auth, pick the right endpoints, map parameters, handle retries and errors, and manually compose workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.openapis.org/" rel="noopener noreferrer"&gt;OpenAPI&lt;/a&gt; became the universal machine-readable description of the API. It captured endpoints, request/response schemas, authentication, parameters, types, and examples. This enabled Swagger UI, SDK generators, Postman collections, API gateways, client codegen, and testing tools.&lt;/p&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OpenAPI standardized "how humans and programs understand APIs."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But agents aren't humans. And that changes everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why REST APIs Are Awkward for Agents
&lt;/h3&gt;

&lt;p&gt;An LLM &lt;em&gt;can&lt;/em&gt; call REST APIs directly — technically there's nothing stopping it. But raw REST has some serious friction when the consumer is an agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. REST assumes deterministic callers&lt;/strong&gt;&lt;br&gt;
REST expects the caller to already know which endpoint to hit, which parameters matter, the right sequencing, and how to handle failures. Agents don't work that way. They reason step-by-step and make decisions dynamically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. OpenAPI is optimized for developers, not reasoning systems&lt;/strong&gt;&lt;br&gt;
Humans are great at inferring intent from sparse or messy docs. Agents struggle with ambiguous operation names, missing descriptions, inconsistent schemas, and undocumented behavior.&lt;/p&gt;

&lt;p&gt;Multiple &lt;a href="https://blog.christianposta.com/semantics-matter-exposing-openapi-as-mcp-tools/" rel="noopener noreferrer"&gt;OpenAPI→MCP&lt;/a&gt; articles have pointed out the same thing: the quality of the MCP experience depends &lt;em&gt;heavily&lt;/em&gt; on the semantic quality of the underlying OpenAPI spec.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. REST exposes transport details too directly&lt;/strong&gt;&lt;br&gt;
Agents don't care about HTTP verbs, query params vs body, pagination formats, or JSON quirks. They care about &lt;em&gt;capabilities&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Instead of thinking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/v3/issues
Content-Type: application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They want to think:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Create a Jira ticket"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP pulls the interface up to the level of tools and capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP: APIs for Agents
&lt;/h3&gt;

&lt;p&gt;The Model Context Protocol (MCP) is essentially:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A standardized protocol that lets agents discover and invoke tools dynamically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Anthropic has called it something like "&lt;a href="https://www.itpro.com/technology/artificial-intelligence/what-is-model-context-protocol-mcp" rel="noopener noreferrer"&gt;USB-C for AI integrations&lt;/a&gt;."&lt;/p&gt;

&lt;p&gt;The new flow usually looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  ↓
LLM Host (Claude, Cursor, VSCode, etc)
  ↓
MCP Client
  ↓
MCP Server
  ↓
REST APIs / Databases / Tools / Systems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The crucial mental model shift:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST = interface for programmers&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;MCP = interface for agents&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What MCP Actually Exposes
&lt;/h3&gt;

&lt;p&gt;An MCP server exposes &lt;strong&gt;tools&lt;/strong&gt;, &lt;strong&gt;resources&lt;/strong&gt;, &lt;strong&gt;prompts&lt;/strong&gt;, and &lt;strong&gt;capabilities&lt;/strong&gt;. The star of the show is usually the &lt;strong&gt;tool&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's a simplified 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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"create_github_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;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Create a GitHub issue in a repository"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&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="err"&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;Notice everything that disappeared: HTTP verbs, endpoint URLs, transport details. The agent now reasons at the &lt;em&gt;capability&lt;/em&gt; level.&lt;/p&gt;

&lt;h3&gt;
  
  
  REST vs MCP
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;REST/OpenAPI&lt;/th&gt;
&lt;th&gt;MCP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Designed for developers&lt;/td&gt;
&lt;td&gt;Designed for agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoint-centric&lt;/td&gt;
&lt;td&gt;Capability-centric&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP-first&lt;/td&gt;
&lt;td&gt;Tool-first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human docs&lt;/td&gt;
&lt;td&gt;LLM-readable semantics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explicit orchestration&lt;/td&gt;
&lt;td&gt;Dynamic reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDKs&lt;/td&gt;
&lt;td&gt;Tool registries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request/response focus&lt;/td&gt;
&lt;td&gt;Intent/action focus&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  So Where Does OpenAPI Fit?
&lt;/h3&gt;

&lt;p&gt;This is where things got exciting fast.&lt;/p&gt;

&lt;p&gt;We already have &lt;em&gt;massive&lt;/em&gt; amounts of structured API metadata sitting in OpenAPI specs. So instead of hand-writing MCP servers, the ecosystem started &lt;em&gt;generating&lt;/em&gt; them automatically.&lt;/p&gt;

&lt;p&gt;Tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mattt/emcee" rel="noopener noreferrer"&gt;emcee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/harsha-iiiv/openapi-mcp-generator" rel="noopener noreferrer"&gt;openapi-mcp-generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/TBosak/specbridge" rel="noopener noreferrer"&gt;specbridge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://awslabs.github.io/mcp/servers/openapi-mcp-server" rel="noopener noreferrer"&gt;OpenAPI MCP Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;are basically doing &lt;code&gt;OpenAPI → MCP tools&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Core Conversion Idea
&lt;/h3&gt;

&lt;p&gt;Take a REST endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;POST /tickets&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with OpenAPI metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;createTicket&lt;/span&gt;
&lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create support ticket&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An MCP generator turns it into a clean tool definition. Under the hood the MCP server still makes the HTTP call, but the agent sees a high-level capability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Works Surprisingly Well
&lt;/h3&gt;

&lt;p&gt;OpenAPI already gives us schemas, parameters, descriptions, auth definitions, and operation names. A lot of REST APIs were already "halfway to MCP."&lt;/p&gt;

&lt;p&gt;That's why &lt;a href="https://www.stainless.com/mcp/convert-openapi-specs-to-mcp-servers" rel="noopener noreferrer"&gt;OpenAPI-to-MCP tooling&lt;/a&gt; exploded so quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  But Conversion Is Not Enough
&lt;/h3&gt;

&lt;p&gt;Here's where many early takes fall short.&lt;/p&gt;

&lt;p&gt;A naive 1:1 mapping from REST endpoint to MCP tool is often... mediocre. MCP isn't just a protocol translation — it's an &lt;em&gt;interface redesign&lt;/em&gt; for agents. Production teams figured this out quickly. (&lt;a href="https://xata.io/blog/built-xata-mcp-server" rel="noopener noreferrer"&gt;Example&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  The Semantic Problem
&lt;/h3&gt;

&lt;p&gt;Humans tolerate ugly APIs. Agents don't.&lt;/p&gt;

&lt;p&gt;Bad naming (&lt;code&gt;POST /v2/createTaskEx&lt;/code&gt;), weak descriptions (&lt;code&gt;summary: Get task&lt;/code&gt;), or ambiguous parameters become painfully obvious when an agent tries to use them.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Real Insight
&lt;/h3&gt;

&lt;p&gt;OpenAPI→MCP isn't mere translation. It's transforming developer-oriented APIs into &lt;strong&gt;agent-oriented capabilities&lt;/strong&gt;. That's a deeper change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Good MCP Design Often Adds Abstractions
&lt;/h3&gt;

&lt;p&gt;The best implementations go beyond CRUD. Instead of exposing &lt;code&gt;createIssue&lt;/code&gt;, &lt;code&gt;assignIssue&lt;/code&gt;, &lt;code&gt;addLabel&lt;/code&gt;, they might offer &lt;code&gt;manage_incident_ticket&lt;/code&gt; — a higher-level tool that orchestrates multiple calls behind the scenes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.stainless.com/blog/from-api-to-mcp-a-practical-guide-for-developers" rel="noopener noreferrer"&gt;Composite tools&lt;/a&gt; help agents reason much better with semantically meaningful operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Servers Are Becoming API Gateways for Agents
&lt;/h3&gt;

&lt;p&gt;Historically API gateways served humans and services. Now MCP servers are emerging as the gateway &lt;em&gt;for agents&lt;/em&gt; — acting as capability registry, semantic adapter, auth broker, orchestration layer, safety boundary, and context provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local vs Remote MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local MCP&lt;/strong&gt; (stdio) — perfect for Cursor, filesystem tools, IDE automation, desktop workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote MCP&lt;/strong&gt; (HTTP/SSE) — ideal for SaaS platforms, cloud APIs, enterprise systems. A lot of momentum is heading here. (&lt;a href="https://awslabs.github.io/mcp/servers/openapi-mcp-server" rel="noopener noreferrer"&gt;Reference&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Happens to SDKs?
&lt;/h3&gt;

&lt;p&gt;SDKs aren't going away, but they're no longer the &lt;em&gt;primary&lt;/em&gt; interface for AI-native systems.&lt;/p&gt;

&lt;p&gt;The pattern is shifting from &lt;code&gt;Human → SDK → API&lt;/code&gt; to &lt;code&gt;Agent → MCP → API&lt;/code&gt;. The SDK often still lives inside the MCP server.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Bigger Shift
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Era&lt;/th&gt;
&lt;th&gt;Primary Consumer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web era&lt;/td&gt;
&lt;td&gt;Humans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API era&lt;/td&gt;
&lt;td&gt;Programs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP/Agent era&lt;/td&gt;
&lt;td&gt;Reasoning systems&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;REST standardized service access. MCP standardizes &lt;em&gt;agent&lt;/em&gt; access.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Most Important Architectural Change
&lt;/h3&gt;

&lt;p&gt;Software used to expose &lt;strong&gt;data&lt;/strong&gt;. Now it's exposing &lt;strong&gt;capabilities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Agents don't just retrieve information — they &lt;em&gt;act&lt;/em&gt;. This demands semantic discoverability, richer intent descriptions, tool safety, permission boundaries, and composable workflows.&lt;/p&gt;

&lt;p&gt;MCP is the protocol built for exactly that transition.&lt;/p&gt;

&lt;h3&gt;
  
  
  One Way To Think About It
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;OpenAPI was designed so humans could generate clients.&lt;br&gt;
MCP is designed so models can generate behavior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's why it feels qualitatively different even when it's still calling REST APIs underneath.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical Architecture Today
&lt;/h3&gt;

&lt;p&gt;Modern AI-native systems increasingly look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend Agent
    ↓
MCP Client
    ↓
MCP Server
    ↓
REST/gRPC/DB/internal services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And many companies are realizing they already own thousands of APIs — MCP is simply the new interaction layer sitting on top of them. (&lt;a href="https://xata.io/blog/built-xata-mcp-server" rel="noopener noreferrer"&gt;Example&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The agent era is here, and the interface layer is evolving with it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What do you think — is MCP going to be as big a shift as REST was? Drop your thoughts below.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Now, a quick introduction to &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;git-lrc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;git-lrc is a free micro AI code review tool that runs on Git commits as you develop software with AI agents.&lt;/p&gt;

&lt;p&gt;AI can generate large amounts of code, but your team still owns the outcome. You cannot delegate responsibility—only execution.&lt;/p&gt;

&lt;p&gt;git-lrc provides lightweight code reviews at commit time. It improves stability, security, and performance while reducing bugs and costs.&lt;/p&gt;

&lt;p&gt;You run Git as usual. When you commit, a review is triggered. You receive a summary of changes and categorized issues—warnings, critical issues, performance problems, and security concerns.&lt;/p&gt;

&lt;p&gt;The tool includes a web UI for reviewing results.&lt;/p&gt;

&lt;p&gt;It is open source and available at &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;github.com/HexmosTech/git-lrc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For teams, pricing starts at $32 per month. It supports unlimited users and includes integrations with GitHub, GitLab, and Bitbucket, along with AI credits.&lt;/p&gt;

&lt;p&gt;You can learn more at &lt;a href="https://hexmos.com/git-lrc" rel="noopener noreferrer"&gt;hexmos.com/git-lrc&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why Agentic Engineering Must Replace Vibe Coding</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Wed, 06 May 2026 12:56:02 +0000</pubDate>
      <link>https://dev.to/shrsv/why-agentic-engineering-must-replace-vibe-coding-339f</link>
      <guid>https://dev.to/shrsv/why-agentic-engineering-must-replace-vibe-coding-339f</guid>
      <description>&lt;p&gt;&lt;em&gt;If you prefer watching a video version of this article, check out:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/IDeuIAwejOo"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Here, we are going to look into a phenomenon that is happening across social media. “Vibe coding” is all the rage—for good reasons, and also for some bad ones.&lt;/p&gt;

&lt;p&gt;We will examine this phenomenon, look at its strengths and weaknesses, and discuss my position on it as the author of &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;git-lrc&lt;/a&gt; and as someone working in this space of tools that help build things quickly—AI-assisted coding and so on. I am interested not just in the technology, but in what it means for software engineering, its users, customers, the public at large, and civilization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Vibe Coding Sound So Inevitable?
&lt;/h2&gt;

&lt;p&gt;I have a screenshot here. The person doesn’t matter, but it captures a general opinion many people have: if you are not vibe coding, you are essentially writing today’s version of COBOL—it works, but it’s no longer how things are meant to be built.&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.amazonaws.com%2Fuploads%2Farticles%2Fi1xbsbq1qvpvxctm0jpq.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.amazonaws.com%2Fuploads%2Farticles%2Fi1xbsbq1qvpvxctm0jpq.png" alt="Social media claim about vibe coding" width="708" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is a strong and very clear claim about the present and the future.&lt;/p&gt;

&lt;p&gt;I don’t like absolute statements. I prefer to assess things in more detail.&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/..." 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/..." alt="details" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changes When You Translate Intent Instead of Code?
&lt;/h2&gt;

&lt;p&gt;Previously, we had assembly programming. Then came B at Bell Labs with Ken Thompson, then C, and later languages like Python and Java. These transitions are related. Moving from C to assembly is a conversion from one formal language to another.&lt;/p&gt;

&lt;p&gt;What is a formal language? The meaning is precise. A &lt;code&gt;print&lt;/code&gt; statement in C has a corresponding, predictable meaning in assembly. There is no uncertainty. A &lt;code&gt;for&lt;/code&gt; loop in C becomes a loop structure in assembly. The mapping is clear and deterministic.&lt;/p&gt;

&lt;p&gt;But when you prompt an AI agent and it produces Python or C, that is a different kind of process. It is a conversion from a natural language to a formal language.&lt;/p&gt;

&lt;p&gt;Your prompt might be two lines or ten lines. It might be structured. But the output can vary widely. Even the same model can produce different outputs across runs. We don’t know exactly what it will produce.&lt;/p&gt;

&lt;p&gt;Also consider the reverse direction. Given code, can you reconstruct the original problem? Not reliably. This is not a one-to-one mapping. It is one-to-many.&lt;/p&gt;

&lt;p&gt;In contrast, C to assembly is close to one-to-one. From assembly, you can reconstruct C-like code. You might lose variable names, but the structure remains intact.&lt;/p&gt;

&lt;p&gt;So with vibe coding, we must remain vigilant. The system is producing meaning on the fly. It adds, removes, and modifies intent. It generates its interpretation of your input.&lt;/p&gt;

&lt;p&gt;This is a key differentiator when dealing with natural language input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Abstractions Stop Protecting You at the Worst Time
&lt;/h2&gt;

&lt;p&gt;There is also the concept of leaky abstractions. Even with traditional abstractions, you need to understand layers beneath them to produce good results.&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.amazonaws.com%2Fuploads%2Farticles%2Fb05z4hbv8dxb9hyx4i5i.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.amazonaws.com%2Fuploads%2Farticles%2Fb05z4hbv8dxb9hyx4i5i.png" alt="Screenshot illustrating leaky abstractions and engineering depth" width="604" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Consider why Elon Musk needs to understand how rockets work. He could hire people and delegate everything, but he still engages deeply with engineering details.&lt;/p&gt;

&lt;p&gt;When you build something serious, you need understanding across multiple abstraction layers. Depth matters.&lt;/p&gt;

&lt;p&gt;Similarly, we teach computer architecture concepts—memory, CPU, etc.—even if students later write Java. Why? Because abstractions break. They work most of the time, but not always. You need to understand what is happening underneath.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Breaks When Software Gets Trusted Too Easily?
&lt;/h2&gt;

&lt;p&gt;Now consider a few questions about vibe coding.&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.amazonaws.com%2Fuploads%2Farticles%2Fge4kxaxgth170l3zd3nb.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.amazonaws.com%2Fuploads%2Farticles%2Fge4kxaxgth170l3zd3nb.png" alt="Screenshot introducing questions about vibe coding" width="604" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might think this is exaggerated. Let’s look at history—examples of software failures.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Therac-25 accidents led to six deaths due to software malfunction.&lt;/li&gt;
&lt;li&gt;Toyota had unintended acceleration issues—89 deaths and thousands of complaints.&lt;/li&gt;
&lt;li&gt;The Patriot missile failure caused 28 deaths due to a numerical error.&lt;/li&gt;
&lt;li&gt;The Mariner 2 failure involved costly software-related issues.&lt;/li&gt;
&lt;li&gt;Another spacecraft failure was caused by an integer overflow.&lt;/li&gt;
&lt;li&gt;The Mars Climate Orbiter was lost due to a unit mismatch.&lt;/li&gt;
&lt;li&gt;Boeing crashes caused hundreds of deaths due to sensor-related software issues.&lt;/li&gt;
&lt;li&gt;Financial systems like Capital One and Citibank experienced major erroneous transactions.&lt;/li&gt;
&lt;li&gt;The Fujitsu Horizon scandal led to wrongful prosecutions due to software errors.&lt;/li&gt;
&lt;li&gt;The CrowdStrike outage affected millions of systems, disrupting flights, healthcare, and payments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are failures in professionally engineered systems.&lt;/p&gt;

&lt;p&gt;So the question is: am I exaggerating?&lt;/p&gt;

&lt;p&gt;In serious contexts—from personal tools to critical infrastructure—you cannot blindly trust software.&lt;/p&gt;

&lt;p&gt;The problem with vibe coding is that its advocates promote it, but would they trust systems built using it?&lt;/p&gt;

&lt;p&gt;At a deeper level, trust is the bedrock of civilization. Engineering exists to build reliable and secure systems that others can depend on.&lt;/p&gt;

&lt;p&gt;An engineer’s responsibility is not personal convenience, but public safety and reliability. Bridges must stand. Planes must land safely. Medical systems must work when needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  So What Should Replace Vibe Coding?
&lt;/h2&gt;

&lt;p&gt;Vibe coding, by itself, cannot support this level of responsibility. It may be useful for prototyping, exploration, or internal tools. But it cannot be the foundation for serious systems without additional rigor.&lt;/p&gt;

&lt;p&gt;That is why I discourage the term “vibe coding” and instead advocate “agentic engineering.”&lt;/p&gt;

&lt;p&gt;Agentic engineering emphasizes respect for reality, feedback loops, testing, criticism, and verification. Not blind trust—verification.&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.amazonaws.com%2Fuploads%2Farticles%2F9610zal48e0r4zyxi2yw.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.amazonaws.com%2Fuploads%2Farticles%2F9610zal48e0r4zyxi2yw.png" alt="agentic-vs-vibe" width="640" height="960"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We must not rely solely on intuition or “it seems to work.” Systems can fail in critical ways.&lt;/p&gt;

&lt;p&gt;We have a responsibility to promote methods that uphold engineering values.&lt;/p&gt;

&lt;p&gt;Interestingly, Andrej Karpathy popularized the term “vibe coding,” and by 2026 he is also advocating a shift toward agentic engineering.&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.amazonaws.com%2Fuploads%2Farticles%2Ffyuuli2964lqxtm5t0ry.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.amazonaws.com%2Fuploads%2Farticles%2Ffyuuli2964lqxtm5t0ry.png" alt="andrej-1" width="635" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We want to preserve engineering values: reliability, correctness, efficiency, performance, and security. These are what build civilizations.&lt;/p&gt;

&lt;p&gt;Agentic engineering aligns with that.&lt;/p&gt;

&lt;p&gt;As part of this, I built a tool called &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;git-lrc&lt;/a&gt;. It provides micro AI code reviews on commit. Every time you commit, it encourages you to review what was generated, identify issues early, and maintain quality.&lt;/p&gt;

&lt;p&gt;We should not pass problems downstream to customers. We should take responsibility upfront.&lt;/p&gt;

&lt;p&gt;That is the core message: promote agentic engineering over vibe coding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Want a Practical Way to Apply This?
&lt;/h2&gt;

&lt;p&gt;Now, a quick introduction to &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;git-lrc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;git-lrc is a free micro AI code review tool that runs on Git commits as you develop software with AI agents.&lt;/p&gt;

&lt;p&gt;AI can generate large amounts of code, but your team still owns the outcome. You cannot delegate responsibility—only execution.&lt;/p&gt;

&lt;p&gt;git-lrc provides lightweight code reviews at commit time. It improves stability, security, and performance while reducing bugs and costs.&lt;/p&gt;

&lt;p&gt;You run Git as usual. When you commit, a review is triggered. You receive a summary of changes and categorized issues—warnings, critical issues, performance problems, and security concerns.&lt;/p&gt;

&lt;p&gt;The tool includes a web UI for reviewing results.&lt;/p&gt;

&lt;p&gt;It is open source and available at &lt;a href="https://github.com/HexmosTech/git-lrc" rel="noopener noreferrer"&gt;github.com/HexmosTech/git-lrc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For teams, pricing starts at $32 per month. It supports unlimited users and includes integrations with GitHub, GitLab, and Bitbucket, along with AI credits.&lt;/p&gt;

&lt;p&gt;You can learn more at &lt;a href="https://hexmos.com/git-lrc" rel="noopener noreferrer"&gt;hexmos.com/git-lrc&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>agenticengineering</category>
    </item>
    <item>
      <title>Responsible Design: Shaping Large-Scale Consequences by Organizing Agents</title>
      <dc:creator>Shrijith Venkatramana</dc:creator>
      <pubDate>Tue, 05 May 2026 10:39:41 +0000</pubDate>
      <link>https://dev.to/shrsv/responsible-design-shaping-large-scale-consequences-by-organizing-agents-339m</link>
      <guid>https://dev.to/shrsv/responsible-design-shaping-large-scale-consequences-by-organizing-agents-339m</guid>
      <description>&lt;p&gt;&lt;em&gt;You can watch the video version of the post as well if you prefer that:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/J4wZUeLPZTc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Recently on LinkedIn, I saw a comment that I thought was really thought-provoking and interesting.&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.amazonaws.com%2Fuploads%2Farticles%2Ffb0899i7dpnwbp80x73h.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.amazonaws.com%2Fuploads%2Farticles%2Ffb0899i7dpnwbp80x73h.png" alt="meheryas quote" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This comment was made by Mr. Meheryar Tata. He's a CTO and also has a financial background. I think he was a CA as well.&lt;/p&gt;

&lt;p&gt;So, let's get into it.&lt;/p&gt;

&lt;p&gt;What he said is that &lt;strong&gt;AI, by itself, cannot have accountability structurally because it has nothing to lose.&lt;/strong&gt; Only humans and corporations can be accountable because a broken promise has economic consequences. In the long term, this means that &lt;strong&gt;the only remaining job will be risk underwriting.&lt;/strong&gt; You will receive a premium to be held accountable when things go south. Basically, &lt;em&gt;insurance&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is an extremely thought-provoking comment, in my opinion.&lt;/p&gt;

&lt;p&gt;Because what he's essentially saying is that &lt;strong&gt;semi-autonomous systems will do most of the jobs of the future.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Driving a car? AI will do it. Balancing the books? AI will do it. Teaching? AI will do it. Surgery? AI will do it. Arguing for justice? AI will do it. Everything — AI will do it.&lt;/p&gt;

&lt;p&gt;So, what does the human do?&lt;/p&gt;

&lt;p&gt;Well, a human or a corporation &lt;strong&gt;guarantees something&lt;/strong&gt;, and if things go wrong, &lt;strong&gt;someone must be held accountable&lt;/strong&gt; so that bad consequences have an equal and proportionate response.&lt;/p&gt;

&lt;p&gt;As progress happens, I think we also increasingly wish for &lt;strong&gt;security guarantees&lt;/strong&gt; across all kinds of human activity.&lt;/p&gt;

&lt;p&gt;That was his view.&lt;/p&gt;

&lt;p&gt;Now let's go a little further. I don't know whether all of you know what this is about, but this is a picture of Hammurabi.&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.amazonaws.com%2Fuploads%2Farticles%2Fqb70lay7hzk2d5ofdast.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.amazonaws.com%2Fuploads%2Farticles%2Fqb70lay7hzk2d5ofdast.png" alt="hammurabi" width="655" height="718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You know Hammurabi's code. Hammurabi was a famous Babylonian king historically, and he came up with some of the very first laws.&lt;/p&gt;

&lt;p&gt;Most of these were essentially &lt;strong&gt;"if this, then that"&lt;/strong&gt; kinds of laws. Even in India, we had people like Chanakya. In China, people like Han Fei. Different civilizations were developing legal systems. The whole idea was that things go wrong in society all the time, and the question becomes: &lt;strong&gt;how do we deal with it?&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.amazonaws.com%2Fuploads%2Farticles%2Fd3iioc43nsw9b1yil1p1.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.amazonaws.com%2Fuploads%2Farticles%2Fd3iioc43nsw9b1yil1p1.png" alt="hammurabi code" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example, he had laws dealing with structural failure. If a house collapses and kills the owner, then the builder must be executed. The builder therefore has a reason to be careful and design things properly.&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.amazonaws.com%2Fuploads%2Farticles%2Fhql0fychuixpd1393xip.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.amazonaws.com%2Fuploads%2Farticles%2Fhql0fychuixpd1393xip.png" alt="hammurabi laws" width="800" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or if there is damage to the owner's son, then the builder's son is also executed.&lt;/p&gt;

&lt;p&gt;These kinds of systems were about &lt;strong&gt;compensation, damage prevention, deterrence, and quality standards.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are several components to this, and I think it's a very interesting perspective.&lt;/p&gt;

&lt;p&gt;So this is where Mr. Meheryar is coming from. This is the underlying view: &lt;strong&gt;how do you deter dangerous activities in society?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we'll move forward in history and look at another way of thinking about this.&lt;/p&gt;

&lt;p&gt;There was someone called Admiral Rickover. He was the person who introduced the idea of nuclear submarines and made them practical.&lt;/p&gt;

&lt;p&gt;During his time, this was almost seen as impossible because the Manhattan Project was going on, and atomic energy was associated almost entirely with bombs. So it was considered a very tricky thing to even imagine converting atomic energy into productive use.&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.amazonaws.com%2Fuploads%2Farticles%2Fwqcf8j4tstiqdlpaolmo.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.amazonaws.com%2Fuploads%2Farticles%2Fwqcf8j4tstiqdlpaolmo.png" alt="rickover" width="349" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;He was taking it into national defense through nuclear submarines, and he made it safe. He made an extremely dangerous and new technology safe.&lt;/p&gt;

&lt;p&gt;How did he do that?&lt;/p&gt;

&lt;p&gt;His primary concept was &lt;strong&gt;responsibility.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is his quote on responsibility.&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.amazonaws.com%2Fuploads%2Farticles%2Fxzrtd5z565h3utxl41l9.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.amazonaws.com%2Fuploads%2Farticles%2Fxzrtd5z565h3utxl41l9.png" alt="rickover quote" width="503" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What he said is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Responsibility is a unique concept. It can only reside and inhere in a single individual.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Look at the wording here.&lt;/p&gt;

&lt;p&gt;Mr. Meheryar said that accountability can reside in a human or a corporation.&lt;/p&gt;

&lt;p&gt;But Rickover is even harsher. He's saying &lt;strong&gt;only the individual can truly bear the consequence&lt;/strong&gt; because, even inside an organization, someone must ultimately be held responsible.&lt;/p&gt;

&lt;p&gt;People like Elon Musk insist that there must be an actual person's name behind every requirement.&lt;/p&gt;

&lt;p&gt;You cannot hide behind an organization because, at the end of the day, one person is responsible for a particular thing.&lt;/p&gt;

&lt;p&gt;You may share responsibility with others, but &lt;strong&gt;your own responsibility is not diminished.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a wonderful quote.&lt;/p&gt;

&lt;p&gt;You can say ten people are on your team and that they contributed to a bad outcome, but the point is that all ten of you are still responsible.&lt;/p&gt;

&lt;p&gt;That is the idea of responsibility he brings forward. &lt;strong&gt;Each person is responsible for the whole.&lt;/strong&gt; You may delegate execution, but &lt;strong&gt;responsibility still remains with you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Delegation means someone else may execute, but you are still accountable.&lt;/p&gt;

&lt;p&gt;You may disclaim responsibility, but &lt;strong&gt;you cannot divest yourself of it. You cannot escape it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You cannot divide it, pass the buck, or say "I didn't know."&lt;/p&gt;

&lt;p&gt;You are responsible.&lt;/p&gt;

&lt;p&gt;So when something goes wrong, there has to be one person.&lt;/p&gt;

&lt;p&gt;And as they say, &lt;strong&gt;if everyone is responsible, then probably no one is.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So this is another perspective on responsibility.&lt;/p&gt;

&lt;p&gt;From the AI angle, &lt;strong&gt;this is something we have to think deeply about.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do we make people responsible for systems they do not even understand?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We cannot fully predict what AI systems will do.&lt;/p&gt;

&lt;p&gt;Even at the societal level, we cannot predict what every individual will do, and yet governments still say they will provide justice.&lt;/p&gt;

&lt;p&gt;That is the whole idea of the state. Even in highly complex situations, where taking responsibility seems impossible, &lt;strong&gt;we still try to figure out a way to take responsibility.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is another person: Herbert Simon.&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.amazonaws.com%2Fuploads%2Farticles%2F0sggcb4rdgb9twc9iax8.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.amazonaws.com%2Fuploads%2Farticles%2F0sggcb4rdgb9twc9iax8.png" alt="herb simon" width="308" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Herbert Simon wrote a very important book called &lt;em&gt;The Sciences of the Artificial&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.amazonaws.com%2Fuploads%2Farticles%2Firxjlpmnjmpr22gmhf6s.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.amazonaws.com%2Fuploads%2Farticles%2Firxjlpmnjmpr22gmhf6s.png" alt="the sciences of the artificial" width="298" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think this is also &lt;strong&gt;extremely important.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What he said is that engineering, medicine, business, architecture, painting, and many other fields are concerned not with the necessary, but with the contingent — not with how things are, but with how they might be. In short, they are concerned with design.&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.amazonaws.com%2Fuploads%2Farticles%2Fm5qanhv4ezpfk646ey09.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.amazonaws.com%2Fuploads%2Farticles%2Fm5qanhv4ezpfk646ey09.png" alt="design quote" width="800" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This whole book, &lt;em&gt;The Sciences of the Artificial&lt;/em&gt;, is essentially another way of talking about &lt;strong&gt;the science of design.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most modern disciplines are fundamentally about design.&lt;/strong&gt; Engineering is about design. Medicine is about design. Business is about design. Architecture is about design.&lt;/p&gt;

&lt;p&gt;It is all about &lt;strong&gt;shaping outcomes&lt;/strong&gt; using intelligence, resources, capabilities, creativity, focus, and scholarship.&lt;/p&gt;

&lt;p&gt;Using everything available to shape consequences to the best of our ability.&lt;/p&gt;

&lt;p&gt;Making things happen the way we want them to happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That is what design is about.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And what Simon said is that &lt;strong&gt;most modern jobs are fundamentally about design.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design is a first-class intellectual discipline.&lt;/strong&gt; It is not decoration. It is about &lt;strong&gt;taking existing situations and transforming them into preferred outcomes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This applies to architecture, policy, organizations, UI, economics — everything.&lt;/p&gt;

&lt;p&gt;It is fundamentally about &lt;strong&gt;consequences.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And again, Simon brings in this perspective of complexity.&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.amazonaws.com%2Fuploads%2Farticles%2Fpij068plmyh9ncojqtkh.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.amazonaws.com%2Fuploads%2Farticles%2Fpij068plmyh9ncojqtkh.png" alt="program environment" width="743" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The relation of program to environment opens up an exceedingly important role for computer simulation as a tool for achieving a deeper understanding of human behavior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Back then, we could not understand humans at a very micro level. This was before AI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For it is the organization of components and not their physical properties that largely determine behavior. And if computers are organized somewhat in the image of man, then the computer becomes an obvious device for exploring the consequences of alternative organizational assumptions for human behavior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essentially, what he is saying is that &lt;strong&gt;each AI agent is a component&lt;/strong&gt;, and now we are going to &lt;strong&gt;organize these agents into coherent systems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We must organize them in such a way that &lt;strong&gt;harm does not befall humanity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We already do this with potentially dangerous systems. For example, we have armies, but armies are placed under civilian control. Even if there is a coup attempt, there are mechanisms to restore order.&lt;/p&gt;

&lt;p&gt;The idea is that we use &lt;strong&gt;intelligent organizational structures&lt;/strong&gt; to keep dangerous power under control in the way we want.&lt;/p&gt;

&lt;p&gt;The entire system is designed so that &lt;strong&gt;outcomes align with our intentions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is what Simon is saying.&lt;/p&gt;

&lt;p&gt;So how does all this relate back to Mr. Meheryar?&lt;/p&gt;

&lt;p&gt;Insurance is one thing. Deterrence is one thing.&lt;/p&gt;

&lt;p&gt;But in the modern view, &lt;strong&gt;we must take responsibility for the outcomes of complex systems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And how do we do that?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We do it through design.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We have to &lt;strong&gt;design systems carefully.&lt;/strong&gt; We have to think about &lt;strong&gt;new organizational structures.&lt;/strong&gt; We have to put things together in sensible ways so that &lt;strong&gt;harm is minimized and benefits are maximized.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That, I hope, gives you an idea of how I think about AI and how to shape the future with AI.&lt;/p&gt;




&lt;p&gt;AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.*&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It's online, source-available, and ready for anyone to use.&lt;/p&gt;

&lt;p&gt;⭐ Star it on GitHub:&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/git-lrc" rel="noopener noreferrer"&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Micro AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;| &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.da.md" rel="noopener noreferrer"&gt;🇩🇰 Dansk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.es.md" rel="noopener noreferrer"&gt;🇪🇸 Español&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fa.md" rel="noopener noreferrer"&gt;🇮🇷 Farsi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.fi.md" rel="noopener noreferrer"&gt;🇫🇮 Suomi&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ja.md" rel="noopener noreferrer"&gt;🇯🇵 日本語&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.nn.md" rel="noopener noreferrer"&gt;🇳🇴 Norsk&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.pt.md" rel="noopener noreferrer"&gt;🇵🇹 Português&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.ru.md" rel="noopener noreferrer"&gt;🇷🇺 Русский&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.sq.md" rel="noopener noreferrer"&gt;🇦🇱 Shqip&lt;/a&gt; | &lt;a href="https://github.com/HexmosTech/git-lrc/readme/README.zh.md" rel="noopener noreferrer"&gt;🇨🇳 中文&lt;/a&gt; |&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;img width="60" alt="git-lrc logo" src="https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667"&gt;&lt;/a&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;git-lrc&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;AI Micro Code Reviews That Run on Commit&lt;/h2&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt" width="200" src="https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638"&gt;&lt;/a&gt;
 &lt;/p&gt;
&lt;br&gt;
&lt;a href="https://discord.gg/sGdnKwB3qq" rel="nofollow noopener noreferrer"&gt;
  &lt;img alt="Discord Community" src="https://camo.githubusercontent.com/b8f979318aaabc8dec512b9d4e6e2a12431fba3c8a3b8738e1a97a0722d4e4bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d436f6d6d756e6974792d3538363546323f6c6f676f3d646973636f7264266c6162656c436f6c6f723d7768697465"&gt;
&lt;/a&gt; &lt;a href="https://goreportcard.com/report/github.com/HexmosTech/git-lrc" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Go Report Card" src="https://camo.githubusercontent.com/e74c0651c3ee9165a2ed01cb0f6842c494029960df30eb9c24cf622d3d21bf46/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f4865786d6f73546563682f6769742d6c7263"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml" rel="noopener noreferrer"&gt;&lt;img alt="gitleaks.yml" title="gitleaks.yml: Secret scanning workflow" src="https://github.com/HexmosTech/git-lrc/actions/workflows/gitleaks.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/osv-scanner.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml" rel="noopener noreferrer"&gt;&lt;img alt="govulncheck.yml" title="govulncheck.yml: Go vulnerability check" src="https://github.com/HexmosTech/git-lrc/actions/workflows/govulncheck.yml/badge.svg"&gt;&lt;/a&gt; &lt;a href="https://github.com/HexmosTech/git-lrc/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/git-lrc/actions/workflows/semgrep.yml/badge.svg"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer" href="https://github.com/HexmosTech/git-lrc/./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%2Fgit-lrc%2FHEAD%2F.%2Fgfx%2Fdependabot-enabled.svg"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;

  
    
    

    &lt;span class="m-1"&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
    
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;Build a habit,&lt;/strong&gt;…&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/git-lrc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>design</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
