What it is
Rounds is a prep tool for house-call veterinarians. It reads everything a practice already has on today's patients and tells the vet what they're walking into, and what to put in the van.
What inspired it
The event was sponsored by Vetr AI, who build software for mobile vets in Grand Rapids. I hadn't thought about mobile vets before. Once I did, the problem was obvious.
A vet in a clinic has everything in the building. A house-call vet has whatever they remembered to load that morning. No technician, no pharmacy down the hall. Forget one vial and that's a forty-minute round trip and a rescheduled patient.
Meanwhile the practice is sitting on years of dictated notes, lab panels, prescription records and text threads from owners. It's all captured. Nobody ever reads it back.
That's the whole idea. Not new data. Just reading what's already there before the van leaves.
How it works
Six patients, six stops. You press one button.
For each stop the agent starts with what the owner actually typed, forms a view about what's going on, then goes looking for evidence. It has six tools: the chart, past visit notes, lab results, dispensing history, the message thread, and what's stocked in the vehicle.
The best example is a 14-year-old cat named Tigger. His owner texted asking for "the same thing you gave him last time, that liquid." She never says what it was. So the agent checks the dispensing log and finds meloxicam, an anti-inflammatory cleared by the kidneys. That's the only reason it then pulls a lab panel from ten months ago that nobody ever interpreted, and works out the cat has stage 2 kidney disease. It also notices the meloxicam is physically on the truck, which is exactly how "sure, we brought it" happens. So it calculates a safe replacement for his weight instead.
Then it looks at the whole day, which no single brief can do. One patient is a ten-month-old dog with one shelter vaccine, vomiting blood. The agent called parvo and moved him to the last stop, so the vet doesn't carry it into four more homes on her shoes. Then it argued with itself: that leaves a critical patient waiting until half three, which isn't acceptable, so call the owner at eight and send him to a hospital instead.
Built with Python, FastAPI and Claude Opus 5. The frontend is one HTML file, mobile-first, because the person using this is standing in a driveway holding a phone.
What I learned
The hard part wasn't the agent. It was the data.
If a patient record says "caution: kidney disease," then the agent isn't reasoning, it's reading a label. So I wrote every record so that nothing states its own conclusion. The lab values sit inside their reference ranges, or one point outside. The owner never names a drug. The pharmacology appears nowhere in the files. I grep-tested each file against the conclusion it supports. If I could find the answer with a text search, I rewrote the record.
The second thing I learned is that restraint is a feature. My first version flagged something at every stop, including the healthy dog. That's useless. An assistant that finds a crisis every time is one you learn to ignore. Three of the six stops are deliberately unremarkable, and getting the agent to say "this one is fine" and stop talking took more prompt work than getting it to find the dangerous ones.
What went wrong
The API got slow mid-afternoon. A full six-patient run went from about a minute to over twenty, and one run hung completely. I lost the route reordering feature for a while and nearly shipped without it. Fix was a replay mode that streams a recorded run at a watchable pace, which turned out to be necessary anyway since nobody watches a twenty-minute demo.
The model also over-flagged the van manifest. It marked gowns, shoe covers and fluid bags as missing when they were clearly in the inventory file. I didn't fix that with a better prompt. I wrote a reconciliation pass that checks the flags against the inventory file and only clears false ones. It's in the repo as fix_manifest.py. The agent reasons well about medicine and badly about string-matching its own output against a stock list, and the honest fix for that is code.
Built With
- claude
- javascript
- maps
- python

Log in or sign up for Devpost to join the conversation.