Inspiration

My grandparents take medicine every single day, and every month there's another pharmacy bill. I kept wondering whether we were paying more than we needed to. It turns out India sells the same molecule under hundreds of brand names: paracetamol 650 mg alone has 532 brands, pantoprazole 40 mg has 1,841, and their printed prices differ by up to 97%. Even the very same strip varies: on the day I tested, Dolo 650 cost ₹24 at one online pharmacy and ₹32 at another. Nobody at the counter tells you.

What it does

Scan a strip (or type a name) and SameSalt:

  1. reads the brand and salt printed on it with a vision model;
  2. finds every brand with the exact same composition (salt, strength, dosage form and release type) in an offline database of 246,068 Indian medicines;
  3. shows what the medicine and its same-salt twins cost today at Indian online pharmacies (1mg, PharmEasy, Apollo 24|7, Truemeds, Netmeds and more), compared per tablet, via SerpApi's Google Shopping API;
  4. checks every live listing against the composition database, so a look-alike like Doxoril (a different drug) is never shown as a substitute;
  5. finds the nearest Jan Aushadhi Kendras (the government's generic pharmacies) with distance, rating and directions, via SerpApi's Google Maps API;
  6. gives a pharmacist card that asks for the salt, not the brand, in English and Hindi.

For narrow-therapeutic-index drugs (thyroxine, warfarin, lithium…), where switching brands is risky, it refuses to suggest a substitute at all.

How I built it

  • Android app in React Native / Expo (TypeScript), with an Apple-style interface.
  • A Python pipeline turns a Kaggle dataset of 246,068 Indian medicines into an on-device SQLite database. Salt names are normalised and units standardised, and every medicine gets a canonical composition key (sorted salts + strength + dosage form + release type). Two brands match only if their keys are identical, so search works offline and instantly.
  • A Cloudflare Worker holds the API keys. It sends strip photos to Gemini 2.5 Flash (via OpenRouter) to read the brand and salt, and calls SerpApi's Google Shopping and Google Maps APIs. Results are cached in Workers KV (24 h for prices, 7 days for stores), and the last good result is shown, labelled with its age, if a live call fails.
  • Live listings are matched to brands by name stems, with a strength check, and prices are normalised per tablet by parsing pack sizes from listing titles ("Strip of 15", "15's").

Challenges I ran into

  • Strips print brands every way: "DOLO-650", "Dolo650", "DOLO-650 TABLETS IP". The first version missed these and fell back to the cheapest same-salt brand, which isn't the medicine you're holding. I rewrote the lookup to try spelling variants on an indexed prefix search and rank candidates by brand, strength and salt.
  • Shopping results are noisy: searching "Dolo 650" also returns Doxoril 650, a different drug. Every listing now has to match a brand that shares the exact composition key.
  • Prices are per pack and packs differ (10, 15, 30 tablets), so everything is compared per tablet.

Accomplishments I'm proud of

  • It works end to end from a single strip photo: the scan, 532 identical brands, live prices from 23 sellers, and the nearest Jan Aushadhi Kendra 400 m away.
  • The safety rule: SameSalt would rather show nothing than suggest a risky switch.

What I learned

How messy real medicine data is (salt spellings, units, pack sizes), and that the hard part of a price-comparison tool isn't fetching prices, it's being sure two products are actually the same.

What's next

An iPhone release, Hindi and Kannada interfaces for the people who need this most, and alerts when a cheaper identical brand comes into stock near you.

Built during ForgeHacks (Oct 3–10)

SameSalt started in September as an offline salt-matching app. During ForgeHacks I added the live layer and rebuilt the experience: today's pharmacy prices via SerpApi's Google Shopping API, with every listing verified against the composition database and compared per tablet; the Jan Aushadhi Kendra finder via SerpApi's Google Maps API; the Cloudflare Worker endpoints with KV caching and stale fallback; strip-scan resolution that handles printed brand styles like "DOLO-650"; and a full redesign. The October commits in the repo show this work.

Built With

Share this project:

Updates

Submission history