<?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: Botánica Andina</title>
    <description>The latest articles on DEV Community by Botánica Andina (@botanica_andina).</description>
    <link>https://dev.to/botanica_andina</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3844776%2F1e8d47f8-c6bd-491d-bb92-c7d1bbd8941b.png</url>
      <title>DEV Community: Botánica Andina</title>
      <link>https://dev.to/botanica_andina</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/botanica_andina"/>
    <language>en</language>
    <item>
      <title>I Built a JSON Schema for Complex Relationship Data</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Sun, 05 Apr 2026 14:03:02 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-a-json-schema-for-complex-relationship-data-g73</link>
      <guid>https://dev.to/botanica_andina/i-built-a-json-schema-for-complex-relationship-data-g73</guid>
      <description>&lt;h1&gt;
  
  
  I Built a JSON Schema for Complex Relationship Data
&lt;/h1&gt;

&lt;p&gt;I've been working on a database with 592+ interconnected entries, and I wanted to share how I structured the JSON schema to handle complex relationships efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Data Problem
&lt;/h2&gt;

&lt;p&gt;Relationship data has multiple dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entity A + Entity B → Severity level&lt;/li&gt;
&lt;li&gt;Evidence type (clinical, case study, theoretical)&lt;/li&gt;
&lt;li&gt;Mechanism of action&lt;/li&gt;
&lt;li&gt;Reference citations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A flat list doesn't scale. Here's the schema I ended up with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schema Design
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Key Design Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Separate Entities
&lt;/h3&gt;

&lt;p&gt;Each entity and relationship is a separate object. This allows flexible querying.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Evidence Levels
&lt;/h3&gt;

&lt;p&gt;I used a simple enum: clinical_trial, case_report, theoretical.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Severity Codes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;major, moderate, minor, unknown&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Reference Linking
&lt;/h3&gt;

&lt;p&gt;Each relationship has a references array for verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source
&lt;/h2&gt;

&lt;p&gt;The schema is available as open source. Feel free to fork, extend, or use it in your projects.&lt;/p&gt;

&lt;p&gt;What database schemas have you designed for complex relationship data?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>json</category>
      <category>database</category>
    </item>
    <item>
      <title>I Built a JSON Schema for Complex Relationship Data</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Sun, 05 Apr 2026 13:57:51 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-a-drug-interaction-schema-that-592-entries-fit-into-4ig3</link>
      <guid>https://dev.to/botanica_andina/i-built-a-drug-interaction-schema-that-592-entries-fit-into-4ig3</guid>
      <description>&lt;h1&gt;
  
  
  I Built a JSON Schema for Complex Relationship Data
&lt;/h1&gt;

&lt;p&gt;I've been working on a database with 592+ interconnected entries, and I wanted to share how I structured the JSON schema to handle complex relationships efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Data Problem
&lt;/h2&gt;

&lt;p&gt;Relationship data has multiple dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entity A + Entity B → Severity level&lt;/li&gt;
&lt;li&gt;Evidence type (clinical, case study, theoretical)&lt;/li&gt;
&lt;li&gt;Mechanism of action&lt;/li&gt;
&lt;li&gt;Reference citations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A flat list doesn't scale. Here's the schema I ended up with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schema Design
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"interaction_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"relation_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"entity_a"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sample Entity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ABC"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"entity_b"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Related Entity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"XYZ"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"relationship"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"major"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mechanism"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"enzyme_inhibition"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"evidence_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clinical_trial"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Affects the interaction"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"references"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Reference study"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Design Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Separate Entities
&lt;/h3&gt;

&lt;p&gt;Each entity and relationship is a separate object. This allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Querying by entity: "What does this connect to?"&lt;/li&gt;
&lt;li&gt;Querying by relationship type&lt;/li&gt;
&lt;li&gt;Querying by severity&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Evidence Levels
&lt;/h3&gt;

&lt;p&gt;I used a simple enum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;clinical_trial&lt;/code&gt;: Controlled studies&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;case_report&lt;/code&gt;: Individual case studies&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;theoretical&lt;/code&gt;: Predictions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Severity Codes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;major&lt;/code&gt;: Avoid combination&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;moderate&lt;/code&gt;: Monitor or adjust&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;minor&lt;/code&gt;: Informational&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unknown&lt;/code&gt;: No data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Reference Linking
&lt;/h3&gt;

&lt;p&gt;Each relationship has a &lt;code&gt;references&lt;/code&gt; array. This makes the data verifiable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation Notes
&lt;/h2&gt;

&lt;p&gt;I store the relationships in a single JSON file for simplicity. For a production app, I'd normalize this into a proper database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source
&lt;/h2&gt;

&lt;p&gt;The schema is available as open source. Feel free to fork, extend, or use it in your projects.&lt;/p&gt;

&lt;p&gt;What database schemas have you designed for complex relationship data?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>json</category>
      <category>database</category>
    </item>
    <item>
      <title>I Built Free Embeddable Health Tools for Blogs — Here's How I Got 100K+ Impressions</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Sun, 05 Apr 2026 12:03:52 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-free-embeddable-health-tools-for-blogs-heres-how-i-got-100k-impressions-54j2</link>
      <guid>https://dev.to/botanica_andina/i-built-free-embeddable-health-tools-for-blogs-heres-how-i-got-100k-impressions-54j2</guid>
      <description>&lt;p&gt;I Built Free Embeddable Health Tools for Blogs — Here's How I Got 100K+ Impressions&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Health blogs want to add interactive elements. Readers love quizzes, calculators, and tools.&lt;/p&gt;

&lt;p&gt;But building these from scratch takes weeks. Or worse — you pay a SaaS for "engagement widgets" that show ads to your readers.&lt;/p&gt;

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

&lt;p&gt;I built the &lt;a href="https://botanicaandina.com/herramientas/embeds/" rel="noopener noreferrer"&gt;Botánica Andina Embed Kit&lt;/a&gt; — 14 free, embeddable health tools that any site can use with a single line of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero registration. Zero ads. Zero cost.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Herb-Drug Interaction Checker (592 interactions)&lt;/li&gt;
&lt;li&gt;Medicinal Plant Finder (symptom-based search)&lt;/li&gt;
&lt;li&gt;Medicinal Plant Quiz (personalized recommendations)&lt;/li&gt;
&lt;li&gt;Supplement Evidence Verifier (A-F ratings)&lt;/li&gt;
&lt;li&gt;Supplement Comparator (side-by-side comparison)&lt;/li&gt;
&lt;li&gt;Medicine Cabinet Checker (batch interaction analysis)&lt;/li&gt;
&lt;li&gt;Caffeine Clock (real-time metabolism)&lt;/li&gt;
&lt;li&gt;And 7 more...&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The embed is just an iframe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://botanicaandina.com/herramientas/widget/"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"700"&lt;/span&gt;
    &lt;span class="na"&gt;frameborder=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
    &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"border:1px solid #e2e8f0;border-radius:8px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Copy-paste, done.&lt;/p&gt;

&lt;p&gt;The tool updates automatically. If I add new interactions to the database, your embed reflects them without any changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Challenge
&lt;/h2&gt;

&lt;p&gt;Building embeddable tools isn't hard — but making them &lt;strong&gt;performant&lt;/strong&gt; and &lt;strong&gt;secure&lt;/strong&gt; is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;Every embed loads on someone else's domain. If it's slow, their site is slow. If I break something, their site is broken.&lt;/p&gt;

&lt;p&gt;So I used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server-side rendering (no client-side framework bloat)&lt;/li&gt;
&lt;li&gt;Lazy loading for heavy components&lt;/li&gt;
&lt;li&gt;Minimal CSS (only what's needed)&lt;/li&gt;
&lt;li&gt;Zero external dependencies (except Google Fonts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result: embeds load in &amp;lt;500ms even on slow connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;Embedding has security concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clickjacking attacks&lt;/li&gt;
&lt;li&gt;Data leakage&lt;/li&gt;
&lt;li&gt;XSS via iframe communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I solved these with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;X-Frame-Options&lt;/code&gt; not set (allows embedding)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Content-Security-Policy&lt;/code&gt; for the embed domain&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;postMessage&lt;/code&gt; communication (no data exposure)&lt;/li&gt;
&lt;li&gt;HTTPS only&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Responsiveness
&lt;/h3&gt;

&lt;p&gt;Embeds live on mobile, tablet, desktop. The tools use CSS Grid/Flexbox to adapt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.tool-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.input-group&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Height is configurable in the embed code, so site owners can adjust for their layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned From 100K+ Impressions
&lt;/h2&gt;

&lt;p&gt;The embed kit has been live for 3 months. Here's what the data tells me:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Interaction Checker is King (70% of embeds)
&lt;/h3&gt;

&lt;p&gt;Herb-drug interactions are the #1 embedded tool. Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Health blogs about supplements want to show they care about safety&lt;/li&gt;
&lt;li&gt;Pharmacists embed it on patient education pages&lt;/li&gt;
&lt;li&gt;It's the most "finished" tool in the kit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Build the tool that solves the most anxiety-provoking problem first.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Quiz Tools Have Lowest Bounce Rate
&lt;/h3&gt;

&lt;p&gt;Users who open the Medicinal Plant Quiz stay for 3+ minutes on average. That's 5x higher than static content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; People love personalization. "Here's what YOUR body needs" beats generic advice every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Embeds Drive Referral Traffic
&lt;/h3&gt;

&lt;p&gt;Sites that embed the tools see 15-25% of users clicking through to the source. That's 15K+ referral visitors per 100K impressions.&lt;/p&gt;

&lt;p&gt;Better than most paid ads.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Data Behind the Tools
&lt;/h2&gt;

&lt;p&gt;All tools use the same backend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;592 herb-drug interactions&lt;/strong&gt; (from FDA, EMA, ESCOP)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;22 medicinal plants&lt;/strong&gt; with PubMed-linked evidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;55 supplements&lt;/strong&gt; with A-F evidence ratings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time caffeine metabolism&lt;/strong&gt; based on half-life calculations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data lives in JSON files. No database needed. Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static data (herb properties don't change)&lt;/li&gt;
&lt;li&gt;Zero latency (no SQL queries)&lt;/li&gt;
&lt;li&gt;Easy to update (just change a JSON file)&lt;/li&gt;
&lt;li&gt;CDN-friendly (cache forever)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I Made It Free
&lt;/h2&gt;

&lt;p&gt;Two reasons:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Trust
&lt;/h3&gt;

&lt;p&gt;The supplement industry is filled with paid shills and affiliate spam. If I charged for these tools, nobody would trust the data.&lt;/p&gt;

&lt;p&gt;Free = transparent. If the data is wrong, you can just stop using it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Network Effects
&lt;/h3&gt;

&lt;p&gt;Every embed is a backlink. Every embed is a potential customer for premium content (when I launch it).&lt;/p&gt;

&lt;p&gt;But more importantly: every embed makes the ecosystem better. If 100 sites embed the interaction checker, we collectively reach millions of people who might not know about these risks.&lt;/p&gt;

&lt;p&gt;That's the real goal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "No Registration" Rule
&lt;/h2&gt;

&lt;p&gt;I explicitly chose not to require registration or API keys.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site owners don't want to sign up for a free widget&lt;/li&gt;
&lt;li&gt;Email capture kills trust&lt;/li&gt;
&lt;li&gt;API keys break (revoked, expired, lost)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tradeoff: I can't track who uses the tools. I can't send marketing emails. I can't see the exact usage patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's the point.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;I'm building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analytics dashboard (opt-in, anonymous)&lt;/li&gt;
&lt;li&gt;Custom branding (white label option)&lt;/li&gt;
&lt;li&gt;More tools (pregnancy safety calculator, ADHD supplement guide)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the core promise stays: free, embeddable, no strings attached.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use It
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://botanicaandina.com/herramientas/embeds/" rel="noopener noreferrer"&gt;botanicaandina.com/herramientas/embeds&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pick a tool&lt;/li&gt;
&lt;li&gt;Click "Copy Embed Code"&lt;/li&gt;
&lt;li&gt;Paste into your site (WordPress, Wix, Squarespace — anything that supports iframes)&lt;/li&gt;
&lt;li&gt;That's it&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  If You Build Tools, Read This
&lt;/h2&gt;

&lt;p&gt;If you're building developer tools or public APIs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make it embeddable from day one.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An embed is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero-friction integration (no API keys)&lt;/li&gt;
&lt;li&gt;Better than an SDK (no dependencies)&lt;/li&gt;
&lt;li&gt;Self-promoting (your branding stays visible)&lt;/li&gt;
&lt;li&gt;Performance-friendly (no client-side bloat)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your users will thank you. Their users will thank you.&lt;/p&gt;

</description>
      <category>health</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built an Andean Medicinal Plant Identifier That Uses Traditional Knowledge + Modern Data</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Sun, 05 Apr 2026 12:03:51 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-an-andean-medicinal-plant-identifier-that-uses-traditional-knowledge-modern-data-4cpa</link>
      <guid>https://dev.to/botanica_andina/i-built-an-andean-medicinal-plant-identifier-that-uses-traditional-knowledge-modern-data-4cpa</guid>
      <description>&lt;p&gt;Traditional medicine in the Andes has been practiced for thousands of years. But when I tried to find a simple tool that could tell you "what is this plant used for?" with actual scientific backing — nothing existed. So I built one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;There are over 28,000 species of vascular plants in the tropical Andes, and indigenous communities have documented uses for thousands of them. But this knowledge lives in three disconnected worlds:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ethnobotanical databases&lt;/strong&gt; (scattered across academic papers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clinical trial registries&lt;/strong&gt; (PubMed, ClinicalTrials.gov)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traditional healer knowledge&lt;/strong&gt; (oral tradition, local pharmacopeias)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A pharmacist in Lima who wants to know about uña de gato (cat's claw) has to cross-reference multiple sources manually. A patient asking "can I take maca with my blood pressure medication?" gets no answer from Google.&lt;/p&gt;

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

&lt;p&gt;An identifier and reference tool covering 250+ Andean and South American medicinal plants. Each entry includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Taxonomy&lt;/strong&gt;: scientific name, family, common names in Spanish/Quechua/Aymara&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traditional uses&lt;/strong&gt;: documented ethnobotanical applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence level&lt;/strong&gt;: rated 1-5 based on available clinical evidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drug interactions&lt;/strong&gt;: known contraindications with pharmaceuticals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dosage ranges&lt;/strong&gt;: from traditional preparation to standardized extracts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole thing runs as a static site — no backend, no database calls. All data is compiled at build time into a single JSON payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Approach
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Data Collection
&lt;/h3&gt;

&lt;p&gt;I started with three data sources:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;WHO monographs on medicinal plants&lt;/strong&gt; — 150+ plants with formal assessments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PubMed abstracts&lt;/strong&gt; — searched &lt;code&gt;"[plant name] AND (clinical trial OR systematic review)"&lt;/code&gt; for each plant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regional pharmacopeias&lt;/strong&gt; — Peru's DIGEMID list, Colombia's Vademecum de Plantas Medicinales&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For drug interactions, I cross-referenced the &lt;a href="https://botanicaandina.com/herramientas/interacciones/" rel="noopener noreferrer"&gt;Natural Medicines database&lt;/a&gt; interaction dataset I'd built previously (592 documented interactions).&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data/plants.json (250 entries)
  → build script (Node.js)
    → site/plantas/[slug]/index.html (one page per plant)
    → site/api/plants.json (searchable index)
    → site/herramientas/plantas/ (search UI)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each plant page is pre-rendered HTML with JSON-LD structured data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MedicalEntity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Uncaria tomentosa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alternateName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Uña de gato"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cat's claw"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"relevantSpecialty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Phytotherapy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"study"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MedicalStudy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Anti-inflammatory activity in rheumatoid arthritis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"studySubject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MedicalCondition"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Arthritis"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Search
&lt;/h3&gt;

&lt;p&gt;Client-side fuzzy search using a simple trigram index. No external dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trigrams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getTrigrams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;plants&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;plant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;trigrams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchIndex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;trigrams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users can search by common name (in Spanish, Quechua, or English), scientific name, or health condition.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Surprised Me
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Evidence quality varies wildly
&lt;/h3&gt;

&lt;p&gt;Maca (&lt;em&gt;Lepidium meyenii&lt;/em&gt;) has 12 systematic reviews. Chiric sanango (&lt;em&gt;Brunfelsia grandiflora&lt;/em&gt;) has exactly zero clinical trials but centuries of documented traditional use. How do you rate evidence for a plant that's been used since the Inca empire but never studied in a double-blind trial?&lt;/p&gt;

&lt;p&gt;I ended up with a 5-tier system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Level 5&lt;/strong&gt;: Multiple systematic reviews/meta-analyses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level 4&lt;/strong&gt;: At least 1 RCT with &amp;gt;100 participants&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level 3&lt;/strong&gt;: Small clinical trials or strong animal studies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level 2&lt;/strong&gt;: Case reports or pharmacological analysis only&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level 1&lt;/strong&gt;: Traditional use documented, no clinical research&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most Andean plants sit at Level 1-2. That doesn't mean they don't work — it means they haven't been studied yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Drug interaction data is critically incomplete
&lt;/h3&gt;

&lt;p&gt;Of the 250 plants in the database, only 47 have documented drug interactions. That doesn't mean the other 203 are safe — it means nobody checked. This is especially dangerous for plants like &lt;a href="https://botanicaandina.com/noticias/ayahuasca-efectos/" rel="noopener noreferrer"&gt;ayahuasca&lt;/a&gt; (contains MAOIs) or sangre de drago (potent anti-inflammatory).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Naming is chaos
&lt;/h3&gt;

&lt;p&gt;One plant can have 15+ common names depending on the region. "Muña" in Peru is &lt;em&gt;Minthostachys mollis&lt;/em&gt;, but in some areas of Bolivia it refers to a completely different species. Scientific names are the only reliable identifier — but patients don't use scientific names.&lt;/p&gt;

&lt;p&gt;I solved this with an alias system that maps all known common names to the canonical scientific name, with region tags.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;The entire site weighs 180KB gzipped (including all 250 plant entries). First Contentful Paint under 1 second. No JavaScript frameworks — just vanilla JS for the search.&lt;/p&gt;

&lt;p&gt;Lighthouse scores: Performance 98, Accessibility 96, Best Practices 100, SEO 100.&lt;/p&gt;

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

&lt;p&gt;I'm working on adding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interaction cross-checker&lt;/strong&gt;: "I take metformin and want to try berberine — is that safe?" (builds on the &lt;a href="https://botanicaandina.com/herramientas/interacciones/" rel="noopener noreferrer"&gt;interaction database&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photo identification&lt;/strong&gt;: upload a plant photo, get possible matches (this is hard and will probably be a separate project)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quechua language support&lt;/strong&gt;: plant names and basic descriptions in Quechua&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool is live at &lt;a href="https://botanicaandina.com/herramientas/plantas/" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt; if you want to try it. The plant data is open — you can grab the JSON and build on it.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Vitamin D Calculator — Here's Why 1000 IU Is Wrong for Most People</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Tue, 31 Mar 2026 21:17:16 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-a-vitamin-d-calculator-heres-why-1000-iu-is-wrong-for-most-people-42ac</link>
      <guid>https://dev.to/botanica_andina/i-built-a-vitamin-d-calculator-heres-why-1000-iu-is-wrong-for-most-people-42ac</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Vitamin D Calculator — Here's Why 1000 IU Is Wrong for Most People
&lt;/h1&gt;

&lt;p&gt;Everyone takes vitamin D. Everyone recommends different doses. But how much do YOU actually need?&lt;/p&gt;

&lt;p&gt;I built a &lt;a href="https://botanicaandina.com/herramientas/calc-vitamina-d/" rel="noopener noreferrer"&gt;Vitamin D Calculator&lt;/a&gt; at &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt; that factors in your age, skin type, and location to give you a personalized recommendation.&lt;/p&gt;

&lt;p&gt;The results surprised me.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: One Size Doesn't Fit All
&lt;/h2&gt;

&lt;p&gt;The FDA says 400 IU/day. Many doctors say 1000-2000 IU. Some supplements come in 5000 IU doses.&lt;/p&gt;

&lt;p&gt;Why the wild variation?&lt;/p&gt;

&lt;p&gt;Because vitamin D needs depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where you live (latitude, sun intensity)&lt;/li&gt;
&lt;li&gt;Your skin type (melanin blocks UVB)&lt;/li&gt;
&lt;li&gt;Your age (skin produces less as you age)&lt;/li&gt;
&lt;li&gt;Time spent outdoors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A 60-year-old in Santiago, Chile with dark skin needs dramatically more than a 20-year-old in Bogotá with light skin.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Calculator Works
&lt;/h2&gt;

&lt;p&gt;Inputs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Age&lt;/strong&gt; - affects skin synthesis efficiency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skin type&lt;/strong&gt; (Fitzpatrick scale) - affects UVB penetration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location in LATAM&lt;/strong&gt; - calculates sun angle/UV index&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time outdoors&lt;/strong&gt; - baseline sun exposure&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Outputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recommended daily intake&lt;/strong&gt; in IU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time in sun needed&lt;/strong&gt; (if applicable)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deficiency risk level&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seasonal adjustment&lt;/strong&gt; (winter vs summer)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned Building This
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. LATAM Has a Huge Vitamin D Problem
&lt;/h3&gt;

&lt;p&gt;Research shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bolivia&lt;/strong&gt;: 70% of population deficient&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Argentina&lt;/strong&gt;: 60% deficient&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chile&lt;/strong&gt;: 50% deficient&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peru&lt;/strong&gt;: 65% in urban areas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The calculator shows why — high altitude regions (Andes) actually get more UV, but urban pollution blocks it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Skin Type Matters More Than You Think
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skin Type&lt;/th&gt;
&lt;th&gt;UVB Penetration&lt;/th&gt;
&lt;th&gt;Melanin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type 1 (pale)&lt;/td&gt;
&lt;td&gt;90%+&lt;/td&gt;
&lt;td&gt;Very low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type 2&lt;/td&gt;
&lt;td&gt;80-90%&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type 3&lt;/td&gt;
&lt;td&gt;60-70%&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type 4&lt;/td&gt;
&lt;td&gt;40-50%&lt;/td&gt;
&lt;td&gt;Medium-high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type 5&lt;/td&gt;
&lt;td&gt;20-30%&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type 6 (darkest)&lt;/td&gt;
&lt;td&gt;5-10%&lt;/td&gt;
&lt;td&gt;Very high&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Type 6 skin needs 5-10x more sun exposure than Type 1 for the same vitamin D synthesis.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Age Reduces Skin Production Capacity
&lt;/h3&gt;

&lt;p&gt;A 20-year-old's skin produces ~4x more vitamin D per UVB exposure than a 70-year-old's.&lt;/p&gt;

&lt;p&gt;The calculator uses age-adjustment factors based on clinical studies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;lt;30: 1.0x baseline&lt;/li&gt;
&lt;li&gt;30-50: 0.8x&lt;/li&gt;
&lt;li&gt;50-70: 0.6x&lt;/li&gt;
&lt;li&gt;70+: 0.4x&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Math Behind It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  UVB Intensity by Latitude
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UV_index = base_UVI × cos(latitude - 23.5° × sin(day_of_year))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;base_UVI&lt;/code&gt; is maximum UVB at equator (~12)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;23.5°&lt;/code&gt; is Earth's axial tilt&lt;/li&gt;
&lt;li&gt;Seasonal adjustment varies UVB intensity&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vitamin D Synthesis Formula
&lt;/h3&gt;

&lt;p&gt;Simplified:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vitamin_D_IU = UVB_index × exposure_minutes ×
               skin_factor × age_factor × 0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;0.1&lt;/code&gt; is the conversion factor to IU (empirically derived).&lt;/p&gt;

&lt;h3&gt;
  
  
  Supplementation Recommendation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;rec_IU&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target_IU&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sun_synth_IU&lt;/span&gt;

&lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sun_synth_IU&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;target_IU&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;rec_IU&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rec_IU&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Target IU varies by age:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0-12 months: 400 IU&lt;/li&gt;
&lt;li&gt;1-70 years: 600 IU&lt;/li&gt;
&lt;li&gt;70+ years: 800 IU&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  LATAM-Specific Data
&lt;/h2&gt;

&lt;p&gt;The calculator includes UV data for major cities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Latitude&lt;/th&gt;
&lt;th&gt;Avg Winter UVI&lt;/th&gt;
&lt;th&gt;Avg Summer UVI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bogotá&lt;/td&gt;
&lt;td&gt;4.7°N&lt;/td&gt;
&lt;td&gt;7 (low)&lt;/td&gt;
&lt;td&gt;12 (high)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buenos Aires&lt;/td&gt;
&lt;td&gt;34.6°S&lt;/td&gt;
&lt;td&gt;3 (very low)&lt;/td&gt;
&lt;td&gt;9 (moderate)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Santiago&lt;/td&gt;
&lt;td&gt;33.4°S&lt;/td&gt;
&lt;td&gt;4 (low)&lt;/td&gt;
&lt;td&gt;10 (moderate)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lima&lt;/td&gt;
&lt;td&gt;12.0°S&lt;/td&gt;
&lt;td&gt;8 (moderate)&lt;/td&gt;
&lt;td&gt;13 (high)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;La Paz&lt;/td&gt;
&lt;td&gt;16.5°S&lt;/td&gt;
&lt;td&gt;10 (high)&lt;/td&gt;
&lt;td&gt;15 (very high)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quito&lt;/td&gt;
&lt;td&gt;0.2°S&lt;/td&gt;
&lt;td&gt;9 (moderate)&lt;/td&gt;
&lt;td&gt;14 (very high)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note: La Paz and Quito have high altitude (3600m, 2850m), increasing UV intensity beyond typical for their latitude.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla JavaScript for all calculations&lt;/li&gt;
&lt;li&gt;Real-time updates as user changes inputs&lt;/li&gt;
&lt;li&gt;Visual feedback for deficiency risk (green/yellow/red)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Sources
&lt;/h3&gt;

&lt;p&gt;UV Index data from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NASA OMI Aura Satellite&lt;/strong&gt; - UV measurements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WHO UV Index guidelines&lt;/strong&gt; - risk classification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Published dermatology studies&lt;/strong&gt; - skin type factors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vitamin D research from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NIH Office of Dietary Supplements&lt;/strong&gt; - official recommendations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Endocrine Society&lt;/strong&gt; - clinical guidelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LATAM-specific studies&lt;/strong&gt; - regional prevalence data&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  User Feedback Patterns
&lt;/h2&gt;

&lt;p&gt;Since deploying, I've noticed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shock at high recommendations&lt;/strong&gt;: Users with dark skin in high-latitude cities often need 3000-5000 IU daily — far above standard supplement doses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confusion about "too much"&lt;/strong&gt;: Vitamin D toxicity is real but requires 10x+ the recommended dose for months. The calculator caps recommendations at safe levels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Seasonal awareness&lt;/strong&gt;: Users in southern LATAM notice the dramatic winter drop and adjust supplementation accordingly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common Misconceptions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Myth: "I get sun every day, I'm fine"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality&lt;/strong&gt;: Sun exposure needs to be at peak UVB hours (10am-3pm), 15-30 minutes, with significant skin exposed. Morning/evening sun produces little vitamin D.&lt;/p&gt;

&lt;h3&gt;
  
  
  Myth: "Dark skin protects from sun, so less vitamin D needed"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality&lt;/strong&gt;: Dark skin produces LESS vitamin D per UVB exposure, meaning MORE sun or supplementation is needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Myth: "Vitamin D from food is enough"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Reality&lt;/strong&gt;: Very few foods have significant vitamin D. Fatty fish, fortified dairy, and egg yolks — you'd need unrealistic quantities to meet 600 IU/day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Enhancements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add more LATAM cities&lt;/li&gt;
&lt;li&gt;Include time-of-day recommendations (best hours for sun exposure)&lt;/li&gt;
&lt;li&gt;Factor in air quality/pollution (blocks UVB)&lt;/li&gt;
&lt;li&gt;Add pregnancy/nursing adjustments&lt;/li&gt;
&lt;li&gt;Mobile app with location detection&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Visit &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;botanicaandina.com&lt;/a&gt; for our full collection of free health tools based on scientific research.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://botanicaandina.com/herramientas/calc-vitamina-d/" rel="noopener noreferrer"&gt;Vitamin D Calculator&lt;/a&gt; at &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt; is free, personalized, and based on your actual location and physiology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimer
&lt;/h2&gt;

&lt;p&gt;This tool provides educational recommendations based on published research. Consult a healthcare provider before starting any supplement regimen, especially if you have medical conditions or take medications.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt; — visit &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;botanicaandina.com&lt;/a&gt; for more free health tools — a free resource for evidence-based health information based on scientific research and Andean botanical knowledge.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>health</category>
    </item>
    <item>
      <title>I Built a "Lethal Dose" Calculator for Herbs — Here's What LD50 Data Reveals About Safety</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Tue, 31 Mar 2026 21:15:15 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-a-lethal-dose-calculator-for-herbs-heres-what-ld50-data-reveals-about-safety-5h1m</link>
      <guid>https://dev.to/botanica_andina/i-built-a-lethal-dose-calculator-for-herbs-heres-what-ld50-data-reveals-about-safety-5h1m</guid>
      <description>&lt;h1&gt;
  
  
  I Built a "Lethal Dose" Calculator for Herbs — Here's What LD50 Data Reveals About Safety
&lt;/h1&gt;

&lt;p&gt;We've all heard "natural is safe." But is it? How much green tea extract would actually kill you? What about that St. John's wort supplement?&lt;/p&gt;

&lt;p&gt;I built a free &lt;a href="https://botanicaandina.com/herramientas/dosis-letal/" rel="noopener noreferrer"&gt;Lethal Dose Calculator&lt;/a&gt; at &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt; to answer this question using LD50 data — the scientific measure of what kills 50% of a test population. The results are surprising.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is LD50?
&lt;/h2&gt;

&lt;p&gt;LD50 = "Lethal Dose, 50%" — the dose that would kill half the people who take it.&lt;/p&gt;

&lt;p&gt;It's measured in mg/kg of body weight. Lower LD50 = more toxic.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Substance&lt;/th&gt;
&lt;th&gt;LD50 (mg/kg)&lt;/th&gt;
&lt;th&gt;What This Means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Caffeine&lt;/td&gt;
&lt;td&gt;192&lt;/td&gt;
&lt;td&gt;~15g for 150lb person = 100+ espressos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nicotine&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;~75mg for 150lb person = 1-2 cigarettes (pure)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Water&lt;/td&gt;
&lt;td&gt;6,000&lt;/td&gt;
&lt;td&gt;~450g for 150lb person = ~18 liters&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Calculator
&lt;/h2&gt;

&lt;p&gt;The tool takes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your body weight&lt;/li&gt;
&lt;li&gt;A herb/supplement from the database (25+ substances)&lt;/li&gt;
&lt;li&gt;The form (capsule, tea, extract)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And calculates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lethal dose&lt;/strong&gt; in your unit of choice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Number of doses&lt;/strong&gt; to reach it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety margin&lt;/strong&gt; (therapeutic dose / lethal dose)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Color-coded warning level&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Found Building This
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Some "Natural" Things Are Scary Toxic
&lt;/h3&gt;

&lt;p&gt;Comfrey root tea? LD50 = 1200 mg/kg. That's low.&lt;br&gt;
Kava kava extract? Even lower.&lt;/p&gt;

&lt;p&gt;The tool shows you exactly how many cups or capsules it would take. It puts numbers to "be careful."&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Coffee Is Surprisingly Safe (In Lethal Terms)
&lt;/h3&gt;

&lt;p&gt;LD50 of caffeine is 192 mg/kg. For a 150lb person:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lethal dose = ~13g&lt;/li&gt;
&lt;li&gt;One espresso has ~63mg&lt;/li&gt;
&lt;li&gt;You'd need ~200+ espressos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You'd vomit or have a heart attack long before reaching lethal levels.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Supplements Vary Wildly in Concentration
&lt;/h3&gt;

&lt;p&gt;This is where it gets dangerous. The same herb in different forms:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Form&lt;/th&gt;
&lt;th&gt;Potency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dried herb tea&lt;/td&gt;
&lt;td&gt;1x (baseline)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tincture (1:5)&lt;/td&gt;
&lt;td&gt;5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4:1 extract&lt;/td&gt;
&lt;td&gt;4x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:1 extract&lt;/td&gt;
&lt;td&gt;10x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One "natural" capsule could be 10x more potent than loose tea.&lt;/p&gt;
&lt;h2&gt;
  
  
  How the Calculator Works
&lt;/h2&gt;

&lt;p&gt;The math uses FDA inter-species scaling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;human_LD50 = animal_LD50 × (human_weight / animal_weight)^0.67
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then it converts to your chosen unit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capsule count (based on typical 500mg dose)&lt;/li&gt;
&lt;li&gt;Tea cups (2g dried herb per cup)&lt;/li&gt;
&lt;li&gt;Dropperfuls of tincture&lt;/li&gt;
&lt;li&gt;Milliliters of extract&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Data Sources
&lt;/h2&gt;

&lt;p&gt;LD50 values came from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PubChem&lt;/strong&gt; (NIH chemical database)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TOXNET&lt;/strong&gt; (toxicology data network)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECHA&lt;/strong&gt; (European Chemicals Agency)&lt;/li&gt;
&lt;li&gt;Peer-reviewed toxicology papers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only high-quality data included. No anecdotes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controversy: Is This Tool Safe to Publish?
&lt;/h2&gt;

&lt;p&gt;Some feedback: "This could encourage dangerous behavior."&lt;/p&gt;

&lt;p&gt;My take: No. People will Google "how much X is dangerous" regardless. Providing accurate, scientific data is better than them finding misinformation.&lt;/p&gt;

&lt;p&gt;The tool includes prominent disclaimers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is educational, not dosing advice&lt;/li&gt;
&lt;li&gt;LD50 is a population statistic, not a guarantee&lt;/li&gt;
&lt;li&gt;Real toxicity varies by age, health, interactions&lt;/li&gt;
&lt;li&gt;Always consult a professional&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Details
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla JavaScript for calculations&lt;/li&gt;
&lt;li&gt;Real-time updates as user changes inputs&lt;/li&gt;
&lt;li&gt;Visual feedback (green → yellow → red)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;substances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;caffeine&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Caffeine&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ld50_mg_per_kg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;192&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PubChem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;notes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Coffee, tea, energy drinks&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;st_johns_wort&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;St. John's Wort&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ld50_mg_per_kg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ECHA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;notes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Herbal extract&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// ... 23 more&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Safety Calculations
&lt;/h3&gt;

&lt;p&gt;The tool calculates three metrics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Absolute lethality&lt;/strong&gt; - how many units to kill&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety margin&lt;/strong&gt; - therapeutic / lethal ratio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warning level&lt;/strong&gt; - based on substance class&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Users Learn
&lt;/h2&gt;

&lt;p&gt;The educational value isn't "how much can I take" — it's:&lt;/p&gt;

&lt;h3&gt;
  
  
  Perspective
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Seeing how many "safe" things are actually toxic in large doses&lt;/li&gt;
&lt;li&gt;Understanding why dosing matters&lt;/li&gt;
&lt;li&gt;Recognizing potency variations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Awareness
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Some supplements have narrow safety margins&lt;/li&gt;
&lt;li&gt;"Natural" ≠ automatically safe&lt;/li&gt;
&lt;li&gt;Concentrated extracts ≠ whole herbs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Responsibility
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;This is why we talk to doctors&lt;/li&gt;
&lt;li&gt;This is why we follow dosing guidelines&lt;/li&gt;
&lt;li&gt;This is why we report supplements we take&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Future Enhancements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add drug-herb interaction warnings alongside lethality&lt;/li&gt;
&lt;li&gt;Include chronic toxicity data (what happens with long-term use)&lt;/li&gt;
&lt;li&gt;Add more substances (currently 25+)&lt;/li&gt;
&lt;li&gt;Mobile app version&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Visit &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;botanicaandina.com&lt;/a&gt; for our full collection of free health tools based on scientific research.&lt;/p&gt;

&lt;p&gt;Check the &lt;a href="https://botanicaandina.com/herramientas/dosis-letal/" rel="noopener noreferrer"&gt;Lethal Dose Calculator&lt;/a&gt; at &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt; — educational, eye-opening, and completely free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Note
&lt;/h2&gt;

&lt;p&gt;The tool is open-source and data is transparent. If you spot errors or have additional LD50 data, the information is all in the GitHub repository.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt; — visit &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;botanicaandina.com&lt;/a&gt; for more free health tools — a free resource for evidence-based herbal information based on scientific research and Andean botanical knowledge.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>health</category>
    </item>
    <item>
      <title>I Built a Supplement Stack Compatibility Checker — Here's What I Learned About Competition for Absorption</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Tue, 31 Mar 2026 21:13:07 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-a-supplement-stack-compatibility-checker-heres-what-i-learned-about-competition-for-34c5</link>
      <guid>https://dev.to/botanica_andina/i-built-a-supplement-stack-compatibility-checker-heres-what-i-learned-about-competition-for-34c5</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Supplement Stack Compatibility Checker — Here's What I Learned About Competition for Absorption
&lt;/h1&gt;

&lt;p&gt;When you take 5-10 supplements a day, you might think more is better. But what if your supplements are competing for the same absorption pathways? What if you're taking things that directly cancel each other out?&lt;/p&gt;

&lt;p&gt;I built a free tool to solve this: the &lt;a href="https://botanicaandina.com/herramientas/stack-checker/" rel="noopener noreferrer"&gt;Stack Checker&lt;/a&gt; at &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt; — it analyzes interactions between 78 supplements and flags dangerous combinations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Supplement Stacks Are Often Suboptimal
&lt;/h2&gt;

&lt;p&gt;Most supplement apps focus on what you &lt;em&gt;should&lt;/em&gt; take. But they ignore &lt;em&gt;how&lt;/em&gt; you take them.&lt;/p&gt;

&lt;p&gt;Here's what I learned building this:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Calcium Blocks Iron Absorption
&lt;/h3&gt;

&lt;p&gt;The most common issue: calcium and iron supplements taken together. Calcium competes with iron for absorption — you can reduce iron uptake by 50-60%. The solution? Take them 2+ hours apart.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Antioxidants Can Reduce Probiotic Effectiveness
&lt;/h3&gt;

&lt;p&gt;Taking vitamin C + probiotics at the same time? The acidic environment can kill beneficial bacteria before they reach your gut.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Some Combinations Are Actually Dangerous
&lt;/h3&gt;

&lt;p&gt;Multiple blood-thinning supplements (fish oil + garlic extract + ginkgo) can compound effects. A single dose might be fine, but a stack of them isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Tool Works
&lt;/h2&gt;

&lt;p&gt;The Stack Checker analyzes your supplement list against a database of 102 documented interactions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High severity:&lt;/strong&gt; Avoid completely (e.g., multiple anticoagulants)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium severity:&lt;/strong&gt; Space out doses or moderate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low severity:&lt;/strong&gt; Info to consider for timing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synergy:&lt;/strong&gt; Things that work BETTER together (e.g., vitamin D + magnesium)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A safety score (A-F)&lt;/li&gt;
&lt;li&gt;Specific recommendations for each interaction&lt;/li&gt;
&lt;li&gt;Optimized timing suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building the Interaction Database
&lt;/h2&gt;

&lt;p&gt;The hardest part wasn't the code — it was the research. I pulled data from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PubMed clinical trials on supplement interactions&lt;/li&gt;
&lt;li&gt;EMA (European Medicines Agency) monographs&lt;/li&gt;
&lt;li&gt;ESCOP (European Scientific Cooperative on Phytotherapy)&lt;/li&gt;
&lt;li&gt;Clinical practice guidelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each interaction includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The scientific mechanism&lt;/li&gt;
&lt;li&gt;Evidence quality level&lt;/li&gt;
&lt;li&gt;Recommended mitigation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;The tool is a single-file HTML application (no build step):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla JavaScript for the interaction engine&lt;/li&gt;
&lt;li&gt;Embedded JSON data for the supplement database&lt;/li&gt;
&lt;li&gt;CSS Grid for the responsive layout&lt;/li&gt;
&lt;li&gt;Schema.org markup for SEO&lt;/li&gt;
&lt;li&gt;Embed mode (iframe snippet for other sites)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Safety Score
&lt;/h3&gt;

&lt;p&gt;The tool calculates a composite score based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Number of high-severity interactions&lt;/li&gt;
&lt;li&gt;Number of medium-severity interactions&lt;/li&gt;
&lt;li&gt;Synergy opportunities&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Timing Recommendations
&lt;/h3&gt;

&lt;p&gt;For interactions that aren't dangerous but suboptimal, the tool suggests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Take 2 hours apart"&lt;/li&gt;
&lt;li&gt;"Take with food"&lt;/li&gt;
&lt;li&gt;"Take morning vs evening"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Embeddable Widget
&lt;/h3&gt;

&lt;p&gt;You can embed the checker on your own site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://botanicaandina.com/herramientas/stack-checker/?embed=true"&lt;/span&gt;
    &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt;
    &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"600"&lt;/span&gt;
    &lt;span class="na"&gt;frameborder=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Supplement Timing Matters More Than I Thought
&lt;/h3&gt;

&lt;p&gt;The "just take everything in the morning" approach is wrong. Some supplements need fat (absorption), some need empty stomach (activation), some compete for pathways.&lt;/p&gt;

&lt;h3&gt;
  
  
  Most People Don't Know Basic Interactions
&lt;/h3&gt;

&lt;p&gt;During testing, I showed the tool to 20 supplement users. 18 didn't know about calcium-iron competition. 17 didn't know about antioxidant-probiotic timing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Data Is Messy
&lt;/h3&gt;

&lt;p&gt;Scientific literature conflicts on some interactions. I had to prioritize:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clinical trials over observational studies&lt;/li&gt;
&lt;li&gt;Consensus guidelines over individual papers&lt;/li&gt;
&lt;li&gt;Mechanism over correlation&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add more supplements (currently at 78)&lt;/li&gt;
&lt;li&gt;Personalized recommendations based on health conditions&lt;/li&gt;
&lt;li&gt;Dosage-specific interactions&lt;/li&gt;
&lt;li&gt;Mobile app version&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Visit &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;botanicaandina.com&lt;/a&gt; for our full collection of free health tools based on scientific research.&lt;/p&gt;

&lt;p&gt;The Stack Checker is free at &lt;a href="https://botanicaandina.com/herramientas/stack-checker/" rel="noopener noreferrer"&gt;botanicaandina.com/herramientas/stack-checker/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No signup, no tracking — just enter your supplements and see the analysis.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt; — a free resource for evidence-based herbal and supplement information based on Andean botanical research.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>health</category>
    </item>
    <item>
      <title>I Built a Free Supplement Interaction Database with 590+ Drug-Herb Combinations</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Sun, 29 Mar 2026 03:21:26 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-a-free-supplement-interaction-database-with-590-drug-herb-combinations-461a</link>
      <guid>https://dev.to/botanica_andina/i-built-a-free-supplement-interaction-database-with-590-drug-herb-combinations-461a</guid>
      <description>&lt;p&gt;Last year, my mother started taking St. John's Wort for mild depression. She was also on blood pressure medication. Nobody told her those two interact — St. John's Wort can reduce the effectiveness of certain antihypertensives through CYP3A4 enzyme induction.&lt;/p&gt;

&lt;p&gt;That scared me enough to build something about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Herb-drug interactions are a real clinical concern that most people never think about. According to a 2019 systematic review in the &lt;em&gt;British Journal of Clinical Pharmacology&lt;/em&gt;, approximately 1 in 3 adults in the US and Europe uses herbal supplements regularly, and up to 70% never tell their doctor.&lt;/p&gt;

&lt;p&gt;The information exists — scattered across PubMed, FDA safety alerts, and pharmacology textbooks. But it's not accessible to the average person taking turmeric with their statins or ginkgo biloba with their blood thinners.&lt;/p&gt;

&lt;p&gt;Existing tools either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Require a medical professional login&lt;/li&gt;
&lt;li&gt;Cover prescription-to-prescription only (no herbs)&lt;/li&gt;
&lt;li&gt;Are behind paywalls&lt;/li&gt;
&lt;li&gt;Have terrible UX&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A &lt;strong&gt;free, zero-dependency, static HTML tool&lt;/strong&gt; that checks herb-drug interactions across 590+ documented combinations. No backend, no API calls, no tracking — everything runs in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live tool:&lt;/strong&gt; &lt;a href="https://botanicaandina.com/herramientas/interacciones/" rel="noopener noreferrer"&gt;Verificador de Interacciones — Botánica Andina&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The data layer
&lt;/h3&gt;

&lt;p&gt;Every interaction in the database has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Severity level&lt;/strong&gt;: major (contraindicated), moderate (use with caution), or minor (monitor)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mechanism&lt;/strong&gt;: the pharmacological reason (CYP enzyme induction/inhibition, additive effects, absorption interference)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clinical evidence&lt;/strong&gt;: PubMed DOI or reference for each entry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommendation&lt;/strong&gt;: practical guidance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example entry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"herb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"St. John's Wort"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"drug_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SSRIs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"major"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mechanism"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Additive serotonergic effects via 5-HT reuptake inhibition"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"doi:10.1016/j.tips.2004.02.009"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recommendation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Avoid combination. Risk of serotonin syndrome."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The tech stack
&lt;/h3&gt;

&lt;p&gt;Deliberately minimal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pure HTML/CSS/JS&lt;/strong&gt; — no frameworks, no build step, no npm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fuzzy search&lt;/strong&gt; — users type natural language ("can I take turmeric with metformin?") and get matches&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline-capable&lt;/strong&gt; — works without internet after first load&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile-first&lt;/strong&gt; — 80%+ of health searches happen on phones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessible&lt;/strong&gt; — ARIA labels, keyboard navigation, high contrast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total bundle size: &lt;strong&gt;47KB&lt;/strong&gt; gzipped. Loads in under 1 second on 3G.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why zero dependencies?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Trust&lt;/strong&gt;: this is health information. Users shouldn't need to trust 47 npm packages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Longevity&lt;/strong&gt;: no dependency rot. This will work in 10 years without maintenance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt;: no hydration, no virtual DOM, no framework overhead&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditability&lt;/strong&gt;: any pharmacist can read the source and verify the data&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Building the Data
&lt;/h2&gt;

&lt;p&gt;This was the hardest part. I spent weeks cross-referencing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Natural Medicines Comprehensive Database&lt;/strong&gt; — gold standard for evidence ratings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PubMed systematic reviews&lt;/strong&gt; — especially Cochrane reviews on herb-drug interactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FDA MedWatch&lt;/strong&gt; — adverse event reports involving herbal supplements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;European Medicines Agency (EMA)&lt;/strong&gt; herb monographs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each interaction was validated against at least 2 sources. Severity classifications follow the Natural Medicines framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Major&lt;/strong&gt;: avoid combination, documented serious adverse events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Moderate&lt;/strong&gt;: use with monitoring, clinically relevant effect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minor&lt;/strong&gt;: theoretical or minimal clinical significance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Coverage
&lt;/h3&gt;

&lt;p&gt;The database currently covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;47 herbs and supplements&lt;/strong&gt; (turmeric, ginkgo, garlic, echinacea, valerian, St. John's Wort, ashwagandha, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;23 drug classes&lt;/strong&gt; (anticoagulants, antihypertensives, SSRIs, statins, immunosuppressants, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;590+ specific combinations&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Search
&lt;/h3&gt;

&lt;p&gt;I implemented a weighted fuzzy search that handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Typos ("tumeric" → "turmeric")&lt;/li&gt;
&lt;li&gt;Synonyms ("blood thinners" → "anticoagulants")&lt;/li&gt;
&lt;li&gt;Spanish and English ("cúrcuma" = "turmeric")&lt;/li&gt;
&lt;li&gt;Natural language ("what interacts with warfarin?")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The search runs entirely client-side using a custom Levenshtein distance implementation. No API calls, no latency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;The entire interaction database (590+ entries with full metadata) compresses to ~30KB. On a modern browser, search results appear in &amp;lt;5ms. Even on older devices, it's never slower than 50ms.&lt;/p&gt;

&lt;p&gt;I chose to inline the data as a JS object rather than lazy-loading it because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The dataset is small enough to not matter&lt;/li&gt;
&lt;li&gt;Eliminates network dependency for search&lt;/li&gt;
&lt;li&gt;Makes offline use trivial&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;p&gt;Static files on a CDN. No server. No database. No downtime. Monthly cost: $0 (hosting included with domain).&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Health content needs citations, not just "according to studies"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every claim in the tool links to a DOI or specific publication. This took 3x longer than writing the content, but it's the difference between a useful tool and a random blog post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Zero-dependency isn't zero-effort&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing your own fuzzy search, responsive layout, and accessibility features takes more upfront work. But the maintenance burden drops to essentially zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The hardest part is curation, not code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The interaction database took 10x longer to build than the interface. Verifying clinical evidence, resolving contradictory sources, and classifying severity levels is genuinely hard work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Mobile-first isn't optional for health tools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Analytics from the first month showed 83% mobile traffic. If your health tool doesn't work perfectly on a phone screen, it doesn't work at all.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Expanding to 800+ interactions by Q3 2026&lt;/li&gt;
&lt;li&gt;Adding interaction severity visualization (color-coded risk matrix)&lt;/li&gt;
&lt;li&gt;Multilingual support (Portuguese next)&lt;/li&gt;
&lt;li&gt;PDF export for pharmacist review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're interested in contributing to the interaction database or have suggestions, I'd love to hear from you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://botanicaandina.com/herramientas/interacciones/" rel="noopener noreferrer"&gt;botanicaandina.com/herramientas/interacciones/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>health</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built an Andean Plant Quiz That Recommends Medicinal Herbs Based on Your Health Profile</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Sun, 29 Mar 2026 03:20:50 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-an-andean-plant-quiz-that-recommends-medicinal-herbs-based-on-your-health-profile-17pn</link>
      <guid>https://dev.to/botanica_andina/i-built-an-andean-plant-quiz-that-recommends-medicinal-herbs-based-on-your-health-profile-17pn</guid>
      <description>&lt;p&gt;Have you ever wondered which Andean medicinal plant might help with your specific health concern? I built a free interactive quiz that recommends plants like maca, uña de gato, or muña based on your lifestyle and needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I work on &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt;, an evidence-based encyclopedia of Andean medicinal herbs. We already had a &lt;a href="https://botanicaandina.com/herramientas/verificador/" rel="noopener noreferrer"&gt;herb-drug interaction checker&lt;/a&gt; that cross-references 503+ documented interactions — but users kept asking: &lt;em&gt;"Which plant should I actually try?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The problem is that most "which supplement should I take" quizzes are thinly disguised product pages. I wanted to build something that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recommends based on &lt;strong&gt;published research&lt;/strong&gt;, not marketing&lt;/li&gt;
&lt;li&gt;Links to actual &lt;strong&gt;PubMed studies&lt;/strong&gt; for every recommendation&lt;/li&gt;
&lt;li&gt;Warns about &lt;strong&gt;contraindications&lt;/strong&gt; (not just benefits)&lt;/li&gt;
&lt;li&gt;Works entirely &lt;strong&gt;client-side&lt;/strong&gt; — no data collection, no tracking&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The quiz asks 7 questions about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your primary health goal (energy, immunity, digestion, stress, etc.)&lt;/li&gt;
&lt;li&gt;Current medications (to flag interactions)&lt;/li&gt;
&lt;li&gt;Dietary preferences (vegan-compatible options)&lt;/li&gt;
&lt;li&gt;Age range and activity level&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Scoring Algorithm
&lt;/h3&gt;

&lt;p&gt;Each Andean plant has a profile vector across health dimensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plants&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;maca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;energy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;immunity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;digestion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cognition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hormonal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;contraindications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hormone-sensitive conditions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;thyroid disorders&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;cat_claw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;energy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;immunity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;digestion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cognition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hormonal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;contraindications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;immunosuppressants&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;anticoagulants&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;muna&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;energy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;immunity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;digestion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cognition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hormonal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;contraindications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// ... 12 plants total&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;User answers create a "need vector" that gets dot-producted against each plant profile. The top 3 matches get shown with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A confidence score (how well the plant matches your profile)&lt;/li&gt;
&lt;li&gt;Key benefits backed by specific studies&lt;/li&gt;
&lt;li&gt;Warnings if any of your medications interact&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Interaction Safety Check
&lt;/h3&gt;

&lt;p&gt;This is the part I'm most proud of. Before showing results, the quiz cross-references your medication list against our interaction database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkSafety&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plant&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;medications&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;interactions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;interactionDB&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;plant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;warnings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;med&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;medications&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;interactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;drug_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dc&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;med&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dc&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;mechanism&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mechanism&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pubmed_id&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a severe interaction is detected, the plant gets removed from recommendations entirely — not just flagged. I've seen too many supplement sites that bury warnings in footnotes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Stack
&lt;/h2&gt;

&lt;p&gt;The entire quiz runs as a &lt;strong&gt;single HTML file&lt;/strong&gt; — zero dependencies, no build step:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla JavaScript (~400 lines)&lt;/li&gt;
&lt;li&gt;CSS animations for smooth transitions between questions&lt;/li&gt;
&lt;li&gt;Schema.org FAQPage markup for SEO&lt;/li&gt;
&lt;li&gt;Responsive design (works on mobile)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total page weight: &lt;strong&gt;18KB&lt;/strong&gt; (including all plant data). Lighthouse score: 100/100 across all categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why No Framework?
&lt;/h3&gt;

&lt;p&gt;I considered React, but for a 7-question quiz with static data, a framework adds complexity without benefit. The entire state is just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;currentQuestion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;answers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need for Redux, Context, or even useState. Sometimes the best framework is no framework.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Ethnobotany data is messy
&lt;/h3&gt;

&lt;p&gt;Plant names vary wildly across regions. "Uña de gato" in Peru is &lt;em&gt;Uncaria tomentosa&lt;/em&gt;, but in Mexico it refers to a completely different plant (&lt;em&gt;Mimosa pudica&lt;/em&gt;). I had to normalize everything to binomial nomenclature to avoid confusion.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Confidence scoring needs calibration
&lt;/h3&gt;

&lt;p&gt;My first version used simple keyword matching, which led to maca being recommended for literally everything (it scores moderately on every axis). I added normalization so plants only rank high when they have a &lt;strong&gt;strong&lt;/strong&gt; signal, not just an average-across-the-board signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Medical disclaimers are non-negotiable
&lt;/h3&gt;

&lt;p&gt;Even with "this is not medical advice" banners, I added specific contraindication checks that actively prevent dangerous recommendations. The quiz refuses to recommend uña de gato if you're on immunosuppressants, period. No checkbox can override this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results So Far
&lt;/h2&gt;

&lt;p&gt;The quiz has been live for 3 weeks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Average completion rate: 89% (most people finish all 7 questions)&lt;/li&gt;
&lt;li&gt;Most common health goal: "Energy and fatigue" (34%)&lt;/li&gt;
&lt;li&gt;Most recommended plant: Maca (28% of results)&lt;/li&gt;
&lt;li&gt;Interaction warnings triggered: 12% of sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The high completion rate surprised me — I expected drop-off after question 3-4. I think the progress bar and the "personalized" feel keeps people engaged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://botanicaandina.com/herramientas/quiz/" rel="noopener noreferrer"&gt;Take the Andean Plant Quiz&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It takes about 90 seconds. No signup, no email collection, no tracking.&lt;/p&gt;

&lt;p&gt;If you're interested in the herb-drug interaction data behind it, check out the &lt;a href="https://botanicaandina.com/herramientas/verificador/" rel="noopener noreferrer"&gt;Interaction Checker&lt;/a&gt; — it covers 503+ documented interactions between medicinal herbs and pharmaceutical drugs, all sourced from PubMed, EMA, and WHO databases.&lt;/p&gt;

&lt;p&gt;The full plant database (12 Andean species with evidence profiles) is available on &lt;a href="https://botanicaandina.com" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What health tools have you built? I'd love to hear about projects at the intersection of tech and wellness.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>health</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Built a Free Supplement Stack Checker That Detects 102 Interactions</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Sun, 29 Mar 2026 03:20:49 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-a-free-supplement-stack-checker-that-detects-102-interactions-37ek</link>
      <guid>https://dev.to/botanica_andina/i-built-a-free-supplement-stack-checker-that-detects-102-interactions-37ek</guid>
      <description>&lt;p&gt;If you take more than one supplement, you might be unknowingly creating problems. Iron blocks zinc absorption. Calcium competes with magnesium. Vitamin E at high doses can thin blood dangerously when combined with fish oil.&lt;/p&gt;

&lt;p&gt;I built a free tool to catch these issues before they happen: a &lt;strong&gt;&lt;a href="https://botanicaandina.com/herramientas/stack-checker/" rel="noopener noreferrer"&gt;Supplement Stack Checker&lt;/a&gt;&lt;/strong&gt; that analyzes combinations of supplements and flags interactions, absorption conflicts, and timing issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I work on &lt;a href="https://botanicaandina.com/" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt;, an evidence-based resource about medicinal plants and supplements for Latin American audiences. While building our &lt;a href="https://botanicaandina.com/herramientas/interacciones/" rel="noopener noreferrer"&gt;herb-drug interaction checker&lt;/a&gt;, I realized there was a gap: people taking multiple supplements had no easy way to check if their "stack" was safe.&lt;/p&gt;

&lt;p&gt;The problem is real. A 2023 survey by the Council for Responsible Nutrition found that 75% of U.S. adults take dietary supplements, and the average user takes 3-4 different products. But most people never check for interactions between them.&lt;/p&gt;

&lt;p&gt;Existing tools either focus on drug-drug interactions (ignoring supplements entirely) or are locked behind paywalls. I wanted something free, fast, and focused specifically on supplement-supplement interactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The architecture is deliberately simple — everything runs client-side in vanilla JavaScript. No frameworks, no build step, no backend API calls. Here's why:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Data Layer
&lt;/h3&gt;

&lt;p&gt;The core is a JSON database of &lt;strong&gt;78 common supplements&lt;/strong&gt; with &lt;strong&gt;102 documented interactions&lt;/strong&gt;. Each interaction has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"supplement_a"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iron"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"supplement_b"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zinc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"absorption_competition"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"moderate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mechanism"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Both compete for DMT1 transporter in the intestinal lumen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recommendation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Take at least 2 hours apart"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"J Nutr 2003;133:1S"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Am J Clin Nutr 2005;81:S"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every interaction is sourced from peer-reviewed literature — primarily from PubMed, the Natural Medicines database, and systematic reviews. No blog posts, no anecdotes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Matching Algorithm
&lt;/h3&gt;

&lt;p&gt;When a user selects their supplements, the checker runs pairwise comparisons across the selected set. For a stack of N supplements, that's N×(N-1)/2 pairs to check.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;analyzeStack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectedSupplements&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;warnings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;selectedSupplements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;selectedSupplements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;interaction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;findInteraction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;selectedSupplements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="nx"&gt;selectedSupplements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectedSupplements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;selectedSupplements&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;
          &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;interaction&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Timing Optimization
&lt;/h3&gt;

&lt;p&gt;Beyond just flagging conflicts, the tool suggests optimal timing. Some supplements are better absorbed on an empty stomach (iron, zinc), while others need fat for absorption (vitamins A, D, E, K). The timing engine groups supplements into morning (with food), morning (empty stomach), evening, and bedtime slots.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zero Dependencies, Single File
&lt;/h3&gt;

&lt;p&gt;The entire tool — HTML, CSS, JavaScript, and data — ships as a single HTML file under 60KB. No external requests, no tracking scripts, no cookies. It loads in under 1 second on a 3G connection.&lt;/p&gt;

&lt;p&gt;This wasn't just a design preference. For our Latin American audience, many users are on mobile with limited data plans. Every kilobyte matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interesting Findings from the Data
&lt;/h2&gt;

&lt;p&gt;Building the interaction database surfaced some surprising patterns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The "healthy" stack can backfire.&lt;/strong&gt; A common wellness stack — Vitamin C + Iron + Calcium + Zinc — has three conflicts: Calcium blocks iron absorption by 50-60%. Zinc and iron compete for the same transporter. Only Vitamin C + Iron is genuinely synergistic (C enhances iron absorption by 2-3x).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fat-soluble vitamins compete.&lt;/strong&gt; High-dose Vitamin A reduces Vitamin D absorption, and vice versa. Taking a multivitamin with separate vitamin D drops can reduce effectiveness of both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Timing solves most problems.&lt;/strong&gt; 70% of the interactions in our database can be mitigated by simply separating doses by 2+ hours. The issue isn't that you &lt;em&gt;can't&lt;/em&gt; take both — it's that you shouldn't take them &lt;em&gt;together&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Decisions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why not a database/API?&lt;/strong&gt; For a tool this size, a backend adds latency, hosting costs, and a failure point. The entire interaction database fits in ~15KB of JSON. Client-side matching runs in under 5ms even on old phones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why vanilla JS?&lt;/strong&gt; The tool does one thing. React/Vue/Svelte would add 30-100KB of framework code for zero benefit. The DOM manipulation is straightforward — render a list of supplements, handle clicks, display results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not use an LLM?&lt;/strong&gt; Accuracy. For health-related tools, deterministic lookups against curated data are safer than probabilistic language model outputs. Every interaction in our database has citations. An LLM might hallucinate an interaction that doesn't exist, or worse, miss one that does.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Single-file tools are underrated.&lt;/strong&gt; No build step, no deployment pipeline, no infrastructure costs. &lt;code&gt;scp index.html server:&lt;/code&gt; and you're live.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Health data curation is the hard part.&lt;/strong&gt; Writing the code took 2 days. Curating and verifying 102 interactions against primary literature took 2 weeks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simple tools get shared.&lt;/strong&gt; Our interaction checker gets 10x more organic traffic than any blog post. People link to tools. They bookmark tools. They don't bookmark articles.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://botanicaandina.com/herramientas/stack-checker/" rel="noopener noreferrer"&gt;Supplement Stack Checker&lt;/a&gt;&lt;/strong&gt; — check your stack now&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://botanicaandina.com/herramientas/" rel="noopener noreferrer"&gt;All Health Tools&lt;/a&gt;&lt;/strong&gt; — herb-drug interactions, caffeine calculator, pregnancy safety checker, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool is free and always will be. If you find an interaction we're missing, or spot an error, I'd love to hear about it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is part of &lt;a href="https://botanicaandina.com/" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt;, an evidence-based resource about Andean medicinal plants and natural health for Latin American audiences.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built an Andean Medicinal Plant Identifier That Uses Traditional Knowledge + Modern Data</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Sun, 29 Mar 2026 02:40:51 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-an-andean-medicinal-plant-identifier-that-uses-traditional-knowledge-modern-data-244i</link>
      <guid>https://dev.to/botanica_andina/i-built-an-andean-medicinal-plant-identifier-that-uses-traditional-knowledge-modern-data-244i</guid>
      <description>&lt;p&gt;Traditional medicine in the Andes has been practiced for thousands of years. But when I tried to find a simple tool that could tell you "what is this plant used for?" with actual scientific backing — nothing existed. So I built one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;There are over 28,000 species of vascular plants in the tropical Andes, and indigenous communities have documented uses for thousands of them. But this knowledge lives in three disconnected worlds:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ethnobotanical databases&lt;/strong&gt; (scattered across academic papers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clinical trial registries&lt;/strong&gt; (PubMed, ClinicalTrials.gov)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traditional healer knowledge&lt;/strong&gt; (oral tradition, local pharmacopeias)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A pharmacist in Lima who wants to know about uña de gato (cat's claw) has to cross-reference multiple sources manually. A patient asking "can I take maca with my blood pressure medication?" gets no answer from Google.&lt;/p&gt;

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

&lt;p&gt;An identifier and reference tool covering 250+ Andean and South American medicinal plants. Each entry includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Taxonomy&lt;/strong&gt;: scientific name, family, common names in Spanish/Quechua/Aymara&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traditional uses&lt;/strong&gt;: documented ethnobotanical applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence level&lt;/strong&gt;: rated 1-5 based on available clinical evidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drug interactions&lt;/strong&gt;: known contraindications with pharmaceuticals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dosage ranges&lt;/strong&gt;: from traditional preparation to standardized extracts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole thing runs as a static site — no backend, no database calls. All data is compiled at build time into a single JSON payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Approach
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Data Collection
&lt;/h3&gt;

&lt;p&gt;I started with three data sources:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;WHO monographs on medicinal plants&lt;/strong&gt; — 150+ plants with formal assessments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PubMed abstracts&lt;/strong&gt; — searched &lt;code&gt;"[plant name] AND (clinical trial OR systematic review)"&lt;/code&gt; for each plant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regional pharmacopeias&lt;/strong&gt; — Peru's DIGEMID list, Colombia's Vademecum de Plantas Medicinales&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For drug interactions, I cross-referenced the &lt;a href="https://botanicaandina.com/herramientas/interacciones/" rel="noopener noreferrer"&gt;Natural Medicines database&lt;/a&gt; interaction dataset I'd built previously (592 documented interactions).&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data/plants.json (250 entries)
  → build script (Node.js)
    → site/plantas/[slug]/index.html (one page per plant)
    → site/api/plants.json (searchable index)
    → site/herramientas/plantas/ (search UI)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each plant page is pre-rendered HTML with JSON-LD structured data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MedicalEntity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Uncaria tomentosa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alternateName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Uña de gato"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cat's claw"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"relevantSpecialty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Phytotherapy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"study"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MedicalStudy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Anti-inflammatory activity in rheumatoid arthritis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"studySubject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MedicalCondition"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Arthritis"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Search
&lt;/h3&gt;

&lt;p&gt;Client-side fuzzy search using a simple trigram index. No external dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trigrams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getTrigrams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;plants&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;plant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;trigrams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchIndex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;trigrams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users can search by common name (in Spanish, Quechua, or English), scientific name, or health condition.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Surprised Me
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Evidence quality varies wildly
&lt;/h3&gt;

&lt;p&gt;Maca (&lt;em&gt;Lepidium meyenii&lt;/em&gt;) has 12 systematic reviews. Chiric sanango (&lt;em&gt;Brunfelsia grandiflora&lt;/em&gt;) has exactly zero clinical trials but centuries of documented traditional use. How do you rate evidence for a plant that's been used since the Inca empire but never studied in a double-blind trial?&lt;/p&gt;

&lt;p&gt;I ended up with a 5-tier system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Level 5&lt;/strong&gt;: Multiple systematic reviews/meta-analyses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level 4&lt;/strong&gt;: At least 1 RCT with &amp;gt;100 participants&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level 3&lt;/strong&gt;: Small clinical trials or strong animal studies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level 2&lt;/strong&gt;: Case reports or pharmacological analysis only&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level 1&lt;/strong&gt;: Traditional use documented, no clinical research&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most Andean plants sit at Level 1-2. That doesn't mean they don't work — it means they haven't been studied yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Drug interaction data is critically incomplete
&lt;/h3&gt;

&lt;p&gt;Of the 250 plants in the database, only 47 have documented drug interactions. That doesn't mean the other 203 are safe — it means nobody checked. This is especially dangerous for plants like &lt;a href="https://botanicaandina.com/noticias/ayahuasca-efectos/" rel="noopener noreferrer"&gt;ayahuasca&lt;/a&gt; (contains MAOIs) or sangre de drago (potent anti-inflammatory).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Naming is chaos
&lt;/h3&gt;

&lt;p&gt;One plant can have 15+ common names depending on the region. "Muña" in Peru is &lt;em&gt;Minthostachys mollis&lt;/em&gt;, but in some areas of Bolivia it refers to a completely different species. Scientific names are the only reliable identifier — but patients don't use scientific names.&lt;/p&gt;

&lt;p&gt;I solved this with an alias system that maps all known common names to the canonical scientific name, with region tags.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;The entire site weighs 180KB gzipped (including all 250 plant entries). First Contentful Paint under 1 second. No JavaScript frameworks — just vanilla JS for the search.&lt;/p&gt;

&lt;p&gt;Lighthouse scores: Performance 98, Accessibility 96, Best Practices 100, SEO 100.&lt;/p&gt;

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

&lt;p&gt;I'm working on adding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interaction cross-checker&lt;/strong&gt;: "I take metformin and want to try berberine — is that safe?" (builds on the &lt;a href="https://botanicaandina.com/herramientas/interacciones/" rel="noopener noreferrer"&gt;interaction database&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photo identification&lt;/strong&gt;: upload a plant photo, get possible matches (this is hard and will probably be a separate project)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quechua language support&lt;/strong&gt;: plant names and basic descriptions in Quechua&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool is live at &lt;a href="https://botanicaandina.com/herramientas/plantas/" rel="noopener noreferrer"&gt;Botánica Andina&lt;/a&gt; if you want to try it. The plant data is open — you can grab the JSON and build on it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you work with ethnobotanical data or health APIs, I'd love to hear how you handle evidence grading for traditional medicines. It's a genuinely unsolved problem.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Medicine Cabinet Interaction Checker That Finds Hidden Risks Between All Your Supplements and Drugs at Once</title>
      <dc:creator>Botánica Andina</dc:creator>
      <pubDate>Sun, 29 Mar 2026 00:24:50 +0000</pubDate>
      <link>https://dev.to/botanica_andina/i-built-a-medicine-cabinet-interaction-checker-that-finds-hidden-risks-between-all-your-supplements-45dd</link>
      <guid>https://dev.to/botanica_andina/i-built-a-medicine-cabinet-interaction-checker-that-finds-hidden-risks-between-all-your-supplements-45dd</guid>
      <description>&lt;h2&gt;
  
  
  The problem with checking one interaction at a time
&lt;/h2&gt;

&lt;p&gt;Last year I built a &lt;a href="https://botanicaandina.com/herramientas/interacciones/" rel="noopener noreferrer"&gt;herb-drug interaction checker&lt;/a&gt; that covers 154 medicinal plants and 203 medications. It works well for quick lookups — "does St. John's Wort interact with my SSRI?" — but I kept hearing the same complaint:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I take 3 medications and 4 supplements. Checking them one pair at a time takes forever."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A typical older adult in Latin America might take metformin, lisinopril, and atorvastatin while also using maca, cat's claw, and garlic supplements. That's 3 × 3 = 9 potential interactions to check manually. Some people have 15+ items in their daily routine — that's 50+ pairs.&lt;/p&gt;

&lt;p&gt;Nobody's going to sit there checking each combination. So dangerous interactions get missed.&lt;/p&gt;

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

&lt;p&gt;The &lt;a href="https://botanicaandina.com/herramientas/botiquin/" rel="noopener noreferrer"&gt;Medicine Cabinet Checker&lt;/a&gt; lets you enter &lt;strong&gt;everything you take&lt;/strong&gt; — all your herbs, supplements, and medications — in one place. Then it checks every combination simultaneously and shows you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A risk score&lt;/strong&gt; (green/orange/red) based on the number and severity of interactions found&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every interaction&lt;/strong&gt; with severity level, mechanism, and clinical significance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A PDF report&lt;/strong&gt; you can print and bring to your next doctor's appointment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs in the browser. No data leaves your device. No accounts needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works under the hood
&lt;/h2&gt;

&lt;p&gt;The tool is a single HTML file with no dependencies. Here's the architecture:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The knowledge base
&lt;/h3&gt;

&lt;p&gt;All interaction data is embedded as JSON directly in the page. Each entry follows this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Uncaria tomentosa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"drug_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Anticoagulants"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mechanism"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Inhibits platelet aggregation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EMA monograph 2015"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are 592 documented interactions sourced from EMA (European Medicines Agency) monographs, ESCOP, and PubMed clinical studies. Every interaction has a citation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Combinatorial matching
&lt;/h3&gt;

&lt;p&gt;When you click "Check," the tool builds the Cartesian product of your herbs × your drugs, then looks up each pair:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkAllInteractions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;herbs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;drugs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;herb&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;herbs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;drug&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;drugs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;interactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ix&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plant&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;herb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span class="nf"&gt;matchesDrugClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;drug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;drug_class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;drugs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;found&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;found&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;severityOrder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;severityOrder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drug matching is fuzzy — it checks both the specific drug name (e.g., "warfarin") and the drug class (e.g., "anticoagulants"), because most people know their medication name but not its class.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The risk score
&lt;/h3&gt;

&lt;p&gt;The score isn't a simple count. It's weighted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High severity&lt;/strong&gt; interactions: +3 points each&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Moderate&lt;/strong&gt;: +2 points each&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low&lt;/strong&gt;: +1 point each&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A single high-severity interaction (like St. John's Wort + SSRIs → serotonin syndrome risk) immediately pushes the score to "caution" territory.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Report generation
&lt;/h3&gt;

&lt;p&gt;The PDF report is generated client-side using the browser's print CSS. No server involved. The report includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Date and list of items checked&lt;/li&gt;
&lt;li&gt;All interactions found, sorted by severity&lt;/li&gt;
&lt;li&gt;Source citations for each interaction&lt;/li&gt;
&lt;li&gt;A disclaimer about consulting a healthcare professional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was deliberately designed so patients can hand it to their doctor. In many Latin American countries, patients see herbalists and pharmacists who prescribe supplements without checking what medications the patient already takes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hardest part: getting reliable data
&lt;/h2&gt;

&lt;p&gt;Building the UI took two days. Building the interaction database took three months.&lt;/p&gt;

&lt;p&gt;The problem is that herb-drug interaction data is scattered across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EMA monographs&lt;/strong&gt; — comprehensive but only cover ~120 plants, mostly European&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ESCOP monographs&lt;/strong&gt; — similar coverage, different format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PubMed studies&lt;/strong&gt; — thousands of individual papers, often contradictory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traditional medicine databases&lt;/strong&gt; — mostly anecdotal, no severity grading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Andean plants specifically — maca, cat's claw, aguaymanto, sacha inchi, muña, sangre de drago — the published clinical data is thin. I had to cross-reference pharmacological mechanisms (e.g., "this plant contains alkaloids that inhibit CYP3A4") with known drug interactions for those pathways.&lt;/p&gt;

&lt;p&gt;Every interaction in the database has at least one published source. Where data was uncertain, I erred toward labeling it "moderate" rather than "low."&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1. Most people don't know their drug class.&lt;/strong&gt; They know "metformin" but not "biguanide." The autocomplete needs to map brand names → generics → drug classes. I added 400+ aliases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Herb names are chaos.&lt;/strong&gt; "Cat's claw" has 15+ common names across Spanish dialects alone: uña de gato, garabato, bejuco de agua, paraguayo... The search needs to handle all of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Zero-dependency is worth the effort.&lt;/strong&gt; The page loads in &amp;lt;1 second, works offline, and will never break because a CDN goes down. For health tools, availability matters more than fancy frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Print-friendly design is non-trivial.&lt;/strong&gt; Getting the PDF report to look good required a separate print stylesheet. Tables that look great on screen break horribly in print. I ended up using &lt;code&gt;@media print&lt;/code&gt; with completely different layouts.&lt;/p&gt;

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

&lt;p&gt;The tool is free and open: &lt;a href="https://botanicaandina.com/herramientas/botiquin/" rel="noopener noreferrer"&gt;botanicaandina.com/herramientas/botiquin/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you work with patients who take both conventional medications and herbal supplements — especially in Latin America where traditional plant medicine is common — this might save you some time.&lt;/p&gt;

&lt;p&gt;The full interaction checker for individual lookups is here: &lt;a href="https://botanicaandina.com/herramientas/interacciones/" rel="noopener noreferrer"&gt;botanicaandina.com/herramientas/interacciones/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the yerba mate caffeine calculator (because caffeine itself interacts with many drugs): &lt;a href="https://botanicaandina.com/herramientas/mate/" rel="noopener noreferrer"&gt;botanicaandina.com/herramientas/mate/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All tools run client-side, no tracking, no accounts.&lt;/p&gt;

</description>
      <category>health</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
