Changelog

Learn about new developer features and improvements.

Link to RSS feed

For the Qlik Cloud feature changelog, visit What's new in Qlik Cloud.

Introducing classic/chart

classic/chart is a new UI for [qlik-embed](../embed/qlik-embed/why-qlik-embed/). classic/chart renders visualizations that have not been converted to nebula.js or use the classic extension api.

Using classic/chart

Like other UIs available through qlik-embed, when you want to use classic/chart in an embedded analytics context, set the ui property to classic/chart. If you use qlik-embed web-components it will look something like this:

<qlik-embed
    ui="classic/chart"
    app-id="<appId>"
    object-id="<objectId>"
></qlik-embed>

classic/chart compatibility

classic/chart will render supported visualizations from Qlik Sense applications. For a full support matrix, refer to the supported charts page.

Third-party extensions

Third-party extensions may not render properly within embedded contexts compared to the native Qlik Sense experience if the extension manipulates private code such as CSS. Manipulating CSS in the native experience is not supported by Qlik, therefore, it’s not supported in qlik-embed.

To learn more about third-party extension compatibility with qlik-embed, please contact the extension author.

Limitations

classic/chart does not support the following features:

  • Right-click context menu
  • Export data

You can learn more about qlik-embed on the Why qlik-embed page.

The Qlik Platform Operations connector is a connector for Qlik Application Automation that enables deployment and management of Qlik Cloud tenants without coding.

The following blocks have been added:

  • Publish or Republish App to Managed Space: a convenience block which rolls together the capabilities in Publish App to Managed Space and Republish App to Managed Space to automatically replace apps if they already exist with the same name in the managed space.
  • Allocate Or Update User License: a convenience block for tenants on the user (professional/analyzer) license model, supporting automated assignment or update of user licenses in a single block.
  • RAW API List Request: a block which supports list API calls to RAW endpoints, removing the requirement for handling looped calls when making RAW calls.

The following blocks have been renamed to improve consistency:

  • Create Interactive Identity Provider: renamed to Create Interactive OIDC Identity Provider in preparation for updates to blocks for additional OIDC and SAML configuration options.
  • Update Interactive Identity Provider: renamed to Update Interactive OIDC Identity Provider in preparation for updates to blocks for additional OIDC and SAML configuration options.

Review Qlik Platform Operations connector overview for information on how to get started using the connector.

@qlik/api is a collection of javascript modules which each exposes an api built to make the integration process for javascript solutions as easy as possible. The library is built for both browser and NodeJS usage and will seamlessly integrate with qlik-embed libraries.

@qlik/api provides Qlik Cloud REST endpoints and access to the Qlik Analytics Engine (QIX).

REST

@qlik/api REST interfaces are generated from open-api specifications released from those Qlik Cloud services that exposes a restful API. The code generation tool runs using the specs, building typescript for all api calls documented in the specification. One module per api is generated.

You can learn more about the available modules in the REST section of the typescript types repository on Qlik Open Source.

QIX

Qlik’s Analytics Engine Service (QIX) is the runtime service for Qlik Sense applications and several analytics services in Qlik Cloud. @qlik/api offers a fully typed api for connecting to and consuming Qlik Sense Applications including “Qlik Sense mixins” which previously only was used internally by in-house Qlik developers.

More info about QIX can be found in the qix section.

Learn more about @qlik/api in the toolkits section.

This changelog provides 60 days’ deprecation notice of the Typescript version of the Platform SDK. The library is being replaced with the Qlik API.

The Qlik API offers the same capabilities and access to Qlik Cloud REST APIs and the Analytics engine, with the addition of officially supported Typescript types.

Switching from the Platform SDK to the Qlik API is straightforward, requiring only a few modifications to your code. The major change is in handling authentication when connecting to your Qlik Cloud tenant.

Authentication with @qlik/api:


//Backend applications
import { auth } from "@qlik/api";
auth.setDefaultHostConfig({
    authType: "oauth2",
    host: "<hostname>.<region>.qlikcloud.com",
    clientId: "<OAuth2_Client_ID>",
    clientSecret: "<OAuth2_Client_Secret>",    
  });

Authentication with Typescript Platform SDK:

const Qlik = require('@qlik/sdk').default;
const { AuthType } = require("@qlik/sdk");

const config =  {
  authType: AuthType.OAuth2,
  host: "<hostname>.<region>.qlikcloud.com",
  clientId: "<OAuth2_Client_ID>",
  clientSecret: "<OAuth2_Client_Secret>",
};

(async () => {
  const qlik = new Qlik(config);
  await qlik.auth.authorize();
})();

For more information about @qlik/api, refer to the release changelog for @qlik/api or visit the toolkit page at qlik-api.

The Qlik Platform Operations connector is a connector for Qlik Application Automation that enables deployment and management of Qlik Cloud tenants without coding.

Note: Some of the block updates below feature breaking changes. Your existing automations will remain unaffected unless you choose to upgrade by clicking “Upgrade to latest version” on the block.

The following blocks have been added:

  • Get Analytics Data Connection: retrieves the definition for a specific analytics data connection.
  • Create Analytics Data Connection: enables creation of analytics data connections using the recently updated data-connections API.
  • List Analytics Data Sources: lists all data sources available on the tenant against which data connections can be created.
  • Get Analytics Data Source Properties: retrieves the properties of a specific data source for use when determining which connectionProperties to pass into a Create New Analytics Data Connection block.
  • List Analytics Data Source Property Mapping: similar to Get Analytics Data Source Properties but formats the possible connectionProperties for easier programmatic use.
  • List Analytics Data Source Gateways: lists available Qlik Direct Access Data Gateways on the tenant for a specific data source.
  • Add Member To Space If Not Existing, Update If Existing: adds a user or group to a space if they are not already a member, or updates their roles if they are a member. Does not update users who are owners of a space.
  • Count Remaining API Keys: returns the number of API keys that the requesting user is able to create on the tenant. This is a function of the maximum number of API keys per user, minus the number of keys the user currently has.
  • Import Base 64 Encoded File To Temporary Contents: supports importing a base64-encoded file to the temporary contents service for downstream consumption in another service, such as report-templates.
  • Export Base 64 Encoded File From Temporary Contents: supports exporting a base64-encoded file from the temporary contents service.
  • Copy Analytics App: copies an analytics app on the same tenant.
  • Generate Automation Schedule Definition: helps to create a valid automation schedule for use in the Create automation or Update automation blocks.

The following blocks have been updated:

  • RAW API Request: breaking change - removed the key value entry input mode for this block due to incorrect translation of certain data types, leading to API errors. If you are using this block, make sure to create a copy before upgrading its version to avoid corrupting the input.
  • RAW API Request With Headers: breaking change - removed the key value entry input mode for this block due to incorrect translation of certain data types, leading to API errors. If you are using this block, make sure to create a copy before upgrading its version to avoid corrupting the input.
  • List Analytics Data Connections: additional input parameters have been added to align with available options on the API.
  • List API Keys: additional input parameters have been added to align with available options on the API.
  • Create API Keys: an example output has been added.
  • List Collections: a new enum has been added for collection type.
  • Create Collection If Not Existing: a new enum has been added for collection type.
  • Create Automation: an input for the automation schedule has been added to the block.
  • Update Automation: an input for the automation schedule has been added to the block.
  • Create Group: block output has been updated to return the created group or groups.
  • Update Roles Of Member From Space: removed unused required input assigneeId.
  • Update User: added enums for user status.
  • Publish App To Managed Space: an example output has been added.
  • Republish App To Managed Space: an example output has been added.
  • List Users: added information on how to list non-active users.
  • List Collections: added enum for public collections (publicgoverned).

The following blocks have been renamed to improve consistency:

  • List Data Connections: renamed to List Analytics Data Connections.
  • Delete Data Connections: renamed to Delete Analytics Data Connections.

Review Qlik Platform Operations connector overview for information on how to get started using the connector.

The Platform Operations connector is a connector for Qlik Application Automation that makes deploying and managing tenants in Qlik Cloud possible without code.

The following blocks have been added:

  • Get Current Tenant Hostname: returns the hostname for the tenant the automation is running on.
  • List Analytics Reloads: returns results from the Reloads API to list analytics reload information.
  • Add Role To User By Name: supports addition of individual roles to users by the name of the role.
  • Remove Role From User By Name: supports removal of individual roles from users by the name of the role.
  • Create collection If Not Existing: checks to see if a collection exists, if so, returns the collection, if not, creates the collection.
  • Get Sharing Settings: retrieves the current configuration of the sharing service for various reporting and sharing features in the tenant.
  • Update Sharing Settings: changes the configuration of the sharing service to turn on or off various reporting and sharing features in the tenant.
  • RAW API Request With Headers: similar to the RAW API Request block, but appends the response headers to the response body, since some Qlik Cloud APIs return information in the header.

The following blocks have been updated:

  • Get API Key Settings: removed the need to pass the tenantId as a block input, since you can only make requests for the tenant you pass the request to.
  • Update API Key Settings: removed the need to pass the tenantId as a block input, since you can only make requests for the tenant you pass the request to.
  • Update Collection: added support for changing collection type from private to publicgoverned to support managing public collections.

The following blocks have been renamed to improve consistency:

  • Enable Data Alerts: renamed to Update Data Alert Settings.
  • Get Auto Create Group Setting: renamed to Get Auto Create Group Settings.
  • Update Auto Create Group Setting: renamed to Update Auto Create Group Settings.
  • Trigger Enable Notes Settings: renamed to Update Notes Settings.

Review how to get started with the Platform Operations connector.

The Platform Operations connector is a connector for Qlik Application Automation that makes deploying and managing tenants in Qlik Cloud possible without code.

Following on from the addition of space type filtering to the items API, the Space Type filter has been added to the following blocks:

  • List items
  • List apps

The deprecated Shared filter has been removed from new and updated blocks. This does not impact blocks which are already in use in running automations.

Review how to get started with the Platform Operations connector.

The Platform Operations connector is a connector for Qlik Application Automation that makes deploying and managing tenants in Qlik Cloud possible without code.

Previously, the Qlik Platform Operations connector supported cross-tenant API calls only to the domain *.qlikcloud.com.

This update brings support for calling any Qlik Cloud tenant, including those in Qlik Cloud Government regions. Due to differences in Qlik Cloud Government, it is not yet possible to use the tenant create, deactivate, or reactivate blocks on Qlik Cloud Government tenants.

Additionally, the connector now supports passing a full tenant hostname. This means that you can now use either of these formats to connect to a tenant:

  • tenantname.region.qlikcloud.com - the full tenant hostname (recommended)
  • tenantname.region - the legacy, reduced path

It is now recommended that you use the full tenant hostname on all blocks for any new automations you create with the Platform Operations connector, by using the generic Variable block to define the hostname at the automation level.

Review how to get started with the Platform Operations connector.

The Platform Operations connector is a connector for Qlik Application Automation that makes deploying and managing tenants in Qlik Cloud possible without code.

Block updates:

The following blocks have been added to the connector:

  • Deactivate tenant
  • Reactivate tenant

These blocks add support for the deactivation, and eventual deletion of tenants from Qlik Cloud. For further information, refer to the delete tenant changelog.

Review how to get started with the Platform Operations connector.

Typescript v0.24.0: New API Intakes and Maintainance

feat: Intake Brands API

The [brands] API supports the creation and management of brands in the tenant. This allows you to provide a custom logo and favicon to help you enhance the user experience for your users. Below is an example of how you can use the API.

Important: Use of the brands API is permitted for OEM use cases only.

const qlik = new Qlik({...});
// upload a new logo
const logo = fs.readFileSync(path.join(__dirname, 'assets/logo.png'));
const brand = await qlik.brands.create(logo, 'my_awesome_logo');
// activate/deactivate and delete
await qlik.brands.activate(brand.id);
await qlik.brands.deactivate(brand.id);
await qlik.brands.delete(brand.id);

See full API reference here

feat: Intake Tenants API

const { tenants, users } = new Qlik({...});
// checks tenant/me
const { id } = await tenants.getMe();
const { tenantId } = await users.getMe();

// get a tenant & update settings
let tenant = await tenants.get(id);
const orgEnableAnalyticCreationSettings = tenant.enableAnalyticCreation;
await tenant.patch([{ op: 'replace', path: '/enableAnalyticCreation', value: !orgEnableAnalyticCreationSettings }]);

See full API reference here

Bugfixes

  • ⚠️ Breaking - fix: method name fixes in various APIs
// example method name changes:
app.recommendInsightAnalyses(...); // was previously app.recommend(...)
automation.retryRun(...); // was previously automation.retry(...)
// & some plural/singular fixes
collections.getFavorites(); // was previously collections.getFavorite()
webhook.getDelivery(...); // was previously webhook.getDeliverie(...)

Other Fixes

  • fix: render inline response object
  • fix: random nbr in group test by
  • fix: bump spectacular.ts to latest

To get started with the Qlik Typescript SDK, clik here

Python v0.16.0: New API Intakes and Fixes

feat: Intake for Brands API

brands = Brands(config=config)
# create upload logo to your tenant
file_dir = os.path.dirname(os.path.abspath(__file__))
logo_path = os.path.join(file_dir, "logo.png")
with open(logo_path, "rb") as logo_file:
    brand = brands.create(logo=logo_file, name="my_awesome_logo")
# get / activate / deactivate
brands.get(brand_id=brand.id)
brands.activate(brand_id=brand.id)
brands.deactivate(brand_id=brand.id)

See full API reference here

feat: Tenants API

tenants = Tenants(config=config)
# fetch information about your tenant
my_tenant = tenants.get_me()

# change settings
tenant_analytic_creation_setting = my_tenant.enableAnalyticCreation
my_tenant.patch(
    data=[
        {
            "op": "replace",
            "path": "/enableAnalyticCreation",
            "value": True,
        }
    ]
)

See full API reference here

feat: Intake for Notes API

notes = Notes(config=config)
# fetch notes settings
notes_settings = notes.get_settings()
# set settings programatically
notes.set_settings(data={"toggledOn": True, "snapshotRelations": True})

fix: [breaking change] variouse plurals/singular method names fixes

# webhooks.get_deliverie(..) changed to:
webhooks.get_delivery(..)
# collections.get_favorite(..) is now:
collections.get_favorites(..)
# and more

See full API reference here

To get started with the Qlik Python SDK, clik here

The Platform Operations connector is a connector for Qlik Application Automation that makes deploying and managing tenants in Qlik Cloud possible without code.

Block updates:

The following blocks have been added to the connector:

  • Get tenant name
  • Get tenant alias
  • Create key provider (part of Customer Managed Keys release)
  • Get key provider by fingerprint (part of Customer Managed Keys release)
  • Get ongoing migration details (part of Customer Managed Keys release)
  • Reset a migration to Qlik provider (part of Customer Managed Keys release)
  • List key providers (part of Customer Managed Keys release)
  • Trigger migration (part of Customer Managed Keys release)
  • Validate key provider (part of Customer Managed Keys release)

The following blocks have been updated in the connector:

  • Get tenant - this has been updated to use the new tenants endpoints
  • List automations - additional filter options have been added
  • Update tenant - made easier to use

Review how to get started with the Platform Operations connector.

Qlik-Cli v2.22.0

feat: Intake of the brands API

This API allows you to manage the branding of a tenant. For example, you can customize logos and favicons with your brand. You can activate this by using the command:

qlik brand create --name=<name> --file-logo=<logo.png> --file-favIcon=<icon.ico>
qlik brand activate <brand-id>

feat: Intake of group-create

The group-create command is a command used for creating groups. It can be used for managing access control for multiple users at the same time. For example, you can create a group called developers with the “Developer” role assigned.

qlik group create --name=developers --assignedRoles='[{"name":"Developer"}]'

You can get a complete list of roles using the command qlik role ls. --assignedRoles accepts either an ID or the name of a role.

feat: Tenant-edit command

The tenant-edit command now allows you to update your tenant-configuration in a command-line-editor of your choice.

  • docs: Edit-commands are no longer experimental
  • docs: The identity-provider commands are no longer experimental
  • fix: Bug when providing required body parameters from a file using the --file flag.

The Platform Operations connector is a connector for Qlik Application Automation that makes deploying and managing tenants in Qlik Cloud possible without code.

Block updates:

The following blocks have been added to the connector:

  • Get group
  • Update group
  • Add Role To Group By Name
  • Remove Role From Group By Name
  • Get tenant
  • Update tenant
  • Create space if not existing

The following blocks have been updated in the connector:

  • Create group - this has been updated to leverage the recently released groups REST API

Review how to get started with the Platform Operations connector.

The Platform Operations connector is a connector for Qlik Application Automation that makes deploying and managing tenants in Qlik Cloud possible without code.

Change to ratelimit handling

When making API calls against Qlik’s APIs, you are subject to ratelimits as described on our ratelimits page.

Previously, hitting a ratelimit during an automation would cause a failure of the automation, but new handling has been added that has changed the behaviour to respect the retry-after header returned when the ratelimit is hit.

This addition means you can remove any custom ratelimit handling implemented within your automations. It should now result in automations, which were failing previously, running until completion.

This change applies to all blocks on the Platform Operations connector.

Block updates

The following blocks have been updated in the connector:

  • Update auto create group settings - this has been updated to ensure that the value of both autoCreateGroups and syncIdpGroups are toggled on each call. This is to ensure parity with the behavior in the management console. If you wish to change these independently in future, use the Raw API call block.

Review how to get started with the Platform Operations connector.

Qlik-Cli v2.21.0

  • feat: Intake for note settings
qlik note settings update --toggledOn=true
  • feat: Intake of the transports API
qlik transport email-config ls # list email configuration settings
qlik transport email-config validate # validate the config
  • feat: Tenants API - updates
qlik tenant me # get current tenant information
qlik tenant patch <tenantId> 
  • fix: make tcs default in data-file create and update by making resumable flag default true
# to set resumable to false
qlik data-file create  --name <fileName> --file <filePath>  --resumable=false
  • docs: Explain quotes in body for Windows

  • fix: remove deprecated app-evaluator endpoint

  • fix: consistency in the data-file command now update use TCS like data-file create

  • fix: checks if context already exists in init command

  • fix: handle request bodies with a body property

Typescript 0.23.0: Browser friendly library

⚠️ Breaking - in this release all the data structures are now type aliases previously they were data classes

// previously
import { GenericSheetProperties } from '@qlik/sdk';
const sheetProperties = new GenericSheetProperties({...});

// now
import type { GenericSheetProperties } from '@qlik/sdk';
const sheetProperties: GenericSheetProperties = {...};

This change reduces drastically the bundle size of the library making it more optimized for browsers.

  • feat: notes settings API
import { Notes } from '@qlik/sdk';
const notes = new Notes({...});
await notes.setSettings({ toggledOn: true });
  • feat: transport API email-config
import { Transports } from '@qlik/sdk';
const transports = new Transports({...});
const emailConfig = await transports.getEmailConfig();
const validated = await transports.validate();
  • feat: apps API - change-owner on objects
// create a sheet
const sheet = await app.createSheet({ qMetaDef:{ title: 'temp sheet' } });
// change owner of the sheet
await app.changeOwner(sheet.id, { ownerId: anotherUser.id });
  • feat: groups API - create groups

You can now create groups using directly the groups API

import Qlik from '@qlik/cli';

const { roles, groups } = new Qlik({...});
// fetch the tenant admin role
const [ tenantAdminRole ] = await roles.getRoles({ filter: 'name eq "TenantAdmin"' });
// create group named avengers with tenant admin role
await groups.create({name: 'avengers', assignedRoles:[{id: tenantAdminRole.id}]})
// fetch the groups
const groups = await groups.getGroups({ filter: 'name eq "avengers"' });
  • feat: users API - invite user
const users = new Users({...});
// resend an invitation in swedish
await users.invite({ invitees:[{ email: 'tom.hanks@qlik.com', resend: true, language: 'sv' }] });
  • fix: allow using limit from query param for pagination

Python 0.15.0: API updates

  • feat: users API - update
qlik = Qlik(config=config)
# resend an invite to a user in your teanant
qlik.users.invite(
    InviteRequest(
        invitees=[{email: "tom_hanks@qlik.com", language: "sv", resend: true}]
    )
)
  • feat: groups API - updates

You can now create a groups:

qlik = Qlik(config=config)
tenant_admin_role = qlik.roles.get_roles(filter='name eq "TenantAdmin"')
# create group
data = GroupPostSchema(name="avengers", assignedRoles={ "id": tenant_admin_role[0].id})
new_group = qlik.groups.create(data=data)
# delete group
group = qlik.groups.get(groupId=new_group.id)
group.delete()
  • feat: apps API - new features

insight analysis: you now can list ()app.get_insight_analyses()) and get recommandations (recommend) from insight advisor through APIs

change the ownership of generic objects

app.change_owner(objectId = 'objectId', data = { ownerId: 'userId' })
  • feat: transport API email-config
config = Config(
    host=self.base_url, auth_type=AuthType.APIKey, api_key=self.api_key
)
q = Qlik(config=config)
email_config = q.transports.get_email_config()
validation = q.transports.validate()
  • fix: handle properties with leading numbers
  • fix: response type as requests.response

The Platform Operations connector is a connector for Qlik Application Automation that makes deploying and managing tenants in Qlik Cloud possible without code.

Blocks have been added or updated for the following APIs:

  • API keys
  • Apps
  • Automations
  • Brands
  • Collections
  • Content security policies
  • Data alerts
  • Data files
  • Groups
  • Licenses
  • Identity providers
  • Items
  • Spaces
  • Users

As a reminder, you can use the Raw API Request block to access any API in Qlik Cloud.

Block listing

New blocks:

  • Apps
    • Change app object owner
    • Change app owner
  • Automations
    • Change automation owner
  • Brands
    • Activate brand
    • Create brand
    • Deactivate brand
    • Get brand
    • Get brand file
    • Delete brand
    • List brands
  • Collections
    • Create collection
    • Delete collection
    • Get collection
    • List collection items
    • List collections
    • Update collection
  • Data alerts
    • Get data alert settings
  • Data files
    • Change data file owner
    • Change data file space
    • Copy data file
    • Create data file
    • Delete data file
    • List data file connections
    • Copy data file in space
    • Create data file in space
    • List data files from space
  • Identity providers
    • List identity providers
  • Items
    • Get item
    • Get item settings
    • List item collections
    • Add item to collection
    • Remove item from collection
    • List items
    • List items for lookup
    • Update item settings
  • Users
    • Invite user by email
    • Update user license

Updated blocks:

  • Create API key
  • List apps
  • List content security policies
  • List groups
  • Update API key settings
  • Add member to space with all roles
  • Export app to base64 encoded file
  • Find user assigned license

Review how to get started with the Platform Operations connector.

Qlik-Cli (v2.20.4)

feat: Added qlik app insight-analyse command for Insight Advisor analyses. Documentation for the API can be found here

feat: Added command for changing owner of an object. Documentation for the API can be found here

# Change owner for a specific object
qlik app object change-owner --appId <app-id> --objectId <object-id> --ownerId <owner-id>

feat: add publish & unpublish commands for Bookmarks, Dimensions and Measures.

# Publish a bookmark
qlik app bookmark publish <bookmark-id> --app <app-id>
# Unpublish a bookmark
qlik app bookmark unpublish <bookmark-id> --app <app-id>
# Publish a dimension
qlik app dimension publish <dimension-id> --app <app-id>
# Unpublish a dimension
qlik app dimension unpublish <dimension-id> --app <app-id>
# Publish a measure
qlik app measure publish <measure-id> --app <app-id>
# Unpublish a measure
qlik app measure unpublish <measure-id> --app <app-id>

fix: qlik context commands are no longer experimental

fix: qlik-cli is now based on Golang v1.20.4 to resolve security vulnerabilities.

fix: added missing body parameters for qlik qrs commands. This issue was reported on qlik-oss here

v0.22.0: Sense Client Objects & Mixins

  • feat: Sense Client Object Defaults support in the SDK

    Added support for Sense Client Objects, users can now easily do operations like:

// fetch the list sheets
const sheetList = await app.getSheets();
// get individual sheet and do operation on it
const sheet =  await app.getSheet(sheetList[0].id);
await sheet.publish()

and more:

// fetch the list fields
const fieldList = await app.getFields();
// fetch fthe list of fields (including system fields)
const fieldList = await app.getFields({ qFieldListDef: { qShowSystem: true } });
// listen to current selections
const currentSelectionsObj = await app.getCurrentSelectionsObject();
await currentSelectionsObj.getLayout();
currentSelectionsObj.on('changed', () => {
  // selections have been toggled
});
// create masterObjects & publish
const createdMasterObject = await app.createMasterobject({ qMetaDef: { title, description } });
// configure app properties
await app.setAppProperties({sheetTitleBgColor: '#ffcf03', sheetTitleColor: '#ffcf03'});
// list bookmarks easily etc...
const bookmarkList = await app.getBookmarks();
  • feat: enigma mixins are now enabled by default non raw rpc calls
// ex: to disable the bandwidth-reducing delta protocol you now need to set it to false
await app.open( { delta: false} );

v0.21.1: Maintenance Release

  • fix: Exclude nebula example from dep specs

    Excluding nebula example as it uses production non-approved dependencie parcel and nebula/stardust

v0.21.0: New Features and Bugfixes

  • fix: Handle property number name

    Added leading underscore to property names starting with number This fixes the problem with groups blocking updating of specs

  • fix: Throw engine message error Added a response error interceptor to throw a descriptive error message received from engine

  • fix: Replaced Buffer to btoa in browser build

  • chore: Refactor env_vars

  • chore: Use apiResponseInterceptor and add nebula integration test

    added empty once function next to the on-listener function - this should be a proper once function set properties in the open function: id, handle, type, genericType use apiResponseInterceptor - to set properties on result throw error from apiResponseInterceptor similar to enigma, should this throw an enigma error? wrap constructor for loop in if-isArray because of a non array response - needs investigation add browser integration test for nebula app using cypress

  • chore: Added once event listener Once event listeners are called only once on event and removed from listeners

hypercube.once('changed', () => {...});
  • chore: Allow event listeners to be async

    Async functions can be added as event listeners

hypercube.on('changed', async () => {...});
  • chore: Keep reserved keywords as class members (delete)

Language reserved words are modified only while using as formal parameters and kept as it is in class members which allows parsing request body with reserved words as keys to class object without loosing any fields from request body

Qlik-Cli (v2.19.0)

feat: commands for managing script versions in an app

# List script versions in an app
qlik app script version ls --appId=<appId>

# Create a version of a script
qlik app script version create --versionMessage="Version1" --script="Load RecNo() as N autogenerate(100);" --appId=<appId>

# Get the current version of a script
qlik app script version get current --appId=<appId>

# Get a specific version of a script. The scriptId is returned when listing script versions.
qlik app script version get <scriptId> --appId=<appId>

# Remove a specific version of a script
qlik app script version rm <scriptId> --appId=<appId>

feat: additional support for rows and json output for the qlik app eval command.

# By default the eval command will only return maximum 20 rows of data
qlik app eval <expression> --app=<appId>

# If additional data is wanted the number of rows can now be specified using the --rows parameter
qlik app eval <expression> --rows=5000 --appId=<appId>

# It is also possible to get the hypercube data pages in raw json
qlik app eval <expression> --rows=5000 --appId=<appId> --json

chore: Documentation updates:

Typescript SDK (v0.19.1)

New APIs (Questions, Audits, App Scripts)

  // Ask question regarding the reloaded data
  const question = 'What is the count of Prime?';
  const answer = await qlik.questions.ask({ text: question, app: { id: app.attributes.id } });
  // Get the list of event sources
  const sources = await qlik.audits.getSources();
  • feat added support for listing app script versions
  // saves a script with version called `v1`
  const script = 'Load RecNo() as N autogenerate(100);';
  await app.createScript({
    script,
    versionMessage: 'v1',
  });
  // retrieves all versions of the app script
  const { scripts } = await app.getScriptVersions();

Features

  • feat: Added support for registering an event listener for object changed and closed events.

    If an object handle is invalidated for instance when the data model has changed, then the handle will be part of a change array in the response for the method that caused the change.

    It is now possible to register a listener for an object, where onChanged is a custom defined function.

    hypercube.on('changed', onChanged);

    Handles can also be closed in a session if they are no longer valid. This can happen if for instance you have a handle for a field and the data model is changed/reloaded.

    field.on('closed', onClosed);

Improvements

  • fix: improvements for handling fetch depending on environment

    The global.fetch function is assumed to be available, and if not now an error will be returned. If it is not available then it can be added:

    1. For ES6-Modules and node-fetch you can use global.fetch = (args) => import('node-fetch').then(({default: fetch}) => fetch(args));
    2. For CommonJS and cross-fetch you can use global.fetch = require('cross-fetch');
  • fix: Handling of websocket close errors. If an error code is set when the websocket is closed, the SDK will now return an error containing the code and reason for being closed.

    // in case of an socket error the err will contain a `closeCode` and a `closeMsg`
    session.on('socket-error', (data) => {
        err = data;
    });

⚠️ Breaking change

Operations on sub-resources ex: get_reloads_log were previously generated as class static methods and required you to have the resource Id as parameter - now fixed.

public async getReloadsLog(reloadId: string): Promise<ArrayBuffer> {...}
// previously requiring appId
public async getReloadsLog(appId: string, reloadId: string): Promise<ArrayBuffer> {...}

This change affects the following resources: Apps, Automations, Collections, Extensions, Spaces, Themes and Weebhooks.

Python SDK (v0.13.0)

New APIs and Maintenance Fixes

config = Config(
  host=self.base_url, auth_type=AuthType.APIKey, api_key=self.api_key
)
oauth_tokens = OauthTokens(config=config)
# fetch all tokens for user with <userId>
tokens = oauth_tokens.get_oauth_tokens(userId="<userId>")
# loop through tokens and revoke them
for token in tokens:
    oauth_tokens.delete(token.id)
  # ask a question about the data
  answer = q.questions.ask(
    QueryCreate(
      app=QlikApp(id=app.attributes.id),
      text="What is the total sum of Prime?",
    )
  )
  # create a script
  app.create_script(ScriptVersion(script="Load RecNo() as N autogenerate(200);", versionMessage="v1"))
  # list the script versions in the app
  scriptMetaList = app.get_script_versions()
  # get a specific version of a script
  scriptObject = app.get_script_by_version(scriptMetaList.scripts[0].scriptId)
  # get the current script version (latest version)
  currentScriptObject = app.get_script_by_version("current")
  • fix: Operations on sub-resources ex: get_reloads_log were previously generated as class static methods and required you to have the resource Id as parameter is now fixed.
  • fix: clear all listeners on session and handles closed events
  • fix: raise engine connection close error
  • fix: pagination users

Here are the latest maintenance releases for the tools and SDKs. Those releases includes a number of bug fixes and security patches.

Python SDK v0.12.0

  • fix: add event listener to the RPC session
from qlik_sdk import Auth, AuthType, Config

# custom function that should be called
def opened_listener():
    print("sesssion opened")

# register function for event "opened"
rpc_session.on("opened", opened_listener)

with rpc_session.open() as rpc_client:
...     # opened_listener function is called when "opened" event is received in session
  • fix: readonly and allOf fields are now handled

  • fix: render param string enums for typings

  • fix: set type for the session property

  • fix: various improvements in the generated code-structure

Typescript SDK v0.17.0

  • feat: adding themes resource
const themes = new Themes({...});

const zipStream = fs.readFileSync(path.join(__dirname, 'assets/red-theme-extension.zip'));

// upload theme
const theme = await themes.create({ name: `red-theme-test-sdk-ts-${Date.now()}` }, zipStream);
  • fix: readonly and allOf fields are now handled
  • fix: improved typings for nested object types
  • fix: bumping all dependencies security patch releases

qlik-cli v2.18.0

  • feat: new resource added oauth-token
qlik oauth-token ls          # List OAuth tokens
qlik oauth-token rm <token>  # Revoke an OAuth token by ID
  • fix: properly handle deprecated operations and commands

Since the release of the Qlik Cloud platform SDKs earlier this year, the packages have recently been updated. The idea with the Qlik Platform SDKs is to let developers extend solutions without the need to develop them from scratch.

Python SDK (v0.11.0)

  • Feat: Allow full path in RAW rest calls. This feature in combination with interceptors unlocks QRS communication, for example:
def inject_csrf_token(req):
    csrf_token = "".join(random.choices(string.ascii_letters + string.digits, k=16))
    req.headers["x-qlik-xrfkey"] = csrf_token
    req.params["xrfkey"] = csrf_token
    return req
win_auth_instance = Auth(config=Config(
    api_key=qseow_api_key, host=qseow_host, auth_type=AuthType.APIKey))
win_auth_instance.rest.interceptors["request"].use(inject_csrf_token)
apps = win_auth_instance.rest(path=f"{qseow_host}qrs/apps/full")

Feat: Added new APIs

  • api-keys API
apiKeys = ApiKeys(config=config)
keys = apiKeys.get_api_keys()
  • audits API
audits = Audits(config=config)
sources = audits.get_sources()
  • Webhooks API
qlik = Webhooks(config=config)
name = "qlik-sdk-py-test"
url = "https://your-tenant.qlikcloud.com/api/v1/automations/{automationId}/actions/execute"
eventTypes = ["com.qlik.v1.app.created", "com.qlik.v1.app.reload.finished"]
headers = {
    "X-Execution-Token": "lXw9BRm1Ba1bb6MOcPDewNvk5WUmdre70bHljfv1KzNMuby9YXwkUExrCgapxoxn"
}
hook = webhooks.create(
    Webhook(name=name, url=url, eventTypes=eventTypes, headers=headers)
)
  • Quotas API
quotas = Quotas(config=config)
data = quotas.get_quotas()
  • Collections API
 qlik = Qlik(config=config)
# create collection
collection = qlik.collections.create({"name": col_name, "type": "public"})
app = qlik.apps.create({"attributes": {"name": app_name}})
items = qlik.items.get_items(resourceType="app", resourceId=app.attributes.id)
itemId = items[0].id
# add item to collection
collection.create_item({"id": itemId})
  • Automations API
qlik = Qlik(config=config)
name = "test-sdk-py-" + str(uuid.uuid1())
# create
automation = automations.create(data=AutomationDetailRequestObject(name=name))
# run
automation.create_run(RunDetailRequestObject(context="detail"))
# list runs
runs = automation.get_runs()
# delete
automation.delete()
  • Reload-Tasks API
qlik = Qlik(config=config)
app = qlik.apps.create({"attributes": {"name": "app name"}})
# create
task = qlik.reload_tasks.create(
    PostTaskBody(
        appId=app.attributes.id,
        timeZone="Europe/Zurich",
        recurrence=[
            "RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=MO;BYHOUR=14;BYMINUTE=16;BYSECOND=0",
        ],
    )
)
# list reload tasks
tasks = qlik.reload_tasks.get_reload_tasks(appId=app.attributes.id)
# delete
task.delete()

Docs

  • Cleaned up README and dded more dev documents
  • New example for auth flows
  • Added engima examples in README.md

Fixes

  • Inline return objects are generated as dataclasses
  • Allow sending dynamic properties for RPC
  • Support nested array object

Typescript SDK (v0.16.0)

  • Feat: Allow user to use full patch for RAW calls. This feature in combination with interceptors unlocks QRS communication, For example:
const injectXrfKey = ([url, config]) => {
  const _url = new URL(url);
  _url.searchParams.append("xrfkey", "ichBinEinBerlinR");
  const res = [
    _url.toString(),
    {
      ...config,
      headers: {
        "x-qlik-xrfkey": "ichBinEinBerlinR",
        ...config.headers,
      },
    },
  ];
  return res;
};
auth.rest.interceptors.request.use([injectXrfKey]);

const apps = await auth
  .rest(`https://win-server/jwt/qrs/app/full?filter=name eq '${appName}'`)
  .then((resp) => resp.json());
  • Feat: Expose session events
const session = await auth.rpc(appId);
session.on("traffic:sent", onTrafficSent);
session.on("traffic:received", (data: any) => {
  /** ... */
});
session.on("opened", onOpened);
session.on("notification:*", onNotification);
  • Feat: Added Relaod-Tasks API
const task = await reloadTasks.create({
  appId: app.attributes.id,
  timeZone: "Europe/Zurich",
  recurrence: [
    "RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=MO;BYHOUR=14;BYMINUTE=16;BYSECOND=0",
  ],
});
// list
const tasks = await reloadTasks.getReloadTasks({ appId: app.id });
  • Feat: Enum values in method and class props and parameters

  • Docs: Added engine examples to README.md

  • Fix: set session on Qix returned Object Classes

  • Fix: allow initiated objects

  • Fix: request and response interceptors promises

  • Refactor: EnigmaSession renamed to the more generic RpcSession

For more information see the package links below:

Please note that the Platform SDK packages are early development releases. So, please expect breaking changes as it updates and stabilize.

Changes in v2.15.0

  • Support for the new automation API with the automation command

    # get an automation
    qlik automation get <automationId>
    # list automation runs
    qlik automation run ls --automationId <automationId>

    See the command documentation here

  • Fix: Fail before request on missing path parameter

    qlik item update itemId --file ./my_file
    # now output an explicit error message about required parameters
    Error: required flag(s) "resourceType" not set
  • Fix: correct output when using the --json for errors

    qlik extension get don_t_exists --json
    # now outputs json ready to be parsed
    {
        "status": 404,
        "title": "Not found"
    }

2.14.3

  • New: Commands have been updated to reflect the latest API changes.

New API: Users

Updated: Spaces

Updated: Collections

  • New: OAuth 2.0 machine-to-machine support. Users are now able to authorize with Qlik Cloud SaaS over client credentials flow.

  • New: Added command for tenant creation.

qlik tenant create Note: This only works with specific entitlements such as an active subscription with the multiple tenants entitlement.

  • New: Added commands for web-integrations management. Web-integrations enable users to manage whitelisted origins that can make requests to a specified tenant (CORS).
qlik web-integration create --name myAllowList --validOrigins "https://www.google.com"
# returns a web-integration id
{
  "created": "...",
  "createdBy": "***********mSUL6MIzchD_",
  "id": "DSghcTBrzTkJBCN53IjQatRUWIJkvbno",
  "lastUpdated": "...",
  "name": "myQllowList",
  "tenantId": "**********PMZOEbLC9z52Op_G",
  "validOrigins": [ "https://www.google.com" ]
}
  • New: Added commands for groups and roles management.
qlik role ls | jq '.[] | select(.name | contains("AnalyticsAdmin"))'
# returns object with role permission for AnalyticsAdmin
{
  "createdAt": "...",
  "description": "...",
  "id": "********36af85d",
  "lastUpdatedAt": "...",
  "level": "admin",
  "name": "AnalyticsAdmin",
  "permissions": [...]
}
qlik group ls
# fetch existing groups
[
  {
    "createdAt": "...",
    "id": "*********df6c8fc0b36c",
    "lastUpdatedAt": "...",
    "name": "Administrators",
    "status": "active",
    "tenantId": "*****OVEWVPMZOEbLC9z52Op_G"
  },
  ...
]

To update to new version, use the command qlik update

previous version updates:

2.13.0

  • Fix: Added qlik-cli to User-Agent header
  • Fix: Creating IdP fo type JWTAuth now works identity-provider create jwtauth

Click to view full changelog updates

Platform SDK package

As more & more developers integrate & embed Qlik Sense, the need to simplify the development process is paramount. Announcing the new Qlik Platform SDK - a suite of tools, libraries, and documentation that simplifies building high-quality and performant applications on top of the Qlik Sense Platform. The idea is to let developers extend solutions without the need to develop them from scratch.

And the best part? The capabilities of the SDK comes in two programming languages - TypeScript & Python. With TypeScript, you will have improved definitions and enhanced developer experience with modern IDEs and the Python package opens up a whole new scope for the Python developer community to leverage the power of Qlik Cloud APIs.

Looking to get started? Here are the package links:

Please note that the Platform SDK packages are early development releases. So, please expect breaking changes as it updates and stabilize.

2.6.0

  • New: Added qlik edit command - you can now easily update resources without worrying about the complicated JSON Patch calculations. Based on the EDITOR environment variable, the edit command starts your preferred editor automatically and once your changes are saved, all PUT/PATCH operations are automatically done.

    If you want to see communication details for your edit call, you can use the --verbose flag. It displays all HTTP operations that are performed including payloads for requests.

    example:

    qlik webhook edit <webhookId>
    # this command launches your preferred editor containing the resource in json format
    # changing, for example, the description parameter is the equivalent of doing
    # a patch request with payload:
    # [
    #   {
    #       "op": "replace",
    #       "path": "/description",
    #       "value": "my new description"
    #   }
    # ]
  • New: Added qlik spec get provides more detailed information about added external specs, most notably the path to the added specification.

  • New: The auto-generated usage documentation now get automatically published to qlik-cli upon new releases.

  • Fix: Improved robustness in handling of array subtypes - missing types now return errors. Any included schema is thus required to have proper types defined. Previously, it defaulted to string if the type was missing.

The latest release of qlik.dev features a new documentation section for qlik-cli. Navigate to the

qlik-cli to learn more.

Here’s a sample of what you can expect with this new documentation:

a screenshot of some qlik-cli documentation on
qlik.dev

The latest version of qlik-cli allows better windows support, support for new APIs and notifications.

Here are the updates.

Chocolatey

qlik-cli is now back to Chocolatey

To install using choco:

choco install qlik-cli

To upgrade qlik-cli using chocolatey: choco upgrade qlik-cli

If you see an error like below:

Error retrieving packages from source The combination of parameters provided to this OData endpoint is no longer supported. Please refer to the this URL for more information about this deprecation.

Then first run: choco source list

Then remove the one matching nuget.org: choco source rm --name=nuget.org

Another way to fix a failing upgrade is to uninstall and reinstall.

 choco uninstall qlik-cli
 choco install qlik-cli

in v2.5.0 / v2.5.1

New - Added support for outbound proxy: you can now set the operating system environment variables called HTTPS_PROXY/HTTP_PROXY with the hostname or IP address of the proxy server.

Note: HTTPS_PROXY takes precedence over HTTP_PROXY for https requests. Qlik CLI supports only Basic Authentication.

Fix - Improve —limit flag descriptions

Fix - Updated the included latest Qlik Sense SaaS API-specifications

in v2.4.0

Updated Commands

Commands have been updated to reflect the latest API changes.

Notifications

Users to be notified when a new version of qlik-cli is available. The notification message contains URL with detailed changelog of the latest release.

Self Update CLI

The self update command enables users to update to the latest version of qlik-cli by simply running qlik update.

OpenAPI specs support

The latest qlik-cli update provides support for OpenAPI specs that define parameters at the path level. In this case, the parameters are inherited by all operations under that path.

Progress Bar

The animated progress bar displayed when uploading an app is now based on estimated upload time.

Support for unix-like Windows terminals

The latest version of qlik-cli provides better support for unix-like Windows terminals (such as MingGW, MSYS2, and Cygwin).

Fix

The latest version of qlik-cli also includes bug fixes and minor improvements.

in v2.3.0

Support for identity-providers endpoint

The identity-providers service is used for managing identity providers. In this version of qlik-cli the support for identity-providers endpoint is provied.

Support for questions endpoint

The questions endpoint lets user ask natural language questions against Qlik Sense apps enabled for conversational analytics. This version of qlik-cli provides support for this endpoint.

qlik question ask --app-id <appId> --text="new cases by department over time"

#returns a QueryResponse object containing conversational response
{
  ...
  "conversationalResponse": {
    ...
    "responses": [
      {
        "imageUrl": "/api/v1/temp-contents/6139c949f0ccf200019a09e2?inline=1",
        "sentence": {
          "text": "new cases by department over time"
        },
        "type": "chart"
      },
      {
        "narrative": {
          "text": "* New Cases is 180.\n* There were 18 of New Cases not associated to a Department. This may indicate a data quality issue."
        },
        "sentence": {
          "text": "new cases by department over time"
        },
        "type": "narrative"
      }
    ],
    "sentenceWithMatches": "**new cases** by **department** over time"
  },

Progress bar for Downloads

The latest version of qlik-cli also shows an animated progress during app download.

Spinner feedback

A new spinner feedback is added when users are waiting for server response using qlik-cli.

The latest version of qlik-cli adds resumable uploads for large Qlik Sense applications and bug fixes to improve overall usability. Here are the updates.

New feature highlights

Import large Qlik Sense apps

You can now upload large apps to SaaS tenants using qlik-cli using the qlik app import command. Use the --resumable switch to instruct the cli to handle the upload as a large file.

When you upload an app using qlik-cli, a nice animated bar appears displaying the progress.

File piping

File piping allows you to combine commands where the output of one may be used as the input of the next command you issue.

Command aliases

Aliases enable you to create shorthand commands for hard to remember long commands. For example, say you run a command frequently to find the guid of an application in your tenant, $(qlik item ls --resourceType app --name. You can use the alias command to create a shortcut it into something like qlik getAppGuid consumer+sales. This returns the complete JSON object for the consumer+sales resource in the items collection.

Limit flag added for listing apps

The --limit switch enables you to return a number of app resource objects per page ranging from 1 to 100.

Identifying experimental flags and switches in commands

Command switches and flags that are experimental features are labeled as such for your information.

Fixes worth mentioning

Temporary Upload Service

Use of the temporary upload service in qlik-cli caused problems with large app uploads and resumability. This problem has been fixed and implemented through the resumable switch in the qlik app import command.

Updated response from reload get command

In prior CLI versions, qlik reload get was not sending a correct response. This issue has been resolved.

Bullet list of all features and fixes in qlik-cli 2.2.0

  • feature: add limit flag when listing apps

  • feature: Support resumable uploads

  • feature: add status for qseow

  • feature: Support big apps

  • feature: show if a flag or command is experimental

  • feature: Add progress-bar

  • feature: add support for command aliases

  • feature: Add Patch description

  • feature: support for files piping

  • fix: Solve temporary upload service store issues

  • fix: Add timeout to Establish TCP connection

  • fix: append exprimental to long description with leading newline

  • fix: Honor optional request bodies

  • fix: handle empty stdin

  • fix: omit cookie header

  • fix: updated response for reload get

Update qlik-cli today by using brew if you use a Mac, or download the redistributable from here.

New commands

The license command in qlik-cli enables you to set license assignments for users in addition to providing metrics related to your tenant’s overall license footprint.

The evaluation command enables you to trigger Qlik Sense app evaluations through cli, retrieve the results, and perform additional commands based on the feedback. A handy command for automating devops of Qlik Sense apps.

New features

Flags that are deprecated in qlik-cli now show a warning message when used.

qlik api-key ls --sub="test"
"Flag --sub has been deprecated, please don't use it!"

A security enhancement has been made to remove session Ids from log messages


You can now add names to external specifications you sideload into qlik-cli. Here’s an example: qlik spec add ./my-spec.json --name foo

Breaking change

The response on the app command has changed. Now it returns only information from the Apps API.

#qlik app create command
app=$(qlik app create --attributes-name "example")
echo $app
#returns new response

{
  "attributes": {
    "_resourcetype": "app",
    "createdDate": "2021-02-15T07:01:43.930Z",
    "custom": {},
    "description": "",
    "dynamicColor": "",
    "encrypted": true,
    "hasSectionAccess": false,
    "id": "8be82d0f-02d2-4f0e-974c-08dc444384a7",
    "lastReloadTime": "",
    "modifiedDate": "2021-02-15T07:01:46.575Z",
    "name": "testttt2",
    "originAppId": "",
    "owner": "auth0|b96eb87010c7ad52667b2dc8b1ec0b12f97c43ae7848740874267b62aa45c856",
    "ownerId": "ffnbiWZyssMZ5ofRfLc1JzFdZrPvACFl",
    "publishTime": "",
    "published": false,
    "thumbnail": ""
  },
  "create": [...],
  "privileges": [...]
}

Instead of returning information from the items API.

#Breaking change

app=$(qlik app create --attributes-name "example")
echo $app
#returns old response

{
  "actions": [...],
  "collectionIds": [],
  "createdAt": "2021-02-15T08:15:57Z",
  "creatorId": "ffnbiWZyssMZ5ofRfLc1JzFdZrPvACFl",
  "id": "602a2dbd31d6bf3d1f471c31",
  "isFavorited": false,
  "meta": {...},
  "name": "testttt3",
  "ownerId": "ffnbiWZyssMZ5ofRfLc1JzFdZrPvACFl",
  "resourceAttributes": {...},
  "resourceCreatedAt": "2021-02-15T08:15:57Z",
  "resourceCustomAttributes": null,
  "resourceId": "22205ac6-406c-4484-b715-1da12219b044",
  "resourceReloadEndTime": "",
  "resourceReloadStatus": "",
  "resourceSize": {... },
  "resourceSubType": "",
  "resourceType": "app",
  "resourceUpdatedAt": "2021-02-15T08:15:57Z",
  "tenantId": "xrpC13FnjenBc-mhBG98ah2qNlfmwj8X",
  "thumbnailId": "",
  "updatedAt": "2021-02-15T08:15:57Z",
  "updaterId": "ffnbiWZyssMZ5ofRfLc1JzFdZrPvACFl"
}

From now on, to obtain the unique id referencing the app in the items API, you need to issue a qlik item ls command after running qlik app create.

qlik item ls --resourceId $app --resourceType app
#returns item information formerly seen in the old response

Bug fixes

  • Fixed a bug with qlik app ls returning non-app resources.
  • Fixed qlik qrs task start by-id which failed with no such operation message.
  • Resolved runtime errors using qlik-cli on Windows computers.

qlik-cli 1.7.1 released

qlik-cli 1.7.1 enables the qlik app reload command to perform partial reloads by adding the --partial flag to the end of the command. Update using homebrew on a Mac, Chocolatey on Windows, or download the linux distro from https://github.com/qlik-oss/qlik-cli/releases/tag/v1.7.1.

qlik.dev now with dark mode

qlik.dev supports dark mode.

qlik-cli 1.6.0: better, stronger, faster. This release has a number of performance improvements. Update using homebrew on a Mac, Chocolatey on Windows, or download the linux distro from https://github.com/qlik-oss/qlik-cli/releases/tag/v1.6.0.