# Introducing the OpenELIS module system

**URL:** <https://talk.openelis-global.org/t/introducing-the-openelis-module-system/2471>\
**Category:** Development\
**Created:** [November 5, 2026, 12:46pm UTC](https://talk.openelis-global.org/t/introducing-the-openelis-module-system/2471 "2026-11-05T12:46:05Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Moses\_Mutesasira](https://yyz2.discourse-cdn.com/flex030/user_avatar/talk.openelis-global.org/moses_mutesasira/32/72_2.png) [@Moses\_Mutesasira](https://talk.openelis-global.org/u/Moses_Mutesasira)\
**Post date:** [November 5, 2026, 12:46pm UTC](https://talk.openelis-global.org/t/introducing-the-openelis-module-system/2471/1 "2026-11-05T12:46:05Z")

</div>

OpenELIS Global now has a **module system** : a way to add complete features (backend and frontend) to OpenELIS without changing the core code or waiting for a core release. It is merged into `develop` in [PR #4954](https://github.com/DIGI-UW/OpenELIS-Global-2/pull/4954) and tracked in the [module system epic (OGC-1577)](https://uwdigi.atlassian.net/browse/OGC-1577).

## Why

Many implementations need features that matter to one site, one country or one program. Until now these went into the core, or into a fork that drifted with every release. Modules let that work live in its own repository, on its own release cycle, while the core stays the same for everyone.

## What a module is

A module is **one JAR file**. A site installs it by copying the JAR into the modules folder and restarting OpenELIS. A module can bring:

- **Its own database tables** , through its own Liquibase changelogs
- **Its own REST API** , under `/rest/modules/<id>/`
- **Its own permissions** , which show up in Role Management
- **Its own menu entries and pages** , rendered inside the normal OpenELIS UI
- **Content inside core pages** , through _extension slots_. For example, a card on the home dashboard, or an action in the patient header.
- **Settings, reactions to core events, and report providers**

A module **reuses the core**. It calls the core’s services (patients, samples, users and more) and renders the core’s own UI components, so its pages look and behave like the rest of OpenELIS. It never modifies core tables or core pages.

There are two kinds of module:

| Kind | What it can do |
| --- | --- |
| **module** | A full feature: tables, API, pages and menus |
| **provider** | Only plugs into a core extension point, such as a report |

## See it working

The [Specimen Follow-up example module](https://github.com/DIGI-UW/openelis-module-specimen-followup) uses every feature above. It adds:

- a follow-up tracker with its own table and pages
- a menu under Order
- two permissions
- a dashboard card

Start a new module by copying it.

## Developing a module

From a checkout of the core, one command builds the module, installs it, and serves its pages with hot reload:

```auto
scripts/dev-stack up --setup light --module ../my-module

```

Rerun the same command after a Java or database change. See [running a module from its source](https://github.com/DIGI-UW/OpenELIS-Global-2/blob/develop/README.md#running-a-module-from-its-source).

The [module author guide](https://github.com/DIGI-UW/OpenELIS-Global-2/blob/develop/docs/modules.md) walks through everything step by step:

- the Maven project and the manifest
- tables, the REST API, permissions and menus
- pages and extension slots
- tests and CI
- a full reference and a troubleshooting table

## Deploying a module

On an [openelis-docker](https://github.com/DIGI-UW/openelis-docker) installation, copy the module JAR into `configs/modules/` and restart the webapp. Admin \> Modules then shows every installed module and its state. See [deploy and operate](https://github.com/DIGI-UW/OpenELIS-Global-2/blob/develop/docs/modules.md#8-deploy-and-operate).

## Extension points: growing what modules can do

Modules plug into the core at defined places:

- **Frontend slots** : today `home.dashboard.cards` and `patient.header.actions`
- **Backend extension points** : today `report`

New ones are added to the core by a pull request, and the guide explains how:

- [adding a slot](https://github.com/DIGI-UW/OpenELIS-Global-2/blob/develop/docs/modules.md#add-a-new-slot-to-the-core)
- [adding a backend extension point](https://github.com/DIGI-UW/OpenELIS-Global-2/blob/develop/docs/modules.md#add-a-new-backend-extension-point)

If your module needs a place in the core that does not exist yet, that is the conversation to start here.

## What’s next

- **Operations tooling** , as sites need it: richer admin reports, more extension points, and pre-deployment checks
- **A first module owned by an implementation** : a real site workflow built as a module and validated by that site

## Get involved

- Read the [module author guide](https://github.com/DIGI-UW/OpenELIS-Global-2/blob/develop/docs/modules.md) and try the [example module](https://github.com/DIGI-UW/openelis-module-specimen-followup).
- Developers can find all the links on the [For Developers page](https://uwdigi.atlassian.net/wiki/spaces/oeg/pages/1326481413/For+Developers).
- Tell us in this thread which feature you would build as a module, and which slots or extension points it would need.

---

<div class="post-metadata">

**Author:** ![Moses\_Mutesasira](https://yyz2.discourse-cdn.com/flex030/user_avatar/talk.openelis-global.org/moses_mutesasira/32/72_2.png) [@Moses\_Mutesasira](https://talk.openelis-global.org/u/Moses_Mutesasira)\
**Post date:** [November 5, 2026, 12:49pm UTC](https://talk.openelis-global.org/t/introducing-the-openelis-module-system/2471/2 "2026-11-05T12:49:06Z")

</div>

Pinned globally on November 5, 2026, 12:49pm UTC



---

<div class="post-metadata">

**Author:** ![Agaba\_Derrick\_Junior](https://yyz2.discourse-cdn.com/flex030/user_avatar/talk.openelis-global.org/agaba_derrick_junior/32/503_2.png) [@Agaba\_Derrick\_Junior](https://talk.openelis-global.org/u/Agaba_Derrick_Junior)\
**Post date:** [November 5, 2026, 2:18pm UTC](https://talk.openelis-global.org/t/introducing-the-openelis-module-system/2471/3 "2026-11-05T14:18:32Z")

</div>

🚀 We’ve shared a post on LinkedIn introducing the new OpenELIS Module System!

The post highlights what the module system brings, why it matters for implementations, and how developers can start building their own modules.

We’d appreciate your support in engaging with the post and sharing your thoughts on the kinds of features you’d like to see built as modules.

🔗 [[LinkedIn post link](https://www.linkedin.com/feed/update/urn:li:activity:7524110534611480576)]

---

<div class="post-metadata">

**Author:** ![JamesK](https://yyz2.discourse-cdn.com/flex030/user_avatar/talk.openelis-global.org/jamesk/32/1276_2.png) [@JamesK](https://talk.openelis-global.org/u/JamesK)\
**Post date:** [November 6, 2026, 9:32am UTC](https://talk.openelis-global.org/t/introducing-the-openelis-module-system/2471/4 "2026-11-06T09:32:14Z")

</div>

wow! 🤩 this is super dope!
