<?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>Forem: Abhi</title>
    <description>The latest articles on Forem by Abhi (@porus09).</description>
    <link>https://forem.com/porus09</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%2F3630149%2F76bf758d-07d6-46fb-b104-d589e0ec8579.png</url>
      <title>Forem: Abhi</title>
      <link>https://forem.com/porus09</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/porus09"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Abhi</dc:creator>
      <pubDate>Sun, 05 Apr 2026 07:20:42 +0000</pubDate>
      <link>https://forem.com/porus09/erpnext-56e8</link>
      <guid>https://forem.com/porus09/erpnext-56e8</guid>
      <description></description>
    </item>
    <item>
      <title>Reverse engineering</title>
      <dc:creator>Abhi</dc:creator>
      <pubDate>Fri, 16 Jan 2026 13:17:05 +0000</pubDate>
      <link>https://forem.com/porus09/reverse-engineering-43a7</link>
      <guid>https://forem.com/porus09/reverse-engineering-43a7</guid>
      <description></description>
    </item>
    <item>
      <title>I Got Tired of Guessing JVM Performance — So I Built a Java Agent From Scratch 🚀</title>
      <dc:creator>Abhi</dc:creator>
      <pubDate>Wed, 17 Dec 2025 18:29:23 +0000</pubDate>
      <link>https://forem.com/porus09/i-got-tired-of-guessing-jvm-performance-so-i-built-a-java-agent-from-scratch-2ab2</link>
      <guid>https://forem.com/porus09/i-got-tired-of-guessing-jvm-performance-so-i-built-a-java-agent-from-scratch-2ab2</guid>
      <description>&lt;p&gt;Hey I am Abhishek Mule, I used to do what most backend developers do. When a Spring Boot app felt slow, I’d:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;😵‍💫 Stare at logs until my eyes blurred.&lt;/li&gt;
&lt;li&gt;⏱️ Add manual &lt;code&gt;System.currentTimeMillis()&lt;/code&gt; timers everywhere.&lt;/li&gt;
&lt;li&gt;☁️ Blame the database (it's always the DB, right?).&lt;/li&gt;
&lt;li&gt;🙏 And just hope the JVM was behaving.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deep down, I knew the truth: &lt;strong&gt;I didn’t actually know what the JVM was doing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of reading another "Top 10 Performance Tips" blog, I decided to do something uncomfortable. I built a JVM agent from scratch. This is the journey of &lt;strong&gt;vtracer&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Starting Point: Brutal Silence 🧩
&lt;/h2&gt;

&lt;p&gt;Before this, terms like &lt;strong&gt;Instrumentation API&lt;/strong&gt; and &lt;strong&gt;Bytecode transformation&lt;/strong&gt; were just abstract concepts. When I started, I expected clear error messages. I was wrong.&lt;/p&gt;

&lt;p&gt;At one point, the JVM simply refused to load my agent. &lt;strong&gt;No errors. No stack traces. Just silence.&lt;/strong&gt; That was Lesson #1: &lt;strong&gt;The JVM doesn’t owe you an explanation.&lt;/strong&gt; If you mess up your bytecode transformer or a manifest entry, the JVM doesn't crash—it just ignores you and moves on. It’s a humbling experience to realize you're invisible to the very system you're trying to track.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 6-Day Build Journey 🛠️
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Day 1: Breaking the Seal
&lt;/h3&gt;

&lt;p&gt;My only goal: Can I make the JVM acknowledge I exist? I wrote a &lt;code&gt;premain&lt;/code&gt; method and finally saw a log line appear inside a target JVM. It felt like cracking open a sealed black box. I finally had an &lt;strong&gt;Instrumentation handle&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 2: The "Explosion" of Reality 💥
&lt;/h3&gt;

&lt;p&gt;I used &lt;strong&gt;ByteBuddy&lt;/strong&gt; to intercept method entry and exit. &lt;/p&gt;

&lt;p&gt;Immediately, lesson #2 hit: &lt;strong&gt;Tracing everything is a disaster.&lt;/strong&gt; My console became unusable—thousands of lines per second, a blur of text. The app was technically "working," but it was completely unobservable. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Takeaway:&lt;/strong&gt; Real JVM tooling is about &lt;strong&gt;restraint&lt;/strong&gt;, not power. If you can't filter the noise, you're just adding to the chaos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Day 3: Attaching to Raw Metal (No Restarts) 💉
&lt;/h3&gt;

&lt;p&gt;Using the &lt;strong&gt;Attach API&lt;/strong&gt;, I built a tool to find a running JVM by PID and inject the agent at runtime. &lt;strong&gt;No restart. No redeploy.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I attached it to a live Spring Boot app and saw Tomcat internals like &lt;code&gt;Http11Processor.recycle()&lt;/code&gt; executing in real-time, it hit me: &lt;strong&gt;This is the exact same mechanism used by million-dollar APMs—just without the marketing and the shiny UI.&lt;/strong&gt; I was finally touching the raw metal of the ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 4: Virtual Threads Aren't Magic 🪄
&lt;/h3&gt;

&lt;p&gt;Java 21's Virtual Threads have massive potential, but they also have massive footguns. I wired a &lt;strong&gt;JFR RecordingStream&lt;/strong&gt; to listen for &lt;code&gt;jdk.VirtualThreadPinned&lt;/code&gt; events. &lt;/p&gt;

&lt;p&gt;I wrote intentionally bad code (a &lt;code&gt;synchronized&lt;/code&gt; block inside a virtual thread), and the agent caught it instantly. &lt;strong&gt;Virtual threads don’t fix bad blocking—they expose it.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 5: The Art of Sampling 📉
&lt;/h3&gt;

&lt;p&gt;Tracing 100% of calls is irresponsible. I implemented &lt;strong&gt;Sampling&lt;/strong&gt; (10% rate). This forced me to think like a systems engineer: predictable overhead, controlled allocations, and finding the "useful signal" in a sea of data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 6: Structured Reporting
&lt;/h3&gt;

&lt;p&gt;I added a &lt;strong&gt;Shutdown Hook&lt;/strong&gt; and &lt;strong&gt;JSON output&lt;/strong&gt;. Now, the agent leaves behind a structured report you can actually analyze, rather than a wall of text you have to scroll past.&lt;/p&gt;




&lt;h2&gt;
  
  
  What vtracer is Today 📍
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Runtime Attachment:&lt;/strong&gt; No restarts required.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Dynamic Instrumentation:&lt;/strong&gt; Power of ByteBuddy.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Smart Sampling:&lt;/strong&gt; Minimal overhead (~2%).&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;JFR Integration:&lt;/strong&gt; Detecting Virtual Thread pinning.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Structured JSON:&lt;/strong&gt; Professional report generation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What vtracer will NEVER be:
&lt;/h3&gt;

&lt;p&gt;I’m not building a UI-heavy dashboard or an "AI-powered oracle." vtracer exists to &lt;strong&gt;understand the JVM, not to hide it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Project Matters 💡
&lt;/h2&gt;

&lt;p&gt;This project didn't just teach me APIs. It taught me how fragile instrumentation can be and how much is happening below the application code that we take for granted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Reality Check:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you’ve never attached to a live JVM, you don’t really know Java—you know frameworks.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Building this agent permanently changed how I debug, how I read stack traces, and how I think about performance. This project didn’t necessarily make me a "faster" developer. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It made me more honest about what I don’t know.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 The Code
&lt;/h2&gt;

&lt;p&gt;If you want to stop guessing and start observing, check the source:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/abhishek-mule/vtracer" rel="noopener noreferrer"&gt;abhishek-mule/vtracer&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Java Version:&lt;/strong&gt; 21+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Early, experimental, and very real.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Learning the JVM, one uncomfortable problem at a time.&lt;/strong&gt; ☕&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building vtracer: Day 1 – My First Java Agent Adventure with Java 21</title>
      <dc:creator>Abhi</dc:creator>
      <pubDate>Tue, 16 Dec 2025 17:11:12 +0000</pubDate>
      <link>https://forem.com/porus09/building-vtracer-day-1-my-first-java-agent-adventure-with-java-21-4fjp</link>
      <guid>https://forem.com/porus09/building-vtracer-day-1-my-first-java-agent-adventure-with-java-21-4fjp</guid>
      <description>&lt;p&gt;Hey Dev.to community! 👋&lt;/p&gt;

&lt;p&gt;I'm Abhishek, a Java enthusiast diving deep into the JVM internals. I'm building &lt;strong&gt;vtracer&lt;/strong&gt; – a low-overhead JVM agent for runtime tracing and virtual thread pinning detection.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;Day 1&lt;/strong&gt; of my journey. Today, I built the foundation: a simple Java agent that loads and prints a message.&lt;/p&gt;

&lt;p&gt;Let's dive in!&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Java Agents? The Magic Behind the JVM
&lt;/h3&gt;

&lt;p&gt;Java agents are powerful tools that let you instrument code at runtime using the &lt;strong&gt;Instrumentation API&lt;/strong&gt;. They can modify bytecode, add logging, monitor performance, or even implement AOP – all without changing the original code.&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%2Fi3rdhg2g781himbb6cn5.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%2Fi3rdhg2g781himbb6cn5.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agents load in two ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static&lt;/strong&gt;: &lt;code&gt;-javaagent&lt;/code&gt; at startup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic&lt;/strong&gt;: Attach to running JVM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today, we focused on static attach – the basics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-Step: My First Premain Agent
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maven Project Setup&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Created a simple Maven project with Java 21.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;pom.xml with Agent Manifest&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-jar-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;archive&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;manifestEntries&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;Premain-Class&amp;gt;&lt;/span&gt;com.example.vtracer.Agent&lt;span class="nt"&gt;&amp;lt;/Premain-Class&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;Can-Redefine-Classes&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/Can-Redefine-Classes&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;Can-Retransform-Classes&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/Can-Retransform-Classes&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/manifestEntries&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/archive&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agent Class&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.vtracer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.instrument.Instrumentation&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;premain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;agentArgs&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Instrumentation&lt;/span&gt; &lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[vtracer] Agent loaded successfully via premain"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[vtracer] Instrumentation: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;inst&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[vtracer] Ready for instrumentation – Day 1 complete!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build &amp;amp; Run&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn clean package
java &lt;span class="nt"&gt;-javaagent&lt;/span&gt;:target/vtracer-1.0.jar TestApp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[vtracer] Agent loaded successfully via premain
[vtracer] Instrumentation instance: sun.instrument.InstrumentationImpl@...
[vtracer] Ready for instrumentation – Day 1 complete!
Test app running...
Test app finished
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qmhmde8354za7tj7x0p.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%2F6qmhmde8354za7tj7x0p.png" alt=" " width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Learned Today
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;premain&lt;/code&gt; runs before main&lt;/li&gt;
&lt;li&gt;Manifest entries are mandatory&lt;/li&gt;
&lt;li&gt;Instrumentation object gives power to transform classes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is just the beginning – next, ByteBuddy for method timing!&lt;/p&gt;

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

&lt;p&gt;Day 2: Method entry/exit timing with ByteBuddy.&lt;/p&gt;

&lt;p&gt;Follow my journey on GitHub: &lt;a href="https://github.com/abhishek-mule/vtracer" rel="noopener noreferrer"&gt;https://github.com/abhishek-mule/vtracer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star ⭐ if you're excited about JVM internals!&lt;/p&gt;

&lt;h1&gt;
  
  
  java #jvm #java21 #agents #bytecode
&lt;/h1&gt;

&lt;p&gt;Thanks for reading! Let's build cool stuff together. 🚀&lt;/p&gt;

&lt;p&gt;— Abhishek Mule&lt;/p&gt;

&lt;p&gt;(Comment below if you're building something similar!)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>java</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Was Tired of Manual Video Editing — So I Built OmniVid Lite</title>
      <dc:creator>Abhi</dc:creator>
      <pubDate>Fri, 28 Nov 2025 09:33:10 +0000</pubDate>
      <link>https://forem.com/porus09/i-was-tired-of-manual-video-editing-so-i-built-omnivid-lite-15i9</link>
      <guid>https://forem.com/porus09/i-was-tired-of-manual-video-editing-so-i-built-omnivid-lite-15i9</guid>
      <description>&lt;p&gt;****🚀 OmniVid Lite — Text-to-Video, Without the Complexity&lt;/p&gt;

&lt;p&gt;Video creation is painful.&lt;/p&gt;

&lt;p&gt;You open CapCut or Premiere…&lt;br&gt;
drag timelines… adjust timing… export… fix something… export again.&lt;/p&gt;

&lt;p&gt;It feels outdated — especially when LLMs can already generate text, code, and images from a single prompt.&lt;/p&gt;

&lt;p&gt;So I built OmniVid Lite — a lightweight, fast, developer-friendly way to generate simple AI-powered videos using nothing but text instructions.&lt;/p&gt;




&lt;p&gt;🎯 The Goal&lt;/p&gt;

&lt;p&gt;Not another "all-in-one AI video editor."&lt;/p&gt;

&lt;p&gt;Just a clean minimal workflow:&lt;/p&gt;

&lt;p&gt;Text prompt ➝ API ➝ Video&lt;/p&gt;

&lt;p&gt;No GPU-heavy diffusion models.&lt;/p&gt;

&lt;p&gt;Instead, OmniVid Lite focuses on:&lt;/p&gt;

&lt;p&gt;05–30 sec explanatory videos&lt;/p&gt;

&lt;p&gt;Subtitles + narration&lt;/p&gt;

&lt;p&gt;Basic scene transitions&lt;/p&gt;

&lt;p&gt;Simple assets (text, shapes, images)&lt;/p&gt;

&lt;p&gt;Think:&lt;br&gt;
"Explain Kubernetes in 20 seconds" → Auto-generated animation.&lt;/p&gt;




&lt;p&gt;🛠️ Tech Stack&lt;/p&gt;

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

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

&lt;p&gt;Video Rendering: Python + Manim (for animation logic)&lt;/p&gt;

&lt;p&gt;Model: LLM (prompt → animation config)&lt;/p&gt;

&lt;p&gt;Auth: API key based&lt;/p&gt;

&lt;p&gt;I wanted a system that a normal developer can deploy, extend, and hack — without depending on closed SaaS APIs.&lt;/p&gt;




&lt;p&gt;🧩 Core Architecture&lt;/p&gt;

&lt;p&gt;User Prompt&lt;br&gt;
      ↓&lt;br&gt;
LLM Prompt Parser (Python)&lt;br&gt;
      ↓&lt;br&gt;
Scene Config (JSON)&lt;br&gt;
      ↓&lt;br&gt;
Renderer (Manim)&lt;br&gt;
      ↓&lt;br&gt;
Final .mp4 Output&lt;/p&gt;

&lt;p&gt;The LLM doesn’t generate raw video — that would be slow and unstable.&lt;/p&gt;

&lt;p&gt;Instead, it generates a structured scene description, like:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "duration": 8,&lt;br&gt;
  "scenes": [&lt;br&gt;
    {&lt;br&gt;
      "type": "text",&lt;br&gt;
      "content": "What is Blockchain?",&lt;br&gt;
      "animation": "fade_in"&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This config is deterministic and editable.&lt;/p&gt;

&lt;p&gt;That makes OmniVid Lite programmable and predictable, unlike "random AI video generators."&lt;/p&gt;




&lt;p&gt;🧪 Example Prompt&lt;/p&gt;

&lt;p&gt;Create a 10-second explanatory video about how DNS works.&lt;br&gt;
Use subtitles, simple animations, and show request flow visually.&lt;/p&gt;

&lt;p&gt;Output:&lt;br&gt;
A short animated video showing:&lt;/p&gt;

&lt;p&gt;browser → DNS resolver → name server → IP response.&lt;/p&gt;

&lt;p&gt;No manual editing. No timeline.&lt;/p&gt;




&lt;p&gt;📦 Current Features&lt;/p&gt;

&lt;p&gt;Text-to-video via /api/v1/render&lt;/p&gt;

&lt;p&gt;Simple Manim-based animations&lt;/p&gt;

&lt;p&gt;Subtitles&lt;/p&gt;

&lt;p&gt;React UI with prompt builder&lt;/p&gt;

&lt;p&gt;API key auth&lt;/p&gt;

&lt;p&gt;Async background rendering&lt;/p&gt;




&lt;p&gt;🧭 What’s Next?&lt;/p&gt;

&lt;p&gt;Voice-over generation&lt;/p&gt;

&lt;p&gt;Image → animated explainer&lt;/p&gt;

&lt;p&gt;Template library&lt;/p&gt;

&lt;p&gt;Drag-and-drop scene editor&lt;/p&gt;

&lt;p&gt;Blender-based advanced export mode&lt;/p&gt;

&lt;p&gt;Not promising hype — just building.&lt;/p&gt;




&lt;p&gt;🔗 Repo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Abhishek-mule/omnivid-lite.git" rel="noopener noreferrer"&gt;https://github.com/Abhishek-mule/omnivid-lite.git&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;💡 Final Thought&lt;/p&gt;

&lt;p&gt;AI won’t replace video editors.&lt;/p&gt;

&lt;p&gt;But tools like OmniVid Lite will replace repetitive, low-creativity editing — so humans can focus on storytelling, not timeline scrubbing.&lt;/p&gt;

&lt;p&gt;If you build videos, teach online, or work on developer tooling — there’s a lot to explore here.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
