Keeping Module Installation Accessible for Non-Technical Practices

I want to raise something from the user side of the house, since I think this forum is the right place for it.

I’ve been following the discussion about moving modules out of core and the thinking that external modules should be installed via the command line rather than through a UI, for security reasons. I want to say first that the security concern makes complete sense to me. Running third-party code inside a live EMR full of patient data is not something to be casual about, and I don’t think anyone wants a one-click path to installing untrusted code.

My worry is just about who ends up on the wrong side of a CLI-only approach. A lot of us running OpenEMR are small practices without dedicated IT. For that group, “install it from the command line” can be the difference between using a module and not being able to touch it at all. I’d hate to see us end up in a place where core modules are available to everyone but everything else is effectively developers-only.

Where I’m hoping the conversation can go: I think the real security concern is trusting the code, not the UI itself — and there might be ways to keep that trust gate without closing the door on non-technical users.

The approach that seems most promising to me is a curated, signed module list — where the UI will only install modules that have been vetted and signed. What I like about it is that it answers the security concern at the root: the install path simply can’t run arbitrary untrusted code, so even a compromised admin account can’t use it to pull in something malicious. The trust comes from the vetting and the signature, not from asking a non-technical user to make a judgment call. It’s roughly the “reviewed app store” model, and it’s been floated for OpenEMR before in one form or another.

I’ll be upfront that this is more work than just requiring the command line — it needs signing infrastructure, a vetting process, and someone to own the ongoing review. But that’s infrastructure the project would arguably benefit from having regardless of how this particular decision goes, since a way to vouch for module integrity is valuable on its own. So I’d gently push back on treating “more effort” as a reason to default to CLI-only — it’s a reason to scope the work, not necessarily to skip it.

There are other middle paths too — letting a server admin approve trusted sources once, or shipping the UI but off by default behind an admin flag — but to me the signed list is the cleanest, because it doesn’t lean on someone making the right trust decision at install time.

I’m not wedded to the implementation details, and the admins know the codebase and the threat model far better than I do. Mostly I want to make sure that whatever we land on, we don’t leave smaller practices unable to install modules at all.

I am curious as to whether others running smaller setups feel the same, and whether any of these middle paths seem workable to the people doing the work.

David Eschelbacher MD

Hi, David, thanks for raising this. The worry you’re naming, that small practices without IT could get locked out of modules entirely, is not an outcome anyone wants.

The module modernization plan lives in Discussion: module overhaul · Issue #9981 · openemr/openemr · GitHub and Modules: The Next Generation · Issue #10714 · openemr/openemr · GitHub, and a stated goal there is already “some concept of verified modules eventually, which represent meeting a certain quality bar.” That is essentially the curated, signed, reviewed-app-store model you’re describing. So the signing and vetting idea isn’t a counter-proposal. It’s where the project is already heading.

It also helps to separate two things that are easy to blur together. One is how a module’s code gets onto a server and stays maintained and security-scoped. The other is how a practice admin turns a module on in a running site. The recent work, for example https://github.com/openemr/openemr/pull/11265, only touches the first. A module that used to be copied into core now arrives as a dependency, but it lands in the same place and is still enabled through the same admin screen. For the person running the practice, nothing about that changes. They never open a terminal.

“CLI-only” was never the goal. Composer happens to be a command-line tool, so it shows up in the developer and packaging path, but that’s plumbing for whoever builds the distribution, not a step practices are asked to perform. The CLI is a stop on the road, not the destination.

Where I think you’ve put your finger on something real and still open is the case you care most about: a non-technical practice that wants a third-party module which isn’t already part of their distribution. A UI for installing arbitrary external modules is deliberately out of scope in the current plan for now, precisely because of the trust problem you describe. And your instinct about the fix matches the project’s: the answer is a vetted, signed list the UI can install from safely, not asking a non-technical admin to make a trust call at install time.

So rather than a parallel proposal, I’d love to fold this into Modules: The Next Generation · Issue #10714 · openemr/openemr · GitHub, where the verified-modules piece is exactly the hook for it. The most useful thing here is what you’ve already started doing: keeping the small-practice requirement loud, so that when that work gets scoped, “don’t strip module access from small practices” is a first-class constraint and not an afterthought.

2 Likes