Ottehr
December 16, 2025 · View on GitHub
The production-ready, open-source EHR
Ottehr
Ottehr is a modern, modular EHR used as the foundation for large-scale production EHR installations. Ottehr uses the headless EHR Oystehr as a service provider and to host its backend service endpoints. Ottehr requires a free Oystehr account to run as-is, but you are welcome to modify it to use a third-party service vendor or build your own service architecture. Ottehr is designed for developers, making it easy to fork, white-label, and build entire new classes of EHRs and health-tech products with a fraction of the effort of starting from scratch.
Ottehr consists of three components:
- Ottehr Patient Portal — A patient-facing registration website for creating appointments and initiating telemedicine calls, with features including rescheduling, check-in, intake chatbot and paperwork, text messages and emails, and listing appointments for an account.
- Ottehr EHR — A staff-facing EHR for managing appointments and completing encounters, with features including checking appointments, managing patient queues, texting patients, updating a location's slots, setting a location's schedule, joining telemedicine calls, HPI and medical history, exam charting, eRx and assessment, patient plan, RCM and claims submission, and more.
- Ottehr Backend — The backend for the Patient Portal and EHR apps, it is composed of Function-as-a-Service endpoints deployed as Oystehr Zambdas.
Run Ottehr Locally
Prerequisites
To run Ottehr, you'll need a free Oystehr account and Node.js.
Get Your Oystehr Account
- Visit oystehr.com.
- Click on Free Access to initiate your early access request.
Once your request is received, the Oystehr team will promptly create your account and reach out to you via email.
Check out the Oystehr Technical Documentation to learn more about the Oystehr platform.
Install Node.js
If you do not already have it, install Node.js v22.x.
Ottehr also supports nvm, asdf, and tools that use .node-version.
Fork & Clone
Fork — Go to https://github.com/masslight/ottehr/fork and click 'Create fork' to fork the repository.
Clone — Copy and run the clone script for your fork.
git clone git@github.com:{your_profile}/ottehr.git
Then, move into the new directory
cd ottehr
Configure Your Environment
Follow the instructions on setting up a new project in deploy/README.md.
Run the Application
npm run apps:start
Log in and explore the Patient app
The Patient app starts up at http://localhost:3002
By default, the Patient app uses passwordless SMS for authentication. On the login screen, enter your mobile phone number followed by the one-time passcode which is sent to your device.
Log in and explore the EHR
The EHR app starts up at http://localhost:4002
To log into the EHR, check the email address you provided during setup for an invitation to join the EHR application. Click the link, follow the account setup workflow, and then enter your credentials to complete login.
End to End Test Setup Procedure
Ottehr includes a suite of end to end tests that can be used to maintain quality as you customize it for your use case.
Ottehr uses the ClickSend API to send an SMS with a confirmation code that is used to login before running the E2E tests. As such, you will need to create a ClickSend account in order to setup e2e testing.
After you have created your ClickSend account, invite a test user to your EHR application using the Oystehr console. Select your EHR application, input the user's email for both "User name" and "Email", set the in-line access policy to
{
"rule": []
}
and choose "Administrator" as the role. Then, click "Invite". To set the password, launch the ehr app by running npm run ehr:start from the root directory, enter the email you invited, click Forgot password? and set a password.
To set the environment files required to run E2E tests, run the following command in the root directory:
./scripts/e2e-test-setup.sh
The script will prompt you for the following information:
- The username for the test user of the EHR
- The password for a test user of the EHR
- The phone number for a test user of the EHR
- Your ClickSend user's username
- Your ClickSend user's password
Once the program finishes running, the environment files for your e2e tests will be set.
From the root directory, running the following commands will run the e2e tests for the backend and UI for the intake and ehr apps:
npm run intake:e2e:local
npm run intake:e2e:local:ui
npm run ehr:e2e:local
npm run ehr:e2e:local:ui
Full E2E Documentation: E2E_README.md
Repository Structure
This repository uses a monorepo structure.
apps— Frontend web apps- intake — The patient's side
- ehr — The provider's side
packages/zambdas— The application's backend endpoints, deployed as Oystehr Zambdas.packages/{other folders}— Other modules that are imported by apps likeutils,ui-components
Apps
EHR App
Patient Portal App
E2E Documentation
Customization
To customize your Ottehr app
- Update the "VITE_APP_NAME" environment variable from both ehr and intake env folders
- Modify the project name, website and support email from
packages/utils/lib/types/constants.ts
To theme your Ottehr Intake app
-
Copy the files in
apps/intake/src/themeinto a new folder, for exampleapps/intake/src/myTheme -
Update the theme environment variables to point to your new folders:
THEME_PATH='/src/themes/myTheme' -
Modify the images, SVGs and colors as needed
-
Restart the app
To theme your Ottehr Ehr app
-
Copy the files in
apps/ehr/src/themeinto a new folder, for exampleapps/ehr/src/myTheme -
Update the theme environment variables to point to your new folders:
THEME_PATH='/src/themes/myTheme' -
Modify the images, SVGs and colors as needed
-
Restart the app