QOps 3.0.15

September 2026

Creating an application from the Operations panel

Build in the Operations panel has a New switch, matching -New on the command line, and it decides which applications the run is about. Leave it off and the run is an ordinary build: existing applications are built and a folder that names no Id is skipped. Turn it on and the run creates the applications for folders that name no Id, skipping the ones that already exist. Either way, every application you selected reports what happened to it.

Creating an application also gives its folder an Id, so QOps-Prepare, QOps-Reload, a release and the Portal all address it from then on like any other application. The recorded Id is the project folder name rather than the Qlik application id: the Qlik id stays in App.local, where each environment keeps its own, so a repository that creates an application is not tied to the Qlik it was created on. Only the Id field is written - the rest of the file, including its line endings, is left exactly as it was.

Updating no longer depends on the licence check

QOps-Update installs the new version whether or not the licence checks out. Where the check fails, or cannot run at all, the run says which of the two happened and carries on:

QOps-Update: license check failed. License is invalid: the license has expired. The update runs
anyway: QOps-Update does not require a license. Other commands do - run QOps-Activate to restore
them.

Every other command still checks the licence for itself, so this changes what you can update, not what you can do.

Configuration and setup

  • The configuration wizard is safe to step through and safe to decline. Pressing Enter at the certificate step keeps the value you already have, exactly as the prompt offers; a path that does not exist says so. Pressing Enter at the first step declines the wizard and leaves your configuration untouched.
  • A missing profile is reported immediately, and names the file that asked for it - so you know which configuration to fix rather than which command to rerun.
  • Your .gitignore keeps the rules QOps did not put there. Both the .qopsconfig rule handling and QOps-Pull now touch only what they are about: rules that merely share a prefix stay, the file survives attaching an origin remote, and it is restored on every path - including one where the pull does not complete. Each says in one line what it did.

Qlik Cloud and engine

  • Application descriptions behave like ordinary text. A description can be cleared as well as changed, it no longer grows a line break on each save, and quotes in it arrive intact.
  • Connection problems name the setting to change. An expired or wrong Qlik Cloud key names the API key setting and the command that replaces it, and connecting to Qlik Sense without a SenseUrl says that is what is missing - on both the repository and the engine connection.

Commands and output

  • An empty result says which kind of empty it was. Nothing found now distinguishes "no application projects here" from "projects are here, the filter matched none", names the scan root, and - where nothing was found at all - says that a folder holding App.json/App.yaml must be a direct child of the repository root or of an AppSubfolders entry.
  • A refusal reads as a refusal. QOps-ExportFile says why it declined instead of returning the silence that looks like a search with no matches.
  • A command with no -Filter tells you what it will act on. Reading and writing answer that differently, on purpose. QOps-ShowExtensions with no filter now lists every extension, instead of stopping at a repository filter that may never have been set and reporting nothing found. A write command still uses the filter saved in the repository, and where none is saved it touches nothing and says so, rather than reporting success having done nothing — pass -Filter * when you do mean all of them. A write that skips one names it and says why.
  • What QOps writes can be read back. An extension file whose bytes it cannot decode is refused before anything is changed, rather than uploaded with the undecodable parts replaced; and YAML strings containing tabs are quoted, so strict parsers accept them.