
Initial Release
An agent co-pilot for the InterSystems IRIS System Management Portal.
A rebuilt portal for the six areas administrators live in, with an AI agent beside every screen.
Live demo · Quick start · Get a key · Walkthrough · Developer reference
OcuPilot is an Angular portal served from the IRIS instance itself, with an ObjectScript REST API
behind it. It covers the six areas named by InterSystems’ “Build Your Own Management
Portal” contest - web applications, permissions,
security and secrets, tasks, OS management and the logs - with list screens, row actions and full
editors that work against live instance data.
A panel docked on the right of every screen holds the agent. It sees the screen you are on, answers
questions about it from the rows in front of you, opens the screen a conversation is about, and
changes settings through tools that run strictly as you. Every change it wants to make is shown as
a proposal you confirm; nothing changes until you press Confirm. The change then runs with your own
privileges, is marked in the IRIS audit database as an agent write, and the screen refreshes and
marks the row that changed.
ocupilot.org runs the current release on a real IRIS for Health
instance. Sign in as demo with the password ocupilot-demo.
demo account can administer all six areas. It cannot see or change the agent’s ownoperator with the passwordocupilot-operator: an operator who runs tasks and processes but holds no security privileges.
Asking about the screen you are on - the agent reads the task schedule and history and explains
what needs attention.

Full editors - here the SSL/TLS configuration editor, with its connection test.

Fewer privileges, plainly explained - signed in as operator, the agent declines a security
change and says what would be needed; Home marks the screens this user may not open.

Light and dark - every screen in both themes.

OcuPilot/Security/AgentWrite, and the screen marks the changed row.%All holder, _SYSTEM, the signed-in user, the serviceCtrl+K),| Area | Screens | What you can do |
|---|---|---|
| Web applications | Web applications, REST API explorer, OpenAPI document viewer | Create, edit, enable, disable and delete applications; browse every REST application’s endpoints |
| Permissions | Users, roles, resources, services | Create and edit users and roles, set passwords, grant and revoke roles and resource permissions, enable and disable services |
| Security and secrets | SSL/TLS, X.509 credentials, wallet, OAuth 2.0 (client server descriptions, client configurations, resource servers, the authorization server, server client descriptions), LDAP, auditing | Editors for each, SSL/TLS and LDAP connection tests, OAuth token revocation, audit event configuration, and audit database copy and purge |
| Tasks | Task schedule, on-demand tasks, upcoming tasks, task history, task details | A New Task wizard, edit, run, suspend, resume and delete |
| OS management | Processes, process details, locks, system usage, databases, devices | Suspend, resume and terminate processes; edit devices; free space per database |
| Logs | alerts.log, messages.log, application errors, the audit database |
Search and page each log, filter the audit database to agent writes, delete application errors, and ask the agent to explain any entry |
You need Docker (Docker Desktop on macOS or Windows, or Docker Engine with Compose v2 on Linux)
and nothing else.
git clone https://github.com/jbrandtmse/OcuPilot.git
cd OcuPilot
docker compose up -d --wait
The first start takes a few minutes: IRIS for Health Community starts, then the container compiles
and installs OcuPilot. --wait returns once the health check reports OcuPilot installed.
Then open http://localhost:52774/ocupilot/ and sign in as _SYSTEM with the password SYS.
Community Edition ships _SYSTEM‘s password already expired; OcuPilot’s first install clears that,
so you are not asked to change it.
The host ports are 52774 (web) and 1973 (SuperServer), one above the IRIS defaults, so OcuPilot can
run beside an IRIS container you already have. The classic Management Portal stays available at
http://localhost:52774/csp/sys/UtilHome.csp.
The first time an administrator signs in with no model configured, OcuPilot opens the agent
definition form.
The key is never shown again: the field reads “Stored” and takes a new value only to replace it.
New definitions can propose changes; every change still waits for your Confirm.
The Docker path installs a small set of demonstration objects, so every screen has something to show
and the agent has something to fix. The IPM install never creates them.
/csp/myapp, a disabled web application with no resourceOcuPilotDemoTLS, an SSL/TLS configuration, and OcuPilotDemoCert, a self-signed X.509OcuPilotDemo.Sample, a wallet collectionTo install without them, remove OCUPILOT_DEMO: "1" from docker-compose.yml before the first
start.
| Provider | Default model | Where to get a key |
|---|---|---|
| Anthropic | claude-opus-5-5 |
console.anthropic.com → Settings → API keys |
| OpenAI | gpt-5.6-terra |
platform.openai.com/api-keys |
| Google Gemini | gemini-3.8-flash |
aistudio.google.com/apikey |
| OpenAI-compatible | none - you name it | Your own server: Ollama, vLLM, LM Studio and others |
http://host.docker.internal:11434/v1 - tick Local model andServer_Response_Timeout for a slow model; OcuPilot never changes that setting itself, andOcuPilot is also one IPM package. In the namespace you want it in (not %SYS or another system
namespace):
zpm "install ocupilot"
Then open /ocupilot/ on that instance’s web server. Two things differ from the container path:
IPM never clears an expired _SYSTEM password, and it creates no demonstration objects. The
installer grants the OcuPilotAdmin role to the account that runs the install when that is a named
user; otherwise it prints the one command that grants it. OcuPilot needs IRIS or IRIS for Health
2026.2 or later and IPM 0.10.0 or later. On plain IRIS Community, which has no HSCUSTOM
namespace, the container installs into USER.
OcuPilot is an administration tool, so it says plainly what it adds to an instance.
OCUPILOT, guarded by the %DB_OCUPILOT resource, which no ordinary roleOcuPilotAdmin resource and role, which gate the agent’s configuration. Using the agent/ocupilot (the portal’s static files, served unauthenticated),/api/ocupilot (the REST API: password sign-in, JWT, no server session) and/api/ocupilot/readiness.OcuPilotState and OcuPilotIdentity, a global mappingOcuPilotProvider, for model calls.OcuPilot/Security/AgentWrite, ConfigChange, SecurityChange, RoleGranted, LedgerRead).Uninstalling (zpm "uninstall ocupilot") removes what the installer created.
Open Web applications and ask the agent: “Enable /csp/myapp and give it the %Development
resource.” If you ask from another screen, the agent opens this one first.
The proposal card appears. It names the target, shows the fields that change with their
current and new values - computed on the instance from a fresh read, not by the model - the
privilege the change needs, and how to reverse it.

Press Confirm. OcuPilot re-checks that you still hold the privilege, that the target has not
changed since the proposal was made, and that the change is not prohibited, then runs it as you.
The screen refreshes and marks /csp/myapp as Changed; the panel shows the change done and
audit-marked, confirmed by you.

Open Logs → Audit database, tick Agent-marked events only and press Search: the
change is there as an OcuPilot/Security/AgentWrite event.

A proposal expires after ten minutes and can be confirmed once. It is refused if, in between, the
target changes, you are no longer the user who asked, or the conversation, the agent definition or
the read-only state changes.
flowchart LR
B["Browser
Angular 22 shell and agent panel"] -- "JWT" --> A["/api/ocupilot
ObjectScript REST"]
A --> M["IRIS management APIs
/api/admin v2 in-process, Security.*, %SYS.Task, logs"]
A --> T["Agent turn
background job"]
T <-- "screen context, tools" --> P["Model provider
Anthropic, OpenAI, Gemini or local"]
T --> R["Proposal
minted and stored on the instance"]
B -- "Confirm" --> A
A -- "write as the user" --> M
A --> U[("IRIS audit database
OcuPilot/Security/AgentWrite")]
/ocupilot; the API, the agent%UnitTest classes run inside IRIS; 76 Node test files and 106 Angular componentbash scripts/smoke.sh --container ocupilot --user _SYSTEM --password SYS asks the running instance whether OcuPilot works; the assertions live insideHTTP 401 from everything on a fresh container: _SYSTEM’s password is still expired. The
first install clears it, so this usually means an older iris-data/ folder was reused. Clear it
with:
docker compose exec -T iris iris session iris -U "%SYS" '##class(Security.Users).UnExpireUserPasswords("_SYSTEM")'
docker compose up --wait reports the container unhealthy: run docker compose logs iris and
look for the container-start: lines. LOAD-FAILED means a compile error, STARTPATH-FAILED
names the install step that failed. A failed install is retried three times and then left
stopped; fix the cause and run docker compose up -d --wait again.
Test connection says the model did not answer in time: see the local-model note under
Get a model key.
Anthropic refuses the key: create a key inside one workspace.
Ports 52774 or 1973 are taken: change the host side of the two port mappings in
docker-compose.yml.
OcuPilot implements two ideas from the InterSystems Ideas portal
that carry Community Opportunity status:
messages.log line, alert or audit record in front of itImprovements continue through the contest’s voting week, released to main in tested batches:
messages.log files in the Logs area (DPI-I-966);Beyond the contest, OcuPilot grows toward parity with the classic portal: the rest of the admin API
(namespaces, databases, journals, encryption), a code and SQL explorer, Interoperability, and every
remaining portal page.
https://github.com/jbrandtmse/OcuPilot/blob/main/docs/DEVELOPMENT.md is the contributor reference: the development container
and its start path, the installer, the smoke script and CI, the IPM manifest, VS Code setup and the
IRIS MCP server suite. Building the client needs Node ^22.22.3, ^24.15.0 or ^26.0.0.
OcuPilot was planned and built with the BMAD Method,
with Claude Code as the development agents: research, a product brief and PRD, UX design and an
architecture spine first, then every story through the same spec, implementation, QA, code review
and CI cycle. The planning documents are under
https://github.com/jbrandtmse/OcuPilot/blob/main/_bmad-output/planning-artifacts/.
MIT - see https://github.com/jbrandtmse/OcuPilot/blob/main/LICENSE. Third-party material redistributed with OcuPilot is listed in
https://github.com/jbrandtmse/OcuPilot/blob/main/ATTRIBUTIONS.md.