<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Clint Rori</title><link>https://rorimwema.github.io/</link><description>Recent content on Clint Rori</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 30 Jan 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://rorimwema.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Building Fenra: From 'Find the Corruption' to Swarm Intelligence</title><link>https://rorimwema.github.io/posts/building-fenra/</link><pubDate>Mon, 02 Mar 2026 15:38:26 +0300</pubDate><guid>https://rorimwema.github.io/posts/building-fenra/</guid><description>&lt;p&gt;How I stopped trying to build one perfect AI and started building a team of specialized ones.&lt;/p&gt;
&lt;h2 id="the-problem-i-actually-wanted-to-solve"&gt;The Problem I Actually Wanted to Solve&lt;/h2&gt;
&lt;p&gt;I started Fenra because I kept reading about corruption cases in Kenya where the patterns were obvious in hindsight—strange procurement patterns, shell companies, duplicate payments—but nobody caught them in real-time. The data was there, scattered across different systems. The connections were there too, but buried under too much noise for humans to spot quickly.&lt;/p&gt;</description><content:encoded><![CDATA[<p>How I stopped trying to build one perfect AI and started building a team of specialized ones.</p>
<h2 id="the-problem-i-actually-wanted-to-solve">The Problem I Actually Wanted to Solve</h2>
<p>I started Fenra because I kept reading about corruption cases in Kenya where the patterns were obvious in hindsight—strange procurement patterns, shell companies, duplicate payments—but nobody caught them in real-time. The data was there, scattered across different systems. The connections were there too, but buried under too much noise for humans to spot quickly.</p>
<p>My first thought: build one smart AI that can read everything and tell you when something looks corrupt.</p>
<p>That didn&rsquo;t work.</p>
<h2 id="why-single-ai-models-fail-at-this">Why Single AI Models Fail at This</h2>
<p>I tried the obvious approach first. Feed documents into a large language model, ask &ldquo;is this corrupt?&rdquo; The results were either:</p>
<ul>
<li><strong>Too vague</strong> (&ldquo;this seems suspicious&rdquo; — thanks, but why?)</li>
<li><strong>Too confident</strong> (flagging legitimate transactions because of unusual but legal patterns)</li>
<li><strong>Or missing things entirely</strong> (not understanding that two shell companies sharing a director matters)</li>
</ul>
<p>The problem isn&rsquo;t that LLMs are dumb. It&rsquo;s that corruption detection requires multiple types of reasoning at once:</p>
<ul>
<li><strong>Pattern matching</strong> (unusual transaction amounts, timing)</li>
<li><strong>Relationship tracing</strong> (who knows who, company networks)</li>
<li><strong>Legal knowledge</strong> (what actually violates procurement laws)</li>
<li><strong>Context awareness</strong> (this is normal for this industry, weird for that one)</li>
</ul>
<p>No single model is good at all of these. And even if one was, I didn&rsquo;t want a black box making accusations.</p>
<h2 id="the-swarm-idea">The Swarm Idea</h2>
<p>I started thinking about how actual investigations work. You don&rsquo;t have one super-detective who does everything. You have:</p>
<ul>
<li>A forensic accountant who traces money</li>
<li>A network analyst who maps relationships</li>
<li>A legal researcher who knows the regulations</li>
<li>A senior investigator who reviews findings before anything goes to court</li>
</ul>
<p>So I built Fenra as a swarm. Multiple specialized agents, each with a specific job, coordinated by a &ldquo;Judge&rdquo; that verifies conclusions before they&rsquo;re reported.</p>
<h2 id="why-graph-rag-was-the-right-choice">Why Graph RAG Was the Right Choice</h2>
<p>Early on, I tried standard RAG (Retrieval-Augmented Generation) — chunk documents, embed them, retrieve relevant chunks when querying. It worked for simple questions but failed on relationships.</p>
<p><strong>Example:</strong> Company A paid Company B. Company B&rsquo;s director is the cousin of a procurement officer. That&rsquo;s three hops. Standard vector search doesn&rsquo;t handle hops well.</p>
<p><strong>Graph RAG</strong> stores entities (companies, people, transactions) as nodes and relationships as edges. Now the &ldquo;network analyst&rdquo; agent can actually traverse connections—follow the money, find shared directors, spot circular payments.</p>
<p>The graph also gives us explainability. When Fenra flags something, we can show the path:</p>
<blockquote>
<p>&ldquo;Flagged because Company A → paid → Company B → director is → Person C → related to → Procurement Officer D.&rdquo;</p>
</blockquote>
<h2 id="the-architecture-that-actually-works">The Architecture That Actually Works</h2>
<p>Here&rsquo;s what I ended up with:</p>
<h3 id="specialist-agents-the-workers">Specialist Agents (The Workers)</h3>
<ul>
<li><strong>Transaction Analyzer</strong>: Looks at financial patterns, outliers, timing anomalies</li>
<li><strong>Network Mapper</strong>: Traverses the knowledge graph to find hidden relationships</li>
<li><strong>Legal Checker</strong>: Knows procurement regulations, flags procedural violations</li>
<li><strong>Document Reader</strong>: Extracts entities and relationships from unstructured text (contracts, emails)</li>
</ul>
<h3 id="the-judge-the-verifier">The Judge (The Verifier)</h3>
<ul>
<li>Takes findings from specialists and verifies them against evidence</li>
<li>Checks for contradictions between agents</li>
<li>Assigns confidence scores</li>
<li>Only escalates high-confidence, well-supported findings</li>
</ul>
<h3 id="the-graph-store">The Graph Store</h3>
<ul>
<li><strong>Neo4j</strong> for relationship data (who knows who, ownership structures)</li>
<li><strong>Vector store</strong> for semantic search (finding similar contract language, for example)</li>
<li>Both feed into each other — vector search finds relevant documents, graph traversal finds connections within them</li>
</ul>
<h2 id="why-ocaml-and-erlang">Why OCaml and Erlang</h2>
<p>I get asked why I didn&rsquo;t just use Python like everyone else. A few reasons:</p>
<p><strong>OCaml for the core logic:</strong> Corruption detection involves a lot of data transformation and rule evaluation. OCaml&rsquo;s type system catches bugs at compile time that would be runtime errors in Python. When you&rsquo;re dealing with legal and financial data, &ldquo;oops, NoneType has no attribute&rdquo; isn&rsquo;t acceptable.</p>
<p>Also, hot code reloading means I can update an agent&rsquo;s logic without stopping the system. Important when you&rsquo;re iterating on detection rules.</p>
<h2 id="what-i-learned-the-hard-way">What I Learned the Hard Way</h2>
<ol>
<li>
<p><strong>Start with synthetic data:</strong> I spent weeks trying to get real procurement data. Don&rsquo;t. Generate fake but realistic corruption patterns first. If your system can&rsquo;t find fake corruption you planted yourself, it won&rsquo;t find real corruption either.</p>
</li>
<li>
<p><strong>The graph schema matters more than the model:</strong> I wasted time fine-tuning LLMs when the real problem was my graph schema didn&rsquo;t capture &ldquo;subsidiary of&rdquo; relationships properly. Fix your data model first.</p>
</li>
<li>
<p><strong>Explainability is not optional:</strong> In a real deployment, every flag Fenra raises will be challenged. &ldquo;The AI said so&rdquo; is not a defense. The graph structure gives us audit trails by default.</p>
</li>
<li>
<p><strong>Human-in-the-loop is a feature, not a bug:</strong> The Judge agent doesn&rsquo;t just verify AI outputs—it creates a checkpoint where human investigators can review, correct, and improve the system. The goal isn&rsquo;t to replace investigators, it&rsquo;s to make them 10x more effective.</p>
</li>
</ol>
]]></content:encoded></item><item><title>Fenra</title><link>https://rorimwema.github.io/projects/fenra/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://rorimwema.github.io/projects/fenra/</guid><description>&lt;p&gt;Fenra is a multi-agent system for detecting corruption patterns in public procurement data. It uses a swarm of specialized AI agents coordinated by a verification layer called &amp;ldquo;the Judge.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="the-problem"&gt;The Problem&lt;/h3&gt;
&lt;p&gt;Corruption in procurement leaves traces across multiple systems—financial records, company registries, contract documents. The patterns are obvious in hindsight but buried under noise in real-time. Single AI models fail because corruption detection requires simultaneous reasoning about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Financial anomalies (pattern matching)&lt;/li&gt;
&lt;li&gt;Relationship networks (graph traversal)&lt;/li&gt;
&lt;li&gt;Legal compliance (rule evaluation)&lt;/li&gt;
&lt;li&gt;Industry context (domain knowledge)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-swarm-architecture"&gt;The Swarm Architecture&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Specialist Agents (The Workers):&lt;/strong&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<p>Fenra is a multi-agent system for detecting corruption patterns in public procurement data. It uses a swarm of specialized AI agents coordinated by a verification layer called &ldquo;the Judge.&rdquo;</p>
<h3 id="the-problem">The Problem</h3>
<p>Corruption in procurement leaves traces across multiple systems—financial records, company registries, contract documents. The patterns are obvious in hindsight but buried under noise in real-time. Single AI models fail because corruption detection requires simultaneous reasoning about:</p>
<ul>
<li>Financial anomalies (pattern matching)</li>
<li>Relationship networks (graph traversal)</li>
<li>Legal compliance (rule evaluation)</li>
<li>Industry context (domain knowledge)</li>
</ul>
<h3 id="the-swarm-architecture">The Swarm Architecture</h3>
<p><strong>Specialist Agents (The Workers):</strong></p>
<ul>
<li><strong>Transaction Analyzer</strong>: Detects outliers in amounts, timing, and frequency</li>
<li><strong>Network Mapper</strong>: Traverses knowledge graphs to find hidden relationships between companies and officials</li>
<li><strong>Legal Checker</strong>: Flags procedural violations against procurement regulations</li>
<li><strong>Document Reader</strong>: Extracts entities and relationships from unstructured text</li>
</ul>
<p><strong>The Judge (The Verifier):</strong></p>
<ul>
<li>Validates findings against evidence</li>
<li>Checks for contradictions between agents</li>
<li>Assigns confidence scores</li>
<li>Only escalates high-confidence, well-supported flags</li>
</ul>
<h3 id="graph-rag">Graph RAG</h3>
<p>Fenra uses Graph RAG instead of standard vector search. Entities (companies, people, transactions) are nodes; relationships are edges. This enables multi-hop reasoning:</p>
<blockquote>
<p>&ldquo;Company A paid Company B → Company B&rsquo;s director is Person C → Person C is related to Procurement Officer D&rdquo;</p>
</blockquote>
<p>The graph structure also provides explainability—every flag comes with an auditable path.</p>
<h3 id="tech-stack">Tech Stack</h3>
<ul>
<li><strong>Neo4j</strong> for relationship data and graph traversal</li>
<li><strong>Vector store</strong> for semantic search over documents</li>
<li><strong>OCaml</strong> for the core logic—type safety for financial and legal data</li>
<li><strong>Erlang</strong> for agent orchestration—hot code reloading without downtime</li>
</ul>
]]></content:encoded></item><item><title>Kowalski</title><link>https://rorimwema.github.io/projects/kowalski/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://rorimwema.github.io/projects/kowalski/</guid><description>&lt;p&gt;Kowalski is a set-and-forget tax agentic-first platform designed for Kenyan SMEs.&lt;/p&gt;
&lt;h3 id="what-it-does"&gt;What It Does&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-gateway ingestion&lt;/strong&gt;: Pulls transactions from M-Pesa, bank APIs, Stripe, and other payment providers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI-driven reconciliation&lt;/strong&gt;: Automatically matches payments to invoices, categorizes expenses, and flags anomalies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Immutable tax rules&lt;/strong&gt;: Kenyan tax regulations encoded as verifiable logic—no guesswork, no drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct KRA filing&lt;/strong&gt;: Files returns directly to the Kenya Revenue Authority via eTIMS/GavaConnect APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="why-agentic"&gt;Why Agentic?&lt;/h3&gt;
&lt;p&gt;Instead of rigid automation, Kowalski uses specialized agents that handle different aspects of tax compliance:&lt;/p&gt;</description><content:encoded><![CDATA[<p>Kowalski is a set-and-forget tax agentic-first platform designed for Kenyan SMEs.</p>
<h3 id="what-it-does">What It Does</h3>
<ul>
<li><strong>Multi-gateway ingestion</strong>: Pulls transactions from M-Pesa, bank APIs, Stripe, and other payment providers</li>
<li><strong>AI-driven reconciliation</strong>: Automatically matches payments to invoices, categorizes expenses, and flags anomalies</li>
<li><strong>Immutable tax rules</strong>: Kenyan tax regulations encoded as verifiable logic—no guesswork, no drift</li>
<li><strong>Direct KRA filing</strong>: Files returns directly to the Kenya Revenue Authority via eTIMS/GavaConnect APIs</li>
</ul>
<h3 id="why-agentic">Why Agentic?</h3>
<p>Instead of rigid automation, Kowalski uses specialized agents that handle different aspects of tax compliance:</p>
<ul>
<li><strong>Ingestion Agent</strong>: Handles API connections, rate limiting, and data normalization</li>
<li><strong>Reconciliation Agent</strong>: Uses ML to match fuzzy transaction descriptions to actual business activities</li>
<li><strong>Compliance Agent</strong>: Applies Kenyan tax rules (VAT, income tax, withholding) to categorized transactions</li>
<li><strong>Filing Agent</strong>: Prepares and submits returns, handling KRA&rsquo;s specific formatting requirements</li>
</ul>
<p>Each agent reports to a supervisor that ensures consistency and flags edge cases for human review.</p>
<h3 id="built-with">Built With</h3>
<ul>
<li><strong>OCaml</strong> for the tax rule engine—type safety is non-negotiable when dealing with government compliance</li>
<li><strong>Erlang/OTP</strong> for the agent orchestration—fault tolerance and hot code reloading are essential for financial systems</li>
<li><strong>LLMs</strong> for classification and anomaly detection, constrained by structured output schemas</li>
</ul>
]]></content:encoded></item><item><title>We Are Just Conscious Animals</title><link>https://rorimwema.github.io/posts/we-are-just-conscious-animals/</link><pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate><guid>https://rorimwema.github.io/posts/we-are-just-conscious-animals/</guid><description>&lt;p&gt;Humans are intelligent animals.
We build cities, machines, and whole digital worlds — but we remain animals.&lt;/p&gt;
&lt;p&gt;Between one person and another, the difference is not holiness.
It is imagination.
It is discipline.
It is timing.&lt;/p&gt;
&lt;p&gt;Some people are not better. They were simply positioned well — the right place, the right moment. Luck and circumstance shape more than we like to admit.&lt;/p&gt;
&lt;p&gt;There is no manual for life. Anyone who claims to have one is selling comfort, not truth.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Humans are intelligent animals.
We build cities, machines, and whole digital worlds — but we remain animals.</p>
<p>Between one person and another, the difference is not holiness.
It is imagination.
It is discipline.
It is timing.</p>
<p>Some people are not better. They were simply positioned well — the right place, the right moment. Luck and circumstance shape more than we like to admit.</p>
<p>There is no manual for life. Anyone who claims to have one is selling comfort, not truth.</p>
<p>Happiness is temporary. It rises and falls with events.
Joy is deeper. Joy is alignment. It is the quiet certainty that you are living in a way that belongs to you. You find it in people, in art, in friendship, and in work that feels honest.</p>
<p>You control your choices.
You do not control the outcome.
That is enough.</p>
<p>Choose a direction. Choose your values. Choose your effort. Results are not yours to command. Trust the path anyway. Choosing yourself means acting in a way you can stand behind, whatever follows.</p>
<p>Freedom is internal. No one can read your thoughts without your consent. No one can live inside your head. Even in a rigid world, your inner world is yours.</p>
<p>We are conscious animals in a wild universe.
If death is certain, creation is defiance.</p>
<p>When you write, build, design, or code, you push back against decay. You make a mark that proves awareness was here. For me, that mark is programming and writing — tiny acts of rebellion against entropy.</p>
<p>Structure is a tool, not a master.
Invention rarely comes from chaos alone. It comes from people who know the rules, then bend them. You do not reject structure — you refuse to disappear inside it.</p>
<p>Do not look down on anyone. We all enter the world the same way. We all leave the same way. Status is temporary. Flesh is equal.</p>
<p>Each day fades and will not return. This is not tragedy. It is clarity. Live so you do not betray yourself. Regret weighs more than failure.</p>
<p>Do not chase happiness.
Do not chase approval.
Create.</p>
<p>Create because it sharpens your mind.
Create because it feels true.
Create because it is the only clear proof that you were here.</p>
<p>You came with nothing. You will leave with nothing.
Between those two points is a brief window. Use it to build something that reflects you.</p>
<p>Be yourself — not loudly, not theatrically — but deliberately.
Live aligned. Let your death be not theft, but completion.</p>
]]></content:encoded></item><item><title>The Disappearance of Wonder</title><link>https://rorimwema.github.io/posts/dont-grow-up/</link><pubDate>Wed, 04 Feb 2026 20:30:00 +0300</pubDate><guid>https://rorimwema.github.io/posts/dont-grow-up/</guid><description>&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t Grow Up It&amp;rsquo;s a Scam&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://tinyurl.com/nxmdpesb"
 alt="Don&amp;#39;t grow up" width="400"&gt;
&lt;/figure&gt;

&lt;p&gt;Children are interesting creatures. Alive with dreams, energy, a happiness that costs nothing. They inhabit wonder the way fish inhabit water naturally, completely, without knowing they are wet.&lt;/p&gt;
&lt;p&gt;Then they are told to &amp;ldquo;grow up.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Society arrives with its expectations, its imaginary rulebook for how life must be lived. But here is what the rulebook never admits: it is written specifically to kill the thing that makes you human.&lt;/p&gt;</description><content:encoded><![CDATA[<p><strong>Don&rsquo;t Grow Up It&rsquo;s a Scam</strong></p>
<figure><img src="https://tinyurl.com/nxmdpesb"
    alt="Don&#39;t grow up" width="400">
</figure>

<p>Children are interesting creatures. Alive with dreams, energy, a happiness that costs nothing. They inhabit wonder the way fish inhabit water naturally, completely, without knowing they are wet.</p>
<p>Then they are told to &ldquo;grow up.&rdquo;</p>
<p>Society arrives with its expectations, its imaginary rulebook for how life must be lived. But here is what the rulebook never admits: it is written specifically to kill the thing that makes you human.</p>
<p><strong>The Disappearance of Wonder</strong> happens slowly. It is not one dramatic death. It is a thousand small withdrawals. The tree stops being a castle and becomes lumber. The cloud stops being a dragon and becomes precipitation. The stranger stops being a potential friend and becomes a threat, a competitor, a demographic. You learn to measure everything time, love, success, beauty until nothing remains that cannot be weighed. The energy vanishes not because you aged, but because you stopped allowing yourself to be astonished.</p>
<p>You learn to wear masks. You pretend to be someone &ldquo;grown up,&rdquo; which mostly means someone bored, someone tired, someone who already knows how the story ends. Happiness becomes a metric, a checklist of requirements you must meet before you are allowed to feel it. Dreams shrink because someone drew a line between possible and impossible and you believed them. You stopped asking <em>why</em> and started asking <em>how much</em>.</p>
<p>Happy at heart, brain, and soul. If you, like me, have felt this fraud the sense that you are performing a role rather than living a life step back. Question everything you are right now. Ask who wrote the rules you follow. Ask when you last stood still simply because the light was hitting the wall in a way that made your chest ache.</p>
<p>Others will argue that people simply change. That this narrowing is natural, necessary, mature. But I think the child in you does not change. That child remains your light, your compass. The imagination was alive then not because you were naive, but because you were honest. The intentions were pure not because you were ignorant, but because you were true.</p>
<p>We follow our hearts by essence but if the heart is not pure, it misleads, and peace remains impossible.</p>
<p>So become the baby again. Let the wonder return. Look at the world as if you have never seen it, because in truth, you never have you have only been looking at your ideas about it. Only when the wonder returns does true imagination awaken. Only then do you live the life you love.</p>
<p>It is never too late.</p>
<p>As long as your heart beats.</p>
]]></content:encoded></item><item><title>The Code of Silence</title><link>https://rorimwema.github.io/posts/the-code-of-silence/</link><pubDate>Fri, 30 Jan 2026 21:00:00 +0300</pubDate><guid>https://rorimwema.github.io/posts/the-code-of-silence/</guid><description>&lt;p&gt;In the quiet hum of the server room,
Where logic weaves its digital loom,
We trade in absolute, binary truth,
Seeking elegance in eternal youth.&lt;/p&gt;
&lt;p&gt;But life is fuzzy, a float precision,
Full of race conditions and blurred vision.
We debug the world line by line,
Hoping the output will be divine.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Is the universe just a recursive call?&lt;/em&gt;
&lt;em&gt;Or are we trapped in an endless &lt;code&gt;while(true)&lt;/code&gt; loop after all?&lt;/em&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<p>In the quiet hum of the server room,
Where logic weaves its digital loom,
We trade in absolute, binary truth,
Seeking elegance in eternal youth.</p>
<p>But life is fuzzy, a float precision,
Full of race conditions and blurred vision.
We debug the world line by line,
Hoping the output will be divine.</p>
<p><em>Is the universe just a recursive call?</em>
<em>Or are we trapped in an endless <code>while(true)</code> loop after all?</em></p>
]]></content:encoded></item><item><title>Neovim Config</title><link>https://rorimwema.github.io/projects/nvim-config/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate><guid>https://rorimwema.github.io/projects/nvim-config/</guid><description>&lt;p&gt;My personal Neovim configuration. I&amp;rsquo;ve spent way too many hours tweaking this to be the perfect dev environment.&lt;/p&gt;
&lt;h3 id="features"&gt;Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blazing Fast&lt;/strong&gt;: Startup time &amp;lt; 50ms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LSP Support&lt;/strong&gt;: Native LSP integration for TypeScript, Go, Rust, OCaml, and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugin Manager&lt;/strong&gt;: Uses &lt;code&gt;lazy.nvim&lt;/code&gt; for efficient plugin loading.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aesthetics&lt;/strong&gt;: Custom colorscheme integration (Flexoki support included).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check out the &lt;a href="https://github.com/rorimwema/nvim-config"&gt;repository&lt;/a&gt; for installation instructions.&lt;/p&gt;</description><content:encoded><![CDATA[<p>My personal Neovim configuration. I&rsquo;ve spent way too many hours tweaking this to be the perfect dev environment.</p>
<h3 id="features">Features</h3>
<ul>
<li><strong>Blazing Fast</strong>: Startup time &lt; 50ms.</li>
<li><strong>LSP Support</strong>: Native LSP integration for TypeScript, Go, Rust, OCaml, and more.</li>
<li><strong>Plugin Manager</strong>: Uses <code>lazy.nvim</code> for efficient plugin loading.</li>
<li><strong>Aesthetics</strong>: Custom colorscheme integration (Flexoki support included).</li>
</ul>
<p>Check out the <a href="https://github.com/rorimwema/nvim-config">repository</a> for installation instructions.</p>
]]></content:encoded></item><item><title>About Me</title><link>https://rorimwema.github.io/about/</link><pubDate>Tue, 20 Jan 2026 10:00:00 +0300</pubDate><guid>https://rorimwema.github.io/about/</guid><description>&lt;p&gt;I believe computers are simple. It&amp;rsquo;s us humans who keep making them complicated.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m that programmer who reads programming language theory for fun and genuinely enjoys compiler design. While others debate framework-of-the-week, I&amp;rsquo;m deep in the ML family, OCaml is my daily driver, and yes, I use the type system to prevent bugs &lt;em&gt;before&lt;/em&gt; they happen.&lt;/p&gt;
&lt;h3 id="my-toolbox"&gt;My Toolbox&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;OCaml&lt;/strong&gt; — My daily driver. The type system catches bugs before they exist, and hot code reloading means I can iterate without downtime. I use it for anything that needs to stay standing.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I believe computers are simple. It&rsquo;s us humans who keep making them complicated.</p>
<p>I&rsquo;m that programmer who reads programming language theory for fun and genuinely enjoys compiler design. While others debate framework-of-the-week, I&rsquo;m deep in the ML family, OCaml is my daily driver, and yes, I use the type system to prevent bugs <em>before</em> they happen.</p>
<h3 id="my-toolbox">My Toolbox</h3>
<p><strong>OCaml</strong> — My daily driver. The type system catches bugs before they exist, and hot code reloading means I can iterate without downtime. I use it for anything that needs to stay standing.</p>
<p><strong>TypeScript</strong> — When I have to touch the web, I want types. It&rsquo;s JavaScript that won&rsquo;t stab you in production at 3am.</p>
<p><strong>Python</strong> — Still the best for gluing things together, scripting, and when the AI ecosystem hasn&rsquo;t caught up to ML family languages yet.</p>
<p><strong>Neovim</strong> — My editor of choice. Custom config in Lua, sub-50ms startup, LSP for everything. I don&rsquo;t fight my tools; they disappear.</p>
<p><strong>Pi Coding Agent</strong> — My pair programmer that doesn&rsquo;t sleep. Good for scaffolding, refactoring, and rubber-ducking at scale.</p>
<h3 id="philosophy">Philosophy</h3>
<p>I admire <strong>Mat Armstrong&rsquo;s</strong> approach: solve the actual problem, ignore the hype, write code that makes sense six months later. Complexity is a bug, not a feature. If you need a diagram to explain your architecture, your architecture is wrong.</p>
<h3 id="currently-building">Currently Building</h3>
<ul>
<li><strong>Kowalski</strong> — A set-and-forget tax agentic platform for Kenyan SMEs. OCaml for the rules engine, Erlang for agent orchestration, direct KRA filing via eTIMS.</li>
<li><strong>Fenra</strong> — A swarm intelligence system for detecting corruption in public procurement. Multi-agent architecture with Graph RAG for relationship tracing.</li>
</ul>
<h3 id="the-goal">The Goal</h3>
<p>Uncomplicate things. Make programming accessible. Prove that elegant solutions exist—you just have to stop accepting messy ones.</p>
<hr>
<p><em>&ldquo;The best code is the code you don&rsquo;t have to write. The second best is the code you write once and never touch again.&rdquo;</em></p>
<hr>
]]></content:encoded></item><item><title>So You Want to Be a Programmer</title><link>https://rorimwema.github.io/posts/hello-world/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate><guid>https://rorimwema.github.io/posts/hello-world/</guid><description>&lt;p&gt;So you want to be a programmer. You think it is about computers, about code, about some neat abstractions stacked in your head. But really, it is about patience and curiosity and the relentless itch of wanting to see what happens when you poke at the world.&lt;/p&gt;
&lt;p&gt;Programming is not glamorous. It is not about showing off frameworks or boasting about your GitHub streak. It is about sitting there, staring at a problem, feeling your brain ache a little, and then — suddenly — a door opens, a tiny mechanism clicks, and the machine obeys. That moment is bliss, more than any job title or paycheck.&lt;/p&gt;</description><content:encoded><![CDATA[<p>So you want to be a programmer. You think it is about computers, about code, about some neat abstractions stacked in your head. But really, it is about patience and curiosity and the relentless itch of wanting to see what happens when you poke at the world.</p>
<p>Programming is not glamorous. It is not about showing off frameworks or boasting about your GitHub streak. It is about sitting there, staring at a problem, feeling your brain ache a little, and then — suddenly — a door opens, a tiny mechanism clicks, and the machine obeys. That moment is bliss, more than any job title or paycheck.</p>
<p>Charles Bukowski said writing is a gut feeling, a way to bleed yourself onto the page. Programming is the same, only your bleeding is logic, your words are functions, your paragraphs are data structures. Sussman would tell you it is about understanding the system, the abstraction, not just hacking on the surface. Paul Graham would tell you to build something people want, to start with what fascinates you, and then sweat the details until your code becomes invisible, elegant, and powerful.</p>
<p>If you want to be a programmer, be prepared to fail. Be prepared to love the failures, because every bug is a teacher, every crash is a conversation. Be authentic. Write code like you breathe — messy, desperate, alive.</p>
<p>Programming is not a career. It is a calling. And if you want it, you will not be stopped by languages, frameworks, or abstractions. You will be stopped only by yourself.</p>
]]></content:encoded></item><item><title>Now</title><link>https://rorimwema.github.io/now/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rorimwema.github.io/now/</guid><description>&lt;h2 id="what-im-doing-now"&gt;What I&amp;rsquo;m Doing Now&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Last updated: January 2026&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="building"&gt;Building&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://rorimwema.github.io/projects/flowy/"&gt;Flowy&lt;/a&gt;&lt;/strong&gt; — A Telegram mini app for money and commerce. Making payments simple inside the app you already use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://rorimwema.github.io/projects/nvim-config/"&gt;Lisp Interpreter&lt;/a&gt;&lt;/strong&gt; — In OCaml, because every programmer needs to write a Lisp at least once.&lt;/p&gt;
&lt;h3 id="learning"&gt;Learning&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Reading through &lt;em&gt;The Art of Computer Programming&lt;/em&gt; (Knuth) — Volume 4B at the moment&lt;/li&gt;
&lt;li&gt;Diving deeper into distributed systems and consensus algorithms&lt;/li&gt;
&lt;li&gt;Trying to finally understand monads in Haskell (still pretending)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="using"&gt;Using&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Editor&lt;/strong&gt;: Neovim with my own &lt;a href="https://rorimwema.github.io/projects/nvim-config/"&gt;config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Language&lt;/strong&gt;: OCaml for serious work, Python for quick scripts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OS&lt;/strong&gt;: macOS with a heavily customized terminal setup&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reading"&gt;Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Structure and Interpretation of Computer Programs&lt;/em&gt; (SICP) — re-reading, still learning new things&lt;/li&gt;
&lt;li&gt;Various papers on type theory and compiler design&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;</description><content:encoded><![CDATA[<h2 id="what-im-doing-now">What I&rsquo;m Doing Now</h2>
<p><em>Last updated: January 2026</em></p>
<h3 id="building">Building</h3>
<p><strong><a href="/projects/flowy/">Flowy</a></strong> — A Telegram mini app for money and commerce. Making payments simple inside the app you already use.</p>
<p><strong><a href="/projects/nvim-config/">Lisp Interpreter</a></strong> — In OCaml, because every programmer needs to write a Lisp at least once.</p>
<h3 id="learning">Learning</h3>
<ul>
<li>Reading through <em>The Art of Computer Programming</em> (Knuth) — Volume 4B at the moment</li>
<li>Diving deeper into distributed systems and consensus algorithms</li>
<li>Trying to finally understand monads in Haskell (still pretending)</li>
</ul>
<h3 id="using">Using</h3>
<ul>
<li><strong>Editor</strong>: Neovim with my own <a href="/projects/nvim-config/">config</a></li>
<li><strong>Language</strong>: OCaml for serious work, Python for quick scripts</li>
<li><strong>OS</strong>: macOS with a heavily customized terminal setup</li>
</ul>
<h3 id="reading">Reading</h3>
<ul>
<li><em>Structure and Interpretation of Computer Programs</em> (SICP) — re-reading, still learning new things</li>
<li>Various papers on type theory and compiler design</li>
</ul>
<hr>
]]></content:encoded></item></channel></rss>