A modern EMR platform designed for the way veterinary teams actually work — fast, clear, and built around the patient.
From patient profiles to shift-based medication administration, PetChanceEMR centralizes every part of clinical workflow into a single connected platform.
A complete picture of the patient at a glance — species, breed, weight, and owner details unified in a single view so care can start immediately.
Drill into any patient and see everything that matters — medications, diagnoses, emergency events, and physical findings tracked on a visual body map.
A clean medication administration record organized by shift — surfaces what's due, what's given, and what was held, with the clarity nurses actually need at the bedside.
Log every medication as it's given — with full clinical detail captured at the moment of administration so the record is always current and complete.
A real-time shift view across every patient in your family — pending medication tasks, upcoming vet trips, and active patients organized by day or night shift so nothing gets missed.
Link pets to their households and invite caregivers to share access — with role-based permissions ensuring the right people see the right records.
PetChanceEMR isn't a tutorial project. It's a full-stack clinical application with real domain complexity — shift-aware scheduling logic, structured emergency data modeling, multi-tenant access control, and a shared contract between server and client that prevents an entire class of runtime bugs.
MedicationScheduleService runs entirely in the Blazor WebAssembly client with no server round-trip needed for the shift view. It resolves each medication's frequency against its prescription start date — BID every 12 hours, TID every 8 hours — to determine exactly which hours a dose is due. PRN medications are handled as a separate lane: surfaced in the MAR but never auto-scheduled, so clinicians make a conscious choice each time. The result feeds both the per-patient MAR page and the all-patient shift dashboard simultaneously.
Rather than splitting emergency records across a dozen tables, OhNoEvent is a single entity with 50+ nullable fields organized into type-specific groups — seizure duration and post-ictal state, bleeding location and estimated volume, GI symptom clusters, cardiac events, trauma, poisoning, and behavioral incidents. The Blazor UI reads the selected OhNoEventType enum value and renders only the relevant field groups, keeping the schema flat without a table-per-type explosion. New event types can be added with a migration and a UI block, nothing else.
There's no global pet endpoint. Every controller action extracts the requesting user's ID from their JWT claims and cross-references a FamilyMembership join table before touching any pet data. A user who isn't a member of a pet's family gets a 403 — not an empty list, a hard rejection. FamilyMembership also carries an Owner / Member role, so ownership semantics are enforced at the data layer rather than sprinkled across the UI. ASP.NET Identity backs the auth layer with int-keyed users and configurable JWT expiry.
The solution has three projects: EpicPetEMR.Api (ASP.NET Core), EpicPetEMR-Ui (Blazor WASM), and EpicPetEMR.Shared. The Shared project exports DTO types referenced by both sides — meaning the client and server are always in sync on field names and types. Mapper classes in the API handle domain-model ↔ DTO conversion and keep business logic out of serialization. EF Core migrations auto-apply on startup; SQLite runs in WAL mode for better concurrent read performance under load.
Built with
Hurricane, WV · Full-Stack Engineer · Former ICU RN
Chelsey Short is a full-stack software engineer and former ICU RN based in Hurricane, WV. After years at the bedside managing real patients on real MARs, she taught herself to code and built the EMR system she always wished had existed — combining clinical intuition with modern software engineering to make something that actually works the way care teams think.