July 2026
QOps 3.0.10 ships with Portal 1.0.0. This is the release where QOps got a user interface. Everything before it was cmdlets: QOps-StartPortal opens a local web app on the machine that already has the module, and the work that used to be typed one command at a time now has a screen — the apps in the repository, what changed in them, what an operation is doing while it runs, and the log afterwards. Earlier manifests listed QOps-StartPortal, but nothing was behind it; this is the first release where there is.
What the Portal gives you
-
Studio, a file tree and a real editor. Monaco, several tabs at once, copy/cut/paste/rename and delete on the tree, and a confirm before leaving with unsaved work (QOPS-162, QOPS-181, QOPS-184, QOPS-286, QOPS-243, QOPS-198). Search runs across the repository or one object type, and Global Replace writes through every match and refreshes the editors behind it (QOPS-183, QOPS-193).
-
Documentation generated from the repository. Each app gets a page built from what is committed: sheets, widgets, measures, master objects and the script (QOPS-163, QOPS-221, QOPS-249). Where-used follows a field into inline widget expressions (QOPS-216). Two audit filters narrow the list to objects nothing references and to objects defined twice under different names, comparing formulas rather than text (QOPS-275, QOPS-278), and the filtered set exports to CSV (QOPS-274).
-
Lineage as a picture. The app drawn from script to sheet to widget, with a right-click that inspects a node, opens its source file, or jumps to it in Studio, a focus chain that hides everything unrelated to one object, and export to SVG, PNG or JSON (QOPS-128, QOPS-175, QOPS-188, QOPS-197).
-
Git without leaving the Portal. Branches, commit, stash, pull and push, including guided handling of a branch switch that would otherwise lose uncommitted work (QOPS-132, QOPS-133, QOPS-174, QOPS-145). The Diff panel shows the working tree grouped per app and names objects by title rather than by id (QOPS-135, QOPS-176, QOPS-192), and untracked files are listed one by one instead of collapsed into a folder row (QOPS-290).
-
Operations with the flags you would have typed. Prepare, Build, Reload, Publish, Release and a new Add App, each with its documented flags as toggles, a preview of the exact command before it runs, and a time estimate averaged over the last runs on this machine (QOPS-150, QOPS-212, QOPS-153, QOPS-139). Run them against one app or the whole repository (QOPS-159), and the history survives both a panel switch and a restart (QOPS-138, QOPS-30).
-
Logs while the operation is still running, streamed rather than arriving at the end, with a picker for one specific run and a search across every log file in the repository (QOPS-129, QOPS-191, QOPS-151, QOPS-281).
-
Settings that edit the configuration you already have. Global settings and profiles in one place, profile create, edit and delete, licence activation, and the active environment remembered per repository (QOPS-205, QOPS-206, QOPS-134).
-
Light and dark themes, applied without a flash on load and followed by the editor (QOPS-207).
Repositories written as YAML, and apps nested in -prj folders, are discovered the same as JSON ones (QOPS-125, QOPS-126, QOPS-144). The Portal carries its own Help, including a page describing what each panel is for (QOPS-32, QOPS-166, QOPS-289).
Licensing keeps working when LicenseSpot does not
An outage at LicenseSpot used to hard-fail every cmdlet on machines that were already activated. The genuine check now runs against the QOps licence service, which holds the authoritative record anyway, plus the offline signature on the .lic file (QOPS-246). Licences issued on the additive-trust client key do not involve LicenseSpot at all (QOPS-248).
The module
-
QOps-SetVersion switches to an already-installed version without downloading anything, forward or as a rollback, taking effect from the next cmdlet call (QOPS-74).
-
Newtonsoft.Json is current. The module moved from 6.0.8 to 13.0.4, and stopped hijacking that assembly for other modules loaded in the same PowerShell 7 session (QOPS-65, QOPS-38, QOPS-130).
-
‘;’ in a filter means OR, the way the documentation always described it. A trailing or repeated separator is handled instead of quietly widening the match (QOPS-87, QOPS-90).
-
Four crashes became messages:
QOps-SetLocalAppwithout a licence,QOps-Releasewhen no certificate is found,QOps-ShowDataConnectionson an empty result, andQOps-Buildon an app with no owner (QOPS-109, QOPS-110, QOPS-120, QOPS-287). -
QOps-Reload returns its result on an ordinary call, not only under
-Wait -ShowLogs(QOPS-66). -
A configuration write that fails says so instead of continuing quietly, and a
.qopsconfigheld open by another process no longer aborts the cmdlet (QOPS-67, QOPS-169). -
QOps-Update finds installs it used to miss, both flat and MSI, under either PowerShell root (QOPS-214).