findbupe.org Updates (Fall '25)

Here’s what’s new in v2.0:
🌎 More Languages = More Access
Language shouldn’t be a gatekeeper to survival. Our new update smashed that barrier by adding 19 languages. Now, more people can access this platform, no matter how they speak.
How you can help
- If there are problems with translations, you can help improve them by updating the translation files on GitHub.
- Just compare any language file with the EN version. We spot checked the translations, but are sure there are some wonky spots...
- If you're not sure what that GitHub files mean but still want to help, reply to this email!
- If you don’t see a language that would help your community, let us know and we’ll work to add it!
We'll keep improving on this feature to make sure it meets everyone's needs.
💉 Long-Acting Injectable Bupe Formulation Added
We’ve added long-acting injectable buprenorphine (LAIB) to the formulation options. I was under the impression that most of LAIB shots were happening at clinics, not pharmacies. And while that is true today…we can change that! Some pharmacies can administer LAIBs like other shots (think vaccines, contraception, etc.). There's important work being done to get pharmacies on-board with LAIBs. To future-proof the platform and signal the importance of pharmacies filling + administering LAIB, we added it to the reporting forms and finding bupe pathways. Thank you for the feedback!
🎨 Responsive Collaborator Logos
We have our first collaboration: Wisconsin Opioid Overdose Response Center (WOORC) at the University of Wisconsin School of Pharmacy! The WOORC provided data from their pharmacy students and are promoting this tool in their community. We added some languages for them. If you use a Wisconsin ZIP code, you'll see their logo to recognize their significant contribution to our growing platform. Thank you WOORC and Elizabeth Salisbury-Afshar for the connection!
How you can help
We need data! While this is a crowdsource tool and anyone can enter data, we want to shift the burden off individuals reporting data and tap into larger datasets, especially to get started. If you have data or want to help collect it, reply to this email!
Check it out at findbupe.org
Find BupeOther Smaller Updates:
🤷 Explainer
To help people understand the tool, we created a page that walks you through how it works.
📜 Pagination for Long Lists
Easily navigate through long lists of pharmacies! This is part of future-proofing the platform, and will be very important as we add more data. Print view already capped things to avoid massive print jobs, but this should make the live website more user-friendly, especially on mobile.
🔒 Privacy-Preserving Analytics
We’ve implemented analytics that respect user privacy. Our goal is to understand how the platform is used without linking to an individual's use of the platform (thereby maintaining privacy). When certain buttons are selected (e.g., find bupe, report pharmacy), that click is recorded in our Airtable database. At the end of each month, the aggregate data will be added to the dashboard. This can help us prioritize where to grow and help us measure impact. Previously, we only had insight into half the website (reports filed) now we know, in aggregate, when someone clicks “Find Bupe”! We created a bespoke option to avoid using third-party tools that violate the privacy of people visiting websites.
What We Learned:
🐛 Bugs Created (Then Squashed!)
It's essential that we're transparent about improvements and issues. Like I mentioned in the intro, we had some time that the reporting pharmacies part of the website was broken this month. That's not great.
We are designing this to fill an important gap and serve as critical infrastructure until pharmacies routinely stock bupe (that might be awhile...) We recognize that there's a big responsibility that comes with building a platform like this. While not many people are using the website right now since it just launched, we don't want downtime as we roll it out more widely. If you experienced this issue, massive apologies.
So what happened?! Basically, we did two edits at once and didn't catch that one of them caused the form to break. I thought the changes would be quick and easy but…
- …when we added the new LAIB formulations to the backend Airtable database, it broke the “Report Pharmacies” form on the website.
- Basically, we added LAIB to the Airtable database first to facilitate testing local code changes related to the translation functionality. This way, we could make sure the translations were working before pushing that code to the live website.
- BUT, that meant the live website “Report Pharmacies” form options that send responses to the Airtable database was out of sync with the Airtable database form options.
- Said differently, the live website “Report Pharmacies” form did not have LAIB options, but the backend Airtable database did. Having options out of sync between the two creates errors and blocked pharmacy reporting.
- NB, We hardcoded the form instead of using a form tool like Fillout.com, Qualtrics, or Airtable forms because coding it provides more flexibility, aligns with our privacy principles, and helps keep down costs. If we used those tools, this wouldn't have happened because the front and backend are automatically synced because they are the same software. Tradeoffs!
- As a security measure, the Airtable database only accepts exact matches for form submissions from the live website form. This makes sense from a data integrity standpoint and to prevent shenanigans, but turns out this is a little fragile with edits. When there was discordance (live database had LAIB, live code did not, local code did) it wouldn't allow for submissions.
- and...I didn't realize that it broke the “Report Pharmacies” form because it was working locally! The local code had the correct website form. But I didn't push it to be live because...
- ...at the same time, I was working on the translations (bad idea to do it at the same time!)
- The translation tool was challenging to implement. Essentially, I created a tool that extracts and translates all the text tagged for translation. To make this work, I first had to manually tag all the text for translation after failing multiple times to get the tool to automatically find text for translation. That took awhile to set up, but is future-proof and aligned with privacy goals.
- Next, we have to translate all the text in a private and secure way. I took Latin through HS and college, so I know nothing. I set up a local LLM to handle this. That was working fine-ish for most of the text, but some parts were stinkers because of the HTML formatting (bold, italics, etc) and LLM limitations. Some languages just flat out didn't work across models, and some models provided “reasoning” instead of the translation. To get around this, I supplemented the LLMs with offline Google Translate APIs (this is not part of the live website, so Google does not get user data!)
- But the biggest pain was the form responses! You might already see why because of my other issue with form responses needing to be an exact match..the initial approach to translation was sending the translated form responses! That doesn't work. So I came up with a workaround that allows the forms to be translated and sync correctly with the backend Airtable database.
- Whew.

In the future, I don't anticipate functionality breaking changes like this. It is now easy-ish to add new languages and partner logos. I also learned about that database + codebase quirk. But with technology, there are always other ways we might experience growing pains. Thank you for growing with us and following along.
Your feedback drives our work. If you’ve used the tool, let us know what’s working and what’s not. Reply to this email to share your thoughts!
P.S. Know someone who could benefit from this tool? Share this newsletter or send them to findbupe.org today!
Check it out at findbupe.org
Find BupeWatch Our Demo
Opioid Policy Institute by Jonathan JK Stoltman, PhD is licensed under CC BY-NC-SA 4.0