The stack you'd choose if you could start from scratch.
OdonHub isn't a black box. It's documented for the people who run it: a small core, modules that plug in, a stack chosen by serious teams, and no hidden magic — self-hostable under license, with a stable public API.
Principles, not just features.
Small core, modules that plug in
The core handles auth, RBAC, clinics and users. Everything else lives as a module — installable and removable without touching the rest.
Contracts before classes
Each module exposes typed events and endpoints with Pydantic. Modules react to events, not to each other's internal imports.
API first, interface second
Everything you see in the UI goes through the same public API that integrators and AI agents use. OpenAPI is generated automatically.
A deliberately boring stack
We pick tools with years of production behind them. The exotic stuff we leave for side projects.
The module system isn't a metaphor.
Each module ships its own manifest, its Alembic migrations, its YAML seeds, its auto-registered navigation, and subscribes to the internal event bus. Enable the ones your clinic needs; the rest add zero weight.
Modern, and deliberately boring.
Documented for the people who run it.
Self-host it on your own infrastructure under a clinic license, with a stable public API and a documented module system.