Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,26 @@ Every endpoint ships with mapper unit tests **and** a contract test
(`schema.parse(toApiX(row))`) so internal changes can't silently break the
public contract.

## Good first issues

New here? These are scoped, self-contained, and well-tested — great first PRs.
Comment on the matching [issue](https://github.com/evangauer/openvpm/issues) (or
open one) to claim it.

- **Expand the drug dosing formulary** — add drugs with species-specific reference
ranges to `apps/web/lib/dosing/formulary.ts`. Data-only, fully unit-tested
(`apps/web/lib/dosing/__tests__/`). Keep ranges conservative and cite a source.
- **Drag-to-reschedule on the calendar** — the `appointments.reschedule` API
already exists with conflict checking; wire it into the schedule UI.
- **Appointment waitlist** — small schema + tRPC router + a list view.
- **CSV import UI** — a Settings → Data screen for the existing
`data.importClientsCsv` / `importPatientsCsv` procedures.
- **Embeddable booking widget** — an iframe/script version of the client-portal
booking flow (`apps/web/app/portal/[token]/book`).

Want to help but unsure where to start? Open a
[Discussion](https://github.com/evangauer/openvpm/discussions) and say hello.

## License

By contributing, you agree that your contributions will be licensed under the MIT License.
18 changes: 17 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
</p>

<p align="center">
<a href="https://demo.openvpm.com/login">Live Demo</a> &middot;
<a href="https://openvpm.com">Website</a> &middot;
<a href="https://openvpm.com/demo">Live Demo</a> &middot;
<a href="#features">Features</a> &middot;
<a href="#quick-start">Quick Start</a> &middot;
<a href="#api">API Docs</a> &middot;
Expand All @@ -20,11 +20,19 @@
<p align="center">
<a href="https://github.com/evangauer/openvpm/actions"><img src="https://github.com/evangauer/openvpm/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License" /></a>
<a href="CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" alt="PRs Welcome" /></a>
<a href="https://github.com/evangauer/openvpm/discussions"><img src="https://img.shields.io/badge/Discussions-join-blue.svg" alt="Discussions" /></a>
<a href="https://github.com/evangauer/openvpm/stargazers"><img src="https://img.shields.io/github/stars/evangauer/openvpm?style=social" alt="GitHub Stars" /></a>
</p>

---

<p align="center">
<strong>▶ <a href="https://demo.openvpm.com/login">Try the live demo</a></strong> — one-click logins, no signup. &nbsp;|&nbsp; If you believe veterinary software should be open, <strong><a href="https://github.com/evangauer/openvpm">give us a ⭐</a></strong> — it helps other clinics and builders find the project.
</p>

---

## The Problem

The veterinary PIMS market is broken — and everyone knows it.
Expand Down Expand Up @@ -301,6 +309,8 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, coding standards,

## Roadmap

See **[ROADMAP.md](ROADMAP.md)** for what's shipping now, next, and later — and how to influence it.

- [x] Patient & client management
- [x] Appointment scheduling with calendar views
- [x] Electronic medical records (SOAP, labs, vaccinations, prescriptions)
Expand All @@ -313,6 +323,12 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, coding standards,
- [x] Client portal
- [x] Open API with webhooks
- [x] AI integration points
- [x] Public REST API (`/api/v1`) with scoped API keys
- [x] OpenVPM Agent — operate the practice via natural language over the API
- [x] Drug dosing calculator, vital signs, treatment plans
- [x] Wellness plans / recurring billing
- [x] Self-service online booking (client portal)
- [x] CSV import for migrating clients & patients
- [ ] Online booking widget (embeddable)
- [ ] FHIR-inspired veterinary data standard
- [ ] Multi-language support
Expand Down
40 changes: 40 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# OpenVPM Roadmap

OpenVPM is building the modern, open, API-first foundation for veterinary software — the system AI agents and integrators can actually build on, and that clinics fully own.

This roadmap is a living document. The fastest way to influence it: [open an issue](https://github.com/evangauer/openvpm/issues), [start a discussion](https://github.com/evangauer/openvpm/discussions), or 👍 the ones that matter to you. ⭐ the repo to follow along.

## ✅ Shipped

- Core PIMS: patients, clients, scheduling, medical records (SOAP, labs, vaccinations, prescriptions), billing & invoicing, inventory, controlled substances, reporting, client portal, real-time whiteboard
- **Public REST API** (`/api/v1`) with scoped, per-practice API keys
- **OpenVPM Agent** — a typed tool layer + Claude tool-use runner; operate the practice in natural language, in-app or over `POST /api/v1/agent`
- **Scheduling engine** — strict conflict detection (doctor *and* room), reschedule, open-slot availability
- **Clinical depth** — weight-based drug dosing calculator, vital signs, treatment plans linked to the problem list
- **Wellness plans / recurring billing**
- **Self-service online booking** via the client portal
- **CSV import** for migrating clients & patients (pairs with full JSON export)

## 🔜 Next (no external dependencies — community PRs very welcome)

- Staff calendar UX: drag-to-reschedule on the live calendar (the API already supports it)
- Appointment waitlist
- Reminder scheduling (queue + due-list; delivery pluggable)
- Deeper agent tools and an audit trail for agent actions
- Embeddable online-booking widget for clinic websites

## 🌅 Later (needs integrations or larger design)

- Payments (Stripe) — online invoice payment + wellness-plan charge capture
- SMS / email delivery (Twilio / Resend) for reminders and two-way client comms
- Lab integrations (IDEXX, Antech, Zoetis) — order + auto-result matching
- **PIMS-compatibility connectors** — mirror an incumbent's public API so existing integrations work against OpenVPM, and so a clinic can keep a live, owned copy of their data
- Imaging / DICOM, multi-location, FHIR-inspired veterinary data standard, mobile companion app

## How we prioritize

1. Does it help a real clinic do real work faster? (reduce staff hours)
2. Does it strengthen the open API / agent platform others build on?
3. Can the community own a piece of it? (we label [`good first issue`](https://github.com/evangauer/openvpm/labels/good%20first%20issue))

If something you need isn't here, tell us — that's how it gets prioritized.
9 changes: 3 additions & 6 deletions apps/web/middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,9 @@ export async function middleware(request: NextRequest) {
secret: process.env.NEXTAUTH_SECRET,
});

// Unauthenticated visitors at root get redirected to the marketing site
if (!token && request.nextUrl.pathname === "/") {
const wwwUrl = process.env.NEXT_PUBLIC_WWW_URL || "https://openvpm.com";
return NextResponse.redirect(wwwUrl);
}

// Unauthenticated visitors go to the demo login, which offers one-click
// demo access. (Previously the root path bounced to the marketing site,
// which dead-ended anyone who came straight to demo.openvpm.com to try it.)
if (!token) {
const loginUrl = new URL("/login", request.url);
return NextResponse.redirect(loginUrl);
Expand Down
12 changes: 12 additions & 0 deletions apps/www/app/demo/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { NextResponse } from "next/server";

// Some links (and the old README) point at openvpm.com/demo. Send them to the
// real demo login instead of 404ing. Kept as a redirect so the canonical demo
// URL can change without breaking inbound links.
const DEMO_URL = process.env.NEXT_PUBLIC_APP_URL
? `${process.env.NEXT_PUBLIC_APP_URL}/login`
: "https://demo.openvpm.com/login";

export function GET() {
return NextResponse.redirect(DEMO_URL, 307);
}
Loading
Loading