Skip to main content


· 34 min read

The 2021.2 release of the Thinkwise Platform features a lot of additions and improvements, and a large number of feature requests and tickets have been addressed.

Table of contents

Upgrade notes

SQL Server and .NET Framework support

  • The Software Factory development environment and the Intelligent Application Manager require SQL Server 2016 or higher.

  • This also applies to the Windows and Web user interfaces, which additionally need version 4.7 of the .NET Framework (4.7.2 is advised for Web).

  • Using Indicium (both Universal and Legacy) requires the .NET 5 Windows Hosting Bundle. Additionally .NET Framework 4.7.2 is required when using:

    • Indicium Legacy (Windows/Mobile GUI)
    • DB2
    • Crystal Reports
    • SQL Server Reporting Services.

For more information about supported technologies, see the Thinkwise Lifecycle Policy.

Upgrading from 2020.1 or earlier

If you're upgrading from version 2020.1 or earlier, it is required to upload all image and report files to the database once. More information about uploading images and reports can be found here: Images and reports should be uploaded

Upgrade validation

We have changed the data model for process action output parameters so a process variable can be assigned only once. An upgrade validation is made for the deleted duplicate assignments.

Breaking changes

Subroutines for type Function moved

The subroutines for type Function with return value table have moved to another code file, from functions to table_valued_functions.

File storage extension whitelist moved

Universal GUI

From now on, the extension whitelist for file storage is specified in the Software Factory instead of in the Indicium configuration. This whitelist can be used to limit the file types that can be uploaded. It can be defined for each file storage location separately, in the menu Projects > Project overview > tab Project versions > tab File storage location > tab Extension whitelist.

The whitelist setting in Indicium's appsettings.json won't be used any longer. So, as of this release, the whitelist has to be specified in the Software Factory.

Software Factory


Fallback language for applications

Universal GUI

A fallback language can now be specified by developers for a project version. The fallback language will be applied when a user uses a language that is not available for the application. It will affect both users using the application via IAM as well as users starting the application directly on the Software Factory. A language can, for example, be available if the application is started via IAM but not if it is started directly on the Software Factory. In that case, the fallback language is used.

When upgrading to version 2021.2, the fallback application language will be set as English. If English is not a valid language in your application, the upgrade will set the fallback language to the language having the most translated objects.

  • The fallback language for a project version can be changed in the menu Projects > Project overview > tab Project versions > tab Form > tab Project version.
  • The default fallback language for new projects and project versions is set in the menu Settings > Configuration.

As of Indicium version 2021.1.18, the session variable tsf_appl_lang_id is available. The statement select SESSION_CONTEXT(N'tsf_appl_lang_id') will send the user's language to the SQL server, for instance, ENG or NL.

Default user groups

To speed up the rollout of an application instance or an application for a new tenant, we've added the option to create a reusable, preconfigured set of user groups and role assignments in the Software Factory.

It is called Default user groups and can be found in the Software Factory in the menu Access Control > Default user groups. Here, developers can register the default user groups and role assignments. This may vary per project version.

Default authorization Default authorization

In the Intelligent Application Manager, users with the following roles can add the default user groups to a certain application for a provided tenant: root administrator, application administrator, or application owner. Selecting a tenant is only possible for root administrators and application administrators. An application owner may only provide for their own tenant.

The default user groups can be added to an application in the menu Authorization > Applications > tab Authorization, by using the task Apply default authorization. Any user group that does not yet exist for the tenant will be created, and new role assignments will be added. Existing role assignments will not be removed. Any role that is not available due to module authorization will not be assigned.

Default authorization in IAM Default authorization in IAM

Verify synchronization to IAM

Community idea

It is now possible to verify your synchronized model. Since the model is not locked during synchronization, it can be changed while synchronizing is in progress. This could lead to errors when a change applies to an object that has already been synchronized. For example, when a table has been renamed, but the columns have already been synchronized with the old table name.

By default, the option Verify synchronization is checked. Thinkwise advises sticking to this default. Deviate from it only if you're absolutely certain that no changes will be made during synchronization (e.g., in a one-man project).

Verify synchronization Verify synchronization

When the model changes during synchronization, a warning is shown. The prefilter Only warnings for last run will show which items contain changes. Based on the outcome, you can decide to rerun the synchronization.

Warning for verify synchronization Warning: model has changed during synchronization

It is possible to verify the synchronized model by:

  • Synchronization to IAM (in the menu Deployment > Synchronization to IAM > task Synchronize to IAM Task synchronize to IAM).
  • Synchronization to disk (in the menu Deployment > Synchronization to IAM > task Write to Disk Write to disk).
  • Creating a deployment package (in the menu Deployment > Deployment package > task Create deployment package Task create deployment package).

Partitioning available

Warning: This is an advanced feature that should not be used without a proper understanding of SQL Server's implementation of partitioning.

It's now possible to apply partitioning to the tables in your application. Partitioning allows data in a table to be stored in separate chunks on the file system. For very large tables this could possibly lead to a performance increase.

To get started with partitioning, a partition scheme needs to be created in the menu Data > Data model > tab Tables > tab Form. Open the pop-up next to the Partition scheme field.

The following information is required:

  • A name for the partition scheme (field: Partition Scheme).
  • A domain to determine which data type will be used to partition the data (field: Domain). This domain needs to be of the same data type as the column that is going to be used as the partition column.
  • The alignment for the boundaries of the partition ranges (field: Range). The boundaries can be aligned either left or right.

Partition scheme Create a partition scheme

After the partition scheme is created, boundaries need to be defined in the Partition boundaries detail tab. Boundaries determine where the data is going to be split. In the example below, every year on January 1st.

Partition boundaries Partition boundaries

The last step is to apply the partitioning to the table, in the menu Data > Data model > tab Tables > tab Form. Select one of the created partitions in the field Partition scheme, and select a column in the field Partition column. The partition column is the column that contains the data that will be used to partition the table.

Apply partitioning to a table Apply a partition to a table

Validation on shortcuts that are in use by the GUI

Some shortcuts (shift code + ASCII code) are dedicated to being used by the GUI, for example [ctrl]+[R] for filtering. So, if a shortcut is already in use by the GUI, it won't work for a self-made object like a task, report, or prefilter. New validations have been introduced to warn about this situation.

New menu setting: 'Show open documents'

Universal GUI

By default, the open screens are shown on top of a menu as Open documents. Now you can specify in the Menu settings if the open documents should be displayed or not. This is a setting that only affects the Universal GUI.

The Show open documents checkbox can be found in menu User Interface > Menus > tab Menus > tab Menus. Previously, these open documents could be hidden by using the extended property: HideOpenDocuments.

Show open documents Show open documents

New setting 'Translation review required'

In the 2021.1 version of the Thinkwise Platform, the option was introduced to approve and disapprove translations. Translations that were not yet approved or disapproved, would lead to validation messages.

However, not every project requires to review translations. For example, single developer projects, or projects where translations are being reviewed by an external party.

Therefore, we've created a new setting named Translation review required in the menu Settings > Configuration. When this setting not checked, the tasks to (dis)approve translations will be hidden. Also, no validations regarding (dis)approved translations will be shown.

Translation review Translation review required

New domain setting: make domain elements unavailable

Windows GUI Web GUI Community idea

It is now possible to mark a domain element as 'unavailable'. This way, it won't be shown in the drop-down, so it can't be selected for future entries. This setting doesn't affect older or historic entries. For these, the domain element is still available.

A domain element can be marked as 'unavailable' by unchecking the Available checkbox in menu Data > Domains > tab Elements > tab Form > tab Element.

New domain controls: 'Datetime short' and 'Time short'

Universal GUI Community idea

Two new controls (DATETIME_SHORT and TIME_SHORT) have been introduced. These can be used in domains (menu Data > Domains > tab Form > field Control). The controls show a DateTime or Time without seconds.

Note: In the Windows GUI and Web GUI, these controls can be used, but will be treated as DateTime/Time (with the seconds).

Domain controls New domain controls

'Debug' as message location for sending messages

We have added 'Debug' as a message location, which will show messages in the debug window when running the application in developer mode.

The message location indicates how messages should be displayed and can be set in the menu User interface > Messages. The options 'Popup', 'Panel', and 'None' were already available.

Priority added to messages with regular expression

Messages with a regular expression are parsed based on the error code. The messages are sorted alphabetically and the first message that matches the error code is used to parse the message. Now, we've added the priority column to these messages, so they will be sorted based on the priority.

Table tasks can be marked as grid double click action

Using the checkbox Grid double click in a table task makes it possible to execute the task by clicking twice on the desired row. The checkbox can be found in menu User Interface > Subjects > tab Subjects > tab Links > tab Tasks. Previously, this was possible by using the extended property: double_click_task_start.

Grid double click Grid double click

Trace information updates

The trace information has been improved by updating many tasks and triggers. From now on, when other fields in a table are updated, the update_user and update_date_time trace fields are also filled.

Column 'Type' in variant screens

The column Type was not present for several variant screens, like Filter, Search, and Sort. This column has been added for those screens, including the conditional layout. This made it possible to add the prefilters Possibly visible and Possibly editable, which are also available at the main table level.

First column by default set to primary key

Usually, the first column of a table is used for the primary key. Therefore, as of this release, it will be marked as such automatically. If you wish to deviate from this, it is still possible to uncheck the box. Previously you had to mark each first column manually as a primary key.

A new connector process action for OAuth 2.0 connection

Windows GUI Community idea

A new connector process action has been added: the OAuth connector. You can use it to retrieve an OAuth 2.0 authorization code, by redirecting a user to an external identity platform.

It can be used, for example, to leverage the Microsoft Graph API (Azure, Office 365, Microsoft 365) on behalf of a user instead of a service account. For this process action, input and output parameters are added.

Oauth connectors New Oauth connectors

This process action needs an OAuth server configuration to work:

Oauth server configuration Oauth server configuration

This server can be configured in the menu Projects > Project Overview > tab Project versions -> tab OAuth servers.

Oauth server Oauth server

It is possible to override these settings for development/testing purposes in the runtime configuration (menu Deployment > Runtime configuration > tab OAuth servers).

It is also possible to override the configuration settings in IAM (menu Authorization > Applications > tab OAuth server configurations).

Sequences available

Community idea

Sequences can now be created in the Software Factory. Sequences are database objects that can be used as a counter. A sequence can be queried to get the next number in the series. You can find the new sequences screen in the Data menu.

When a sequence is created, it will be generated to its own code file, which can be run on the database. The current implementation of sequences does not allow them to be used as a replacement for identity columns. Sequences can, however, be freely used in any functionality, for example, in defaults or default value expressions for a column.

Sequences Sequences

Planning poker to estimate story points for requirements

To make a good story points estimation for requirements with your team, the Planning poker feature has been added to the Software Factory. This feature can be found as a detail of the menu Specification > Requirement overview. Since the individual estimations may lead to discussion, a discussion panel is available. A message in the discussion panel can only be deleted and edited by the user who sent it.

  • Vote By using the Vote task, a development team can vote individually for their estimation of the story points. You can update your vote by using the task again.
  • Set When everyone has voted, the story points can be set for the selected requirement by using the Set story points task. The highest vote is selected by default.

Planning poker Planning poker overview

Project version increment in global configuration

Community idea

It is now possible to set a default project version increment of a hundredth, a tenth, or a whole number (so, .01, .10, or 1). By default, it's .10. You can change this setting in the menu Settings > Configuration > tab Configuration > field Project version increment.

Continue working in branches after merging

When merging a branch to the trunk (or another branch), it is now possible to indicate if you want to deactivate the branch (default) or continue working in the branch. When continuing the branch, a new version will be created in the branch after merging, based on the new target version.

Deactivate branch Deactivate branch

AWS S3 file storage subfolders

It is now possible to work with file storage subfolders when using the AWS S3 file storage.

AWS subfolders Subfolders for AWS S3 file storage

Unit tests: save and retrieve runtime info in results

When running a unit test, the runtime configuration, host, and database name are now stored in the Results tab.

The runtime configuration that was most recently used for all unit tests within a project version, will now be filled by default when executing a unit test. Previously, the default set runtime configuration was used. Since you'll usually use the same configuration, this will save manual adaptation if your configuration deviates from the default set runtime configuration.

The host and the database name are also shown for debugging purposes.

Unit tests: check output parameters for null or not null

Community idea

Unit test output parameters can now also be validated with a 'null', and 'not null'. Previously, validation was only possible with an 'equal to' function.

Expected output Expected output for 'null' and 'not null'

Unit tests: prepare query available

We have added the ability to add a prepare query to a unit test. A prepare query can be used, for example, to influence parameter values. It can be created in the menu Quality > Unit tests > tab Logic > tab Form > tab Prepare. Check the Use prepare query box to enable the query field.

Unit tests: output parameters for assertion query

The output parameters for a unit test are now also available in the assertion query.

Unit tests: parameter length increased

The length of the input and output parameters is increased so that all the object names will fit.

Unit tests: Task for showing unit test code

In the unit test screen (menu Quality > Unit test), we have added a task to show the unit test code. This can be used to debug the unit test.

Unit test code Task for showing unit test code


Version information extended

The version information (table sf_info) of the Software Factory now contains information of the user performing the installation or update, and the date on which the installation or update was performed. It used to contain only information regarding the creation of the installation or update package by Thinkwise.

Task for creating a new project

It is no longer possible to add a project by creating a new project record. Instead, you should use the task Create project in the menu Projects > Project overview > tab Projects.

Create project New task: create project

This task creates a project and a project version using the default configuration.

The default configuration is set in the menu Settings > Configuration. When critical information is missing, an error is shown and you are guided to the Configuration screen.

Create project Create project

Disabled mutation buttons in a view

Community idea

Since a view is by default not editable, we made sure that from now on, the Software Factory by default disables the mutation buttons (add, copy, delete, edit, mass update, import) when you create a view. The reason is, that it was often forgotten to disable the buttons, which resulted in errors if the user uses them. Of course, you can still deviate from this default.

There is no point in linking work to itself. For this reason, this is prevented from now on, by means of an error message.

Data sets moved to another menu

The data sets screen has been moved from the Data menu to the menu Quality > Unit tests > tab Data sets. The reason is, that data sets are only used in combination with unit tests.

Prefilters shown for subject tab pages

In some tab pages in the Subject menu (eg Search, or Filter), a prefilter named Possibly visible is active. This prefilter hides all the columns that will be hidden in the end product, because hidden fields are not the typical fields used for searching or filtering. But since the prefilters were not shown as buttons here, this meant that information easily could be missed. Therefore, the screen types for these tab pages have been altered to show the prefilter buttons on-screen.

Behavior of process action id names

The process action id is now automatically entered if the process action uses an object from the model, this provides the name with a context. If this is not the case, the developer has to enter an id. This way, the process action id gets a logical name that makes its function recognizable. The process action id can be found in the menu Processes > Process flows > tab Process actions > tab Process action > field Process action (under Description).

Subroutines for Indicium (Legacy)

It is now possible to choose whether or not a subroutine is published as an API by Indicium and/or Indicium Legacy. This is set in the menu Business Logic > Subroutines > tab Form.

Before, enabling the API checkbox would publish the subroutine as an API for both runtime service tiers. Now, the API checkbox only affects Indicium, and the API (legacy) checkbox only affects Indicium Legacy.

Any current subroutine with the former API checkbox enabled will have both checkboxes enabled after the upgrade.

Subroutine as an API Checkboxes for publishing a subroutine as an API

Developer field for a changelog after a merge

For every change pushed to the changelog, the developer id was changed as well. This also happened when a branch was merged. The person executing the merge session was set as the developer id for the changelog. The developer id will now remain the same when new changes are pushed to an open changelog of a control procedure with a review status or when a branch is merged.

We've improved and extended how the responsibility is displayed in control procedures and code search:

  • menu Business logic > Functionality > tab Templates: When a control procedure is in development, and you are not the responsible developer, the templates would already be shown in red. The same behavior now also applies when a control procedure is in review and you are not the responsible developer. In that case, the templates will also be shown in red.
  • menu Business logic > Code search: The same now also applies to hits on control procedures in development or in review when using Code search. If you are not the responsible developer, these hits are shown in red.


  • Truncation error when generating foreign key indexes - When generating foreign key indexes, the name of the foreign key is 'fk_' + the name of the foreign key. However, a foreign key has a varchar(300) data type, and an index has a varchar(128) data type. So, when a foreign key was too long, it led to a truncation error. To solve this, the foreign key name must be shortened, but also remain unique. Therefore, the foreign key name is now shortened to 120 characters, followed by a unique identifying row number (00001, 00002, etc.).
  • Form fields after a hidden field - Universal GUI When a field is hidden but contains form group or tab page settings, the next visible field in the form will inherit this information.
  • Merging to branch
    • When merging to the branch, the status of the old branch project version will now be changed to the chosen status in the Execute merge session task pop-up.
    • The merge sessions now have a default description for the two merging project versions. This editable description will also be used as a description for the new project version.
    • Community idea When merging to the branch, the project folder for the new project version is now copied from the previous branch version instead of the trunk.
  • Merge of control procedure in review - When a merge session includes control procedures in review, this would in some scenarios cause a change in the control procedure or one of its templates submitted for review would be omitted from the control procedure's changelog in the resulting merged project version. This has been resolved.

Intelligent Application Manager


Multi tenancy available

As of this release, multi-tenancy is supported. Tenants are only visible for root and application administrators. Other administrators can only see, add, and update users and user groups that are from the same tenant.

One tenant is included in every IAM by default. New tenants can be created in the new tenant screen, which you can find in the menu Authorization > Tenants.

Tenants Add a tenant

For every user and user group, it is possible to add a tenant.

For users, the field Tenant is available in the menu Authorization > Users > tab Form. For user groups, the field Tenant is available in the menu Authorization > User groups > tab Form.

Which tenants have access to which modules is visible in various ways:

  • Per tenant: information about the current access to applications and modules for each tenant (menu Authorization > Tenants > tab Form). The tabs Application administration analysis and Current access analysis can be used to delve deeper into the details.

Tenant overview Tenant overview

  • Per application: In the applications screen (menu Authorization > Applications > tab List), information about which tenants have access (column: Accessible by tenants) and which tenants have administrative access (column: Administrated by tenants) is available.

Tenant overview per application Tenant overview per application

To delve deeper into this information for the selected application, two cubes have been added to the menu Authorization > Applications > tab Analysis):

  • Application administration analysis: per application, the assigned administrative roles for each tenant, both root IAM administration and tenant self-administration.
  • Current access analysis: per application, which users have access to which module.

Detailed tenant information Detailed tenant information

Module authorization

It is now possible to set up module authorization in IAM. It can be used, for example, to limit or extend a tenant's access to IAM. This can be done at the application level and only by a root administrator or an application administrator.

To enable module authorization for an application, the Limited module access box needs to be checked (menu Authorization > Applications > tab Form).

Enable module authorization Enable module authorization. Field of interest: Limited module access

This activates the tab Module authorization, where modules can be authorized (activated or deactivated) for the application.

Authorized module A subset of authorized modules

Module authorization can affect roles:

  • Roles that are not a part of a module are always available.
  • Roles that are part of at least one authorized module, are also available.
  • So, if a role is only a part of unauthorized modules, it is not available.

Role configuration visible

The role configuration is now visible in IAM. This can help application administrators to configure user groups and troubleshoot authorization issues.

Role rights are displayed in three tabs (only granted role rights are shown):

  • menu Projects > Project overview > tab Project versions > tab Roles.
  • menu Authorization > Applications > tab Authorization > tab Roles.
  • menu Authorization > User groups > tab Authorization > tab Roles.

Password expiration in IAM

Community idea

In IAM, in the Global settings (menu Settings - Global settings) it is now possible to add an expiration period for passwords.

Password expiration Password expiration

For each user, the administrator can select an Expiration policy in IAM (menu Authorization > Users):

  • Force expired - The user needs to change the password on the next login.
  • Default expiration policy - After the number of days specified, the user needs to change the password. When the field Password expires in (days) is empty, passwords with * Default expiration policy will never expire.
  • Never expires - Use this for service accounts that never need to expire and have no user available to change the password.

Expiration policy Expiration policy

Faster second synchronization

Community idea

We've added a new mechanism to cache the synchronization. This results in a faster second synchronization of limited changes in the same project.

Note: working around supported features is not supported and not advised. But if you decide to make a manual change in the model anyway, you should also update the table sync_view to make sure that the synchronization will work as expected.

Azure authentication

Windows GUI Web GUI Indicium

Authentication type External will provide authentication for Azure Active Directory. You can set the authentication for users in the menu Authorization > Users.


Role inactivation instead of disposal

When roles or modules are no longer available, the existing role assignments and module assignments will now become inactive. Inactivation instead of disposal allows an administrator to fix mistakes in the configuration, either in IAM or during synchronization.

Roles can become unavailable due to changes in modules or module authorization, or due to synchronization.

In the example below, a role assignment is highlighted because its role is no longer available (menu Authorization > Applications > tab Authorization > tab Roles):

Inactive role The highlighted role is assigned but no longer available

Application (de)activation

Application owners are no longer allowed to activate or deactivate an application. This prevents the application owners from (de)activating applications that an application administrator is still working on. So, the application administrator decides when an application is ready to be handed over (activated) to an application owner.

Applying roles or user rights to the Software Factory database

IAM will now show an error when trying to apply roles or user rights to the Software Factory database. Applying roles or user rights to the database could overwrite the necessary rights needed for the Software Factory to function properly.

Default title for new and upgraded environments

Previously, the Title in IAM (menu Settings > Global settings) was always filled with 'Thinkwise Software Factory', even if it was manually changed or emptied. Since this can affect, for example, your splash screen, this has been changed:

  • Newly installed environments still initially use 'Thinkwise Platform' as splash- and application title.
  • Upgrades no longer override manual changes to the title.
  • When installing the Software Factory in an IAM environment, the title is still set to 'Thinkwise Software Factory'. This may override a manually configured title.

Data model changes

Changes Software Factory

Table changes

SF - From tableSF - To table

Column changes

SF - From tableSF - From columnSF - To tableSF - To column

Changes Intelligent Application Manager

Table changes

IAM - From tableIAM - To table

Column changes

IAM - From tableIAM - From columnIAM - To tableIAM - To column