Repository navigation
Releases
Aperture 1.7.3
- Bump the minor-and-patch group across 1 directory with 10 updates: @tabler/icons-react 3.48.0 to 3.49.0, @tanstack/react-query 5.103.2 to 5.104.3, react 19.3.0 to 19.3.1, react-dom 19.3.0 to 19.3.1, @axe-core/playwright 4.13.0 to 4.14.0, @playwright/test 1.63.0 to 1.64.1, @testing-library/user-event 14.6.7 to 14.6.8, postcss 8.5.28 to 8.5.30, prettier 3.9.9 to 3.9.10, vitest 5.0.2 to 5.0.5.
Aperture 1.7.2
- Bump the actions group across 1 directory with 3 updates: actions/setup-node 7.0.0 to 7.1.0, actions/upload-artifact 7.0.1 to 7.0.2, actions/download-artifact 7.0.0 to 8.0.2.
- Bump the eslint group across 1 directory with 3 updates: eslint 9.39.5 to 10.13.0, globals 17.12.0 to 17.13.0, typescript-eslint 8.70.1 to 8.71.2.
Aperture 1.7.1
- Bump nginx from 1.30-alpine to 1.31-alpine in /docker.
- Bump vitest from 4.1.11 to 5.0.2.
Aperture 1.7.0
Aperture 1.7.0 brings together four feature releases made since 1.3.0 (2 October 2026): interoperability productions, an SQL screen, FHIR servers for IRIS for Health, and SQL auditing, plus a review of the whole portal with its fixes applied. Each new screen was checked in browser tests against the in-browser demo and against a real IRIS for Health 2026.2.
New screens
Productions (1.4.0)
- Every production of the instance. A new Interoperability group lists every production of every namespace the account may use for interoperability, with its state and its hosts by status.
- A production and its hosts. Each host's errors of the last 24 hours and the newest one, read from its event log (a host's status only tells how its last message went). A drawer shows a host's event log, messages, queue, connections and settings. Message dates, which IRIS sends in UTC, are shown on the instance's clock like everything else.
- Start, stop and recover. A production or one of its hosts can be started or stopped from the production's header or the host's drawer. Each action is confirmed (stopping a production on a LIVE instance asks for its name), refused in a read-only tab and recorded in Activity. IRIS answers success to any request on that route, so Aperture reads the state back and says what IRIS reports. A troubled production, which IRIS will neither start nor stop, is offered Recover. While another production of the namespace runs, Start is disabled with the reason.
- Honest numbers. IRIS returns only a host's newest 50 event log entries, so a busy host's error count reads
n+and the screen says why. Accounts that IRIS does not let read event logs, messages or queues are not sent those reads, and the screen says what is missing. - Through
/api/interop-editors, the API of IRIS's own Interoperability UI, with the session's own sign-in: no second password.
SQL as yourself (1.5.0)
- Run SQL in any namespace as the signed-in account, so IRIS applies that account's own SQL privileges. Parameters, a row limit, results with each column's SQL type (sortable, filterable, CSV export),
EXPLAIN's plan, and the tab's recent statements. - The catalogue. Schemas, tables and columns from
INFORMATION_SCHEMA, with the first 100 rows of any table. Two more tabs show the statements running now and the statement index with its statistics, which were only in the classic portal until now. - Changes are deliberate. A statement that may change data (including a
CALL, and aSELECTthat calls a schema-qualified stored function) is named before it runs, confirmed, refused in a read-only tab and recorded in Activity. A procedure's result set is shown like a query's. - Through the Atelier API (
/api/atelier, the API VS Code uses), which takes a password, so a JWT session gives it once. The account needs%Development:USE. The demo runs statements in a small SQL evaluator of its own, since an engine that compiles SQL to JavaScript would needunsafe-eval, which Aperture's Content-Security-Policy refuses.
FHIR servers (1.6.0)
- On IRIS for Health and Health Connect, in a new Health group: every FHIR-enabled namespace and its servers, with FHIR version, storage, state and resources stored. A server's configuration, resources per type and re-index progress, the resource types and interactions its CapabilityStatement declares, its jobs, and the FHIR packages loaded.
- Changes with care. A server can be disabled and enabled (read back from IRIS), and reset, decommissioned or deleted after its URL is typed, each as an IRIS job followed to its end. Disabling a server on a LIVE instance asks for its URL too.
- Open servers called out. A server that answers a search without credentials is flagged, as is debug mode. (IRIS serves every server's
/metadatato anyone, so that alone raises no alarm.) - Through InterSystems' FHIR Server Management API (
/csp/fhir-management/api), with the session's own sign-in. On plain IRIS the screen says the API is not there.
SQL statements in the audit log (1.7.0)
- "IRIS SQL audit is disabled." As IRIS ships, every
%System/%SQLaudit event is off, so nothing records who changed what through SQL, from Aperture or any other client. The SQL screen now says so, reading system-wide auditing and the Dynamic SQL events: changes are audited withDynamicStatementDMLandDynamicStatementDDLon, queries withDynamicStatementQuery. - Switch it on from there. An account with
%Admin_Secure:Ucan enable change auditing, query auditing as a separate step, and system-wide auditing if it is off. Each is confirmed (it applies to every SQL client and grows the audit database), refused in a read-only tab, recorded in Activity and read back. Other accounts are told the state is unknown. - Checked live: with the two change events on, IRIS for Health 2026.2 recorded the SQL screen's
CREATE TABLE,INSERTandDROP TABLEunder the signed-in user. - The Health check's auditing check now reports SQL statements that go unaudited.
Security and reliability fixes
- A comment can no longer hide a change. An apostrophe in an SQL comment (
-- don't) made the followingDELETElook like a read, so it skipped the confirmation and the read-only tab. Statements are now read in one pass that understands strings, delimited names and both comment styles. - No SQL session outlives sign-out. The browser kept the Atelier session cookie, which went on running SQL as the account after sign-out. Every request now carries its own credentials and no cookie is kept.
- Passwords stay where they belong. An account without
%Development:USEno longer wipes the password that the Messages log, REST services and the Health check share, and neither does the log reader under an escalation role. Recent SQL statements that may carry a password are not kept, and the list is forgotten at sign-out or when another account signs in on the tab. - The dependency release no longer runs package code next to a write token. Updated packages are built by a job with a read-only token. A second job, which runs no package code, checks the commit and then tags and releases exactly the commit that was checked.
- The request export masks secrets in a body that does not parse as JSON, as it already did for valid JSON.
- The log reader is not called for an account without
%Admin_Operate(IRIS would refuse it as a wrong password and audit a login failure), pages past lines longer than its window, and Similar entries works for an%Operatoraccount. - nginx forwards the client's address on every IRIS route, and proxies only the FHIR endpoints'
/metadataand one anonymous search from/csp/healthshare, GET only and without credentials. - Smaller fixes:
- Explain with parameters filled in.
- Table previews with reserved-word names.
- Overlapping SQL runs.
- A namespace switch keeping old results.
- HTML entities in SQL errors.
- A message header column that held the body id.
- One menu entry marked per screen.
- An npm advisory in a build-time dependency (
npm auditis clean).
Upgrading
- IPM:
zpm "install iris-aperture"; the Docker image:docker pull ghcr.io/mxsalata/aperture:1.7.0. - Behind your own nginx: the new screens need
/api/interop-editors/,/api/atelier/and/csp/fhir-management/api/proxied, and for FHIR each/csp/healthshareendpoint's/metadataand one anonymous resource search (GET only, without credentials; the open-server check relies on it). The template indocker/nginx/default.conf.templatehas every location, and its multi-instance recipe says how to prefix them, the/csp/healthshareone included. - Privileges:
- SQL needs
%Development:USEon/api/atelier. - Productions follow the interoperability privileges IRIS reports for the account.
- Switching SQL auditing on needs
%Admin_Secure:U.
- SQL needs
Full changelog: https://github.com/MxSalata/aperture/blob/main/CHANGELOG.md
Aperture 1.2.0
- An opened log entry says how often its message was logged. The Messages log's entry panel now shows the count of entries worded like it ("Seen at least 250 times since ...") as it opens, read from the wording index as it stands, without indexing anything; Show similar entries lists them as before. The page says so under its title, and the demo's index is ready from the start, as on an instance that has used it, so Similar entries (IRIS Vector Search) no longer hides behind a button nobody knew to press.
- The README links the video and lists two more bonuses in its table: the YouTube video and the first-time contribution.
- Dependency updates arrive monthly and release themselves. Dependabot runs monthly, with the Mantine packages as one group and the ESLint packages as another. Once its pull requests are merged into
main, a job reads the Dependabot commits since the last version tag and makes one patch release that names them all: the version moves, the changelog gets a section,www/is rebuilt, the commit is tagged and released on GitHub, and the image is published as that version (1.1.1 was the first). No run that Dependabot starts holds a write token, and runs onmainno longer cancel each other, so a release is never cut off halfway.
The image: docker pull ghcr.io/mxsalata/aperture:1.2.0. The IPM registry keeps 1.1.1 until the Open Exchange release after the voting week.
Aperture 1.1.1
- Bump globals from 16.5.0 to 17.12.0.
- Bump node from
b6f26b3to0a7108bin /docker. - Bump the minor-and-patch group across 1 directory with 4 updates: @tabler/icons-react 3.46.0 to 3.48.0, @tanstack/react-query 5.103.1 to 5.103.2, prettier 3.9.7 to 3.9.9, typescript-eslint 8.70.0 to 8.70.1.
v1.1.0
From the comments on the article about the specification (Joshua Brandt, building OcuPilot on the same API, found what Aperture had misread and one write it would have missed), and a second review of 1.0.5.
- Suspended tasks show as suspended.
GET /v2/tasksanswersSuspendedfalse for every task, suspended ones included (sysadmin-api-specification issue #1; on IRIS for Health 2026.2, 2 of 19 tasks suspended by/v2/task/info, none by the list). Aperture had read it as a lag after a suspend. The Tasks screen now reads each task's state from/v2/task/info(four at a time; "Unknown" for an account without%Admin_Operate:U), the Health check finds suspended tasks the same way, the task page no longer compares with the list, and the demo's task list answers as IRIS does. The quirk is nowtask-list-suspended-false. - A resource save is read back. IRIS can answer 200 and keep nothing: a description longer than the 256 characters
Security.Resourcesholds leaves the resource as it was. Every resource write is now read back, and when IRIS did not keep a field the portal names it and keeps the dialog open; the description field stops at 256 characters. Quirkresource-put-not-kept; the demo drops a long description the way IRIS does. - The Job Center's progress bar follows every poll. A poll that moved only the progress figures in a task's
Result, without a new console line, was dropped, so on a real instance the bar stalled between lines; progress now counts as a change on its own. - Similar entries don't wait out a busy index. When another refresh holds the wording index, the search stops refreshing and answers with what is indexed, rather than asking up to 12 times.
- The keyboard reaches everything. Sortable table headers are buttons, so every list sorts with Enter or Space; "Skip to content" is the first Tab stop on every page and takes the focus past the navigation (without changing the route); the Refresh menu names its current interval "(current)" rather than marking it with a bullet only; timestamps carry their second reading as hidden text for screen readers, with no tab stop added.
- Three more actions ask first. Suspending or resuming the task manager, running a task now, and switching auditing off (in red) each open a confirmation, like every delete and purge.
- The Health check says what it could not read. An account that may list tasks but not read their state gets "The state of N of M tasks could not be read" rather than tasks taken for active.
- Smaller fixes. "Enable account" sends only the change, like "Disable account". A process page stops asking once the process has ended, and says so. A full disk's card says "The disk is full" instead of an empty size. Connections and the sign-in form warn that another origin fails in the browser (no CORS headers, and on the builds with their own policy, the Content-Security-Policy). The curl exports say they are quoted for bash and zsh. A test ties the About page's "New in" to the package version. The Tasks screen keeps each task's state for a minute.
- The README reads the same on Open Exchange. Open Exchange renders every line break inside a paragraph as a break, so the README's hard-wrapped paragraphs came out broken mid-sentence on the listing. Each paragraph and list item of README.md is now one line (Prettier
proseWrap: neverfor that file only). - The spec findings credit OcuPilot.
docs/SPEC_FINDINGS.mdhas a "Found with OcuPilot" section (the task list,GET /v2/web-appwithoutType,WSGITypeas a string, the resource write), and notes that the OAuth field of finding 6 and the halved journal records reproduce on IRIS for Health 2026.2. - Links that work on Open Exchange, and the second article. Open Exchange rewrote the README's in-page links (the Docker and IPM badges, the jump links, the "more" links) to GitHub's file tree, where they lost their place; they now point at the section of the README on GitHub. The second article, "20 places where the SysAdmin API specification and IRIS disagree", is linked from the header, the bonuses table, the spec findings section and
docs/SPEC_FINDINGS.md. "For judges" starts with the Health check and Similar entries, and "Tested on real IRIS" no longer repeats the verification section. - The README says why one image. A "Why one image" section: the image is the official IRIS Community 2026.2 with the package installed, Aperture has no server of its own to put in a second container, part of it lives inside IRIS, the browser needs one origin, and what CI checked is what runs. The image and Compose sections point to it, and the compose file's header says the same.