Inspiration
A batch recalled in one country is often still on shelves in another. In October 2025 a contaminated cough syrup batch (Coldrif, batch SR-13) killed children in India, and pharmacies were asked to check their shelves by hand. In August 2026 Nigeria's NAFDAC relayed a recall that Pakistan's DRAP had issued four months earlier. A pharmacist has no fast way to ask: "Is this pack named in any alert?"
What it does
BatchWatch watches the recall and falsified-medicine alerts of 10 drug regulators (SFDA, WHO, FDA, MHRA, Health Canada, NAFDAC, DRAP, SAHPRA, Rwanda FDA, FDA Ghana) and reads each new alert into batch-level records.
- One pack: scan the GS1 DataMatrix on the box or type the batch. The answer is a plain verdict (Stop dispensing, Confirm product, Follow the notice, Review, No alert found) with the regulator's own words and a link to the notice.
- Stock list: upload a CSV or Excel export, including Arabic column names. Every affected line is listed with its evidence.
- Cross-border trace: an agent shows where else a batch was flagged.
- English and Arabic, with a full right-to-left interface.
BatchWatch never declares a medicine safe and never quarantines on its own. The pharmacist decides.
How we built it
Nemotron 3 Nano on Nebius Token Factory reads each alert into constrained JSON: products, strengths and batch numbers. Six rule-based checks verify the reading against the regulator's own text. If a check fails, Nemotron 3 Super reads the alert again. Matching is deterministic, with no AI and no cost. The trace agent runs on Nemotron 3 Super with Tavily search, and a finding counts as verified only if its quote and batch numbers appear on the page it read. The backend is Python and FastAPI, the frontend is plain HTML, CSS and JavaScript, and a GitHub Actions job asks each regulator what is new every 30 minutes.
Challenges we ran into
Real alerts are messy: lot numbers that look like dates, batch numbers as short as 008, Saudi registration numbers printed next to batch numbers, Arabic text mistaken for a batch, and alerts withdrawn as issued in error. A missed match means a recalled medicine gets dispensed. A false match quarantines a good one. Every check exists because an evaluation run caught a real failure.
Accomplishments that we're proud of
On 90 real alerts with 340 hand-labelled batch numbers, the checked pipeline found all 340, invented none, and got 90 of 90 alerts fully correct. That matches Nemotron 3 Ultra's accuracy at $0.076 against $0.590 for the 90 alerts. For 28 of the 90 alerts, a regulator in another country reported the same product, verified on the page.
What we learned
A small model is accurate enough when rules check its work against the source text, and it costs about an eighth of a large model. Cost limits and handling for an empty credit balance matter as much as accuracy.
What's next for BatchWatch
Add more regulators, and test the stock-list check with a real pharmacy.
Built With
- css
- docker
- fastapi
- github-actions
- html
- httpx
- javascript
- nebius-token-factory
- nvidia-nemotron
- openai-sdk
- openpyxl
- pytest
- python
- render
- tavily
- uvicorn
Log in or sign up for Devpost to join the conversation.