When an OpenMRS FHIR2 module implementation becomes necessary
An OpenMRS FHIR2 module implementation becomes necessary when a national health information system, a regional exchange or a third-party app needs patient, encounter and observation data from OpenMRS through a standard interface. The FHIR2 module provides that REST API, focused on FHIR R4 with translation support for R3, so receiving systems can query records without reading the OpenMRS database directly. The SMART on FHIR module adds app launch under the SMART App Launch Framework and uses Keycloak as the default authorization server. Together, these components let an approved app start from the OpenMRS context and request only the access its launch grants. Whether this design fits depends on what the receiving party has specified, so the decision should start from that party's written requirements.
Four questions decide whether this work is needed now. First, which FHIR version does the receiving system require? If it requires R4, the FHIR2 module is the direct path. If it expects R3, confirm which resource types the translation layer covers before committing to a design. Second, does the consumer need read-only access or write-back of data? Write operations change the validation, audit and access requirements. Third, will apps launch from inside OpenMRS with a user context, or will they connect as back-end services? SMART launch and service-to-service access use different authorization flows. Fourth, which identity source will users sign in with? If single sign-on across OpenMRS and Keycloak is already planned, the OAuth2 Login module is a related decision to scope in the same design.
The work usually involves several teams. Implementer organizations that run OpenMRS deployments own the platform, the module versions and the upgrade schedule, and they must confirm that the FHIR2 and SMART on FHIR module versions match their OpenMRS platform or 3.x reference application release. The identity team owns Keycloak, including clients, user federation, hosting and patching. The integration team maps the receiving system's resources to what OpenMRS stores, and the security team reviews scopes, token lifetimes and audit logging. Ask the consumer's conformance team which profiles and test suites they will use for acceptance, and agree early on who signs off on test results. These choices shape the scope and timeline, so they belong in the written scope before work starts.
Several things sit outside the module's scope and need their own plan. Terminology is the main one. The FHIR2 module returns the concepts held in the OpenMRS dictionary, so the codes a receiving system sees depend on how concepts are named, mapped and maintained. That dictionary work runs through Open Concept Lab, which the sibling topic on concept dictionary management covers. Profile conformance, validation against national implementation guides and terminology binding also belong to the integration design, not to the module itself. Keycloak operations, including high availability, database sizing, upgrades and backup, are separate from the OpenMRS deployment and should be scoped with the identity team. Confirm each boundary in writing before estimating effort.
What the OpenMRS FHIR2 module exposes and what SMART on FHIR adds
The FHIR2 module supplies the REST API, the SMART App Launch support builds on top of it, and the OAuth2 Login module decides how people and services authenticate. Read the cards in that order, because each layer depends on the one before it. Confirm the exact versions you plan to run before you commit to a design.
FHIR REST API from the FHIR2 module
The openmrs-module-fhir2 repository provides the FHIR REST API for OpenMRS, with its stated focus on FHIR R4. Consumers reach clinical and administrative data through standard FHIR resource endpoints. Before you scope integrations, confirm which resource types the release you plan to run supports, because coverage is release-specific and partner systems often need particular resources to function.
R4 focus with R3 translation
The module's stated focus is FHIR R4, and it provides translation support for FHIR R3. Check which R3 resources and fields convert correctly in both directions before a national or third-party system that still speaks R3 depends on them. Test with a representative sample of records, including concepts, encounters and observations that use locally defined values, because translation is where mapping gaps usually appear. Ask the partner's team which FHIR version it negotiates and whether it validates against a specific profile.
SMART App Launch depends on FHIR2
The openmrs-module-smartonfhir module supports the SMART App Launch Framework and depends on the FHIR2 module to do so. Treat the two as one stack in your design, since a SMART app can only launch against FHIR resources that FHIR2 exposes to it. Map each app's requested scopes to resources in your release, and confirm the module version pairs with your FHIR2 version before you schedule an upgrade of either one.
Keycloak as the default authorization server
The SMART on FHIR module uses Keycloak as its default authorization server. Keycloak is licensed under Apache 2.0 and supports OpenID Connect, OAuth 2.0 and SAML 2.0. Decide early who operates the realms, how Keycloak is hosted, and which supported production database it uses. Keycloak documents that both supported high availability designs need a synchronously replicated database, so plan that dependency with your database team before go-live.
OAuth2 Login replaces basic authentication
The OAuth2 Login module replaces OpenMRS basic authentication with an OAuth 2.0 provider, so users authenticate with that provider. Plan the cutover for accounts that exist today, the local administrator account you keep for recovery, and any clients still using basic authentication. The module's documentation covers Keycloak and Google configurations, so confirm which one matches the identity provider you run before you configure anything.
User creation, roles and service accounts
The module's documentation lists on-the-fly user creation, mapping of names, email and roles from the provider, and JWT service accounts for non-interactive clients. Decide which provider claims drive role assignment, because a mistake in the mapping can grant or remove clinical permissions for every user who signs in. Confirm the exact claim names, role mapping rules and JWT service account setup in the documentation for your release before you write the mapping.
Which authentication and SMART launch options fit your OpenMRS FHIR2 module deployment
This table compares the decisions that shape how the OpenMRS FHIR2 module and SMART on FHIR are secured and deployed. Read each row by first asking which option fits your users and integrations, then check what the national or third-party partner must do. Confirm every setting and version in the module documentation before you commit.
| Decision | Option and when it fits | What it changes for the partner and what to confirm |
|---|---|---|
| Authorization server | Keycloak as default: fits sites without an existing identity provider, and matches the SMART on FHIR module's default setup. | Partner receives client registrations and realm details. Confirm the realm and client configuration steps in the SMART module docs. |
| Authorization server | Another OAuth 2.0 provider: fits sites whose organization already mandates one central identity service. | Partner registers apps with that provider. Confirm which OAuth 2.0 features and endpoints the OAuth2 Login module requires. |
| User sign-in | Basic authentication kept: fits internal users only, with no external or federated sign-in needed. | Partner-facing apps get no federated sign-in path. Confirm how basic authentication works alongside SMART launch flows. |
| User sign-in | OAuth2 Login module: fits sites that want users signing in through a central provider with accounts created on first login. | Partner depends on claims for name, email and roles. Confirm the mapping settings and the Keycloak and Google examples in the module docs. |
| Backend app access | JWT service accounts: fit scheduled jobs and system-to-system exchange where no clinician is signed in. | Partner manages key issuance and rotation. Confirm the key format and how the OAuth2 Login module handles service accounts. |
| Backend app access | User-context tokens: fit apps acting for a signed-in clinician, limited to that user's OpenMRS privileges. | Partner must handle consent, token refresh and expiry. Confirm token lifetime and scopes that the SMART module expects. |
| Deployment model | Standalone OpenMRS: fits a single site or a Tomcat and MySQL setup your team already operates. | Partner connects to one base URL and database. Confirm module versions compatible with your OpenMRS platform release. |
| Deployment model | Docker-based O3 stack: fits teams adopting the 3.x frontend on the reference application containers. | Partner reaches the Nginx gateway and TLS endpoints. Confirm FHIR2 and SMART module support in the O3 distribution you deploy. |
How a SMART app launch flows through Keycloak into OpenMRS
A SMART app launch passes through three parties: the external app, Keycloak as the authorization server, and OpenMRS with the FHIR2 module as the resource server. Understanding the order of those hand-offs is the fastest way to find where a launch fails. The SMART on FHIR module supports the SMART App Launch Framework on top of the FHIR2 API and uses Keycloak as its default authorization server, so the flow below assumes that pairing. Treat it as a conceptual map. Your own realm, client definitions and scope configuration determine what actually happens in your environment, and you should walk the flow end to end against those settings before any clinical user or partner app depends on it.
In plain steps, the app first identifies itself to Keycloak as a registered client and redirects the user's browser to the authorization endpoint with the scopes it asks for. For a user-facing launch, the user signs in at Keycloak and consents where consent is configured. Keycloak then returns an authorization code, which the app exchanges at the token endpoint for an access token. The app calls FHIR2 endpoints with that token as a bearer credential. Each request carries the scopes that were granted, and the scopes are the boundary the app is supposed to stay inside. A backend system app follows a similar pattern with the client credentials grant and a system scope, with no interactive user. Confirm which scope patterns your SMART configuration accepts for patient, user and system access, because an app that requests a broader scope than your client permits should be refused at the token step, not at the data step.
The OAuth2 Login module is where OpenMRS stops relying on its own basic authentication and starts trusting the identity provider. When a token holder signs in for the first time, the module can create the OpenMRS user on the fly, populating name and email from the identity claims and assigning roles from the token. This is convenient, but it means OpenMRS accepts whatever the identity provider asserts. Decide before go-live which claims supply the username, name, email and roles, and document the mapping for each realm and client. The module documents Keycloak configuration, so start from that reference and then verify the claim names your realm actually emits.
Role mapping is where access rules most often go wrong. A realm role, a client role and a group can all look like the same permission to a person reading the admin console, yet only one of them may reach the OpenMRS privilege the team intended. Common failures include a default role granted to every new user, a composite role that quietly includes an administrative privilege, a mapper that copies roles from a different client, and a token that carries roles from a previous sign-in because sessions were not expired. Test with several accounts that hold deliberately different roles, and check both what the token contains and what OpenMRS grants after login. Keep the mapper configuration under version control with the realm export so changes are reviewed like code.
Before a partner app or national exchange is connected, run a test plan that covers a successful launch, a launch with a scope the client should not hold, a user with no mapped role, a revoked or expired session, and a backend system call. Record the token claims and the resulting OpenMRS privileges for each case. Ask your implementation team and your identity administrator to confirm the Keycloak version and database support for your environment against the current Keycloak documentation, since realm and client behavior is tied to the release you run. Because the exact settings depend on your deployment, the results of this test plan, not the diagram, are the evidence you should keep.
OpenMRS FHIR2 module implementation sequence and the output of each step
This sequence takes an OpenMRS deployment from a confirmed version baseline to a production FHIR R4 and SMART on FHIR endpoint, with a written record of each step. Each step closes with an artifact that the next step depends on, so gaps surface before go-live.
Confirm platform and module versions
Your clinical informatics lead and DeployOpen agree on the OpenMRS distribution (Platform 2.x with a WAR on Tomcat, or the O3 Reference Application stack) and check that the FHIR2 and SMART on FHIR module versions match the core version you run. The latest Platform and O3 releases are listed on the OpenMRS download page, but your choice depends on your existing implementation and database. Output: a signed component manifest listing every core version, module version, database and servlet container, which fixes the baseline for all later steps.
Stand up the test environment
DeployOpen builds a non-production environment in your infrastructure that mirrors the production topology, including the database engine, reverse proxy, TLS termination and backup jobs. The environment is built from scripts or infrastructure-as-code so it can be rebuilt. Output: a build record with versions, host inventory and a restored copy of a de-identified database. The step is complete when the OpenMRS login page, the REST endpoints and the backup restore test all succeed.
Configure the identity provider and realm
The team creates a Keycloak realm for OpenMRS users and a confidential client for the SMART apps, then configures the OAuth2 Login module so OpenMRS delegates sign-in to Keycloak instead of basic authentication. Roles from the identity provider are mapped to OpenMRS privileges, and the mapping is tested with one account per role. Confirm the Keycloak database is one of the supported production engines and that the high availability design you choose requires a synchronously replicated database. Output: an exported realm configuration and a role-to-privilege matrix approved by the client.
Install FHIR2 and SMART on FHIR modules
DeployOpen installs the FHIR2 module first, then the SMART on FHIR module, pointing its authorization server setting at the Keycloak realm from the previous step. The team confirms that the FHIR endpoint publishes its capability statement and that the SMART launch configuration advertises the expected scopes. The module configuration is recorded with the exact module versions, so later upgrades can be compared against it. Output: a module configuration record and a log of the capability statement and SMART configuration responses captured from the test environment.
Map concepts and patient identifiers
The team maps local concepts and encounter types to the codes your exchange profile requires, and maps local patient identifier types to the identifier systems that the national or third-party partner expects. Where concepts come from a shared dictionary, the mapping names the dictionary version used. Clinical and terminology owners review every mapping, and unmapped items are listed rather than silently dropped. Output: a signed mapping specification with one row per resource element and identifier type, plus a list of open items with owners.
Run conformance and access tests with the partner
DeployOpen and the exchange partner run resource-level conformance checks against the mapped data and test SMART launches from each registered client. Negative tests confirm that a client without the right scope cannot read patient data, that an expired token is refused and that a user without a privilege receives no records. Any failure is logged with a fix and a retest result. Output: a test evidence pack with the executed test cases, results, retest outcomes and a signed-off client registration list naming each app, its scopes and its owner.
Move to production with monitoring and rollback
Before the production change, the team takes a verified database backup and confirms the rollback runbook by executing it in the test environment. Keycloak runs schema migration automatically at startup by default, so the team decides whether to apply migration SQL manually for a controlled upgrade. Monitoring covers the OpenMRS, FHIR endpoint and Keycloak metrics, with alert thresholds set by your operations team. Output: a production change record, a monitoring baseline, a tested rollback runbook and the go-live sign-off from your application owner.
What drives OpenMRS FHIR2 and SMART on FHIR effort and cost
This table lists the main cost components of an OpenMRS FHIR2 and SMART on FHIR engagement, with what raises each one and what keeps it down. Read each row as a scoping question, because effort rises with consuming systems, custom profiles, certification obligations and sites. No price or duration is given here, so ask for a fixed-scope quote that itemizes these drivers against the written scope.
| Driver | What increases it | What keeps it down |
|---|---|---|
| Configuration and identity setup | Keycloak realms, clients, role mapping and OAuth2 Login settings multiply across environments and sites. | One agreed role model and a reusable realm template for every environment. |
| Consuming applications | Each SMART app or third-party system adds client registration, scopes, testing and ongoing support. | Limit the first release to named applications and add others through a change request. |
| Testing with each consuming system | Each external system needs its own test scenarios, test data, environment access and sign-off. | A shared test plan with fixed sample patients and one test environment. |
| Custom resource profiles | Non-standard FHIR R4 profiles, extensions or translated R3 requests need mapping, validation and documentation. | Confirm required resources early and expose only the fields consumers use. |
| National exchange certification | Certification programs add conformance testing, evidence collection and rework cycles set by the program. | Obtain the program's test requirements in writing before design starts. |
| Terminology and data mapping | Local concepts that need mapping to shared dictionary codes add review and data clean-up work. | Finish concept decisions in Open Concept Lab first and agree one code map per resource. |
| Hosting and database | Keycloak high availability needs a synchronously replicated database, and each added site adds clusters to run. | Single-cluster design where requirements allow, with a tested database sizing and failover plan. |
| Ongoing upgrades | OpenMRS, the FHIR2 and SMART modules and Keycloak each release on their own schedule, with Keycloak planning four minor releases a year. | Pin versions, use manual approval for Keycloak Operator updates and plan upgrades in a support retainer. |
Preparing OpenMRS concept and patient data for FHIR exchange
The FHIR2 module can only expose what OpenMRS already records consistently. A FHIR Observation is only as useful as the concept it points to, an Encounter is only as useful as its encounter type, and a Patient resource is only as trustworthy as its identifiers. For that reason the concept dictionary, encounter types and identifier schemes should be stable before a national system or third-party app starts testing against the API. Changes to concepts after partners have mapped them tend to break mappings silently, so treat the dictionary as a release that is frozen for the exchange scope.
Start with coded data. Review the concepts that will appear in exchanged Observations, Conditions and Medication Requests, and confirm that each one has a clear name, a concept class, a datatype and a reference term in the code system your partner expects. Check for duplicate concepts that express the same clinical idea, and for locally created concepts that duplicate a shared concept already in the dictionary. The sibling topic on Open Concept Lab covers how shared and local concepts are managed, including subscriptions, validation rules and offline imports, so use it to settle those decisions first rather than repeating the work in the exchange project.
Next, check patient data. Run a duplicate patient review against the identifiers that the FHIR Patient resource will carry, and decide which identifier type is the exchange identifier. Confirm that each identifier type has a documented format, a validation rule and an owner, and that the partner understands which system URI identifies it. Where the same person has records under several identifier types, decide how merges are handled before any Patient is published, because a merge after exchange has started must be communicated to every consuming system. Also confirm that encounter types and visit types are used consistently across sites, since partners will often filter on them.
Legacy forms need a separate decision. The O3 form migration tool was built by Palladium Kenya to convert legacy OpenMRS HTML forms to the O3 form schema, and the community adopted it. It matters only if legacy HTML forms feed the data you plan to exchange. If they do, confirm which forms are involved, whether their concept mappings are complete, and whether the converted forms produce the same concepts and encounter types as the originals. If no exchanged data originates from HTML forms, you can leave this tool out of scope and say so in the statement of work.
Before the partner begins testing, agree a short written readiness checklist and have the OpenMRS team sign it off. It should list the concepts and encounter types in scope, the identifier types used for exchange, the duplicate patient review result, the status of legacy forms, and the named owner for each item. Ask the partner which terminology and identifier conventions they require, and confirm that your deployment's FHIR2 and SMART on FHIR configuration can produce them, because some requirements will need data cleanup rather than configuration.
How the FHIR2 and SMART modules connect to the rest of your OpenMRS platform
The FHIR2 and SMART modules depend on five connections: the OpenMRS core and its database, the identity provider, the O3 gateway, the terminology source and the external apps that call the API. Each connection needs a named owner and a confirmed setting before go-live.
Core and supported databases
The FHIR2 and SMART modules load into the OpenMRS core, which is written in Java, built with Maven and runs on Tomcat or Jetty. Confirm that the platform version, module versions and Java runtime are compatible, and that the database is MySQL, MariaDB or PostgreSQL. Your platform team owns the servlet container, JVM and database. Your database team owns backups and failover, and changes to the database should be tested against the module release before upgrades.
Keycloak and other OAuth 2.0 providers
The OAuth2 Login module replaces basic authentication with an OAuth 2.0 provider and creates users on first sign-in, mapping names, email and roles. The SMART on FHIR module uses Keycloak as its default authorization server. Confirm the realm, client registrations, redirect URIs, scopes and role mappings, and whether JWT service accounts are needed for backend jobs. Your identity team owns the provider and its clients, while your OpenMRS team owns module settings and role mapping.
O3 gateway and certificate setup
The O3 Docker Compose stack runs MariaDB, the OpenMRS backend, an Nginx frontend for the 3.x modules, an Nginx gateway and an optional Certbot service. Confirm which gateway routes FHIR and SMART paths to the backend, where TLS terminates, and whether certificates come from Certbot or your own certificate authority. SMART redirect URIs must match the public hostname that the gateway presents. Your infrastructure team owns DNS, certificates and the gateway, while your implementation team owns routing rules and the backend settings they depend on.
Open Concept Lab terminology
FHIR resources reference concept codes from the OpenMRS dictionary, so the terminology source shapes what clients receive. Confirm whether the site has an Open Concept Lab subscription and API token, which imports run online and which need offline zip files, and how local concepts map to shared ones before FHIR clients query them. Clinical informatics owns dictionary governance and approves changes. The implementation team owns the FHIR mappings that depend on those concepts, so a dictionary change should be tested against FHIR output before release.
National systems and third-party apps
National health information systems and third-party SMART apps call the FHIR R4 API after a SMART App Launch. Confirm which resource types and scopes each consumer needs, whether a receiving system requires R3 translation (the FHIR2 module focuses on R4 with translation support for R3), and which app registrations live in your authorization server. The national program or app vendor defines requirements and conformance testing. You own the scopes you grant, the audit trail of access and the decision to publish each app. Agree test endpoints with each external party before go-live.
How much work does an OpenMRS FHIR2 module implementation need from our team?
What drives the cost of an OpenMRS FHIR2 implementation?
Cost follows the scope you agree in writing. The largest drivers are how much data you expose, how much terminology work sits behind it, and how many SMART apps and exchange partners connect.
One-time work usually includes scoping the resources and operations your exchange partner needs, configuring the FHIR2 and SMART on FHIR modules, setting up Keycloak as the authorization server, mapping concepts to the codes partners expect, testing against their requirements, and writing runbooks.
Recurring work includes upgrades, monitoring, backups and any support retainer you choose. Costs rise when requirements change mid-build, when more apps or identity sources are added, or when OpenMRS data needs cleanup first. Ask the quote to break out each workstream, its assumptions and the responsibilities that fall to your team.
How long does the work take and what depends on our exchange partner?
Duration depends more on your exchange partner's readiness than on the build itself. Before work starts, confirm which profiles, resources, search parameters and SMART scopes the partner requires, whether they provide a test endpoint and a client registration process, and who signs off conformance.
If the partner changes requirements or delays test access, the schedule moves even when your side is ready. On your side, the critical items are an agreed Keycloak deployment model, access to identity sources, and a review window for your clinical terminology owners.
Ask for a timeline tied to milestones and dependencies, with the partner's responsibilities written down. Do not accept a date that assumes partner readiness nobody has confirmed.
Which staff do we need to assign to the FHIR2 and SMART work?
Plan for three named roles from the start, each with decisions that block the build.
- Identity administrators own Keycloak realms, clients, roles and the mapping of names, email and roles that the OAuth2 Login module uses.
- OpenMRS administrators own privileges, the accounts integrations use, module deployment windows and production configuration.
- Clinical terminology owners approve which concepts map to which codes and which values appear in exchanged resources.
Each role needs a named person with authority to approve decisions and time set aside for reviews. Ask the quote to list the sessions, reviews and approvals expected from each role, and the periods when your staff must be available.
Can our internal team build and run this without a partner?
Yes, a team with the right skills can do it alone, and some organizations prefer that. The work spans OpenMRS module configuration on Tomcat with MySQL, MariaDB or PostgreSQL, Keycloak deployment and tuning, SMART App Launch configuration, FHIR conformance testing and documentation of how the whole system runs.
Check whether your staff have hands-on experience with each of those areas, and whether anyone has run FHIR R4 conformance testing against an exchange partner before. Gaps usually appear in the test phase and in production operations, where an outside review adds value.
Be honest about how much time your team can release from current duties. A partner can take fixed-scope build work or review your design, and your team keeps ownership of the running system.
What should a written quote for FHIR2 and SMART on FHIR include?
A written quote should describe the scope in enough detail that you can compare it with another proposal. List the OpenMRS resources and operations exposed through the FHIR2 module, the SMART apps and scopes to launch, the Keycloak deployment model and database, the environments covered, and the OpenMRS and Keycloak versions targeted.
Separate one-time work (design, build, conformance testing, documentation and handover) from recurring work (upgrades, monitoring and support). Name the responsibilities of DeployOpen and of your team, including the staff time each role needs.
Add assumptions, a change control process for requirement changes, acceptance criteria, and what happens if partner test access slips. Most engagements are fixed-scope, so ask for these items agreed in writing before work starts.
Does our Keycloak hosting choice change the implementation effort?
Yes. The Keycloak design affects effort more than many buyers expect. Keycloak documents three high availability architectures, and both supported multi-site designs require a synchronously replicated database, so database capacity and replication belong in the scope.
Use a database from Keycloak's supported production list. The development file database is for development only. Decide how the Keycloak Operator or another install method will run, and who approves updates, since the Operator documentation strongly recommends manual approval mode for operator updates.
Schema migration runs automatically at startup by default, while large deployments may prefer to apply the migration SQL manually. Each of these choices adds design, testing and runbook work, so ask the quote to name them explicitly.
What recurring work follows after the FHIR2 module goes live?
Recurring work starts after go-live and is easy to underestimate. Keycloak plans four minor releases a year, and since Keycloak 26.0, breaking changes in minor releases are opt-in, so each upgrade still needs a compatibility check.
OpenMRS module versions must be tested against the platform version you run, and the FHIR2 and SMART on FHIR modules change with it. Monitoring, backups and access reviews all need named owners. Partner requirements also change over time, which brings conformance testing back into scope.
You can run this in house, or buy a retainer for upgrades, continuous testing and support, with the scope and response terms written down in advance.
How DeployOpen scopes and delivers an OpenMRS FHIR2 module implementation
DeployOpen treats the FHIR2 module and SMART on FHIR as one interoperability layer inside your own OpenMRS environment, planned with your clinical informatics, identity and integration teams. We set the resource scope, launch model and Keycloak configuration in writing before build starts, then deliver in your cloud accounts, data centers or air-gapped networks. Engagements are fixed-scope, and ongoing support is available as a retainer.
How we scope
- The written scope lists which FHIR2 resources and operations are exposed, with R4 as the target version.
- SMART App Launch scope, client registration and Keycloak realm design are agreed before any configuration starts.
- Engagements are fixed-scope, so deliverables, acceptance tests and timelines are fixed in writing before work starts.
How we build
- We configure the FHIR2 module and the SMART on FHIR module in a staging copy of your OpenMRS environment first.
- Keycloak is wired in as the authorization server, with the OAuth2 Login module handling user mapping and roles.
- Test cases cover resource reads and searches, token scopes, launch flows and access denial for unauthorized roles.
How we hand over
- Handover includes configuration records, Keycloak realm exports, client registrations and a runbook for your operators.
- Test evidence and access-control mappings are delivered so your security and compliance reviewers can check them.
- Your team receives knowledge transfer on updating the FHIR2, SMART and Keycloak components in your own environment.
How we support
- Ongoing support, upgrades and continuous testing are available as a retainer, scoped to your module and Keycloak versions.
- Where Keycloak runs on the Operator, updates use the manual approval mode the Operator documentation recommends.
- Database schema migrations are reviewed before startup or applied manually for large deployments, as the upgrading guide suggests.

