<?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: Tanay Vasishtha</title>
    <description>The latest articles on DEV Community by Tanay Vasishtha (@tanay_vasishtha_c1416cdae).</description>
    <link>https://dev.to/tanay_vasishtha_c1416cdae</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%2F3152608%2Ff90b7f7b-a1be-472e-abfc-50d2829a63dd.png</url>
      <title>DEV Community: Tanay Vasishtha</title>
      <link>https://dev.to/tanay_vasishtha_c1416cdae</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanay_vasishtha_c1416cdae"/>
    <language>en</language>
    <item>
      <title>The substitute came out of the same factory</title>
      <dc:creator>Tanay Vasishtha</dc:creator>
      <pubDate>Sat, 17 Oct 2026 17:12:27 +0000</pubDate>
      <link>https://dev.to/tanay_vasishtha_c1416cdae/the-substitute-came-out-of-the-same-factory-5461</link>
      <guid>https://dev.to/tanay_vasishtha_c1416cdae/the-substitute-came-out-of-the-same-factory-5461</guid>
      <description>&lt;p&gt;&lt;em&gt;Built for &lt;a href="https://www.wemakedevs.org/hackathons/falkordb" rel="noopener noreferrer"&gt;Graph Hacks: Context for AI Agents&lt;/a&gt; by WeMakeDevs and FalkorDB. Try the &lt;a href="https://provenance-imzk.onrender.com" rel="noopener noreferrer"&gt;live app&lt;/a&gt;, read the &lt;a href="https://github.com/tanayvasishtha/provenance" rel="noopener noreferrer"&gt;source&lt;/a&gt;, or watch the 2:40 demo:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/jQsp9cDahSg" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In November 2022 FDA inspectors walked into an Intas Pharmaceuticals plant in Sanand, Gujarat, and found quality records torn up and thrown in the scrap. The plant made more than half of America's generic cisplatin and carboplatin. Intas stopped shipping, cisplatin went short in February 2023, and by June an NCCN survey found 93% of 27 cancer centres short of carboplatin and 70% short of cisplatin.&lt;/p&gt;

&lt;p&gt;Carboplatin is what you reach for when cisplatin runs out. It ran out too, for the same reason: it came out of the same plant.&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%2F1h9jgmwfzewxmtfkuvl6.jpg" 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%2F1h9jgmwfzewxmtfkuvl6.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Cisplatin and its standard substitute both trace back to one Intas plant under FDA import alert.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For Graph Hacks I built Provenance, an agent that checks this before a pharmacist makes the switch. This is how it works, what the data can and can't tell you, and what broke on the way.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why a graph, and why vector search misses it
&lt;/h2&gt;

&lt;p&gt;Ask a search over drug labels for a cisplatin substitute and it will say carboplatin, because the two labels read alike. That's a fine answer to "what is similar" and a dangerous answer to "what will still be on the shelf next month".&lt;/p&gt;

&lt;p&gt;The fact that matters isn't written anywhere as a sentence. It's spread across four public records:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A DailyMed drug label names the plants that make the product, each with a DUNS number.&lt;/li&gt;
&lt;li&gt;FDA's establishment registry maps that DUNS to an FDA FEI number and a country.&lt;/li&gt;
&lt;li&gt;FDA's Import Alert 66-40 lists plants barred from shipping drugs to the US.&lt;/li&gt;
&lt;li&gt;openFDA's shortage list says what is short today.&lt;/li&gt;
&lt;/ol&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%2F8nmfkhfevs768qvgzhae.jpg" 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%2F8nmfkhfevs768qvgzhae.jpg" alt=" " width="800" height="469"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The graph model in FalkorDB: four FDA sources joined into one supply graph, plus one memory graph per hospital.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Join them and you get a graph: plants make products, products contain ingredients, ingredients sit in FDA pharmacologic classes, plants carry FDA actions. "Does this substitute share a plant with the drug that ran out" becomes one Cypher pattern in FalkorDB:&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;i:&lt;/span&gt;&lt;span class="n"&gt;Ingredient&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="n"&gt;$drug&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;:IN_CLASS&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="nc"&gt;:Class&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:IN_CLASS&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;alt:&lt;/span&gt;&lt;span class="n"&gt;Ingredient&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="n"&gt;i&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:CONTAINS&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;:Product&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:MAKES&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;f:&lt;/span&gt;&lt;span class="n"&gt;Facility&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;:MAKES&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="nc"&gt;:Product&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;:CONTAINS&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;alt&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="n"&gt;f&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;:FLAGGED&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;a:&lt;/span&gt;&lt;span class="n"&gt;Action&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;alt.name&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="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="n"&gt;f.name&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="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="n"&gt;a.date&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For cisplatin it returns carboplatin with three shared plants, Intas at FEI 3004011473 among them, flagged on 1 June 2023. It also turned up something I didn't know going in: a second Intas site in the same town makes cisplatin too, and it has its own import alert, from November 2023.&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%2F9r8ntieh2gxqeystktk7.jpg" 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%2F9r8ntieh2gxqeystktk7.jpg" alt=" " width="799" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;What the app shows for cisplatin: seven plants, three shared with carboplatin, two Intas sites under import alert.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The build
&lt;/h2&gt;

&lt;p&gt;For data, I scoped to the 20 drugs with the most current shortage entries plus the three platinum drugs, then the members of their FDA classes as candidate substitutes: 75 substances, 6,251 products, 3,828 labels. Every label was read. The whole graph fits in memory with room to spare, which matters because FalkorDB keeps the graph in RAM.&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%2Frq8h03v4kdgcy9gugdk8.jpg" 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%2Frq8h03v4kdgcy9gugdk8.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The supply graph: 670 plant-drug links. Amber drugs are on today's FDA shortage list; red plants are under import alert.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To make the comparison fair, the "similar text" baseline also runs in FalkorDB: each drug's indications text is embedded with bge-small and stored in a FalkorDB vector index, and the baseline picks the nearest neighbour. Same database, same drugs, two ways of asking.&lt;/p&gt;

&lt;p&gt;The agent's tools are Cypher queries: one &lt;code&gt;check_substitute&lt;/code&gt; call returns the plants behind a drug, the plants it shares with a proposed substitute, any import alerts on them, and the same-class options with no shared plant. Others cover plant impact, the bridging plants and hospital memory. On the live demo, GPT-4.1 mini picks the tools through function calling, capped at 200 model calls a day; with no key, or past the cap, a rule-based planner runs the same tools. The system prompt says one thing above all: never name a plant, FEI number or date a tool didn't return. The page streams each tool call with its Cypher as it returns, then the answer as it's written, so rows show up in under half a second.&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%2Fu4drk0j4vpkg3otfw811.jpg" 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%2Fu4drk0j4vpkg3otfw811.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The trap query running live on FalkorDB Cloud: five rows in 27 ms.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;FalkorDB's built-in algorithms do the systemic part. I project the graph to plant-drug edges in both directions, so every drug-to-drug path runs through the plants that make them, then run &lt;code&gt;algo.betweenness&lt;/code&gt; on it. Plants with high betweenness tie separate drug supply chains together: Fresenius Kabi's FEI 3001833549 makes 15 of the graph's drugs across 14 classes. Intas ranks 33rd, a single point of failure for platinum drugs but not a bridge between classes. Two surprises: the algorithm samples 32 start nodes by default, so I set the sample to every node for exact scores; and FalkorDB 4.22 and 6.0.1 return different exact scores on the same 671 edges, with the same top three plants in a different order.&lt;/p&gt;

&lt;p&gt;For memory, each hospital is its own graph on the same FalkorDB server, &lt;code&gt;hospital:&amp;lt;name&amp;gt;&lt;/code&gt;, holding what it stocks and every substitution it decided. When a pharmacist says "we switched cisplatin to oxaliplatin", the agent writes a &lt;code&gt;Decision&lt;/code&gt; node, links the old decision to the new one with &lt;code&gt;REPLACED_BY&lt;/code&gt;, and points out that oxaliplatin also comes out of the Intas plant. When an FDA action hits a plant, each hospital's graph is read against it, so the same event lands as three different alerts: chemo drugs at the oncology centre, a sedative at the surgical hospital, a diuretic at the children's hospital.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Across the 18 drugs on today's shortage list that the graph covers, the similar-text substitute shared a manufacturing plant with the drug in shortage 14 times. Six times it was itself on the shortage list. For 15 of the 18, the graph found a same-class drug with no shared plant.&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%2Fnx7snx0gagcrih4i63ov.jpg" 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%2Fnx7snx0gagcrih4i63ov.jpg" alt=" " width="800" height="292"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Measured across the 18 drugs on today's FDA shortage list.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For dextrose, dopamine, hydromorphone and lorazepam, the similar-text pick shared no plant at all. For carboplatin, dextrose and rocuronium, every same-class alternative shares a plant with the drug, so the honest answer is "there is no independent option in this class".&lt;/p&gt;

&lt;p&gt;Then I scored the agent the same way. A script asks the live agent one plain question per shortage drug and checks the answer against FalkorDB. In 18 of 18 answers it cited no FEI number or alert date the graph doesn't hold. In 17 of 18 it named every flagged plant behind the drug with its date; the miss said "in 2023" for clonazepam instead of the two dates. Median answer: 2.3 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke
&lt;/h2&gt;

&lt;p&gt;Repackers looked like factories. Labels list repackers and relabellers next to manufacturers. My first count said 94% of similar-text picks shared a plant, and most of that was repackers like Bryant Ranch Prepack. I split the edge into &lt;code&gt;MAKES&lt;/code&gt; (manufacture, sterilise) and &lt;code&gt;HANDLES&lt;/code&gt; (pack, relabel, test). The real number is 78%.&lt;/p&gt;

&lt;p&gt;One firm had seven sites. My first matcher attached both Intas import-alert entries to one plant. They're two sites with two dates. The matcher now scores every registered site of a firm by shared address words and keeps the best. A test pins it.&lt;/p&gt;

&lt;p&gt;DailyMed cut me off at label 1,739. The fetcher now paces requests, honours &lt;code&gt;Retry-After&lt;/code&gt;, and records every response so a rerun resumes from where it stopped.&lt;/p&gt;

&lt;p&gt;The model skimmed past the one fact that mattered. The first agent eval caught GPT-4.1 mini telling a pharmacist that no plant behind furosemide was under import alert. Both Intas sites make furosemide. The flagged plant sat in the middle of a 27-row list and the model read past it. &lt;code&gt;check_substitute&lt;/code&gt; now returns flagged plants as their own field, and the prompt requires each one with its date. The smaller GPT-4.1 nano was worse: it invented import alerts on midazolam's substitutes, so it's out.&lt;/p&gt;

&lt;p&gt;FalkorDB 4.22 dropped a hop. On the cloud instance, &lt;code&gt;OPTIONAL MATCH (q)&amp;lt;-[:MAKES]-(bad:Facility)-[:FLAGGED]-&amp;gt;(:Action)&lt;/code&gt; bound every plant that makes the product, flagged or not, so clobazam showed 11 plants under import alert when it has none. 6.0.1 gets it right. Moving the second hop into &lt;code&gt;WHERE (bad)-[:FLAGGED]-&amp;gt;(:Action)&lt;/code&gt; works on both, and a test pins it. The minimal repro is in the README.&lt;/p&gt;

&lt;p&gt;Every new connection to the cloud cost 410 ms. Opening a fresh FalkorDB Cloud connection per query made a simple answer take 2.1 seconds. Now one pooled connection opens at startup and the agent's tool calls run in parallel, and the same answer takes about 70 ms locally.&lt;/p&gt;

&lt;p&gt;There is no FalkorDB 6 Docker image yet. The Rust rewrite ships as a module, while &lt;code&gt;falkordb/falkordb:latest&lt;/code&gt; is 4.22.1. CI now runs every test on both, and the eval numbers match.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the data can't tell you
&lt;/h2&gt;

&lt;p&gt;Labels name the plant that makes the finished drug, not the plant that makes the active ingredient, and many shortages start at the ingredient. FDA doesn't publish market share either, so "share of US labels" undersells Intas badly: public labels show it making 2 of 19 cisplatin products, while it supplied over half of US cisplatin. And "same class" is a pharmacology grouping, not a statement that two drugs are interchangeable for a patient. A pharmacist decides.&lt;/p&gt;

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

&lt;p&gt;The most useful fact in this project lives between records. No FDA document says carboplatin and cisplatin share a factory; you only see it by walking from a label to a plant to a registry entry to an import alert. That walk is what a graph is for, and it's why vector search, which reads one document at a time, kept picking the risky substitute.&lt;/p&gt;

&lt;p&gt;Cleaning the data turned out to be modelling. The repacker fix lives in the graph itself: "makes this drug" and "puts a label on this drug" became different edges. Once the graph said what each plant actually did, the numbers became honest.&lt;/p&gt;

&lt;p&gt;Score the AI against the graph. The demo looked right every time I tried it by hand. A script that asked about all 18 shortage drugs and checked each answer against FalkorDB found the furosemide error in its first run.&lt;/p&gt;

&lt;p&gt;Test on the engine you deploy on. My tests passed on FalkorDB 6.0.1 locally while the cloud instance on 4.22 gave a different answer to the same query. CI now runs both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Live app: &lt;a href="https://provenance-imzk.onrender.com" rel="noopener noreferrer"&gt;https://provenance-imzk.onrender.com&lt;/a&gt; (free hosting, so the first visit can take a minute to wake). Pick cisplatin, then click the red Intas plant in the chain.&lt;/p&gt;

&lt;p&gt;Code, data snapshot, the Cypher and every number above: &lt;a href="https://github.com/tanayvasishtha/provenance" rel="noopener noreferrer"&gt;https://github.com/tanayvasishtha/provenance&lt;/a&gt;&lt;/p&gt;

</description>
      <category>falkordb</category>
      <category>graphdatabase</category>
      <category>ai</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>Building Smarter: My Journey with CurateBang and Kiro</title>
      <dc:creator>Tanay Vasishtha</dc:creator>
      <pubDate>Mon, 15 Sep 2025 18:32:33 +0000</pubDate>
      <link>https://dev.to/tanay_vasishtha_c1416cdae/building-smarter-my-journey-with-curatebang-and-kiro-3014</link>
      <guid>https://dev.to/tanay_vasishtha_c1416cdae/building-smarter-my-journey-with-curatebang-and-kiro-3014</guid>
      <description>&lt;p&gt;Every creator knows the grind. You have a great idea, but turning it into tailored content for Twitter, LinkedIn, and a blog is repetitive work. It kills creativity and momentum. I built CurateBang to fix this.&lt;/p&gt;

&lt;p&gt;CurateBang is a minimalist tool that does one thing well: it amplifies your ideas. You provide a single prompt, and our AI engine generates high quality, platform specific content instantly. The interface is clean and focused. No distractions, just productivity.&lt;/p&gt;

&lt;p&gt;Building this required a modern, scalable stack. We used Next.js for a fast frontend, hosted on Vercel for global speed. For our data, we chose NeonDB, a serverless Postgres platform that offers power without complexity. The AI core is driven by the Perplexity API.&lt;/p&gt;

&lt;p&gt;The real game changer was Kiro. I used spec-driven development to architect the entire application. By defining the logic clearly, Kiro’s AI was able to generate robust, clean code for both the frontend and our serverless functions. This was not just about coding faster. It was about building better, with a clear architecture from day one.&lt;/p&gt;

&lt;p&gt;We faced challenges. Our initial backend choice was powerful but proved to be the wrong tool for our data model. We made the call to pivot to NeonDB. This required a significant refactor, but it was the right decision. It taught me a valuable lesson: be willing to change course to build a better product.&lt;/p&gt;

&lt;p&gt;This project confirmed my belief that AI is the most powerful tool developers have today. Kiro is more than an assistant; it is a partner in the creative process. It allows a solo founder to build with the speed and quality of a much larger team.&lt;/p&gt;

&lt;p&gt;Thank you to the Code with Kiro team for this incredible opportunity. The future is not about replacing developers. It is about empowering them.&lt;/p&gt;

&lt;h1&gt;
  
  
  kiro #buildinpublic #ai #development
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>kiro</category>
    </item>
  </channel>
</rss>
