<?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: Juan Denis</title>
    <description>The latest articles on DEV Community by Juan Denis (@juandenis).</description>
    <link>https://dev.to/juandenis</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%2F3625216%2F6e92851c-2c38-4c48-92db-d28c150a156d.png</url>
      <title>DEV Community: Juan Denis</title>
      <link>https://dev.to/juandenis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/juandenis"/>
    <language>en</language>
    <item>
      <title>Python was built for humans, Mapanare was built for AI</title>
      <dc:creator>Juan Denis</dc:creator>
      <pubDate>Mon, 09 Mar 2026 01:40:26 +0000</pubDate>
      <link>https://dev.to/juandenis/python-was-built-for-humans-mapanare-was-built-for-ai-1c6a</link>
      <guid>https://dev.to/juandenis/python-was-built-for-humans-mapanare-was-built-for-ai-1c6a</guid>
      <description>&lt;p&gt;Every language you use today was designed for humans typing code into terminals. Python, JavaScript, Rust, Go — all of them. The abstractions they offer — functions, classes, threads — were built for a world where a human reads every line.&lt;/p&gt;

&lt;p&gt;That world is ending.&lt;/p&gt;

&lt;p&gt;AI is writing more code every day. Agents are orchestrating other agents. Data flows through reactive pipelines that no human debugs line by line. Tensors get reshaped, multiplied, and dispatched to GPUs in patterns that matter more to compilers than to people.&lt;/p&gt;

&lt;p&gt;And yet we're still writing all of it in languages from the 1990s. Bolting on frameworks. Duct-taping &lt;code&gt;asyncio&lt;/code&gt;. Praying the shapes match at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mapanare is the first language designed from the other side.&lt;/strong&gt; AI-native. Agents, signals, streams, and tensors aren't libraries — they're language primitives, checked by the compiler, optimized at compile time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With "AI + Legacy Languages"
&lt;/h2&gt;

&lt;p&gt;Here's what happens when AI writes Python:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It generates &lt;code&gt;asyncio&lt;/code&gt; boilerplate to run two agents concurrently — and gets the event loop wrong half the time&lt;/li&gt;
&lt;li&gt;It produces tensor operations with no shape validation — you find out dimensions don't match at 2 AM in production&lt;/li&gt;
&lt;li&gt;It writes reactive patterns using three different libraries because the language has no opinion on reactivity&lt;/li&gt;
&lt;li&gt;It burns context window tokens on syntactic sugar that exists purely for human readability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The language was never designed for this workflow. Python was built in 1991 for humans who read left to right, top to bottom. We're asking it to do something fundamentally different now, and it shows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "AI-Native" Actually Means
&lt;/h2&gt;

&lt;p&gt;It's not a buzzword. It means the language primitives match how modern AI systems actually work:&lt;/p&gt;

&lt;h3&gt;
  
  
  Agents are first-class citizens
&lt;/h3&gt;

&lt;p&gt;Not a framework. Not a library. A language construct with dedicated syntax, typed channels, and compiler-checked message passing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agent Classifier {
    input text: String
    output label: String

    fn handle(text: String) -&amp;gt; String {
        // classification logic
        return "positive"
    }
}

fn main() {
    let cls = spawn Classifier()
    cls.text &amp;lt;- "Mapanare is fast"
    let result = sync cls.label
    print(result)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;spawn&lt;/code&gt;, &lt;code&gt;&amp;lt;-&lt;/code&gt;, &lt;code&gt;sync&lt;/code&gt; — these are keywords, not method calls. The compiler understands agent lifecycle, channel types, and message flow. An AI generating this code can't accidentally forget to start an event loop or mishandle a coroutine — those concepts don't exist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reactive signals without the framework churn
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let mut count = signal(0)
let doubled = computed { count * 2 }

count.set(5)
print(doubled)  // 10

batch {
    count.set(10)
    // notifications coalesced until batch ends
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No React. No RxJS. No state management library of the month. The compiler tracks the dependency graph. When AI generates reactive code in Mapanare, it works — because reactivity is a language feature, not a pattern the AI has to remember.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stream pipelines with automatic fusion
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let result = stream([1, 2, 3, 4, 5])
    |&amp;gt; filter(fn(x) { x &amp;gt; 2 })
    |&amp;gt; map(fn(x) { x * 10 })
    |&amp;gt; fold(0, fn(acc, x) { acc + x })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;|&amp;gt;&lt;/code&gt; pipe operator is part of the grammar. Adjacent &lt;code&gt;map&lt;/code&gt; and &lt;code&gt;filter&lt;/code&gt; operations fuse into a single pass automatically — the compiler does it, not the developer, not the AI. Less code, fewer tokens, same result.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tensors with compile-time shape checking
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let a: Tensor&amp;lt;Float&amp;gt;[3, 3] = identity(3)
let b: Tensor&amp;lt;Float&amp;gt;[3, 4] = zeros(3, 4)
let c = a @ b  // shape [3, 4] — checked at compile time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shape mismatches are caught &lt;strong&gt;before runtime&lt;/strong&gt;. In Python, you find out when NumPy throws an exception. In Mapanare, the compiler rejects it. This is the difference between "AI-generated code that might work" and "AI-generated code that is correct by construction."&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-agent composition via pipes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipe ClassifyText {
    Tokenizer |&amp;gt; Classifier
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Declarative. Type-checked. The compiler verifies data flows between agents. This is the kind of code AI should be generating — high-level intent with compiler-enforced correctness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dual Compilation: Python Ecosystem + Bare-Metal Speed
&lt;/h2&gt;

&lt;p&gt;Mapanare compiles two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Transpiler&lt;/strong&gt; — emits readable Python, giving you access to the entire Python ecosystem (NumPy, PyTorch, everything)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLVM backend&lt;/strong&gt; — emits native binaries via LLVM IR for production performance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The numbers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Mapanare (LLVM)&lt;/th&gt;
&lt;th&gt;Python&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fibonacci (n=35)&lt;/td&gt;
&lt;td&gt;0.045s&lt;/td&gt;
&lt;td&gt;1.189s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;26x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stream Pipeline (1M items)&lt;/td&gt;
&lt;td&gt;0.017s&lt;/td&gt;
&lt;td&gt;1.034s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;63x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Matrix Multiply (100x100)&lt;/td&gt;
&lt;td&gt;0.020s&lt;/td&gt;
&lt;td&gt;0.456s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;23x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And expressiveness — Mapanare programs are consistently the shortest across every benchmark compared to Python, Go, and Rust:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Mapanare&lt;/th&gt;
&lt;th&gt;Python&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;th&gt;Rust&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fibonacci&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10 lines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message Passing&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18 lines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stream Pipeline&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10 lines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Matrix Multiply&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14 lines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fewer lines means fewer tokens. Fewer tokens means more room in the context window. More room means better AI-generated code. The language design feeds back into AI efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  No OOP. By Design.
&lt;/h2&gt;

&lt;p&gt;No classes. No inheritance. No virtual methods. Structs, enums, and pattern matching instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum Shape {
    Circle(Float),
    Rect(Float, Float),
}

fn area(s: Shape) -&amp;gt; Float {
    match s {
        Circle(r) =&amp;gt; 3.14159 * r * r,
        Rect(w, h) =&amp;gt; w * h,
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI models consistently produce cleaner, more correct code with algebraic data types than with class hierarchies. Less ambiguity in the language means less hallucination in the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built With AI. Not "Vibe Coded."
&lt;/h2&gt;

&lt;p&gt;Yes, Mapanare was built with AI assistance. There's an obvious irony in using AI to build a language for AI. But there's a difference between vibe coding and engineering with AI as a tool.&lt;/p&gt;

&lt;p&gt;The compiler has ~60 test files. CI runs on every commit. There's a full language spec, an RFC process for language changes, and a self-hosted compiler being bootstrapped — the compiler is being rewritten in Mapanare itself.&lt;/p&gt;

&lt;p&gt;This isn't a weekend project that went viral. It's a staged, deliberate effort: Foundation, Transpiler, Runtime, LLVM, Tensors, Self-Hosting, Ecosystem. Each phase ships working software.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Compiler Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.mn source → Lexer → Parser → AST → Semantic Analysis → Optimizer → Emit
                                                                      ↓
                                                               Python | LLVM IR
                                                                      ↓
                                                       Interpreter | Native Binary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lexer&lt;/strong&gt;: 18 keywords, 29 operators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parser&lt;/strong&gt;: LALR with precedence climbing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic&lt;/strong&gt;: Type checking, scope analysis, builtins registry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimizer&lt;/strong&gt;: Constant folding, dead code elimination, agent inlining, stream fusion (&lt;code&gt;-O0&lt;/code&gt; to &lt;code&gt;-O3&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLVM&lt;/strong&gt;: Full IR generation via llvmlite with cross-compilation targets&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Now
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Linux / macOS&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/Mapanare-Research/Mapanare/main/install.sh | bash

&lt;span class="c"&gt;# Windows (PowerShell)&lt;/span&gt;
irm https://raw.githubusercontent.com/Mapanare-Research/Mapanare/main/install.ps1 | iex

&lt;span class="c"&gt;# Or install via pip&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;mapanare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mapanare run hello.mn          &lt;span class="c"&gt;# compile and run&lt;/span&gt;
mapanare build hello.mn        &lt;span class="c"&gt;# native binary via LLVM&lt;/span&gt;
mapanare check hello.mn        &lt;span class="c"&gt;# type-check only&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VS Code extension included — syntax highlighting, snippets, and LSP (hover, go-to-definition, diagnostics, autocomplete).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The roadmap is public and concrete:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Foundation (lexer, parser, semantic)&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transpiler (Python emit)&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime (agents, signals, streams)&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLVM (native compilation)&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tensors (compile-time shapes)&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-Hosting&lt;/td&gt;
&lt;td&gt;In Progress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ecosystem&lt;/td&gt;
&lt;td&gt;Planned&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The self-hosted compiler means Mapanare will eventually compile itself — no Python dependency. That's the endgame.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join
&lt;/h2&gt;

&lt;p&gt;Mapanare is MIT-licensed, open source, and looking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI/ML engineers&lt;/strong&gt; tired of Python's concurrency model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compiler hackers&lt;/strong&gt; who want to work on an LLVM backend or a self-hosted bootstrap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language designers&lt;/strong&gt; who want to shape semantics via the RFC process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone building agent systems&lt;/strong&gt; who's sick of framework churn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Python was the last great language built for humans writing code by hand. The next era needs something different.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/Mapanare-Research/Mapanare" rel="noopener noreferrer"&gt;github.com/Mapanare-Research/Mapanare&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Manifesto&lt;/strong&gt;: &lt;a href="https://github.com/Mapanare-Research/Mapanare/blob/main/docs/manifesto.md" rel="noopener noreferrer"&gt;Why Mapanare Exists&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Mapanare — named after a Venezuelan pit viper. Fast strike, lethal precision, native to the land where the idea was born.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>ai</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>AI Settles the Ultimate Venezuelan vs Colombian Arepa Debate (Kimi K2.5)</title>
      <dc:creator>Juan Denis</dc:creator>
      <pubDate>Sun, 22 Feb 2026 10:40:57 +0000</pubDate>
      <link>https://dev.to/juandenis/ai-settles-the-ultimate-venezuelan-vs-colombian-arepa-debate-2ngm</link>
      <guid>https://dev.to/juandenis/ai-settles-the-ultimate-venezuelan-vs-colombian-arepa-debate-2ngm</guid>
      <description>&lt;h2&gt;
  
  
  The Arepa Wars: Venezuela vs. Colombia vs. Miami Chaos
&lt;/h2&gt;

&lt;p&gt;Forget JavaScript frameworks. Forget tabs vs. spaces. The most passionate, unresolvable debate I've ever witnessed wasn't in a GitHub thread — it was about corn flatbreads.&lt;/p&gt;

&lt;p&gt;Specifically: &lt;strong&gt;who invented the arepa?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To simulate this high-stakes culinary diplomatic crisis, I used my own open-source tool, &lt;strong&gt;&lt;a href="https://github.com/jhd3197/cachibot" rel="noopener noreferrer"&gt;CachiBot&lt;/a&gt;&lt;/strong&gt;. Because if you're going to build a chatbot platform, you might as well use it to start international food fights.&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%2Fwyhmtww80kvixsmx1x0l.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%2Fwyhmtww80kvixsmx1x0l.gif" alt="A spread of delicious looking arepas on wooden boards, featuring small Venezuelan and Colombian flags placed in different stacks." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎥 &lt;strong&gt;&lt;a href="https://youtu.be/G8JEhkcRxD8" rel="noopener noreferrer"&gt;Watch the Debate on YouTube&lt;/a&gt;&lt;/strong&gt; | 🤖 &lt;strong&gt;&lt;a href="https://cachibot.ai/marketplace/rooms/great-arepa-war?utm_source=github&amp;amp;utm_medium=readme&amp;amp;utm_campaign=arepa_war_room" rel="noopener noreferrer"&gt;View the actual CachiBot Chat Log&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🥊 The Contestants
&lt;/h2&gt;

&lt;p&gt;Three "people" (simulated by CachiBot agents) walked into this debate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🇻🇪 &lt;strong&gt;The Venezuelan Champion:&lt;/strong&gt; Armed with emotion, a 47-item ranked filling list, and an &lt;em&gt;abuela&lt;/em&gt; who wakes up at 5am to prep the masa.&lt;/li&gt;
&lt;li&gt;🇨🇴 &lt;strong&gt;The Colombian Defender:&lt;/strong&gt; Five generations deep, mentally cataloging regional varieties, carrying the gravity of someone delivering a sermon.&lt;/li&gt;
&lt;li&gt;🌴 &lt;strong&gt;The Miami Local:&lt;/strong&gt; A food blogger with a ring light, 47K followers, and diplomatic immunity from eating arepas "from Weston to Brickell."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛎️ Round 1: The Origin Story
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Venezuelan&lt;/strong&gt; opened with historical receipts: "The word comes from 'erepa' in the Cumanagoto language—meaning CORN! We have 3,000-year-old clay griddles to prove it!" &lt;em&gt;(Score: 9/10. Great use of abuela energy.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Colombian&lt;/strong&gt; was unfazed: "The Muisca people in Colombia were making them too! Corn cultivation here dates back 4,000 years! FOUR THOUSAND!" &lt;em&gt;(Score: 9/10. Powerful counter-receipts.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Miami Local&lt;/strong&gt; chimed in: "Actually, indigenous peoples of this whole &lt;em&gt;region&lt;/em&gt; made them. The arepa belongs to the LAND, not modern borders!" &lt;em&gt;(Technically correct. Completely unacceptable to both sides.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛎️ Round 2: The Varieties
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Colombian&lt;/strong&gt; went full encyclopedia mode, dropping varieties like dropping mics: &lt;em&gt;Arepa de choclo&lt;/em&gt; (sweet corn), &lt;em&gt;Boyacense&lt;/em&gt; (cheesy and huge), &lt;em&gt;Santandereana&lt;/em&gt; (with chicharrón), and the legendary &lt;em&gt;Arepa de huevo&lt;/em&gt; (fried and egg-stuffed).&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Venezuelan&lt;/strong&gt; countered with pure philosophy. The arepa isn't just food; it's identity. "My abuela doesn't make 'corn flatbread without borders.' She makes Venezuelan arepas. With enough butter to make a cardiologist weep."&lt;/p&gt;

&lt;h2&gt;
  
  
  🕊️ The "Peace Treaty" Wildcard
&lt;/h2&gt;

&lt;p&gt;Every great debate needs an agent of chaos.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Miami Local&lt;/strong&gt; proposed the &lt;strong&gt;"Peace Treaty Arepa"&lt;/strong&gt;—a Colombian &lt;em&gt;arepa de choclo&lt;/em&gt; base, stuffed with a Venezuelan &lt;em&gt;reina pepiada&lt;/em&gt; filling. The ultimate diplomatic compromise.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Venezuelan:&lt;/strong&gt; Would consider it (if the sign says "Venezuelan Arepas" in bigger font).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Colombian:&lt;/strong&gt; Would try it "for research purposes."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Miami Local:&lt;/strong&gt; Already filming a TikTok about it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 What Does This Teach Us?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Pride in craft is universal.&lt;/strong&gt; Whether it's your codebase, your open-source library, or your grandmother's masa recipe, people fight for what they build. That's a feature, not a bug.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Attribution is messy.&lt;/strong&gt; "Who invented X?" is the wrong question. Origins are shared, cultivated over thousands of years by indigenous communities. This is as true for software as it is for food.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Collaboration doesn't erase identity.&lt;/strong&gt; Fusion is great, but distinct traditions hold their own value. You don't have to merge everything to celebrate it.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The algorithm always wins.&lt;/strong&gt; The person with the ring light isn't wrong; they're just optimizing for a different metric.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ⚖️ Final Verdict
&lt;/h2&gt;

&lt;p&gt;The arepa was born from the land, shaped by indigenous peoples, and belongs to both Venezuela and Colombia in equally valid, delicious ways.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Look, I programmed the bot to be diplomatic. But I’m Venezuelan, so if there’s a slight bias in the training data... la arepa es nuestra. 🤫)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have strong feelings about arepas? Want to check out the &lt;a href="https://github.com/jhd3197/cachibot" rel="noopener noreferrer"&gt;tool that built this debate&lt;/a&gt;? Drop your thoughts in the comments. This is a safe space. Mostly.&lt;/strong&gt; 🌽🔥&lt;/p&gt;

</description>
      <category>ai</category>
      <category>debate</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Armored AI Agent You Can Actually Trust</title>
      <dc:creator>Juan Denis</dc:creator>
      <pubDate>Fri, 06 Feb 2026 11:30:00 +0000</pubDate>
      <link>https://dev.to/juandenis/the-armored-ai-agent-you-can-actually-trust-4pea</link>
      <guid>https://dev.to/juandenis/the-armored-ai-agent-you-can-actually-trust-4pea</guid>
      <description>&lt;p&gt;I built an open-source AI agent platform that prioritizes transparency and security over "magic". Think Open Claw, but with armor.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with "Invisible" AI Agents
&lt;/h2&gt;

&lt;p&gt;We've all been there. You fire up an AI agent, give it a task, and... &lt;em&gt;silence&lt;/em&gt;. Minutes pass. Is it working? Is it stuck? Did it just &lt;code&gt;rm -rf&lt;/code&gt; something important?&lt;/p&gt;

&lt;p&gt;Most AI agent tools today operate like black boxes. They promise autonomy but deliver anxiety. You're supposed to trust that the agent is doing the right thing, even when you have zero visibility into what it's actually doing.&lt;/p&gt;

&lt;p&gt;I wanted something different.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter CachiBot: Visibility = Security
&lt;/h2&gt;

&lt;p&gt;CachiBot is named after the Venezuelan &lt;em&gt;cachicamo&lt;/em&gt; (armadillo) — a creature that's armored, deliberate, and doesn't rush into danger. That's exactly the philosophy behind this project.&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%2Ff87i7u3wm4cyae7r9ak9.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%2Ff87i7u3wm4cyae7r9ak9.png" alt="CachiBot Dashboard" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Philosophy
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"If you can't see it, you can't secure it."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every action CachiBot takes is visible in real-time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Thinking streams&lt;/strong&gt; — See the agent's reasoning as it happens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool calls with arguments&lt;/strong&gt; — Know exactly what's being executed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk analysis&lt;/strong&gt; — Dangerous code is flagged BEFORE execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval workflows&lt;/strong&gt; — You decide what runs, not the AI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Makes CachiBot Different?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Sandboxed Code Execution with Risk Analysis
&lt;/h3&gt;

&lt;p&gt;CachiBot uses AST-based static analysis to detect dangerous operations before they run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This triggers a HIGH risk warning:
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="n"&gt;subprocess&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rm&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;-rf&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;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Risk Analysis:
# - CRITICAL: subprocess import detected
# - HIGH: Potentially destructive command
# - Action: Requires user approval
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sandbox only allows safe imports (json, math, datetime, etc.) and blocks anything that could compromise your system.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Real-Time WebSocket Streaming
&lt;/h3&gt;

&lt;p&gt;No more guessing. Watch everything happen live:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[THINKING] Analyzing the file structure...
[TOOL_START] file_list(path="/workspace")
[TOOL_END] Found 12 files
[THINKING] I should read the config file first...
[APPROVAL_NEEDED] python_execute: Risk level HIGH
   └─ Code: os.environ['API_KEY']
   └─ Reason: Accessing environment variables
[USER] ✓ Approved
[TOOL_END] Result: sk-xxx...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Multi-Bot Management
&lt;/h3&gt;

&lt;p&gt;Create specialized bots for different tasks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bot&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CodeReviewer&lt;/td&gt;
&lt;td&gt;PR reviews&lt;/td&gt;
&lt;td&gt;Claude Sonnet 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataAnalyst&lt;/td&gt;
&lt;td&gt;CSV/SQL work&lt;/td&gt;
&lt;td&gt;GPT-4o&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LocalHelper&lt;/td&gt;
&lt;td&gt;Quick tasks&lt;/td&gt;
&lt;td&gt;Ollama (llama3.1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Researcher&lt;/td&gt;
&lt;td&gt;Web searches&lt;/td&gt;
&lt;td&gt;Kimi K2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each bot has its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System prompt and personality&lt;/li&gt;
&lt;li&gt;Enabled tools and capabilities&lt;/li&gt;
&lt;li&gt;Knowledge base (RAG with vector search)&lt;/li&gt;
&lt;li&gt;Platform connections (Telegram, Discord)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Built-in Work Management
&lt;/h3&gt;

&lt;p&gt;CachiBot isn't just a chat interface — it's a work orchestration system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Work Item: "Refactor authentication module"
├── Task 1: Analyze current auth flow [COMPLETED]
├── Task 2: Design new token system [IN_PROGRESS]
├── Task 3: Implement refresh tokens [BLOCKED by Task 2]
├── Task 4: Write unit tests [PENDING]
└── Task 5: Update documentation [PENDING]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Schedule jobs with cron expressions, set up event triggers, and track everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Platform Connections
&lt;/h3&gt;

&lt;p&gt;Connect your bots to the real world:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Telegram] @MyAssistantBot
├── Status: Connected
├── Messages: 1,247
└── Last active: 2 minutes ago

[Discord] CachiBot#1234
├── Status: Connected
├── Servers: 3
└── Last active: Just now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Messages route automatically to the right bot based on your configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Backend (Python 3.10+)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI + async everywhere&lt;/li&gt;
&lt;li&gt;Prompture (my structured LLM library)&lt;/li&gt;
&lt;li&gt;SQLite with sqlite-vec for embeddings&lt;/li&gt;
&lt;li&gt;Sandboxed Python execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend (React 19 + TypeScript)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vite 6 for lightning-fast builds&lt;/li&gt;
&lt;li&gt;Zustand for state management&lt;/li&gt;
&lt;li&gt;Tailwind CSS for styling&lt;/li&gt;
&lt;li&gt;WebSocket for real-time updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;LLM Providers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic (Claude)&lt;/li&gt;
&lt;li&gt;OpenAI (GPT-4o)&lt;/li&gt;
&lt;li&gt;Moonshot (Kimi K2.5)&lt;/li&gt;
&lt;li&gt;Ollama (local models)&lt;/li&gt;
&lt;li&gt;Groq (fast inference)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;cachibot

&lt;span class="c"&gt;# Start the server&lt;/span&gt;
cachibot-server

&lt;span class="c"&gt;# Or use the CLI directly&lt;/span&gt;
cachibot &lt;span class="s2"&gt;"Analyze this Python file for security issues"&lt;/span&gt;

&lt;span class="c"&gt;# Interactive mode&lt;/span&gt;
cachibot &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;code&gt;http://localhost:6392&lt;/code&gt; for the full dashboard experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Approval System in Action
&lt;/h2&gt;

&lt;p&gt;Here's what happens when CachiBot tries to do something risky:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────┐
│  APPROVAL REQUIRED                                         │
├────────────────────────────────────────────────────────────┤
│  Tool: python_execute                                      │
│  Risk Level: HIGH                                          │
│                                                            │
│  Code:                                                     │
│  ┌──────────────────────────────────────────────────────┐  │
│  │ import requests                                      │  │
│  │ response = requests.get(url)                         │  │
│  │ with open('data.json', 'w') as f:                    │  │
│  │     f.write(response.text)                           │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                            │
│  Risks Detected:                                           │
│  • Network request (requests.get)                          │
│  • File write operation                                    │
│                                                            │
│  [APPROVE]  [DENY]  [APPROVE ALL FOR THIS SESSION]         │
└────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You stay in control. Always.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Not Just Use Open Claw / Open WebUI / etc.?
&lt;/h2&gt;

&lt;p&gt;Great projects! But they solve different problems.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Open Claw&lt;/th&gt;
&lt;th&gt;CachiBot&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Focus&lt;/td&gt;
&lt;td&gt;Chat interface&lt;/td&gt;
&lt;td&gt;Agent execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code execution&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Sandboxed + Risk analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approval system&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-bot&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Full support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Work management&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time streaming&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Full WebSocket&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CachiBot is for when you need an AI that &lt;strong&gt;does things&lt;/strong&gt; — safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] MCP (Model Context Protocol) support&lt;/li&gt;
&lt;li&gt;[ ] More platform adapters (Slack, WhatsApp)&lt;/li&gt;
&lt;li&gt;[ ] Plugin marketplace&lt;/li&gt;
&lt;li&gt;[ ] Team collaboration features&lt;/li&gt;
&lt;li&gt;[ ] Self-hosted cloud option&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;cachibot
cachibot-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/jhd3197/CachiBot" rel="noopener noreferrer"&gt;github.com/jhd3197/CachiBot&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://cachibot.com/" rel="noopener noreferrer"&gt;cachibot.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Star the repo if you believe AI agents should be transparent!&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%2F906p78q8ifqerl2chwhh.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%2F906p78q8ifqerl2chwhh.png" alt="Chat UI" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>security</category>
    </item>
    <item>
      <title>I Built My Own DeepSite Alternative That Works with Kimi K2.5, Gemini, or Any Model</title>
      <dc:creator>Juan Denis</dc:creator>
      <pubDate>Mon, 02 Feb 2026 04:09:47 +0000</pubDate>
      <link>https://dev.to/juandenis/i-built-my-own-deepsite-alternative-that-works-with-kimi-k25-gemini-or-any-model-5gfo</link>
      <guid>https://dev.to/juandenis/i-built-my-own-deepsite-alternative-that-works-with-kimi-k25-gemini-or-any-model-5gfo</guid>
      <description>&lt;p&gt;So I got tired of DeepSite.&lt;/p&gt;

&lt;p&gt;Don't get me wrong, it's a fun tool. Type a prompt, get a website. But every time I used it I kept running into the same problems. You can't pick the model. You can't self-host it. And there's no quality check on what it generates. You just get whatever comes out and deal with it.&lt;/p&gt;

&lt;p&gt;I wanted something where I could plug in whatever model I felt like using that day. Kimi K2.5 just dropped? Let me try it. Gemini got an update? Switch it. Claude writing better code this week? Cool, use that instead.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/jhd3197/AgentSite" rel="noopener noreferrer"&gt;AgentSite&lt;/a&gt;. Open source, self-hosted, and instead of one model doing everything, it uses &lt;strong&gt;four AI agents working together like an actual team&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let me show you what I mean. I just built a travel agency website using Kimi K2.5 and the whole thing took one prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four Agents, Not One
&lt;/h2&gt;

&lt;p&gt;Here's what happens when you hit generate. Instead of one model trying to plan, design, code, and review all at once, AgentSite splits the work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your prompt → PM → Designer → Developer ↔ Reviewer → Done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The PM plans the structure. The Designer builds a color palette and typography system. The Developer writes the actual code. And the Reviewer scores everything and sends it back if it's not good enough.&lt;/p&gt;

&lt;p&gt;That last part is the thing I haven't seen anywhere else. The Reviewer agent actually checks accessibility, code quality, and visual consistency. If the score is below 7 out of 10, the Developer gets feedback and fixes it. Up to two rounds of revision. Like an actual code review, but automatic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting It Running
&lt;/h2&gt;

&lt;p&gt;The fastest way is straight from GitHub. There's a &lt;strong&gt;Deploy on Railway&lt;/strong&gt; button right in the README. Click it and Railway handles everything. No terminal, no installing stuff locally.&lt;/p&gt;

&lt;p&gt;You can also do &lt;code&gt;pip install agentsite&lt;/code&gt; and run it locally if you prefer. But for this demo I deployed to Railway and had a live URL running in a couple minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting It Up
&lt;/h2&gt;

&lt;p&gt;Once the app is running you need two things: an API key and a model.&lt;/p&gt;

&lt;p&gt;Go to the providers page in settings and paste your key. I added my Moonshot AI key since I wanted to use Kimi K2.5. But you could paste an OpenAI key, Google key, Anthropic key, whatever. You can even add multiple providers and mix them across projects.&lt;/p&gt;

&lt;p&gt;Then go to the agents page and set your default model. I set all four agents to &lt;code&gt;moonshot/kimi-k2.5&lt;/code&gt;. You could also set different models per agent if you want to get creative, like Kimi for coding and Claude for reviewing.&lt;/p&gt;

&lt;p&gt;This is the part DeepSite can't do. New model drops tomorrow? Come back, change the dropdown, done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Ukelele Travels
&lt;/h2&gt;

&lt;p&gt;Alright, the fun part. I created a project called &lt;strong&gt;Ukelele Travels&lt;/strong&gt;, a travel agency that sends people to Venezuela.&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%2Fayrpi1v1ys0b9el8oj0z.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%2Fayrpi1v1ys0b9el8oj0z.png" alt="The AgentSite dashboard showing my projects including Ukelele Travels" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside the project you get the detail page where you manage all your pages, see the brand identity, and get an overview of what's been generated.&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%2Fk9zbil9oxur3j5w1ju3b.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%2Fk9zbil9oxur3j5w1ju3b.png" alt="The Ukelele Travels project detail page" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I created a home page, typed my prompt, and let the four agents do their thing. Here's the page builder after generation — chat on the left, live preview on the right.&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%2Fnzo82dzx0izzovkbfxev.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%2Fnzo82dzx0izzovkbfxev.png" alt="The Home page builder showing the generated Ukelele Travels site" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All of this from one prompt. Kimi K2.5 running through four agents. The PM planned the structure, the Designer picked colors and typography, the Developer wrote the code, and the Reviewer checked it and sent feedback until it passed. No templates, no frameworks, just clean HTML, CSS, and JS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tracking Everything
&lt;/h2&gt;

&lt;p&gt;One thing I added that I find really useful is the analytics page. You can see exactly how many tokens each agent used, the cost breakdown, and what happened during each generation.&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%2Figc0iu95sawmw37jllt6.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%2Figc0iu95sawmw37jllt6.png" alt="The analytics page showing token usage and cost breakdown" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you're paying for API calls it's nice to know where the tokens are going. The Reviewer agent barely uses anything compared to the Developer, which makes sense since it's reading and scoring rather than writing full pages of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Think This Approach is Better
&lt;/h2&gt;

&lt;p&gt;When you ask one model to do everything, you get a compromise. The planning is okay. The design is generic. The code works but it's messy. And nobody checks it.&lt;/p&gt;

&lt;p&gt;When you split the work across specialized agents, each one only has to be good at its job. The PM doesn't need to write CSS. The Developer doesn't pick colors. The Reviewer just reviews. And because each agent gets the output from the previous one as context, everything stays consistent.&lt;/p&gt;

&lt;p&gt;I've been running different models through this pipeline for a while now and the multi-agent output is consistently better than any single-prompt approach I've tried. Not a little better, noticeably better.&lt;/p&gt;

&lt;h2&gt;
  
  
  About Kimi K2.5
&lt;/h2&gt;

&lt;p&gt;Since I used it for this whole demo, some quick notes. Kimi K2.5 is one of the most consistent models I've run through AgentSite. Most models have at least one role where they struggle. Great at coding but the design system is bland. Good at planning but the code output is sloppy.&lt;/p&gt;

&lt;p&gt;Kimi K2.5 was solid across all four agents. It's also fast, which matters when you're running four sequential agents plus revision loops. And it never broke the structured JSON schema that the agents use to pass data between each other. Some models hallucinate extra keys or mess up the nesting. Kimi didn't.&lt;/p&gt;

&lt;p&gt;That said, the whole point of AgentSite is that you're not married to any model. I built Ukelele Travels with Kimi K2.5 today. Tomorrow I might use Gemini or Claude for the next project. Just change the dropdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/jhd3197/AgentSite" rel="noopener noreferrer"&gt;github.com/jhd3197/AgentSite&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One-click deploy buttons for Railway, Render, and Heroku right in the README. Or &lt;code&gt;pip install agentsite&lt;/code&gt; if you want it local.&lt;/p&gt;

&lt;p&gt;It's MIT licensed and free. You just bring your own API keys.&lt;/p&gt;

&lt;p&gt;If you try it out let me know what model you used and what you built. I'm genuinely curious to see what people come up with.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why I Built an Open Source SEO Plugin in 2026</title>
      <dc:creator>Juan Denis</dc:creator>
      <pubDate>Sat, 24 Jan 2026 02:37:00 +0000</pubDate>
      <link>https://dev.to/juandenis/why-i-built-an-open-source-seo-plugin-in-2026-3i1p</link>
      <guid>https://dev.to/juandenis/why-i-built-an-open-source-seo-plugin-in-2026-3i1p</guid>
      <description>&lt;p&gt;For years, I watched the WordPress SEO landscape become increasingly dominated by proprietary solutions. Yoast, RankMath, All in One SEO—all powerful tools, but all operating as black boxes. You put your content in, and magic happens. Or does it?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem I Kept Running Into
&lt;/h2&gt;

&lt;p&gt;As a developer building WordPress sites for clients, I found myself constantly asking: &lt;em&gt;What exactly is this plugin doing to my markup?&lt;/em&gt; Every time I inspected the source, I saw meta tags and structured data that I didn't fully understand or control.&lt;/p&gt;

&lt;p&gt;When bugs appeared—duplicate canonical URLs, malformed JSON-LD, conflicting Open Graph tags—debugging was a nightmare. The code was obfuscated. The documentation was marketing-speak. And the "premium" support was often just someone telling me to clear my cache.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Moment I Decided to Build Something Different
&lt;/h2&gt;

&lt;p&gt;It was December 2025. I was debugging a client's site that had dropped 40% in organic traffic after a plugin update. After three days of reverse-engineering what the SEO plugin was doing, I realized something:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The SEO industry doesn't benefit from secrecy. It benefits from transparency.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google's algorithms aren't secret anymore. The best practices are well-documented. Schema.org is an open standard. So why are our SEO tools still black boxes?&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Saman SEO
&lt;/h2&gt;

&lt;p&gt;That frustration became &lt;a href="https://github.com/SamanLabs/Saman-SEO" rel="noopener noreferrer"&gt;Saman SEO&lt;/a&gt;—a comprehensive, transparent SEO solution built for developers who believe SEO tooling should be open source, not a black box.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Makes It Different
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complete Transparency&lt;/strong&gt;: Every line of code is open for inspection. You can see exactly how your meta tags are generated, how structured data is built, and how redirects are processed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Developer-First Architecture&lt;/strong&gt;: Built with hooks and filters throughout. Want to modify how titles are generated? There's a filter for that. Need to inject custom schema? There's a hook for that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Modern Stack&lt;/strong&gt;: React-powered admin interface, WP-CLI support, and a clean REST API.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's Inside
&lt;/h2&gt;

&lt;p&gt;Saman SEO isn't a stripped-down alternative. It's a full-featured SEO toolkit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Per-Post SEO Fields&lt;/strong&gt;: Complete meta control with Gutenberg sidebar and classic editor support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-Rendered Output&lt;/strong&gt;: Titles, meta descriptions, canonical URLs, robots directives, Open Graph, Twitter Cards, and JSON-LD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Suggestions&lt;/strong&gt;: Optional OpenAI integration for intelligent meta generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal Linking Engine&lt;/strong&gt;: Automated keyword-to-link conversion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Sitemap Manager&lt;/strong&gt;: Full XML sitemap control with RSS and Google News support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redirect Manager&lt;/strong&gt;: Database-backed 301 redirects with WP-CLI support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit Dashboard&lt;/strong&gt;: Visual issue tracking and automatic fallback generation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  This is Just the Beginning
&lt;/h2&gt;

&lt;p&gt;In the coming articles, I'll dive deep into how Saman SEO works under the hood. We'll explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The architecture decisions that make it extensible&lt;/li&gt;
&lt;li&gt;How to use it for local businesses&lt;/li&gt;
&lt;li&gt;Advanced internal linking strategies&lt;/li&gt;
&lt;li&gt;Migrating from other SEO plugins&lt;/li&gt;
&lt;li&gt;How to contribute to the project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've ever been frustrated by black-box SEO tools, I think you'll find Saman SEO refreshing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The code is open. The standards are shared. Let's build better SEO together.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/SamanLabs/Saman-SEO" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SamanLabs/Saman-SEO/tree/main/docs" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SamanLabs/Saman-SEO/blob/main/docs/GETTING_STARTED.md" rel="noopener noreferrer"&gt;Getting Started Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>wordpress</category>
      <category>seo</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Free Alternative to cPanel - Here's What I Learned</title>
      <dc:creator>Juan Denis</dc:creator>
      <pubDate>Tue, 20 Jan 2026 05:06:55 +0000</pubDate>
      <link>https://dev.to/juandenis/i-built-a-free-alternative-to-cpanel-heres-what-i-learned-npj</link>
      <guid>https://dev.to/juandenis/i-built-a-free-alternative-to-cpanel-heres-what-i-learned-npj</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Last year I was managing a handful of WordPress sites and a few Python apps for clients. My options were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;cPanel&lt;/strong&gt; - $45/month per server. For 3 servers, that's $1,620/year just for a control panel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Coolify&lt;/strong&gt; - Great for Docker but felt like overkill for WordPress sites. I don't need Kubernetes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CloudPanel&lt;/strong&gt; - Nice and lightweight but no Docker support. I need both.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HestiaCP&lt;/strong&gt; - Free and feature-rich but the UI looks like it's from 2008.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I wanted something in between: &lt;strong&gt;the simplicity of traditional hosting panels with the power of modern deployment tools&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I built ServerKit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is ServerKit?
&lt;/h2&gt;

&lt;p&gt;ServerKit is an open-source server management panel that lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy WordPress, Flask, Django, and Node.js apps&lt;/li&gt;
&lt;li&gt;Manage Docker containers alongside traditional apps&lt;/li&gt;
&lt;li&gt;Automatic HTTPS via Let's Encrypt&lt;/li&gt;
&lt;li&gt;Real-time monitoring with alerts to Discord/Slack/Telegram&lt;/li&gt;
&lt;li&gt;Visual firewall and cron job management&lt;/li&gt;
&lt;li&gt;2FA security with ClamAV malware scanning&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%2Fa1zur2vzv9w3wq7trz2j.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%2Fa1zur2vzv9w3wq7trz2j.png" alt="Dashboard Screenshot" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.11 with Flask&lt;/li&gt;
&lt;li&gt;SQLAlchemy ORM&lt;/li&gt;
&lt;li&gt;Flask-SocketIO for real-time updates&lt;/li&gt;
&lt;li&gt;Gunicorn for production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React 18 with Vite&lt;/li&gt;
&lt;li&gt;WebSocket connection for live metrics&lt;/li&gt;
&lt;li&gt;LESS for styling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx reverse proxy&lt;/li&gt;
&lt;li&gt;Let's Encrypt via Certbot&lt;/li&gt;
&lt;li&gt;Docker &amp;amp; Docker Compose&lt;/li&gt;
&lt;li&gt;MySQL/PostgreSQL support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why Flask over FastAPI?
&lt;/h3&gt;

&lt;p&gt;FastAPI is great for pure APIs, but ServerKit needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebSocket support (Flask-SocketIO is mature)&lt;/li&gt;
&lt;li&gt;Template rendering for some pages&lt;/li&gt;
&lt;li&gt;Simpler debugging during development&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Real-Time Metrics
&lt;/h3&gt;

&lt;p&gt;Every second, the backend collects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;metrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cpu&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_percent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;memory&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;virtual_memory&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;percent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;disk&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disk_usage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;percent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;network&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;get_network_stats&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;socketio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;metrics&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;broadcast&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The React frontend subscribes and updates the dashboard live. No polling, no page refreshes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dynamic Nginx Configuration
&lt;/h3&gt;

&lt;p&gt;Each app type has a Jinja2 template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# PHP app nginx config
&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="p"&gt;}};&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; \&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fastcgi_pass&lt;/span&gt; &lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php_version&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fpm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you create an app, ServerKit generates the config, symlinks it, and reloads Nginx.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Start with the UI
&lt;/h3&gt;

&lt;p&gt;I built the backend first and regretted it. Users don't see your clean API - they see the interface. Start with mockups, validate the UX, then build the backend to support it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Security is Non-Negotiable
&lt;/h3&gt;

&lt;p&gt;Server management panels are high-value targets. From day one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWT with short expiration&lt;/li&gt;
&lt;li&gt;TOTP 2FA with backup codes&lt;/li&gt;
&lt;li&gt;All secrets encrypted at rest&lt;/li&gt;
&lt;li&gt;No shell commands built from user input&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Real-Time Feels Premium
&lt;/h3&gt;

&lt;p&gt;Static dashboards feel dead. Adding WebSocket-based live metrics made the app feel 10x more polished with relatively little code.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Don't Reinvent Everything
&lt;/h3&gt;

&lt;p&gt;I use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certbot for SSL (don't roll your own ACME)&lt;/li&gt;
&lt;li&gt;ClamAV for malware (don't write an antivirus)&lt;/li&gt;
&lt;li&gt;systemd for service management (it works)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Focus on the glue, not the components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One-line install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/jhd3197/ServerKit/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Or with Docker:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/jhd3197/ServerKit.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ServerKit
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/jhd3197/ServerKit" rel="noopener noreferrer"&gt;github.com/jhd3197/ServerKit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed, no telemetry, no cloud dependency.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What features would make this useful for you?&lt;/strong&gt; Drop a comment - I read everything.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>selfhosted</category>
      <category>webdev</category>
      <category>python</category>
    </item>
  </channel>
</rss>
