<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>whysooraj&#x27;s Portfolio</title>
    <subtitle>Portfolio showcasing projects and research.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://blog.sooraj.fun/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-10-05T00:00:00+00:00</updated>
    <id>https://blog.sooraj.fun/atom.xml</id>
    <entry xml:lang="en">
        <title>Laya Auto File Organizer</title>
        <published>2026-10-05T00:00:00+00:00</published>
        <updated>2026-10-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/projects/laya-file-organizer/"/>
        <id>https://blog.sooraj.fun/projects/laya-file-organizer/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/projects/laya-file-organizer/">&lt;p&gt;Sub-35ms local AI file organizer powered by Laya non-autoregressive System 1 decision engine without cloud API latency or token cost.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-it-exists&quot;&gt;Why it exists&lt;&#x2F;h3&gt;
&lt;p&gt;Organizing cluttered download folders with cloud LLMs is slow, expensive, and leaks private file paths to remote APIs. Traditional regex scripts are too rigid to understand diverse naming schemes. I wanted an instant, zero-cloud tool that runs locally and categorizes files in a fraction of a second.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Extracts file metadata (extension, name, size) and the initial 1KB text snippet from document files.&lt;&#x2F;li&gt;
&lt;li&gt;Queries Laya&#x27;s non-autoregressive System 1 engine in a single sub-35ms forward pass for category choice and junk status.&lt;&#x2F;li&gt;
&lt;li&gt;Sorts files into 12 structured categories (Documents, Code, Financial, Data, Images, Archives, etc.).&lt;&#x2F;li&gt;
&lt;li&gt;Includes safety guards: duplicate suffixing (`_dup`), fallback thresholds (&amp;lt; 0.50 confidence to `Uncertain&#x2F;`), and full dry-run preview mode.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;what-happened&quot;&gt;What happened&lt;&#x2F;h3&gt;
&lt;p&gt;Tested it against messy desktop and downloads folders containing hundreds of mixed files. Replacing autoregressive token generation with Laya&#x27;s parallel decision heads eliminated all cloud latency while keeping classification accuracy high.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-d-change&quot;&gt;What I&#x27;d change&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;d add a background filesystem watcher (inotify daemon) so newly downloaded files sort automatically without requiring manual CLI invocation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;laya-file-organizer&quot;&gt;GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Why I&#x27;m Ditching LLMs for System 1 Decision Engines (Jev, Laya &amp; Building an Instant File Organizer)</title>
        <published>2026-10-04T00:00:00+00:00</published>
        <updated>2026-10-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/blog/why-im-ditching-llm-classifiers-for-laya/"/>
        <id>https://blog.sooraj.fun/blog/why-im-ditching-llm-classifiers-for-laya/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/blog/why-im-ditching-llm-classifiers-for-laya/">&lt;p&gt;&lt;strong&gt;TL;DR:&lt;&#x2F;strong&gt; LLMs are great at writing essays, but using a 7B+ token-generating LLM to decide whether a file is an invoice or a resume is slow, expensive, and prone to hallucinations. I&#x27;ve been exploring non-autoregressive &quot;System 1&quot; decision engines like &lt;strong&gt;TypeSafe Jev&lt;&#x2F;strong&gt; and &lt;strong&gt;Laya&lt;&#x2F;strong&gt;, and built a sub-35ms local file organizer called &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;laya-file-organizer&quot;&gt;laya-file-organizer&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;the-flaw-in-llm-based-routing-classification&quot;&gt;The Flaw in LLM-Based Routing &amp;amp; Classification&lt;&#x2F;h2&gt;
&lt;p&gt;If you&#x27;ve built AI workflows or agent swarms recently, you&#x27;ve probably hit this wall:&lt;&#x2F;p&gt;
&lt;p&gt;To classify a ticket, route an agent call, or decide what folder a file belongs in, you end up making an API request to GPT-4o-mini or Ollama. You write a complex system prompt, define a Pydantic schema, and wait 500ms to 2 seconds while the model generates tokens letter-by-letter just to output &lt;code&gt;{&quot;category&quot;: &quot;billing&quot;}&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It feels absurd:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Latency Overhead&lt;&#x2F;strong&gt;: You&#x27;re waiting hundreds of milliseconds for token generation when you just needed a categorical decision.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cost &amp;amp; Rate Limits&lt;&#x2F;strong&gt;: Every trivial routing decision eats into token budgets.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Hallucination Risk&lt;&#x2F;strong&gt;: Text generation models can fail schema parsing or output unexpected text.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Human brains don&#x27;t work like this. When you look at an invoice, you don&#x27;t draft a 500-word essay in your head to decide it belongs in your &lt;em&gt;Expenses&lt;&#x2F;em&gt; folder — you recognize it instantly. That&#x27;s &lt;strong&gt;System 1 thinking&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;enter-jev-and-laya-non-autoregressive-decision-engines&quot;&gt;Enter Jev and Laya: Non-Autoregressive Decision Engines&lt;&#x2F;h2&gt;
&lt;p&gt;Recently, a new paradigm of decision models has emerged, pioneered by frameworks like &lt;strong&gt;TypeSafe Jev&lt;&#x2F;strong&gt; and &lt;strong&gt;Laya&lt;&#x2F;strong&gt; (built by &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NandhaKishorM&#x2F;laya&quot;&gt;NandhaKishorM&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;Instead of generating text, these models work in a &lt;strong&gt;single forward pass&lt;&#x2F;strong&gt; (~30ms on CPU or GPU). You pass text in, and get calibrated typed decisions back:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;choice&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: Categorical picks among discrete criteria (e.g. &lt;code&gt;financial&lt;&#x2F;code&gt;, &lt;code&gt;documents&lt;&#x2F;code&gt;, &lt;code&gt;code&lt;&#x2F;code&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;score&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: Ordinal ratings (e.g. urgency 1 to 5).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;noul&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: Calibrated probability $P(\text{true})$ for yes&#x2F;no statements.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;jev-vs-laya&quot;&gt;Jev vs. Laya&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TypeSafe Jev&lt;&#x2F;strong&gt;: Established the benchmark for typed decision protocols, introducing schema-constrained classification without text generation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Laya&lt;&#x2F;strong&gt;: Takes this concept further with a &lt;strong&gt;multilingual router&lt;&#x2F;strong&gt;, supporting 100+ languages natively. Laya runs on optimized transformer backends (ModernBERT and mmBERT) trained with &lt;strong&gt;Reinforcement Learning against Strictly Proper Scoring Rules (RLCD)&lt;&#x2F;strong&gt;. It provides calibrated confidence scores and built-in abstention gates (&lt;code&gt;min_confidence&lt;&#x2F;code&gt;), so the model tells you when it&#x27;s genuinely unsure.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;what-i-built-laya-file-organizer&quot;&gt;What I Built: &lt;code&gt;laya-file-organizer&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;To test Laya&#x27;s capabilities in a real-world scenario, I built &lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;laya-file-organizer&quot;&gt;laya-file-organizer&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; — a local CLI utility that organizes messy directories (like &lt;code&gt;~&#x2F;Downloads&lt;&#x2F;code&gt;) into structured folders automatically.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;architecture&quot;&gt;Architecture&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;File ──&amp;gt; Extract (Name, Extension, 1KB Sample) ──&amp;gt; Laya Router (1 Forward Pass ~33ms)
                                                             │
Files Moved &amp;lt;── Sorted Category &amp;amp; Junk Check &amp;lt;───────────────┘
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Context Sampler&lt;&#x2F;strong&gt;: Extracts the filename, file size, extension, and the first 1KB of text (for text, JSON, code, or CSV files).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Laya Predictor&lt;&#x2F;strong&gt;: Passes the context through &lt;code&gt;laya.Router&lt;&#x2F;code&gt; to query two typed decisions simultaneously:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;category&lt;&#x2F;code&gt;: &lt;code&gt;Financial&lt;&#x2F;code&gt;, &lt;code&gt;Documents&lt;&#x2F;code&gt;, &lt;code&gt;Code_and_Logs&lt;&#x2F;code&gt;, &lt;code&gt;Media&lt;&#x2F;code&gt;, &lt;code&gt;Archives_and_Installers&lt;&#x2F;code&gt;, &lt;code&gt;Other&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;is_temporary_junk&lt;&#x2F;code&gt;: Yes&#x2F;No probability check.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Instant Execution&lt;&#x2F;strong&gt;: If junk probability &amp;gt; 70%, file moves to &lt;code&gt;Junk_Candidates&#x2F;&lt;&#x2F;code&gt;. If confidence &amp;lt; 50%, it moves safely to &lt;code&gt;Uncertain&#x2F;&lt;&#x2F;code&gt;. Otherwise, it routes directly to its target folder.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;performance-experience&quot;&gt;Performance &amp;amp; Experience&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Speed&lt;&#x2F;strong&gt;: Sorting 50 files takes ~1.5 seconds total on standard CPU.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zero Cloud Leak&lt;&#x2F;strong&gt;: No API keys, no network calls after initial model load, 100% private.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Accuracy&lt;&#x2F;strong&gt;: Invoices with strings like &lt;code&gt;&quot;Invoice #402 due April 10&quot;&lt;&#x2F;code&gt; get classified as &lt;code&gt;Financial&lt;&#x2F;code&gt; with &lt;strong&gt;0.96 confidence&lt;&#x2F;strong&gt; instantly.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;what-s-next&quot;&gt;What&#x27;s Next?&lt;&#x2F;h2&gt;
&lt;p&gt;Replacing generative LLMs with dedicated decision engines like Laya for routing, triage, and filtering is one of the most practical AI speedups I&#x27;ve implemented.&lt;&#x2F;p&gt;
&lt;p&gt;Check out the code on GitHub:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;Project&lt;&#x2F;strong&gt;: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;laya-file-organizer&quot;&gt;whysooraj&#x2F;laya-file-organizer&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Laya Engine&lt;&#x2F;strong&gt;: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NandhaKishorM&#x2F;laya&quot;&gt;NandhaKishorM&#x2F;laya&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Quanevac</title>
        <published>2026-09-04T00:00:00+00:00</published>
        <updated>2026-09-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/projects/quanevac/"/>
        <id>https://blog.sooraj.fun/projects/quanevac/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/projects/quanevac/">&lt;p&gt;Quantum-enhanced evacuation routing system integrating PyTorch LSTM flood prediction, Qiskit QAOA &#x2F; IBM Quantum hardware, and OSRM real road mapping.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-it-exists&quot;&gt;Why it exists&lt;&#x2F;h3&gt;
&lt;p&gt;Severe coastal cyclones disrupt critical transit networks within hours. Classical heuristic routers struggle to assign congestion-free escape routes when storm surges submerge arterial highways. Quanevac couples temporal deep learning flood forecasts with quantum combinatorial optimization.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Implements a &lt;strong&gt;PyTorch LSTM&lt;&#x2F;strong&gt; risk model predicting road segment inundation probabilities across 3 timesteps ($T=0\text{h}$, $T+12\text{h}$, $T+24\text{h}$).&lt;&#x2F;li&gt;
&lt;li&gt;Formulates congestion-aware route assignment into a Quadratic Unconstrained Binary Optimization (QUBO) problem.&lt;&#x2F;li&gt;
&lt;li&gt;Executes variational circuits using &lt;strong&gt;QAOA&lt;&#x2F;strong&gt; via Qiskit Aer simulators or real &lt;strong&gt;IBM Quantum&lt;&#x2F;strong&gt; hardware via `qiskit-ibm-runtime`.&lt;&#x2F;li&gt;
&lt;li&gt;Traces real driving geometry via &lt;strong&gt;OSRM&lt;&#x2F;strong&gt; and visualizes evacuation corridors on dark-mode interactive maps with live storm track manipulation.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;what-happened&quot;&gt;What happened&lt;&#x2F;h3&gt;
&lt;p&gt;Expanded from an early hackathon prototype into a full end-to-end framework featuring real highway polylines, classical baseline fallbacks, and real QPU dispatch. Handling quantum execution latency while keeping the map interactive required careful asynchronous worker queuing.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-d-change&quot;&gt;What I&#x27;d change&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;d ingest live Doppler radar weather telemetry directly into the LSTM tensor pipeline to trigger automatic dynamic re-routing during active storm landfall.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;Quanevac&quot;&gt;GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CodeWeaver</title>
        <published>2026-07-18T00:00:00+00:00</published>
        <updated>2026-07-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/projects/codeweaver/"/>
        <id>https://blog.sooraj.fun/projects/codeweaver/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/projects/codeweaver/">&lt;p&gt;Lightweight, zero-dependency local proxy bridging Claude Code Anthropic API calls to Gemini CLI Google OAuth sessions.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-it-exists&quot;&gt;Why it exists&lt;&#x2F;h3&gt;
&lt;p&gt;Claude Code is a fast CLI tool for terminal coding, but Anthropic API token costs add up quickly during extended refactoring sessions. Google OAuth sessions provide generous daily quotas for personal development. CodeWeaver translates protocol formats in flight so Claude Code connects directly to Gemini models.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Listens locally on port 8099 with zero external npm dependencies using native Node.js `http` and `crypto`.&lt;&#x2F;li&gt;
&lt;li&gt;Reads session credentials from `~&#x2F;.pi&#x2F;agent&#x2F;auth.json` and auto-refreshes Google OAuth tokens.&lt;&#x2F;li&gt;
&lt;li&gt;Translates Anthropic Messages API payloads, tools, and system prompts into Google Generative Language format in flight.&lt;&#x2F;li&gt;
&lt;li&gt;Handles quota resilience: automatically fails over overflowing requests from Pro models to Flash when rate limits are approached.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;what-happened&quot;&gt;What happened&lt;&#x2F;h3&gt;
&lt;p&gt;Replaced heavy containerized proxy setups with a single script that boots in 15ms. Ran end-to-end coding loops across complex repositories without hitting Anthropic billing caps.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-d-change&quot;&gt;What I&#x27;d change&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;d implement streaming response pass-through for tool calls to reduce perceived latency on large file edits.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;CodeWeaver&quot;&gt;GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>besynx</title>
        <published>2026-07-17T00:00:00+00:00</published>
        <updated>2026-07-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/projects/besynx/"/>
        <id>https://blog.sooraj.fun/projects/besynx/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/projects/besynx/">&lt;p&gt;Secure, local-first, peer-to-peer browser history and cookie synchronization service powered by Rust, SQLite, and WebExtensions.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-it-exists&quot;&gt;Why it exists&lt;&#x2F;h3&gt;
&lt;p&gt;Modern browsers isolate history and session credentials into separate silos, while cloud sync tools transmit unencrypted or centralized browsing data to third-party servers. besynx provides private, zero-cloud synchronization directly between local browsers and trusted devices.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Runs a lightweight background daemon written in &lt;strong&gt;Rust&lt;&#x2F;strong&gt; backed by a local &lt;strong&gt;SQLite&lt;&#x2F;strong&gt; database with locked filesystem permissions (`0600`).&lt;&#x2F;li&gt;
&lt;li&gt;Couples with Manifest-V3 browser extensions for Chromium and Firefox featuring offline visit event queues.&lt;&#x2F;li&gt;
&lt;li&gt;Synchronizes cookies bidirectionally with anti-loop protection and strict Origin header validation to prevent Cross-Site WebSocket Hijacking (CSWSH).&lt;&#x2F;li&gt;
&lt;li&gt;Authenticates remote peer daemons using mutual &lt;strong&gt;Ed25519&lt;&#x2F;strong&gt; cryptographic identity keypairs.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;what-happened&quot;&gt;What happened&lt;&#x2F;h3&gt;
&lt;p&gt;Preventing infinite cookie feedback loops between Firefox and Chromium required careful timestamp and domain debouncing. Once stabilized, switching between browsers kept session logins active without touching the cloud.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-d-change&quot;&gt;What I&#x27;d change&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;d add local mDNS peer discovery and WireGuard tunnel integration so mobile Firefox instances on Android sync seamlessly over local Wi-Fi.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;besynx&quot;&gt;GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Paradox of VibeThinker:3B — SOTA Reasoning, Futile Agency</title>
        <published>2026-07-05T00:00:00+00:00</published>
        <updated>2026-07-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/blog/vibethinker-3b-reasoning-vs-agency/"/>
        <id>https://blog.sooraj.fun/blog/vibethinker-3b-reasoning-vs-agency/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/blog/vibethinker-3b-reasoning-vs-agency/">&lt;p&gt;In June 2026, Weibo AI introduced &lt;strong&gt;VibeThinker:3B&lt;&#x2F;strong&gt;, a 3-billion-parameter model that disrupted the conventional correlation between model scale and reasoning capability. Built on the Qwen2.5-Coder-3B foundation, VibeThinker:3B matches or exceeds frontier models orders of magnitude larger on highly structured reasoning benchmarks.&lt;&#x2F;p&gt;
&lt;p&gt;Yet, when integrated into autonomous agentic coding frameworks (such as SWE-bench environments or multi-tool developer loops), the model’s performance degrades rapidly. This analysis explores the technical architecture driving VibeThinker’s success and the underlying limitations that prevent its application in agentic workflows.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;benchmarks-redefining-efficiency-in-closed-world-logic&quot;&gt;Benchmarks: Redefining Efficiency in Closed-World Logic&lt;&#x2F;h2&gt;
&lt;p&gt;VibeThinker:3B was optimized using a post-training pipeline based on the &lt;strong&gt;&quot;Spectrum-to-Signal&quot; principle&lt;&#x2F;strong&gt;, aligning with the &lt;strong&gt;Parametric Compression-Coverage Hypothesis&lt;&#x2F;strong&gt;. This hypothesis posits that verifiable reasoning (stemming from mathematics and strict code syntax) is highly compressible because its state space is bounded and mathematically verifiable.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;vibethinker_benchmarks.png&quot; alt=&quot;VibeThinker:3B Benchmarks Comparison&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The model achieves exceptional results in isolated logical environments:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AIME26:&lt;&#x2F;strong&gt; &lt;strong&gt;94.3%&lt;&#x2F;strong&gt; accuracy under test-time scaling configurations, competing directly with GPT-4o and Claude 3.5 Sonnet.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LiveCodeBench v6:&lt;&#x2F;strong&gt; &lt;strong&gt;80.2% Pass@1&lt;&#x2F;strong&gt;, validating its proficiency in algorithmic code generation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LeetCode Contests:&lt;&#x2F;strong&gt; &lt;strong&gt;96.1% acceptance rate&lt;&#x2F;strong&gt; on previously unseen evaluation sets.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;why-vibethinker-3b-falters-in-agentic-ecosystems&quot;&gt;Why VibeThinker:3B Falters in Agentic Ecosystems&lt;&#x2F;h2&gt;
&lt;p&gt;Despite superior mathematical and syntax capabilities, VibeThinker:3B fails when tasked with operating as an autonomous software engineer. The bottleneck is not its reasoning capacity, but its structural and parametric limitations in three critical areas:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1-absence-of-tool-calling-and-api-orchestration-calibration&quot;&gt;1. Absence of Tool-Calling and API Orchestration Calibration&lt;&#x2F;h3&gt;
&lt;p&gt;An autonomous coding agent must continuously interact with its environment: reading directory structures, writing files, executing terminal commands, parsing compiler diagnostics, and query-searching documentation.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Constraint:&lt;&#x2F;strong&gt; VibeThinker:3B was not calibrated for tool-calling, function execution, or multi-step API orchestration.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;The Trade-off:&lt;&#x2F;strong&gt; Fine-tuning a 3B model to output structured tool calls (like JSON schemas or XML blocks) while preserving its high-density reasoning capacity results in severe capability regression. Weibo AI deliberately prioritized raw logical density over environmental interface capabilities.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;2-the-gap-between-closed-world-solvers-and-open-world-agents&quot;&gt;2. The Gap Between Closed-World Solvers and Open-World Agents&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Closed-World Reasoning:&lt;&#x2F;strong&gt; Problems presented in competitive math or coding tests are self-contained. The inputs, parameters, and expected outputs are clearly defined. The reasoning path is linear and objective.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Open-World Exploration:&lt;&#x2F;strong&gt; Software development is non-linear and ambiguous. An agent must ingest massive codebases, trace dependencies, handle silent failures, and adapt when tests fail. This requires a level of pragmatic reasoning and context management that 3B parameter models lack the capacity to store.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;3-context-retention-and-state-machine-tracking&quot;&gt;3. Context Retention and State-Machine Tracking&lt;&#x2F;h3&gt;
&lt;p&gt;Agentic loops generate long execution histories, accumulating tool outputs, command results, and code diffs. Under standard architecture, a 3B parameter model struggles to maintain high-fidelity attention over long, noisy contexts. The attention mechanism loses the target plan amidst the verbose logs of compilers and test runners, leading to loop degradation or repetitive execution errors.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;architectural-verdict-the-multi-model-synergy&quot;&gt;Architectural Verdict: The Multi-Model Synergy&lt;&#x2F;h2&gt;
&lt;p&gt;VibeThinker:3B demonstrates that advanced reasoning can be compressed into edge-capable models. However, it highlights that &lt;strong&gt;agency remains a property of scale&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Rather than deploying VibeThinker:3B as the primary orchestrator of an agentic workflow, optimal implementation involves a &lt;strong&gt;heterogeneous multi-model architecture&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The Planner (Large Model):&lt;&#x2F;strong&gt; Use a larger, tool-optimized model (e.g., Claude 3.5 Sonnet or GPT-4o) to handle codebase exploration, state management, and tool routing.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;The Specialist (VibeThinker:3B):&lt;&#x2F;strong&gt; Route complex, self-contained mathematical logic, algorithm generation, or local code verification tasks to VibeThinker:3B.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;By decoupling system orchestration from core logical deduction, developers can leverage VibeThinker’s efficiency without encountering its agentic limitations.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Project Snorlax</title>
        <published>2026-04-11T00:00:00+00:00</published>
        <updated>2026-04-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/projects/snorlax/"/>
        <id>https://blog.sooraj.fun/projects/snorlax/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/projects/snorlax/">&lt;p&gt;An automated detective that filters out downstream log noise in microservices to isolate &quot;Patient Zero&quot; crash errors.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-it-exists&quot;&gt;Why it exists&lt;&#x2F;h3&gt;
&lt;p&gt;Built for a national hackathon in Mumbai. The premise was simple: reading server logs at 2 AM is miserable, and microservice cascades make it worse. We wanted to build something that hands developers the smoking gun, not a stack of haystacks.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Ingests high-velocity JSON logs using &lt;strong&gt;Redis Streams&lt;&#x2F;strong&gt; as a high-speed buffer.&lt;&#x2F;li&gt;
&lt;li&gt;Employs local ML embeddings (&lt;strong&gt;Sentence-Transformers&lt;&#x2F;strong&gt;) to vectorize log texts.&lt;&#x2F;li&gt;
&lt;li&gt;Groups vectorized anomalies with &lt;strong&gt;DBSCAN clustering&lt;&#x2F;strong&gt; to isolate the root failure.&lt;&#x2F;li&gt;
&lt;li&gt;Sends the isolated root cause to an LLM for a clean, one-sentence diagnosis and suggested fix.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;what-happened&quot;&gt;What happened&lt;&#x2F;h3&gt;
&lt;p&gt;We took this to Mumbai, pitch-ready. The tech judges looked at it and declared: &quot;This won&#x27;t work in the real world.&quot; We didn&#x27;t win, and the critique humbled us. But instead of throwing the code away, I went back home, rewrote the ingestion workers, patched the clustering bottlenecks, and cleared the edge cases that would have broken it in production. It works now.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-d-change&quot;&gt;What I&#x27;d change&lt;&#x2F;h3&gt;
&lt;p&gt;If I did this again, I would swap DBSCAN for an incremental clustering algorithm to handle real-time streaming logs without periodically rebuilding the full vector database space.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;snorlax&quot;&gt;GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Moderix</title>
        <published>2026-04-04T00:00:00+00:00</published>
        <updated>2026-04-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/projects/moderix/"/>
        <id>https://blog.sooraj.fun/projects/moderix/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/projects/moderix/">&lt;p&gt;Autonomous AI agents for scalable Trust &amp;amp; Safety content moderation in OpenEnv environments, featuring high-performance routing.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-it-exists&quot;&gt;Why it exists&lt;&#x2F;h3&gt;
&lt;p&gt;Built for the Meta x Scaler x PyTorch hackathon. We set out to solve the massive scaling challenges of content moderation by creating autonomous trust and safety agents that run locally.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Implements specialized moderation routing agents built on PyTorch.&lt;&#x2F;li&gt;
&lt;li&gt;Packages local inference environments cleanly inside &lt;strong&gt;Docker&lt;&#x2F;strong&gt; containers.&lt;&#x2F;li&gt;
&lt;li&gt;Orchestrates multi-agent handoffs for text and visual content evaluation.&lt;&#x2F;li&gt;
&lt;li&gt;Serves low-latency agent models deployed on &lt;strong&gt;Hugging Face Spaces&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;what-happened&quot;&gt;What happened&lt;&#x2F;h3&gt;
&lt;p&gt;We wrote the entire codebase in an intense 5-day hackathon sprint. Near the deadline, we ran our test suite of 26 test cases: 23 failed, and only 3 passed. It was a chaotic, eye-opening experience. We debugged until the final hours, learned a massive amount about agent stability, and managed to get the system operational.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-d-change&quot;&gt;What I&#x27;d change&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;d move the agent routing decision matrix from rules-based weights to a lightweight, fine-tuned classification model to handle nuanced semantic contexts more dynamically.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;Moderix&quot;&gt;GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CareerCompass AI</title>
        <published>2026-03-30T00:00:00+00:00</published>
        <updated>2026-03-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/projects/carrer-gap-analyser/"/>
        <id>https://blog.sooraj.fun/projects/carrer-gap-analyser/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/projects/carrer-gap-analyser/">&lt;p&gt;An intelligent full-stack platform designed to analyze career skills gaps, leveraging NLP and asynchronous processing to deliver personalized learning roadmaps.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-it-exists&quot;&gt;Why it exists&lt;&#x2F;h3&gt;
&lt;p&gt;I built this for myself. Career planning is full of noise, and finding the exact missing skills between where you are and where you want to be usually means reading 50 job descriptions. I wanted an AI tool to audit my skill profile and outline the roadmap for me.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Utilizes NLP parser algorithms to parse resumes and identify current skills.&lt;&#x2F;li&gt;
&lt;li&gt;Runs comparative match analysis against scraped job market profiles to identify gaps.&lt;&#x2F;li&gt;
&lt;li&gt;Triggers asynchronous roadmapping tasks using Python queue processing.&lt;&#x2F;li&gt;
&lt;li&gt;Handles user dashboard authentication and layouts seamlessly with &lt;strong&gt;Clerk Auth&lt;&#x2F;strong&gt; and &lt;strong&gt;Next.js&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;what-happened&quot;&gt;What happened&lt;&#x2F;h3&gt;
&lt;p&gt;I was tired of wondering what skills I lacked, so I started writing a simple script to compare my resume with job specs. That script quickly ballooned into a full-stack tool. It&#x27;s a project that solves a problem I actually face, and it&#x27;s what I use when mapping out my own next learning curve.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-d-change&quot;&gt;What I&#x27;d change&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;d integrate direct job application API feeds so the system can suggest active listings matching the user&#x27;s newly bridged skill profile.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;carrer-gap-analyser&quot;&gt;GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Amphan Quantum</title>
        <published>2026-03-25T00:00:00+00:00</published>
        <updated>2026-03-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/projects/amphan/"/>
        <id>https://blog.sooraj.fun/projects/amphan/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/projects/amphan/">&lt;p&gt;AI-powered decision support system leveraging Quantum Approximate Optimization Algorithms (QAOA) to solve complex cyclone evacuation routing.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-it-exists&quot;&gt;Why it exists&lt;&#x2F;h3&gt;
&lt;p&gt;Born in a high-stress, 40-hour quantum hackathon hosted by SRM University AP. Cyclone evacuations are high-stakes graph problems where classical routers clog up; we turned to quantum math to see if we could map safety routes through the noise.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Formulates evacuation routing as a Quadratic Unconstrained Binary Optimization (QUBO) problem.&lt;&#x2F;li&gt;
&lt;li&gt;Executes variational circuits using &lt;strong&gt;QAOA&lt;&#x2F;strong&gt; (via Qiskit) to find low-congestion path assignments.&lt;&#x2F;li&gt;
&lt;li&gt;Connects the quantum backend to a &lt;strong&gt;FastAPI&lt;&#x2F;strong&gt; middleware that parses route data.&lt;&#x2F;li&gt;
&lt;li&gt;Visualizes real-world safety paths dynamically using a &lt;strong&gt;React + Leaflet&lt;&#x2F;strong&gt; map interface.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;what-happened&quot;&gt;What happened&lt;&#x2F;h3&gt;
&lt;p&gt;We had 40 hours, a shared whiteboard, and a lot of caffeine. It was my second big quantum project, and we spent the first half just wrestling with Qiskit state vectors and the second half building a UI to make the quantum math look alive. We ran out of time, but the code compiled, the qubits converged on a route, and the maps actually loaded.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-d-change&quot;&gt;What I&#x27;d change&lt;&#x2F;h3&gt;
&lt;p&gt;Currently, the QUBO matrix scales quadratically with graph nodes. I&#x27;d implement graph decomposition beforehand so we can run the algorithm on actual coastal cities without melting local classical simulators.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;Amphan&quot;&gt;GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Echoes in Orbit</title>
        <published>2026-02-01T00:00:00+00:00</published>
        <updated>2026-02-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/projects/echoes-in-orbit/"/>
        <id>https://blog.sooraj.fun/projects/echoes-in-orbit/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/projects/echoes-in-orbit/">&lt;p&gt;An immersive 3D spherical planetarium planet simulation where user confessions are placed using Fibonacci sphere distribution.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-it-exists&quot;&gt;Why it exists&lt;&#x2F;h3&gt;
&lt;p&gt;A fun, quiet weekend project. I wanted a space where confessions could float, not as a flat feed of text, but as a constellation of glowing stars you could explore in 3D.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Renders a responsive 3D starfield dome using &lt;strong&gt;Three.js&lt;&#x2F;strong&gt; and &lt;strong&gt;React Three Fiber&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Places confession coordinates dynamically using a &lt;strong&gt;Fibonacci sphere distribution algorithm&lt;&#x2F;strong&gt; to ensure even geometric spacing.&lt;&#x2F;li&gt;
&lt;li&gt;Groups confessions into five emotional galaxies (Hope, Regret, Dream, Gratitude, Advice).&lt;&#x2F;li&gt;
&lt;li&gt;Uses lightweight CSS and shaders to handle micro-animations and realistic stellar glows.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;what-happened&quot;&gt;What happened&lt;&#x2F;h3&gt;
&lt;p&gt;It started on a Saturday morning with a blank canvas and a lot of math errors. Placing elements evenly on a sphere without them clumping at the poles took a few tries (and some coordinate transformations). By Sunday night, it was a working digital universe. Cast your thoughts into the cosmos, and watch them become a star.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-d-change&quot;&gt;What I&#x27;d change&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;d rewrite the rendering loops to batch draw calls using instanced meshes, so the frame rate doesn&#x27;t drop when the universe gets crowded with thousands of confessions.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;echo-in-orbits&quot;&gt;GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How I Got Claude Code Running on My Gemini Subscription (Without Any API Keys)</title>
        <published>2024-07-04T00:00:00+00:00</published>
        <updated>2024-07-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.sooraj.fun/blog/codeweaver-launch/"/>
        <id>https://blog.sooraj.fun/blog/codeweaver-launch/</id>
        
        <content type="html" xml:base="https://blog.sooraj.fun/blog/codeweaver-launch/">&lt;p&gt;&lt;strong&gt;TL;DR:&lt;&#x2F;strong&gt; I built a lightweight local proxy called &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;CodeWeaver&quot;&gt;CodeWeaver&lt;&#x2F;a&gt; that translates Claude Code&#x27;s Anthropic API calls into Google Cloud Code Assist requests — using your existing Gemini CLI OAuth session. Zero dependencies, one file, ~500 lines.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;&#x2F;h2&gt;
&lt;p&gt;If you&#x27;re a developer working with AI coding agents, you&#x27;ve probably noticed a split in the ecosystem:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Code&lt;&#x2F;strong&gt; has arguably the best UX among AI coding CLIs — great streaming, tool use, multi-turn conversations, and a polished workflow.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Gemini CLI&lt;&#x2F;strong&gt; comes bundled with your Google account and doesn&#x27;t require managing API keys, but the CLI experience is different.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I found myself wanting the Claude Code interface with my Gemini subscription. Paying for two AI subscriptions felt wasteful, and setting up API keys for every tool was a pain.&lt;&#x2F;p&gt;
&lt;p&gt;So I built a bridge.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-architecture&quot;&gt;The Architecture&lt;&#x2F;h2&gt;
&lt;p&gt;CodeWeaver is a local HTTP proxy that sits between Claude Code and Google&#x27;s APIs:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;Claude Code ──&amp;gt; Anthropic API request ──&amp;gt; CodeWeaver ──&amp;gt; Gemini Request ──&amp;gt; Google
                                                                                │
Claude Code &amp;lt;── Anthropic response &amp;lt;── CodeWeaver &amp;lt;── Gemini Response &amp;lt;────────┘
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It&#x27;s a single Node.js file using only native modules (&lt;code&gt;http&lt;&#x2F;code&gt;, &lt;code&gt;fs&lt;&#x2F;code&gt;, &lt;code&gt;path&lt;&#x2F;code&gt;, &lt;code&gt;crypto&lt;&#x2F;code&gt;) — zero npm dependencies. It runs on localhost:8099 and speaks the Anthropic Messages API on one side and the Google Cloud Code Assist streaming API on the other.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-protocol-translation-works&quot;&gt;How Protocol Translation Works&lt;&#x2F;h2&gt;
&lt;p&gt;This was the most interesting part. Claude Code and Gemini have different API shapes, and bridging them required handling several translation layers:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1-message-role-mapping&quot;&gt;1. Message Role Mapping&lt;&#x2F;h3&gt;
&lt;p&gt;Anthropic uses &lt;code&gt;&quot;user&quot;&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;&quot;assistant&quot;&lt;&#x2F;code&gt; roles, while Gemini uses &lt;code&gt;&quot;user&quot;&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;&quot;model&quot;&lt;&#x2F;code&gt;. Simple enough. The tricky part was handling tool interactions.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-tool-use-function-calling&quot;&gt;2. Tool Use ↔ Function Calling&lt;&#x2F;h3&gt;
&lt;p&gt;When Claude Code calls a tool, it sends a &lt;code&gt;tool_use&lt;&#x2F;code&gt; content block. CodeWeaver translates this into Gemini&#x27;s &lt;code&gt;functionCall&lt;&#x2F;code&gt; format:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;Anthropic:            Gemini:
tool_use block  ──&amp;gt;  functionCall { name, args }
tool_result     ──&amp;gt;  functionResponse { name, response }
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The trickiest bit was preserving the &lt;strong&gt;thought signature&lt;&#x2F;strong&gt; — Gemini 3 models include a cryptographic signature in tool responses for security. CodeWeaver encodes this inside the tool_use ID with a custom encoding scheme (&lt;code&gt;toolu_{name}_{random}_sig_{sig}&lt;&#x2F;code&gt;) and decodes it on the way back.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-schema-sanitization&quot;&gt;3. Schema Sanitization&lt;&#x2F;h3&gt;
&lt;p&gt;This was the biggest gotcha. Claude Code sends OpenAPI 3.1-style tool schemas with keywords like &lt;code&gt;$schema&lt;&#x2F;code&gt;, &lt;code&gt;anyOf&lt;&#x2F;code&gt;, &lt;code&gt;oneOf&lt;&#x2F;code&gt;, &lt;code&gt;const&lt;&#x2F;code&gt;, and &lt;code&gt;exclusiveMinimum&lt;&#x2F;code&gt;. Google&#x27;s API strictly rejects these.&lt;&#x2F;p&gt;
&lt;p&gt;CodeWeaver&#x27;s &lt;code&gt;sanitizeSchema()&lt;&#x2F;code&gt; function strips unsupported keywords, flattens &lt;code&gt;anyOf&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;oneOf&lt;&#x2F;code&gt; into their typed variant, and converts &lt;code&gt;const&lt;&#x2F;code&gt; to &lt;code&gt;enum&lt;&#x2F;code&gt; arrays — all while preserving the actual type structure.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-streaming-response-translation&quot;&gt;4. Streaming Response Translation&lt;&#x2F;h3&gt;
&lt;p&gt;Claude Code expects Server-Sent Events (SSE) with a specific event structure:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;event: message_start
event: content_block_start
event: content_block_delta    (text_delta &amp;#x2F; input_json_delta)
event: content_block_stop
event: message_delta
event: message_stop
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Google sends a different SSE format. CodeWeaver maintains state about the current active content block (text vs. tool_use) and translates Google&#x27;s stream chunks into the Anthropic event sequence on the fly.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;authentication-the-best-part&quot;&gt;Authentication: The Best Part&lt;&#x2F;h2&gt;
&lt;p&gt;No API keys. No &lt;code&gt;.env&lt;&#x2F;code&gt; files. No vertex AI setup.&lt;&#x2F;p&gt;
&lt;p&gt;CodeWeaver reuses the OAuth credentials from your existing Gemini CLI session. When you run &lt;code&gt;codeweaver --login&lt;&#x2F;code&gt;, it:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Spins up a local callback server on port 8085&lt;&#x2F;li&gt;
&lt;li&gt;Opens a Google OAuth consent screen (PKCE flow)&lt;&#x2F;li&gt;
&lt;li&gt;Exchanges the authorization code for access + refresh tokens&lt;&#x2F;li&gt;
&lt;li&gt;Optionally provisions a free-tier Cloud Code Assist project&lt;&#x2F;li&gt;
&lt;li&gt;Stores credentials locally&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;After that, it handles token refresh transparently — keeping your session alive without any manual intervention.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rate-limiting-and-fallbacks&quot;&gt;Rate Limiting and Fallbacks&lt;&#x2F;h2&gt;
&lt;p&gt;Google&#x27;s Cloud Code Assist has strict per-minute quotas on Pro models. CodeWeaver handles this with a self-healing fallback:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;If a Pro model (&lt;code&gt;gemini-2.5-pro&lt;&#x2F;code&gt;) hits a 429, the proxy transparently retries with &lt;code&gt;gemini-2.5-flash&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;If the Flash model also hits limits, it parses the retry-after duration and waits&lt;&#x2F;li&gt;
&lt;li&gt;Up to 3 retry attempts before giving up&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This means your Claude Code session rarely fails — it just gracefully degrades to a faster (but still capable) model when traffic is high.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;model-mapping&quot;&gt;Model Mapping&lt;&#x2F;h2&gt;
&lt;p&gt;Claude Code has a hard-coded model selector. CodeWeaver maps those to their Gemini equivalents:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Claude Code Model&lt;&#x2F;th&gt;&lt;th&gt;Gemini Model&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Sonnet (default)&lt;&#x2F;td&gt;&lt;td&gt;gemini-2.5-pro&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Haiku&lt;&#x2F;td&gt;&lt;td&gt;gemini-2.5-flash&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Opus&lt;&#x2F;td&gt;&lt;td&gt;gemini-3.1-pro-preview&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Fable&lt;&#x2F;td&gt;&lt;td&gt;gemini-3.1-flash-lite&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;You can also pass raw Gemini model IDs directly: &lt;code&gt;claude --model gemini-3.1-pro-preview&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-result-500-lines-zero-dependencies&quot;&gt;The Result: 500 Lines, Zero Dependencies&lt;&#x2F;h2&gt;
&lt;p&gt;The entire proxy is a single &lt;code&gt;proxy.js&lt;&#x2F;code&gt; file. Here&#x27;s the breakdown:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;~80 lines&lt;&#x2F;strong&gt; — OAuth login flow with PKCE&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;~60 lines&lt;&#x2F;strong&gt; — Schema sanitization&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;~120 lines&lt;&#x2F;strong&gt; — Request translation (Anthropic → Gemini)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;~200 lines&lt;&#x2F;strong&gt; — HTTP server + streaming response handling&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;~40 lines&lt;&#x2F;strong&gt; — Token management and config&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Total: ~500 lines of vanilla Node.js. No TypeScript, no frameworks, no npm packages.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-next&quot;&gt;What&#x27;s Next&lt;&#x2F;h2&gt;
&lt;p&gt;CodeWeaver is intentionally focused on the Gemini → Claude bridge right now. But the roadmap aims for something bigger:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Plugin architecture&lt;&#x2F;strong&gt; — provider-agnostic backend swapping&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ollama support&lt;&#x2F;strong&gt; — run Claude Code against local models&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI &#x2F; DeepSeek &#x2F; OpenRouter&lt;&#x2F;strong&gt; — any API-compatible provider&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Auto failover&lt;&#x2F;strong&gt; — cascade through providers on rate limits or outages&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Docker image&lt;&#x2F;strong&gt; — containerized deployment&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Web dashboard&lt;&#x2F;strong&gt; — visual provider configuration&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The vision is to make Claude Code a universal frontend for any AI model backend.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;try-it&quot;&gt;Try It&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;curl -fsSL https:&amp;#x2F;&amp;#x2F;raw.githubusercontent.com&amp;#x2F;whysooraj&amp;#x2F;CodeWeaver&amp;#x2F;main&amp;#x2F;claude-gemini-proxy&amp;#x2F;install.sh | bash
codeweaver --login
codeweaver
claude
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Or clone and run manually:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;git clone https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;whysooraj&amp;#x2F;CodeWeaver.git
cd CodeWeaver&amp;#x2F;claude-gemini-proxy
node proxy.js --login
node proxy.js
claude
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Requirements:&lt;&#x2F;strong&gt; Node.js 18+, a Google account, and the Gemini CLI.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;CodeWeaver is open source under MIT. Contributions, issues, and feature requests are welcome!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Links:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;whysooraj&#x2F;CodeWeaver&quot;&gt;github.com&#x2F;whysooraj&#x2F;CodeWeaver&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Install: One-liner above or clone the repo&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;Have questions? Found a bug? Want another provider supported? Let me know in the comments or open an issue on GitHub.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
