alexandrududuman / oe-module-openvisit
Self-hosted Jitsi video visits for OpenEMR
Package info
github.com/alexandrududuman/oe-module-openvisit
Type:openemr-module
pkg:composer/alexandrududuman/oe-module-openvisit
Requires
- php: >=8.3
- openemr/oe-module-installer-plugin: ^0.1.5
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.70
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^12.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Self-hosted video visits for OpenEMR 8.2+, powered by Jitsi Meet.
Status: before 1.0. Everything below works against a self-hosted Jitsi and is covered by browser journeys on every pull request. Follow the implementation plan.
See it in two minutes
The full video below takes two minutes: install the module, connect your Jitsi server, run the setup check and hold a first visit with the patient on a phone, while the call follows you around OpenEMR. The footage is the real module on OpenEMR 8.5; the people are AI-generated and the narration is Kokoro text to speech.
openvisit-setup.mp4
Documentation
| You want to | Read |
|---|---|
| Install it on your OpenEMR | docs/install.md |
| Stand up OpenEMR, Jitsi and TURN in one command | docker/README.md |
| Run video visits, record them, use the floating window | docs/user-guide.md |
| Understand how it is built | docs/design.md |
| See what changed | CHANGELOG.md |
Why
OpenEMR has no free, self-hosted telehealth option that installs and just works. Clinics either pay a per-provider monthly fee to a closed vendor, or paste Zoom and Jitsi links into appointment notes by hand.
OpenVisit is a native OpenEMR module that talks to a Jitsi Meet server the clinic runs itself.
- No monthly fee. The clinic pays for its own server and nothing else.
- Patient data and video stay on infrastructure the clinic controls.
- Built for the OpenEMR 8.x module architecture: Composer install, event hooks, no core patches.
What it does
- Start from the calendar. The provider opens the visit from the appointment. The room is created on demand and an encounter is opened automatically, with the real start and end time. A second call with the same patient that day joins the same encounter, as OpenEMR is set.
- Patients join from a link. Sent by email, no portal account, no app. A browser is enough, on desktop or phone.
- Waiting room. The patient waits until the provider admits them.
- Locked rooms. Every session is protected by a short-lived JWT and a random room name. Nobody can guess their way into a visit.
- Guest links for an interpreter, a family member or a second clinician.
- Self-check settings page. It tests the Jitsi server, the JWT setup and TURN reachability, and tells you what is wrong.
- Reference stack. A
docker composefile with OpenEMR, the module, Jitsi Meet, a TURN server and a reverse proxy, for a working setup in one command. - A call that floats. The visit opens in a window over OpenEMR. Moving elsewhere tucks it into a corner, like Google Meet, with mute, camera, admit and leave at hand.
- Recording, optional. Once the patient is in the call the provider can record, after confirming consent; everyone sees that the visit is recorded, and the file plays back from the visit history. Needs Jibri next to Jitsi.
Planned after v1: SMS invitations through the Fax/SMS module, REST endpoints.
Requirements
| Component | Version |
|---|---|
| OpenEMR | 8.2.0 or newer |
| PHP | 8.3 or newer |
| Jitsi Meet | self-hosted, JWT authentication enabled |
| TURN server | coturn, included in the reference stack |
Install
cd /path/to/openemr
composer require alexandrududuman/oe-module-openvisit
Or unpack the release archive into interface/modules/custom_modules/oe-module-openvisit.
Then in OpenEMR go to Administration > Modules > Manage Modules and click Install, then Enable.
See docs/install.md for the full steps, the official docker image, upgrades
and the developer setup.
Compatibility
| OpenVisit | OpenEMR | Jitsi Meet (docker-jitsi-meet) |
|---|---|---|
| 0.6.0 | 8.2.0 to 8.6.0 (next) | stable-11248-3 |
| 0.5.0 | 8.5.0 | stable-11248-3 |
Every pull request runs unit tests, PHPStan at level max against OpenEMR 8.5, browser journeys that drive a real OpenEMR and Jitsi stack in containers, and an install journey that adds the module to a pristine OpenEMR, sets it up through the Module Manager and runs a first visit. On an OpenEMR older than 8.2.0 the module stays inactive and core keeps working.
Project
- Design document: scope, decisions, what is out of v1, open questions.
- Reference docker stack: OpenEMR, Jitsi, coturn and TLS in one command.
- Changelog
- Security policy
Contributions are welcome once the first release is out. Until then, open an issue to discuss the design.
Custom OpenEMR work
OpenVisit is built and maintained by Alexandru Duduman. If your practice needs OpenEMR to do more than this module does, such as integrations with other systems, custom modules, telehealth workflows or hosting, consulting is available. Get in touch by email at alexandru@thepenguindeveloper.com or on LinkedIn.
License
Copyright (c) 2026 Alexandru Duduman. Licensed under GPL-3.0-or-later, the same license as
OpenEMR. See LICENSE. The bundled Atkinson Hyperlegible font is copyright Braille
Institute of America under the SIL Open Font License, see public/assets/fonts/OFL.txt.
