
Initial Release
A modern, task-oriented management portal for InterSystems IRIS 2026.2+, built on the new
SysAdmin REST API (/api/admin/v2). Everything you click is a documented API call — and the UI
shows you that call, ready to copy as curl.
Online demo (read-only): https://niutics.pl/interSystems — sign in as demo / demo. Every screen can be
browsed; changes are blocked in the public demo, so run it locally (below) to try the actions.

demo / demo) or run it locally (below).messages.log, alerts.log, System Monitor,curl.The classic Management Portal grew screen by screen over decades. Admin Deck groups the same power
around the jobs people actually do:
| Persona | Screens |
|---|---|
| Build & integrate (developers) | Web apps & REST APIs, API explorer for all 190 SysAdmin endpoints |
| Secure (security admins) | Users, roles & resources with an access matrix, wallet secrets, X.509 credentials with expiry warnings, SSL/TLS configs, OAuth2 |
| Operate (operators / SRE) | Tasks (run, suspend, history, schedule), processes & locks, databases, namespaces, journals, devices, license |
| Observe | Live dashboard, status page with latency history, cross-subsystem timeline, log viewer (including rotated logs), recurring problems, similar-incident search, audit trail |
AdminDeck.Metrics) keeps the last hour in 5-second samples./api/monitor/metrics);SYS.Monitor.SAM.Sensors.PrometheusMetrics(), the call behind that%Service_* enable/disable), an access matrixmessages.log, alerts.log, System Monitor,^%ETN, all namespaces), security audit and Task Manager runs, withmessages.log, alerts.log, SystemMonitor.log, journal.log andmessages.old_* files; severity/source/text filters; recurring problems (messages200 OK only says the request was accepted. Edits in the screens’ forms arecurl. Great for learning%Admin_* privileges), server text rendered as text only (no HTML injection), log access restricted/api/admin/v2 over HTTP; theSuperUser/SYS login bound to localhost; the public demo is a separately hardened, read-only deployment.browser ── same origin ──► IRIS web server
├── /admindeck/ static single-page app (vanilla ES modules)
├── /api/admin/v2/* built-in SysAdmin API (all management actions)
└── /admindeck/api/* extension REST API (JWT)
├── logs Embedded Python log parser (current + rotated files)
├── apperrors application errors of all namespaces (SYS.ApplicationError)
├── os Embedded Python CPU / memory / disk metrics
└── search IRIS Vector Search over log entries
/api/admin intentionally rejects cross-origin requests, so the UI is served by IRIS itself.%Admin_Operate:USE, mirroring the SysAdmin API.python/admindeck) parses log files, groups messages into patterns, reads/proc and statvfs, and computes 256-dimension text embeddings (deterministic feature hashing —%Vector(DATATYPE="DOUBLE", LEN=256) columnAdminDeck.Data.LogLine) with an HNSW index (%SQL.Index.HNSW, cosine) and queried withORDER BY VECTOR_COSINE(...) DESC.More detail: https://github.com/DawidKrynski/iris-admin-deck/blob/main/docs/ARCHITECTURE.md.
Requires Docker with Compose.
git clone https://github.com/DawidKrynski/iris-admin-deck.git
cd iris-admin-deck
docker compose up -d --build
Open http://localhost:52785/admindeck/index.html and sign in with SuperUser / SYS
(demo container only — change passwords for anything else).
The Docker build seeds demo data through the SysAdmin API itself (https://github.com/DawidKrynski/iris-admin-deck/blob/main/scripts/demo_seed.py):
two X.509 credentials (one expiring in 12 days, to show expiry warnings), a wallet collection with dummy
secrets, a rotated messages.old_* log and a limited user demo_operator / operator (role %Operator)
to see privilege-aware navigation. Build with --build-arg DEMO=0 to skip it.
Check the instance with the smoke test:
scripts/smoke.sh http://localhost:52785
From a clone of this repository:
USER> zpm "load /path/to/iris-admin-deck"
or, once published to the Open Exchange package registry:
USER> zpm "install iris-admin-deck"
Then open http://<host>:<port>/admindeck/index.html. The package creates two web applications:
/admindeck (static UI) and /admindeck/api (extension REST API, JWT enabled).
intersystemsdc/iris-community:latest is still 2026.1, which is why theintersystemsdc/iris-community:2026.2-zpm. Tested on bothintersystemsdc/iris-community:2026.2-zpm and intersystemsdc/irishealth-community:2026.2-zpmdocker compose build --build-arg IMAGE=intersystemsdc/irishealth-community:2026.2-zpm), amd64;/proc, i.e. Linux / containers.set ^AdminDeck("Settings","HideHostDetails")=1 (in the package namespace) hides the%Admin_* resources for the screens they need (e.g. %All). Timeline: seven sources with per-source status |
Ctrl+K command palette |
A change verified by reading it back |
Status: component health and latency over the last hour |
Similar-incident search (IRIS Vector Search) |
Recurring problems in messages.log |
Tasks |
API console — every call, copyable as curl |
Access matrix |
X.509 credentials with expiry |
Web apps & REST |
API explorer |
curl.messages.log is indexed on installation; index other or rotated files with Similar incidents →# UI served live from ./web (edit and reload) docker compose -f docker-compose.yml -f docker-compose.dev.yml up -dUnit tests: JavaScript (verified changes, palette ranking) and Python (log parsing, embeddings)
node --test tests/js cd python && python -m pytest -q tests && cd ..
Integration tests: the SysAdmin endpoints the UI reads, the main write flows (web app, user/role/resource,
wallet, task, TLS) on throw-away objects, background tasks, extension API, security
python3 -m unittest discover -s tests/integration -v
End-to-end UI tests (headless Chromium)
uvx --with playwright python tests/e2e/test_ui.py
ObjectScript unit tests (6 test methods, 25 assertions)
docker compose exec iris iris session IRIS -U USER '##class(%ZPM.PackageManager).Shell("iris-admin-deck test -only -v",1,1)'
Look up any SysAdmin API endpoint in the OpenAPI spec
python3 scripts/endpoint.py /v2/task/run --schemas
Project layout:
src/AdminDeck/ ObjectScript: REST dispatch, installer, log/OS/vector classes
python/admindeck/ Embedded Python helpers (log parsing, OS metrics, embeddings)
web/ Single-page app (index.html, js/, css/, openapi.json)
tests/ %UnitTest classes
module.xml IPM package definition
Findings from building on the API, shared as feedback for its road to GA:
database-dir/info, integrity-check, security/audit/records, …) answer202 Accepted with an empty body; the task id is only in the Location header — which points to/api/admin/v1/async-result?id=… although the API is v2. Admin Deck reads the id from the header and pollsGET /v2/async-result.PUT /v2/web-app: ServeFiles / UseCookies are validated against the0–3) on create, while the spec and GET use strings ("Always", …) and edits accept strings."Never" does not exist: IRIS reports and accepts "No" and rejects "Never"/v2/monitor/dashboard/main: Licensing.LicenseUse and LicenseUseHigh are percentages, whileLicenseLimit right next to them is in license units — easy to misread as “13 of 8 units” (we did).POST /v2/task requires every Task field (notification lists, expiration, output, …), even for a simpleOAuth2ServerDefinition, butPUT /v2/security/oauth2/client/client-configuration rejects it (“not expected”) and requires ServerDefinition.SSLConfiguration, although the spec only marks it optional on updates.DELETE /v2/database-dir deletes IRIS.DAT even when a namespace uses theDELETE /v2/database checks that (409), so Admin Deck deletes the definition first.POST /v2/database-dir without GlobalJournalState creates a database with journaling off.Routines although the spec marks no field as required, and routine mappingsType field that PUT rejects (the type goes into the name, MyRtn_MAC).^) come back as 500 rather than 400.GET /v2/security/sql-privileges returns Object/Action, not the Name/PrivilegeGrantedVia: "Schema Privilege"; a column grant200 and records nothing; admin grants take one privilege per call.PublicPermission is rejected with a bare 400 (no error message) on bothGET reports "" for existing ones.VerifyPeer is required on create.<collection>.<secret>); a / separator yields/api/admin has no CORS support by design — a UI must be served by IRIS itself or through a same-origin proxy.Implements DPI-I-966 — Option to show older messages.log in IRIS SMP:
rotated messages.old_* and alerts.old_* files can be browsed, filtered and searched from the portal,
without shell access to the server.
Submitted to the InterSystems Programming Contest: Build Your Own Management Portal (2026).
MIT — see https://github.com/DawidKrynski/iris-admin-deck/blob/main/LICENSE.
Dawid Kryński — InterSystems Developer Community profile · GitHub