Initial Release
This application is built specifically for InterSystems IRIS and uses IRIS Management APIs to provide a modern management and observability experience.
It runs as an IRIS web application: a Vue 3 single-page app is served from the instance itself, and every screen is backed by a REST API that wraps IRIS’s own management surface.
Browser
│ static files + REST
▼
IRIS web application /iris-operations
├── SPA (static files in /usr/irissys/csp/iris-operations)
└── REST API /iris-operations/api/ioc → IOC.Web.Application
│
▼
IOC.Service.Management
│ (reuses IRIS's own APIs)
▼
/api/admin/v1 · /api/mgmnt · IRIS classes
IOC.Web.Application (routing and the response envelope) → IOC.API.* → IOC.Service.Management, which calls IRIS’s own management APIs with the caller’s credentials rather than reimplementing them.{ "success": true, "data": …, "meta": {} } or { "success": false, "error": { code, message, details } }.All endpoints live under /iris-operations/api/ioc and require the same credentials as the portal.
| Area | Endpoints |
|---|---|
| System | /system, /system/usage, /system/license, /system/processes, /system/memory, /system/disk, /system/devices |
| Dashboard | /dashboard |
| Applications | /applications, /applications/detail/:app, PUT /applications/:app, DELETE /applications/:app |
| Tasks | /tasks, /tasks/history, /tasks/history/:id, /tasks/detail/:id, /tasks/info/:id, /tasks/manager, POST /tasks/run/:id, POST /tasks/:id/enable, POST /tasks/:id/disable, DELETE /tasks/:id |
| Security | /users, /roles, /security/users/:name, /security/roles/:name, /security/resources, /security/audit/{records,enabled}, /audit/events, /certificates, /wallets, /secrets/:collection, /security/oauth/* |
| Explorer | /explorer/openapi/:ns/(.*), POST /explorer/send |
| Logs | /logs/audit, /logs/intelligence |
| Search and AI | POST /search/semantic, /copilot/status, POST /copilot/ask |
intersystemsdc/irishealth-community image, or any IRIS image that provides the SysAdmin management API and ZPM.docker compose up -d --build
Then open http://localhost:52773/iris-operations/index.html and sign in.
The instance’s password has to be set once before anything can sign in. The community image starts _SYSTEM with the password SYS, and the Management Portal forces a change on first sign-in — open http://localhost:52773/csp/sys/UtilHome.csp, sign in as _SYSTEM / SYS and set a password. The portal and this application share the same IRIS credentials, so whatever you set there is what you sign in with here.
zpm install iris-operations-center
The module compiles the classes, copies the built SPA into the instance’s CSP directory and invokes IOC.Installer.Setup() — the same class the Docker build uses, so both paths create the web applications identically and both end with a working UI. Open /iris-operations/index.html the same way.
Because ZPM installs the SPA from the repository rather than building it, frontend/dist/ is committed. Run npm run build before committing a frontend change; the Docker image builds its own copy from source and ignores the committed one.
| File | Purpose |
|---|---|
docker-compose.yml |
Service definition: build args, ports (52773 web, 1972 SuperServer), environment, health check, restart policy. |
docker/iris/Dockerfile |
Two stages: node:20-alpine builds the frontend, the IRIS stage copies it into /usr/irissys/csp/iris-operations/, compiles the classes and runs the installer. |
docker/iris/installer/install.script |
Compiles /opt/irisbuild/src into USER and calls IOC.Installer.Setup(). |
Pin a different base image with IRIS_IMAGE=... docker compose build. A data volume for /usr/irissys/mgr is provided commented out in docker-compose.yml; the installer removes and recreates the web applications, so building over an existing volume is safe.
| Variable | Purpose |
|---|---|
TZ |
Container time zone. |
IRIS_IMAGE |
Base image to build from. |
IOC_AI_ENABLED |
true to switch the copilot and semantic search on. Default false. |
IOC_AI_BASE_URL |
OpenAI-compatible base URL, for example https://api.openai.com/v1. |
IOC_AI_MODEL |
Model used for chat completions. |
IOC_AI_EMBEDDING_MODEL |
Model used for embeddings; defaults to IOC_AI_MODEL. OpenAI pairs e.g. gpt-4o-mini with text-embedding-3-small. |
IOC_AI_API_KEY |
Bearer token for that endpoint, if it needs one. |
Put these in a .env file beside docker-compose.yml — Compose reads it automatically, and .gitignore keeps it out of version control. Then recreate the container:
docker compose up -d
For a model running on the host (Ollama, LM Studio, vLLM), point IOC_AI_BASE_URL at http://host.docker.internal:11434/v1 so the container can reach it.
Ports and credentials are the image’s defaults: 52773 for the web server and 1972 for the SuperServer.
/iris-operations/index.html and sign in.Pick a REST application on the left; the middle column lists its endpoints from the OpenAPI document IRIS generates for that application. Selecting an endpoint fills the request builder on the right, where you can set method, path, query parameters, headers, an authorization header and a body. The response shows status, duration, headers and a pretty-printed body. Requests are executed by the instance against itself, so there is no cross-origin hop; credentials are whatever you enter, held in memory only.
CPU is reported as process CPU time — IRIS exposes per-process CPU, not host CPU percentage — so the CPU page charts CPU consumed per interval and labels it as such. Memory is IRIS shared memory. Network is the instance’s ECP links and client connections, since interface-level counters are not available. Disk capacity is not exposed by this IRIS version’s management API, and the page says so instead of showing invented numbers. Process termination is offered only for processes IRIS flags as terminable, and asks for confirmation.
The log centre reads the sources this instance can actually report: task runs and audit records. IRIS blocks web applications from reading files, and offers no API that returns the instance message log, so the System tab explains that rather than failing silently. The Intelligence panel groups event records into patterns — first seen, last seen, occurrences, failures, related services and severity — using Embedded Python.
Read-only by design. It explains system status, task activity, certificates and errors from data the pages already gather, and it cannot delete, restart, terminate, reveal secrets or change security. Switch it on by setting IOC_AI_ENABLED=true with IOC_AI_BASE_URL and IOC_AI_MODEL; any OpenAI-compatible endpoint works, and with it switched off the page says so plainly.
A short tour:
/api/atelier, read its General and Security tabs, then use the REST API Explorer on the same application.Screenshots are taken on the demo instance and added here for the contest submission.
frontend/ Vue 3 + TypeScript SPA (Vite)
iris/src/IOC/ ObjectScript classes
Web/ CSP.REST routing and response envelope
API/ endpoints
Service/ adapters over IRIS's management APIs
Installer.cls creates the web applications (Docker and ZPM)
docker/ Dockerfile and the installer script
module.xml ZPM module definition
Run the frontend against a running instance:
cd frontend
npm install
npm run dev # http://localhost:5173, /iris-operations proxied to 52773
npm run build # type-check and build into dist/, which is committed
The dev server reads frontend/.env.local to prefill the login so reloads do not ask again; the deployed build never contains credentials. dist/ is committed because the ZPM module ships it, so a frontend change is not finished until npm run build has run and its output is committed.
MIT — see https://github.com/David36791/IRIS-Operations-Center/blob/main/LICENSE for the full text. Copyright (c) 2026 David36791.