#InterSystems Package Manager (IPM)

0 Followers · 142 Posts

InterSystems Package Manager (IPM) is a tool to deploy the packages and solutions into InterSystems IRIS with dependencies.

Download Package Manager client.

InterSystems staff + admins Hide everywhere
Hidden post for admin
Article Evgeny Shvarov · Aug 29, 2019 4m read

Hi Developers!

Often when we develop some library, tool, package, whatever on InterSystems ObjectScript we have a question, how we deploy this package on the target machine?

Also, we often expect that some other libraries already installed, so our package depends on them, and often on some particular version of it.

When you code on javascript, python, etc the role of packages deployment with dependency management takes package manager.

So, I'm pleased to announce that InterSystems ObjectScript Package Manager available!

19
4 3544
Article Luis Angel Pérez Ramos · Sep 30, 2025 11m read

Welcome, dear members of the Community!

In this article, we will present an example of a project implementing a FHIR-based solution. This project will be based on the national project (Spanish national project), known as ÚNICAS.

What is ÚNICAS?

In his own words:

A project whose objective is to create an ecosystem of partnerships to improve healthcare for pediatric patients with complex rare diseases (RMDs). This project is being implemented through the network within the National Health System (NHS) to improve the diagnosis and care of patients with rare diseases.

2
0 72
Question Sam Duncan · Aug 20, 2025

I've been trying to set up a script I can run after installing an instance to enable IPM across all namespaces. I have been able to install IPM successfully using

set r = ##class(%Net.HttpRequest).%New(),
    r.Server="pm.community.intersystems.com",
    r.SSLConfiguration="ISC.FeatureTracker.SSL.Config" 
d r.Get("/packages/zpm/latest/installer"),
    $system.OBJ.LoadStream(r.HttpResponse.Data,"c")

and then running the zpm commands

repo -r -n registry -url https://pm.community.intersystems.com/ -user "" -pass ""
enable -map -globally
4
0 90
Question André-Claude Gendron · Jul 31, 2025

Hi everyone,

I’m working with an existing InterSystems IRIS server that hosts several web applications and namespace-specific code and data. I’d like to reverse-engineer the current environment into a %Installer.Manifest file so I can store it in Git and manage its changes.

My goal is to:

  • Track the application setup and configuration in version control
  • Rebuild environments consistently (namespaces, CSP apps, security roles, etc.)
  • Possibly automate deployments later on
1
2 59
Question Justin Millette · Jul 8, 2025

I am trying to set up a web application with Delegated Authentication via IPM. It is possible to give a specific application Delegated Authentication:

<WebApplicationName="/${namespaceLower}/api"NameSpace="${namespace}"DispatchClass="pkg.isc.genai.rest.Handler"MatchRoles=":%All"AutheEnabled="#{$$$AutheDelegated}"Recurse="1"CookiePath="/${namespaceLower}/"
        />
3
0 78
Question Jonathan Lent · Jul 24, 2025

I feel I may be in the "people unclear on the concept" group here.

System Default Settings is a great mechanism, and we use some custom code to deploy it in our pipeline after environment specific changes have been applied to the content. However, we are trying our best to reduce the amount of custom code we use in our system that does not relate directly to the business. For CI/CD, this means we are trying to leverage IPM for the heavy lifting.

4
0 61
Article Evgeny Shvarov · Feb 15, 2020 5m read

Hi Developers!

As you know the concept of ObjectScript Package Manager consists of ZPM client - client application for IRIS which helps you to install packages from the registry. And the code which works "on the other side" is  ZPM Registry - server which hosts packages and exposes API to submit, list and install it. Now when you install the ZPM client it installs packages from community package registry, which si hosted on pm.community.intersystems.com

But what if you want your own registry? E.g. you produce different software packages for your clients and you want to distribute it via private registry?  Also, you may want to use your own registry to deploy solutions with different combinations of packages.

Is it possible? The answer is YES! You can have it if you deploy ZPM registry on your server with InterSystems IRIS.

To make it happen you would need to set up your own registry server.

How to do that?

2
1 1194
InterSystems Official Henry Wojnicki · Jul 9, 2024

The Application Services team is pleased to announce the release of git-source-control version 2.4.0, introducing several new features to the open-source project.

For those unfamiliar, git-source-control is an embedded (or "server-side") source control tool for InterSystems products, installed through the InterSystems Package Manager.

Here are the key additions to the 2.4.0 release:

  1. Basic Mode
1
2 324
Article Kunal Pandey · May 12, 2025 1m read

Introducing Smart Clinical Sidechick — the intelligent, no-drama partner your EHR wishes it could be. She reads FHIR data in real time, interprets lab results without ghosting, and explains clinical alerts like she actually cares. Built with GPT-4 brains and YAML sass, she’s not here to replace your main EHR—just to make it look bad. Tired of irrelevant alerts and cryptic warnings? Sidechick serves up real, explainable insights, not vague “elevated risk” vibes. And when your backend crashes, she doesn’t panic—she self-heals. Secure, responsive, and (unlike your last vendor) emotionally

0
1 139
Question Evgeny Shvarov · Apr 26, 2025

Hi developers!

While developing web apps the security practice I consider safe and convenient is to create a special Role (e.g. equal application name) which contains security resources which application will need (SQL tables, priviledges, database access, etc) and assign it to the Web Application.
So the user gets this role once it loggs in to the application (via password, no password or delegated).

Convenient, right?

So, the question is, when I deploy the app as an IPM module what should I put as a database access?

4
0 85
Article janzai renato · Apr 1, 2025 1m read

# IRIS-Intelligent ButlerIRIS Intelligent Butler is an AI intelligent butler system built on the InterSystems IRIS data platform, aimed at providing users with comprehensive intelligent life and work assistance through data intelligence, automated decision-making, and natural interaction.## Application scenarios adding services, initializing configurations, etc. are currently being enriched## Intelligent ButlerIRIS Smart Manager utilizes the powerful data management and AI capabilities of InterSystems IRIS to create a highly personalized, automated, secure, and reliable intelligent life and

1
1 100
Article lando miller · Mar 31, 2025 2m read

Prompt

Firstly, we need to understand what prompt words are and what their functions are.

Prompt Engineering

Hint word engineering is a method specifically designed for optimizing language models.
Its goal is to guide these models to generate more accurate and targeted output text by designing and adjusting the input prompt words.

Core Functions of Prompts

0
5 82
Question Dmitrii Baranov · Mar 31, 2025

I'd like to ask you for recommendations on how to properly use repository dependencies when using VSCode and Client-side editing. Suppose I have projects A, B and C, with A being independent, B depending on A, and C depending on A and B. I am currently working with the main project C, and I want to be able to contribute to all the other projects in a single VSCode window (instead of opening three instances). How do you solve this problem? Git submodules? ZPM? Something else?

1
0 81
Question Pravin Barton · Feb 14, 2025

For some build scripting with the InterSystems Package Manager, I'd like to first uninstall a package with `zpm "uninstall"` and then load it from disk using `zpm "load"`. That way anything that got deleted from the source will also be deleted from IRIS. 

The problem is that `zpm "uninstall"` takes in a module name and I only have the directory path to the package source. Is there a way to get the module name for an installed IPM module given the source path? It's okay  to assume that it has previously been installed from that same directory with `zpm "load"`.

1
0 88
Article Shuheng Liu · Jul 15, 2024 3m read

Introduction to running WSGI in IRIS

With IRIS 2024+, users can host WSGI applications using Security.Applications. As an example, a user can do something like this

Minimum working example

zn "%SYS"
Kill props
Set props("Description") = "Sample WSGI Application"
Set props("MatchRoles") = ":%All"
Set props("WSGIAppLocation") = "/path/to/flaskapp"
Set props("WSGIAppName") = "myapp"
Set props("WSGICallable") = "app"
Set props("DispatchClass") = "%SYS.Python.WSGI" // important, otherwise will be recognized as CSP application
Set sc = ##class(Security.Applications).Create("/flask", .props)
zw sc

where /path/to/flaskapp directory contains an myapp.py file that reads

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello, WSGI!"

Now, go to the URL http(s)://<host>:<port>/<optional-prefix>/flask/. It should show "Hello, WSGI!" in plain text.

Common pitfalls

  1. If the URL http(s):///flask/ is not working, check for the trailing slash first, which must be present.

  2. Also, when running for the first time, flask needs to be installed for embedded python (not your local OS-level python interpreter). Verify the installation is successful by going to the embedded python shell and run import flask.

  3. Finally, read permission of whatever OS user IRIS is assuming must be granted to /path/to/flaskapp/myapp.py and all parent folders.

  4. If the error still can't be resolved, check for entries in messages.log. You can also reach out to us by posting an issue

Using IPM to ship WSGI applications for easy install

IPM makes the process easier by

  1. copying flask app directory to a place with guaranteed read-access
  2. installing relevant python dependencies in a requirements.txt file

Package Example

Here is an example that can be installed easily wherever IPM (v0.7.2+) is installed on IRIS 2024+. Clone this package to a suitable <PACKAGE_ROOT>, and start an IRIS terminal

zn "%SYS"
zpm "load <PACKAGE_ROOT>"

After successful installation, you should be able to visit http(s)://<host>:<port>/<optional-instance-prefix>/my/flask/demo/. In my case, the URL is http://localhost:8080/iris-ml-wsgi/my/flask/demo/ and it reads:

This is a sample WSGI application using Flask!

Hint: you need to install zpm following instructions here first for the zpm command to work.

The module.xml of the above repo is also listed here for quick reference

<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="25">
  <Document name="flask-demo.ZPM">
    <Module>
      <Name>flask-demo</Name>
      <Version>1.0.0</Version>
      <Description>This is a demo of a flask application</Description>
      <Keywords>flask</Keywords>
      <Author>
        <Person>Shuheng Liu</Person>
        <Organization>InterSystems</Organization>
        <CopyrightDate>2024</CopyrightDate>
        <License>MIT</License>
        <Notes>notes</Notes>
      </Author>
      <Packaging>module</Packaging>
      <SystemRequirements Version=">=2024.1" />
      <SourcesRoot>src</SourcesRoot>
      <FileCopy Name="src/python/flaskapp/" Target="${libdir}flask-demo/flaskapp/"/>
      <SystemSetting Name="CSP.DefaultFileCharset" Value="UTF-8"/>

      <WSGIApplication
        Url="/my/flask/demo"
        UnauthenticatedEnabled="1"
        Description="Sample WSGI application using Flask"
        MatchRoles=":${dbrole}"
        WSGIAppLocation="${libdir}flask-demo/flaskapp/"
        WSGIAppName="app"
        WSGICallable="app"
       />
    <AfterInstallMessage>Module installed successfully!</AfterInstallMessage>     
    </Module>    
  </Document>
</Export>
4
1 370
Article John McBride · Jul 10, 2024 2m read

Overview

After having some discussions at Global Summit and using a lot of package managers in my day to day development (npm,nuget,Chocolatey, etc) in addition to recently using the InterSystems Package Manager for some CICD process I'm building using Intersystems IRIS and IRIS 4 Health, I wanted an easy and integrated way to search/view/install packages related to the Intersystems tech stack.

I recently built a VSCode extension for IPM repositories that I will be open sourcing and publishing to the marketplace but wanted create this post to get some feedback from the community.

5
2 482
InterSystems Official Timothy Leavitt · Dec 17, 2024

We have released IPM 0.9.0. I previously remarked on some of the history and reasoning here; to summarize, this is a big release for two reasons: it represents a long-overdue reunification of our internal and community-driven work around IRIS-centric ObjectScript package management, and it has some backwards incompatibilities. There are several necessary backwards incompatibilities in our roadmap, and we've lumped them together; this will not be some new norm.

3
0 294
Article sara aplin · Dec 20, 2024 2m read

Monitor incremental changes in the database through scheduled tasks, display change trends through charts, set alarm thresholds, and write information to messages.log

How to use it

You can install it through Docker or ZPM

Deploying with Docker Prerequisites

Make sure you have git and Docker desktop installed.

Installation

1.Clone/git pull the repo into any local directory

git clone https://github.com/Sara771dev/Database-Size-Monitoring.git

Open the terminal in this directory and run

docker-compose build

Run the IRIS container

docker-compose up -d

ZPM Package Deployment

Open the terminal to run

zpm "install databasesizemonitoring"

Create scheduled tasks

TypeDescribe
AlarmSizeDatabase size alarm
DayActualSizeDaily increase in alarm volume size
IncrementalSizeAtual total increase in alarm volume size

image

If the database size changes by more than the specified value, other information will be written to messages.log

At the same time, you can count the incremental trends of the database. You can visit the following page

http://127.0.0.1:52773/csp/user/DataBases.Page.Chart.cls

imagetip: If you cannot access the Page, you may need to adjust and Web application and change the server file of /csp/user to always and cache.

0
1 240
Announcement Timothy Leavitt · Oct 11, 2024

InterSystems Package Manager 0.9.0 Beta

I am excited to announce the upcoming release of InterSystems® Package Manager (IPM) version 0.9.0. This has possible impact for all users of IPM and we would welcome the community’s feedback prior to release.

How can I get involved?

As an important note, this is a beta and not yet recommended for use in production. You can find the latest v0.9.0-beta.x release at https://github.com/intersystems/ipm/releases. Under assets, there’s a file named zpm-0.9.0-beta.x.xml. Download this and then load it with $System.OBJ.Load(filename,"c"). If you find any issues, please report them at https://github.com/intersystems/ipm/issues.

When will version 0.9.0 be released on the Open Exchange?

December 16, 2024 (ultimately; we slipped on this a bit due to holidays and some unexpected late-breaking issues)

What has changed?

The most significant change is the restructuring of the codebase and rename of all classes, from %ZPM to %IPM. This isn’t expected to impact most users of IPM but if you have packages that extend or reference package manager classes, they will need to be updated. The %IPM package is mapped to the namespace-default routine database on installation, with the option (but no longer the requirement) to make it available instance-wide; the latter is done automatically on upgrade from earlier IPM versions that were available instance-wide. There are several reasons for this change:

  • InterSystems is taking real ownership of this code, so the naming should move out of a space reserved for users.
  • Code living in IRISSYS – such as classes prefaced with %Z – gets some special security exceptions that we don’t want IPM to have.
  • A package mapping approach allows different versions of IPM to run in different namespaces on the same instance. This is helpful if multiple distinct applications are running on the same instance because they are now able to update IPM independently.
  • The original %ZPM package structure was based on some early design intent that is now outdated. Renaming was also an opportunity to make the class names and package structure more intuitive.

We have added automation around testing of the most popular Open Exchange packages, which gives us confidence that the rename and numerous other changes do not have widespread functional impact.

Why is this release important?

It’s helpful to provide a bit of history here. From 2016-2018, I led a team building a package manager for use in development of InterSystems HealthShare® products and InterSystems IRIS® for Health. Our objective started out as revolutionizing the installation and upgrade process for HealthShare, but quickly shifted to taking an enormous, monolithic ObjectScript codebase and making it more modular; a package manager goes a long way to help with that. At the same time, Evgeny Shvarov saw a need for providing a standard way to define and distribute InterSystems ObjectScript-based projects from the open-source community. A package manager is the right tool for that job, too. So Evgeny and team forked the HealthShare package manager, and different teams continued to develop the two projects independently for many years. The community and Evgeny’s team made amazing contributions to ZPM, but most of InterSystems direct investment was in the HealthShare package manager, from within the HealthShare development team. Unsurprisingly, there was significant divergence between the two codebases due to differing needs and use cases, and each package manager was ahead of the other in different ways. We have finally finished reconciling the two, bringing together the best of both, and the release of InterSystems Package Manager 0.9.0 finally marks the point where we just have one package manager. Going forward, investment from InterSystems development in IPM will benefit the community (rather than just HealthShare development), and we are ready to reengage with the community that has driven so much innovation in the past. This work has been a long time coming and has gone through a few changes in ownership, but I am now the architect for IPM, with Bob Kuszewski serving as product manager.

What’s coming next?

We have a lot of big things we'd like to do. These include a focus on improved documentation, catching up with industry standards around software supply chain security, better support for publication and distribution of different artifact formats (such as deployed code targeting multiple versions), and eventually adding options to enable IPM at instance installation and namespace configuration time. We want to hear from you, too, whether that's here or through GitHub issues or discussions.

Known Issues

In general, you can see the latest known issues here: https://github.com/intersystems/ipm/projects/8

If any particularly notable new issues are discovered, I’ll update this post.

7
1 295
Question Jani Hurskainen · Oct 30, 2024

I assume IPM manifest tag UnitTest is tightly coupled with the standard unit test framework, right? However we have our own one that predates the standard one and we are not going to switch.

I think I need to import the unit test cases and then be able to run a single class method for the test run. Any ideas how this would be possible?

9
0 149
Question Jani Hurskainen · Oct 29, 2024

I'm working on my first (!) IPM module and I'm a little puzzled with the registry authorization.

I have a working local registry (I hope!) and the module is loaded (with load-command) to the namespace.

Now publish-command fails because of missing authorization. I have set nothing authorization related myself and I'm lost how the authorization should be configured. All the material I have read so far seems to ignore that and only mentions one have to authenticate ...

Here's the command output:

6
0 173
Question Jani Hurskainen · Nov 5, 2024

I have a custom IPM resource processor like:

<Resource Name="example.json" ProcessorClass="OSEX.ipm.demo.IpmResourceProcessor" Foo="from manifest Resource attribute"/>

What is the best practice to deploy the custom resource processors to the IRIS instance? It can't be part of the module that uses it for obvious (?) chicken-egg situation.

My best idea atm is to put all those custom processors into a (library) module and all modules using any of them just have a dependency to the custom processors module.

0
0 67
Discussion Timothy Leavitt · Oct 31, 2024

Is anyone using the IPM client (e.g., running commands like zpm "install somepackagename") on an IRIS version earlier than 2022.1?

We're thinking about raising the minimum supported version so we can use Embedded Python in IPM. I'm curious if this would impact anyone. Of course, you'd be able to continue to use an earlier version of IPM.

3
0 140
Question Jani Hurskainen · Oct 30, 2024

It's not supported at the moment but is it possible to implement the Sonatype Nexus (or JFrog Artifactory) support based on the current (or upcoming) IPM version?

In repo command help I see there is a support for filesystem repositories (which I have not yet tried) and my current (hopefully not far-fetched) interpretation is the IPM is designed to be able to support different repositories:

5
0 166
Question Jani Hurskainen · Oct 30, 2024

I'm trying package IPM command but I'm getting the following error:

zpm:IPMTEST1>package -verbose -only -path /home/irisowner/ osex-ipm-hello

[IPMTEST1|osex-ipm-hello]       Package START
Exporting 'OSEX.ipm.hello.Hello.cls' to '/home/irisowner/src/OSEX/ipm/hello/Hello.cls'
Exported to /home/irisowner/module.xml
Module exported to:
        /home/irisowner/

[osex-ipm-hello]        Package FAILURE
ERROR! ObjectScript error: <VALUE OUT OF RANGE>zConstructTar+19^%ZPM.Utils.FileBinaryTar.1

What's wrong here?

I can see all the correct module files created:

2
0 112
Question Jani Hurskainen · Oct 28, 2024

I'm trying out the package manager (IPM). I'm trying to create a local (private) registry. To me it looks like the local registry installation succeeded but I can't figure out how to use it.

I'm using latest stable v0.7.3.

I have uploaded one module there (as told in one forum post):

$ curl http://localhost:52774/registry/
{"version":"1.3.2"}
$ curl http://localhost:52774/registry/packages/-/all
[{"name":"objectscript-math","description":"Math library for InterSystems ObjectScript","repository":"https://github.com/psteiwer/ObjectScript-Math/","origin":"","versions":["0.0.5"],"is_owner":0}]
4
0 151