<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bikash Kh</title>
    <description>The latest articles on DEV Community by Bikash Kh (@bikash_kh_).</description>
    <link>https://dev.to/bikash_kh_</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3993343%2F39785690-a474-404e-bdda-85d405ca4833.jpg</url>
      <title>DEV Community: Bikash Kh</title>
      <link>https://dev.to/bikash_kh_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bikash_kh_"/>
    <language>en</language>
    <item>
      <title>I built a company brain that remembers why decisions were made (on FalkorDB)</title>
      <dc:creator>Bikash Kh</dc:creator>
      <pubDate>Fri, 16 Oct 2026 10:22:49 +0000</pubDate>
      <link>https://dev.to/bikash_kh_/i-built-a-company-brain-that-remembers-why-decisions-were-made-on-falkordb-c7</link>
      <guid>https://dev.to/bikash_kh_/i-built-a-company-brain-that-remembers-why-decisions-were-made-on-falkordb-c7</guid>
      <description>&lt;p&gt;You know that moment in every team when someone asks "wait, why do we do it this way?" and the room goes quiet?&lt;br&gt;
Somebody knew once. It was in a Slack thread, or a PR comment, or an ADR nobody reads. And usually the person who&lt;br&gt;
actually knew has already left.&lt;/p&gt;

&lt;p&gt;That moment is what my teammate and I built &lt;strong&gt;Cairn&lt;/strong&gt; for, at Graph Hacks (WeMakeDevs × FalkorDB). It's a company&lt;br&gt;
brain that remembers &lt;em&gt;why&lt;/em&gt;: you ask it a question, and it answers with the reasons, quoting the exact message where&lt;br&gt;
each reason was said.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it here:&lt;/strong&gt; &lt;a href="https://cairn-nine-mu.vercel.app" rel="noopener noreferrer"&gt;https://cairn-nine-mu.vercel.app&lt;/a&gt; (no sign-up). The code is on&lt;br&gt;
&lt;a href="https://github.com/kh-bikash/cairn" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  We didn't have a company, so we made one
&lt;/h2&gt;

&lt;p&gt;The first problem was embarrassing: to build a company brain you need a company, and I don't have one lying around&lt;br&gt;
with its Slack history. So we did two things.&lt;/p&gt;

&lt;p&gt;We pointed Cairn at &lt;strong&gt;FalkorDB's own GitHub org&lt;/strong&gt;, 13 real repositories of PRs, issues and reviews. That's a nice&lt;br&gt;
test, because the people judging this hackathon know that code, so they can check whether Cairn's answers are right.&lt;/p&gt;

&lt;p&gt;Then we generated &lt;strong&gt;Orbiton&lt;/strong&gt;, a fictional 24-person logistics company, as real exports: a Slack export, a Jira CSV,&lt;br&gt;
ADRs, postmortems, runbooks, an org chart. We gave it a story. A staff engineer called Priya pushed for self-managed Kafka&lt;br&gt;
for the event pipeline, then left. Two weeks later the pipeline fell over during a promotion and nobody knew how to&lt;br&gt;
fix it.&lt;/p&gt;

&lt;p&gt;Here's what happens when you ask Cairn about it:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1u83fy7cz1u7r20w2xyk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1u83fy7cz1u7r20w2xyk.png" alt="Cairn answering " width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every little number is a real source you can click: the ADR, the Slack thread where the team argued about it, the&lt;br&gt;
Jira ticket where they compared MSK with Kinesis. That's the whole idea. No answer without the receipt.&lt;/p&gt;
&lt;h2&gt;
  
  
  The part I'm proudest of: "is that still true?"
&lt;/h2&gt;

&lt;p&gt;Decisions go stale. Priya's original reasons for Kafka were "we've run Kafka in production" and "peak is about 3k&lt;br&gt;
events per second". Both stopped being true: she left, and the outage hit 11k events per second. Cairn connects the&lt;br&gt;
outage postmortem back to the original decision and flags it:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgkfy3qyyzf5j4qoac459.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgkfy3qyyzf5j4qoac459.png" alt="A decision page showing a reason challenged by a later postmortem" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My teammate pushed for three everyday workflows on top of this, and they turned out to be the most useful part: a&lt;br&gt;
change-impact report before you touch a service, "has this incident happened before?", and a handoff plan when&lt;br&gt;
someone leaves.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why a graph, and why FalkorDB
&lt;/h2&gt;

&lt;p&gt;At first I thought of this as a search problem. It isn't. "Why did we do X" is sometimes a search problem, but "who&lt;br&gt;
should I ask about payments?", "what breaks if we change the auth service?" and "what did we lose when Priya left?"&lt;br&gt;
aren't. There's no paragraph anywhere that contains those answers. You have to walk relationships: who reviewed what,&lt;br&gt;
which service depends on which, who decided what and based on which message.&lt;/p&gt;

&lt;p&gt;So everything in Cairn is a graph in FalkorDB. People, teams, systems, decisions, the reasons behind them, and the&lt;br&gt;
exact source each reason was quoted from:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb02amyrl8aonzu6jf5s9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb02amyrl8aonzu6jf5s9.png" alt="How Cairn works" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most of that graph is built without any AI. Who authored and reviewed a PR, which files it touched, who replied to&lt;br&gt;
whom, which repos depend on which packages: that's just data, so it can't be hallucinated. The AI only does the part&lt;br&gt;
that needs judgement, finding the decisions and why they were made. And then "why" is literally a walk through the&lt;br&gt;
graph:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;d:&lt;/span&gt;&lt;span class="n"&gt;Decision&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;uid:&lt;/span&gt; &lt;span class="n"&gt;$decision&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:BECAUSE&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;p:&lt;/span&gt;&lt;span class="n"&gt;Premise&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="py"&gt;e:&lt;/span&gt;&lt;span class="n"&gt;EVIDENCED_BY&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;s:&lt;/span&gt;&lt;span class="n"&gt;Source&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;OPTIONAL&lt;/span&gt; &lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;later:&lt;/span&gt;&lt;span class="n"&gt;Source&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="py"&gt;c:&lt;/span&gt;&lt;span class="n"&gt;CHALLENGES&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;p.text&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e.quote&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s.title&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;later.title&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;challenged_by&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FalkorDB's graph algorithms ended up doing real work too. Betweenness finds the "bridge" people who connect teams.&lt;br&gt;
Label propagation finds who actually works together. Shortest path explains how two things are connected. And every&lt;br&gt;
company lives in its own graph inside one FalkorDB instance, so the real data and our fake company never mix.&lt;/p&gt;

&lt;p&gt;When you ask "what did we lose when Priya left?", this is the graph the answer comes from:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb5ieok1mjv0a7ch4mad7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb5ieok1mjv0a7ch4mad7.png" alt="The reasoning graph around Priya: systems, tickets, a runbook and a decision" width="799" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Things that broke (a lot)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The AI kept making things up, until we stopped trusting it.&lt;/strong&gt; The fix wasn't a better prompt. Every reason the&lt;br&gt;
model pulls out has to come with a quote, and the code checks that quote against the original text word for word.&lt;br&gt;
If it doesn't match, the reason is thrown away. At answer time, any citation the model invents gets stripped. That&lt;br&gt;
one rule did more for trust than anything else we tried.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Is that still true?" was full of false alarms.&lt;/strong&gt; The first version found lots of "contradictions", and most were&lt;br&gt;
nonsense. A PR that &lt;em&gt;did&lt;/em&gt; what a decision said looked like it contradicted the decision. A README we had downloaded&lt;br&gt;
during the hackathon looked "newer" than every decision, because a downloaded file carries the date you fetched it,&lt;br&gt;
not the date it was written. We threw away eight false alarms before it got honest: now a second, different model has&lt;br&gt;
to agree, and a PR that just implements the decision doesn't count. On the real FalkorDB data, that left exactly one&lt;br&gt;
decision worth a human look. I'd rather show one real flag than twenty fake ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A whole feature was quietly empty.&lt;/strong&gt; "Bridge people" returned nothing for ages, and nothing errored. It turned out&lt;br&gt;
graph algorithms follow the direction of edges, and we had stored "works with" one way per pair, so no path could ever&lt;br&gt;
go &lt;em&gt;through&lt;/em&gt; a person. Storing it both ways fixed it. That one scared me, because nothing looked broken.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We crashed FalkorDB.&lt;/strong&gt; A query that returns a property the graph has never stored, next to a &lt;code&gt;count&lt;/code&gt;, takes down the&lt;br&gt;
whole server on 6.0.x, and &lt;code&gt;WHERE id(n) &amp;gt; -1&lt;/code&gt; quietly returns nothing. Both turned out to be known issues&lt;br&gt;
(&lt;a href="https://github.com/FalkorDB/FalkorDB/issues/3150" rel="noopener noreferrer"&gt;#3150&lt;/a&gt;, &lt;a href="https://github.com/FalkorDB/FalkorDB/issues/2648" rel="noopener noreferrer"&gt;#2648&lt;/a&gt;),&lt;br&gt;
so we worked around them and wrote them down in the README.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free AI is chaos.&lt;/strong&gt; We ran the whole thing on free models, and every day something ran out. Gemini's free tier gave&lt;br&gt;
us 20 requests a day. Groq was amazing until it hit its daily limit, and Gemini kept answering "high demand". Every "OpenAI-compatible"&lt;br&gt;
API turned out to be compatible in its own special way (one model cites sources as &lt;code&gt;【1】&lt;/code&gt; instead of &lt;code&gt;[1]&lt;/code&gt;). In the&lt;br&gt;
end Cairn chains five free providers (Groq, Cloudflare Workers AI, NVIDIA, Gemini and OpenRouter), waits politely on&lt;br&gt;
the ones with per-minute limits, and if every model is down it still answers straight from the graph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Even hosting fought back.&lt;/strong&gt; Our Railway trial had expired, so our first live link was a tunnel to my laptop. We ended up on a small AWS server using free credits, with the frontend on Vercel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Did the graph actually matter?
&lt;/h2&gt;

&lt;p&gt;This is the part I wanted to be honest about. My first comparison was Cairn against keyword search plus an LLM, and&lt;br&gt;
Cairn crushed it. That felt too easy, so we built a proper vector-search baseline (the thing most "chat with your&lt;br&gt;
docs" tools use), stored the vectors in FalkorDB too, and wrote 40 questions with answers taken from the raw data.&lt;br&gt;
A second model also graded every answer.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Strict&lt;/th&gt;
&lt;th&gt;Judged&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cairn (graph agent)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34/40&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31/40&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cairn's graph routing, no AI at all&lt;/td&gt;
&lt;td&gt;32/40&lt;/td&gt;
&lt;td&gt;26/40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector RAG (same model, same documents)&lt;/td&gt;
&lt;td&gt;22/40&lt;/td&gt;
&lt;td&gt;19/40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keyword RAG&lt;/td&gt;
&lt;td&gt;9/40&lt;/td&gt;
&lt;td&gt;5/40&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Vector search &lt;strong&gt;tied&lt;/strong&gt; us on "why" questions (14 of 17 each). Makes sense: the answer usually sits in one paragraph,&lt;br&gt;
and good retrieval finds it. But on "who knows this?", "what breaks?" and "what changed?", vector search got &lt;strong&gt;zero&lt;/strong&gt;,&lt;br&gt;
and Cairn got all of them. There's no paragraph to retrieve for those. The answers only exist in the relationships.&lt;br&gt;
Even Cairn's graph routing with no AI at all beat vector search overall. That table is the whole argument for a graph.&lt;/p&gt;

&lt;p&gt;It's not perfect. Questions that chain several facts together still trip it up (1 out of 4), and that's what I want to&lt;br&gt;
fix next, along with live Slack and Jira connectors instead of exports.&lt;/p&gt;

&lt;p&gt;Full disclosure: I built Cairn with Claude Code as my coding assistant. My teammate and I made the calls on what to&lt;br&gt;
build, the data and the architecture, and it did a lot of the typing.&lt;/p&gt;

&lt;p&gt;If you have ever lost the &lt;em&gt;why&lt;/em&gt; behind something at work, tell me what you'd ask Cairn first.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>opensource</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>How I Replicated Uber's Core Marketplace in Python: A Technical Deep Dive</title>
      <dc:creator>Bikash Kh</dc:creator>
      <pubDate>Fri, 19 Jun 2026 23:38:35 +0000</pubDate>
      <link>https://dev.to/bikash_kh_/how-i-replicated-ubers-core-marketplace-in-python-a-technical-deep-dive-52mc</link>
      <guid>https://dev.to/bikash_kh_/how-i-replicated-ubers-core-marketplace-in-python-a-technical-deep-dive-52mc</guid>
      <description>&lt;h1&gt;
  
  
  I Built UberSim v2.0: A Production-Grade Urban Mobility Intelligence Platform 🚗🧠
&lt;/h1&gt;

&lt;p&gt;Every time you open Uber and see a &lt;strong&gt;2.1× surge multiplier&lt;/strong&gt;, a complex system has already predicted demand, optimized prices, matched drivers, and logged events for future learning — all within milliseconds.&lt;/p&gt;

&lt;p&gt;I wanted to understand how those systems work.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;UberSim v2.0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A Python-based urban mobility intelligence platform that simulates the core engineering challenges behind modern ride-sharing marketplaces.&lt;/p&gt;

&lt;p&gt;Instead of building another dashboard project, I wanted to recreate the intelligence layer behind a ride-sharing platform from scratch.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  🧠 Demand Forecasting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spatio-temporal demand prediction (&lt;strong&gt;R² = 0.89&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Weather effects, seasonality, lag features, and neighboring zone influence&lt;/li&gt;
&lt;li&gt;Predicts ride demand across multiple city zones&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🕸️ Graph Neural Networks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Models the city as a graph&lt;/li&gt;
&lt;li&gt;Nodes = city zones&lt;/li&gt;
&lt;li&gt;Edges = historical trip flows&lt;/li&gt;
&lt;li&gt;Captures spatial mobility patterns that traditional models miss&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🤖 Reinforcement Learning Pricing
&lt;/h3&gt;

&lt;p&gt;Built a PPO-based surge pricing engine that learns pricing policies instead of relying on hand-crafted rules.&lt;/p&gt;

&lt;p&gt;Optimizes multiple objectives simultaneously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📈 Platform revenue&lt;/li&gt;
&lt;li&gt;🚕 Driver earnings&lt;/li&gt;
&lt;li&gt;😊 Rider welfare&lt;/li&gt;
&lt;li&gt;⏱️ Wait times&lt;/li&gt;
&lt;li&gt;⚖️ Fairness constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One interesting finding:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The RL agent learned to gradually increase surge prices instead of aggressively reacting to demand spikes. This behavior wasn't explicitly programmed.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ⚡ Kafka-Style Real-Time Streaming
&lt;/h3&gt;

&lt;p&gt;Implemented an event-driven architecture with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ride request streams&lt;/li&gt;
&lt;li&gt;Driver status updates&lt;/li&gt;
&lt;li&gt;Pricing events&lt;/li&gt;
&lt;li&gt;Match results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supports historical replay and live marketplace metrics.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Driver State LSTM
&lt;/h3&gt;

&lt;p&gt;Predicts four operational driver states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;online_idle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;online_busy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;relocating&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;offline&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built entirely in NumPy with Backpropagation Through Time and Adam optimization.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧪 Counterfactual A/B Testing
&lt;/h3&gt;

&lt;p&gt;Implemented production-style experimentation techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IPS (Inverse Propensity Scoring)&lt;/li&gt;
&lt;li&gt;Doubly Robust Estimation&lt;/li&gt;
&lt;li&gt;CUPED variance reduction&lt;/li&gt;
&lt;li&gt;Bootstrap confidence intervals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows evaluating policies without deploying every experiment in production.&lt;/p&gt;




&lt;h3&gt;
  
  
  🗺️ Multi-Modal Transit Planning
&lt;/h3&gt;

&lt;p&gt;Journey planning across six transportation modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚗 Rideshare&lt;/li&gt;
&lt;li&gt;🚌 Bus&lt;/li&gt;
&lt;li&gt;🚇 Subway&lt;/li&gt;
&lt;li&gt;🚲 Bike&lt;/li&gt;
&lt;li&gt;🛴 Scooter&lt;/li&gt;
&lt;li&gt;🚶 Walking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uses A*/Dijkstra optimization to balance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Travel time&lt;/li&gt;
&lt;li&gt;Cost&lt;/li&gt;
&lt;li&gt;CO₂ emissions&lt;/li&gt;
&lt;li&gt;Number of transfers&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The hardest problem isn't maximizing revenue.&lt;/p&gt;

&lt;p&gt;It's maximizing revenue &lt;strong&gt;while remaining fair&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Without constraints, optimization naturally prioritizes high-demand areas and disadvantages low-supply neighborhoods.&lt;/p&gt;

&lt;p&gt;Adding fairness fundamentally changes the optimization landscape.&lt;/p&gt;

&lt;p&gt;Some other takeaways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RL discovers strategies humans don't explicitly program.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GNNs capture spatial relationships that tabular models miss.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Causal inference is essential for policy evaluation.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pure NumPy is more powerful than people think.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;code&gt;Python · Streamlit · Plotly · Stable-Baselines3 · NetworkX · NumPy · Scikit-Learn · Gymnasium&lt;/code&gt;&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;[ ] Graph Attention Networks (GAT)&lt;/li&gt;
&lt;li&gt;[ ] Multi-Agent Reinforcement Learning&lt;/li&gt;
&lt;li&gt;[ ] Real Kafka Broker Integration&lt;/li&gt;
&lt;li&gt;[ ] WebGL City Visualization&lt;/li&gt;
&lt;li&gt;[ ] Real-World Dataset Integration (NYC TLC, Chicago Divvy)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 GitHub
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/kh-bikash/ubersim" rel="noopener noreferrer"&gt;https://github.com/kh-bikash/ubersim&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, ideas, and contributions are welcome 🚀&lt;/p&gt;

</description>
      <category>python</category>
      <category>machinelearning</category>
      <category>datascience</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
