2025.3
This release takes a significant step in modernizing the Universal GUI. Applications now feel closer to native mobile apps, with support for push notifications and advanced localization for language, date, and number formats.
Users can now save advanced filters as prefilters in the Universal GUI, making it easier to reuse complex filter setups. In the Intelligent Application Manager, the Authorization and Web domains screens have been further refined to improve usability.
To support developers, we have added the ability to generate unit tests with AI, significantly speeding up the creation of test cases. In addition, you can now use any OpenAI Compatible LLM with the Thinkwise Platform, including self-hosted models.
We have also added several quality-of-life improvements:
- Creating new branches or models directly from the Switch branch pop-up
- Automatic copying of program objects when creating a new branch
- More efficient handling of base models during model import
- Extended import options for Thinkstore models
- Automatic copying of translations for task and report parameters
And while not strictly related to Platform release 2025.3, we would like to highlight the significant UI styling and data density changes that we introduced with Universal GUI 2025.2.13 onwards, as well as the introduction of the Debug center with Indicium 2025.2.13.
Lastly, we would like to remind you that this release (2025.3) is the last LTS release to support the 2-tier architecture. The 3-tier architecture is much more secure and stricter regarding the quality of your model. If you are still working in a 2-tier environment, fix all findings in validations and smoke tests to prepare for the transition to a 3-tier environment. More documentation to support your transition will become available soon.
This release includes 12 community ideas representing 254 votes. The most popular ideas are:
- Ad-hoc push notifications for the Universal GUI (77 votes)
- Localization settings for user preferences (21 votes)
- Custom messages for capturing database errors (20 votes)
Questions or suggestions about the release notes? Let us know in the Thinkwise Community!.
Contents
- Contents
- Upgrade notes
- Breaking
- User preferences for localization settings
- Send push notifications to users
- New and changed in the Software Factory
- Models - Create a new branch or model from the 'Switch branch' pop-up
- Models - Program objects copied upon branch creation
- Models - Changed default grid column width
- Models - Model import continues if base models are missing
- Models - Base model automatically merged into work models
- Data - 'Visible for filter' setting added to reference tasks
- Data - Improved interaction for data model diagram
- Data - Improvements for 'Min. value' and 'Max. value' for data types
- Data - Tag names automatically converted to uppercase
- User Interface - Translations automatically copied for Task and Report parameters
- User Interface - Improved visibility for database message capturing fields
- User Interface - Simplified translation for constraint violation messages
- User Interface - Resource columns visible in Scheduler
- User Interface - Object type shown for menu items 'Design' tab
- User Interface - Pre-configured cube view fields in the area 'Menu' no longer supported
- User Interface - Save advanced filters as prefilters
- User Interface - Group screen types
- User Interface - Query fields automatically emptied
- Business logic - Support for longer error messages from Handler procedures
- Business logic - Interface improvements for 'Deploy' tab
- Business logic - Oracle support for default handler statements for 'INSERT', 'UPDATE' and 'DELETE'
- Quality - Generate unit tests with AI
- Quality - Manual tests no longer require branch selection
- Access Control - Overview of default user groups per role
- Access Control - Changed table right preset logic when assigning rights
- Deployment - Track steps in the synchronization process
- Integration & AI - Support for OpenAI-compatible AI models
- Enrichments - Import options for Thinkstore models
- System requirements - 'Full-Text Search' removed as prerequisite
- Fixed in the Software Factory
- New and changed in the Intelligent Application Manager
- Data model changes
- Questions or suggestions?
Upgrade notes
System requirements
For a full overview, see the System requirements.
-
The Thinkwise Platform requires SQL Server 2019.
-
For AI-powered enrichments, use the latest AI models for the best results. For OpenAI, we recommend GPT 4 or up.
-
.NET Framework requirements:
Component Minimum .NET version Windows GUI 4.7 Indicium 8.0 Indicium Basic 4.7.2
Breaking
Language code changes
breakingBecause of new features for localization, we are updating the language codes for English, Dutch, and German in the Thinkwise Platform.
During the upgrade to Thinkwise Platform release 2025.3, the language codes for English (ENG), Dutch (NL), and German (DE) are being updated.
This may impact your code and .ini
files if you use these to launch your applications through the Software Factory with the Windows GUI.
Check your code and .ini
files for these language codes and update them if necessary.
The following changes are made:
ENG
->en-US
NL
->nl-NL
DE
->de-DE
Changed default retention period for system-versioned tables
breakingOver time, model history data can accumulate and take up a significant amount of database storage. This can lead to performance issues and increased maintenance efforts. To prevent this, we have changed the default retention period for system-versioned tables in IAM to 12 months. If you need to keep historical data for a longer period, check your database back-up strategy and adjust it if necessary.
User preferences for localization settings
Community idea new Universal GUIPreviously, main administrators could set the preferred language of a user in IAM. A user could also select their preferred language themselves in the profile menu > User preferences in the Universal GUI. If the application did not support the language, it would use the default application language as a fallback. The date/time and number formats were based on the browser language, these could not be set separately.
You can now set language, number format, and date/time format preferences separately in IAM. You can configure these settings for individual users, user templates, and default settings for new users in the following locations:
- Authorization > Users > tab Form > group User preferences - For individual users.
- Authorization > OpenID providers > User templates - For user templates.
- Settings > Global settings > tab Form > group User - For default settings for new users.
For applications, you can view the default fallback language in IAM in the menu Authorization > Applications > tab Application. You can also view all available languages in the menu Authorization > Applications > General settings > tab Translations.
To allow users to select their own preferences, you must enable the localization options in User preference availability configuration in IAM (menu Authorization > Users > tab Form > group User preferences).
After setting this up, users can configure their own localization settings in the profile menu > User preferences in the Universal GUI.
- Language - Available options are the available languages in the application.
- Based on browser - The application is shown in the browser language if this is available in the application, otherwise the default application language is used.
- Date and time format - By default, the date and time format is based on the browser.
Available options are pre-defined date and time format styles.
Currently not supported are:
- 12-hour format (AM/PM).
- Non-Gregorian calendars and right-to-left writing systems.
- Number format - Available options are pre-defined number format styles. By default, the number format is based on the browser.
Users can now set their own number and date/time format preferences in the profile menu
The selected date/time and number formats are immediately applied in all relevant places in the application, such as forms, (editable) grids, (editable) pivot tables, and charts. Domain controls that typically use these formatting styles are the Number, Calculator, Date, Time, and Datetime controls. Pivot series and display values of lookups still have unformatted dates/times and numbers; this remains unchanged.
When you develop against the Software Factory instead of IAM, the available user preferences — such as language, date/time, and number formatting — are still managed by IAM. Changing these settings in the Software Factory will therefore update them in IAM. The advantage of this is that you can now also change language and formatting styles while developing.
Send push notifications to users
Community idea new Universal GUIYou can now send push notifications to your users. Push notifications allow you to send timely updates, alerts, or reminders directly to your users, even when they are not actively using the application. With 77 votes, this is our Community's most requested feature so far!
Two types of push notifications are available:
- Ad-hoc push notifications - As a main administrator or user administrator, you can send ad-hoc push notifications to users directly from IAM. You can use this for one-time notifications or alerts to specific users or groups. An example is notifying users about scheduled maintenance or an urgent system update.
- Application-triggered push notifications - As a developer, you can set up process flows to send push notifications based on specific events or conditions within your application. An example is notifying the user when a purchase invoice is processed and requires approval.
Example of an ad-hoc push notification on a mobile device
Prerequisites
To send push notifications, you must meet the following prerequisites:
- Push notifications are only supported by the Thinkwise Platform version 2025.3 and up.
- Configure Indicium.
- Enter a technical Email address in IAM. This email address is used by the browser service to contact you in case of possible issues. The email address is not visible to users.
- For application-triggered notifications, you need to set up process flows.
- The user interface must be able to run in an environment that supports push notifications (see MDN Push API browser compatibility).
- The user interface must be connected to the internet.
- On iOS devices, the application must be installed as a Progressive Web App (PWA) on the device.
- Users must subscribe to
and allow push notifications on the same device where the application is installed.
- Only users with an active push notification subscription receive the notification.
- If a user has no active subscription, the notification is sent once a subscription is registered or reactivated.
- For more information about the supported browsers, see the Lifecycle policy.
- For Chrome, the browser must be open to receive push notifications. The application does not need to be open.
- For Edge, the browser can be closed to receive push notifications.
- Sending a push notification is irrevocable, ensure that the notification is correct before sending it.
- Do not include sensitive information in notifications, since it may appear on the screen and be accessible without authentication.
Configure Indicium
In addition, you must configure Indicium to send push notifications. You can set up push notifications for Indicium on-premise, Azure, and AWS deployments.
Do not lose your keys; it will invalidate all user subscriptions to push notifications.
Add an email address in IAM
In IAM, you must set an administrator contact email address in the menu Settings > Global settings > tab Form > field Contact for failing push messages. This address is not visible to users; it is only used by the browser service to contact you in case of misconfigured push notifications.
Setting the contact email address for failed push messages in IAM
Send an ad-hoc push notification
main administrator user administratorAd-hoc push notifications are useful to send urgent or important messages to users. You can use these to send one-time notifications and alerts to specific users, user groups, applications, or tenants.
In IAM, you can send ad-hoc push notifications in the same way as email or in-app notifications.
To send a Push notification, execute the task Add notification for [all users/all user group users/user]
in one of the following locations:
- menu Authorization > Users - send a notification to a single user.
- menu Authorization > User groups - send a notification to all users in a user group.
- menu Authorization > Tenants - send a notification to all users in a tenant.
You can add the following information to an ad-hoc Push notification:
-
A title.
-
A text message.
-
An expiration date and time - If the user has been offline until the expiration date and time have passed, they will not receive the notification. For example, a push notification about application maintenance is irrelevant once the maintenance is complete, so it is not shown to the user if they have been offline during this time.
-
A deep link URL - This link determines where the user is directed when they select the notification. We recommend using a deep link URL that leads the user to the source of the information shared in the notification. For more information about supported routes and deep link formats, see HTML Control.
- You can use a relative path (for example,
#application=1234
or/#application=1234
) that is appended to the application’s origin. - Or an absolute URL (for example,
https://universal.thinkwise.app/#application=1234
). - If you do not add a deep link, the user will be taken to the application's origin.
- A deep link can point to an internal application route or an external URL (for example,
https://developer.mozilla.org/en-US/
).
- You can use a relative path (for example,
-
An icon URL - The link to the icon you want to show in the notification, for example, an exclamation mark, info icon, or light bulb.
Example configuration of an ad-hoc push notification
Add a process flow to send a push notification from your application
You can add a push notification to a process flow to send notifications based on specific events or conditions within your application. To do this, you need to set up a process flow in the Software Factory (menu Processes > Process flows). This process flow must include the process action Send user notification. To make the user notification a push notification, go to the tab Process actions > tab Input and set the Notification type to Push notification.
A push notification is automatically sent when the process flow is triggered and executed.
A process flow with the action to send a push notification
Example configuration of the input parameters for a push notification
When and how do users receive push notifications?
Users do not receive push notifications by default. They must subscribe and allow them for each device where they want to receive notifications. Inform your users about the availability of push notifications and explain how to enable them.
Users can enable push notifications by opening the profile menu in the Universal GUI and selecting Enable push notifications. The browser asks for permissions; when accepted, the device can receive notifications. The menu item changes to Disable push notifications. Users can select this to unsubscribe from push notifications for that device.
The following applies for push notifications:
- Users can receive push notifications when they are not actively using the application.
- A push notification may take up to a minute to arrive.
- Push notifications are only displayed for a short period of time, depending on the device and operating system.
- On some platforms, notifications are only delivered while the browser or app is running. If closed or offline, notifications will appear the next time a user opens the browser or app.
- If a notification’s expiration time has passed, it will not be shown to the user. For example, if the browser is offline on a ship when a notification is sent, the notification can still be shown once the browser reconnects. But if it expires before that moment, the user will not see it.
- When a user selects a push notification, and if the notification contains a Deep link URL, the application opens at that URL. If the application is already open, the application is brought to the foreground.
Overview of push notification subscriptions in IAM
main administrator user administratorIn IAM, push notification subscriptions can be viewed in the menu Authorization > Users > tab Extra info > tab Push notification subscriptions. In this menu, you can manually delete subscriptions if a user cannot do so themselves or add a the subscription expiration time. You can not add subscriptions for a user; this is the user's responsibility.
New and changed in the Software Factory
Models - Create a new branch or model from the 'Switch branch' pop-up
newWe have expanded the task Switch branch with additional options. You can now create a new branch or model directly from the pop-up without needing to navigate to the Model overview screen.
The pop-up has the following options available:
- Select an existing branch
- Create a new branch, also available as the task Create branch
in the menu Models > Model overview > tab Models and in the menu Models > Model overview > tab Branches
- Create a new model, also available as the task Create model
in the menu Models > Model overview > tab Models.
Create a new branch or model in the 'Switch branch' pop-up
Models - Program objects copied upon branch creation
changePreviously, no program objects were copied when you created a new branch in the Software Factory. This meant that you needed to execute Generate definition first or generate every code group separately to ensure that all program objects were present in the new branch. We have made changes to simplify this process. When you create a new branch now, the program objects are automatically copied into the new branch. With this new process, your new branch is immediately ready for development.
Models - Changed default grid column width
changeYou can configure a grid's default Auto column width in the menu Models > Model overview > tab Branches > tab Model settings. This application-wide setting determines how the UI scales the columns in a grid based on the cell content.
Previously, Auto column width was set to No by default, to improve grid rendering performance. This option does not adjust column widths in the grid automatically.
To optimize user experience, we have updated the default Auto column width to Headers and data. This option automatically sizes columns in a grid based on the header cell and content, ensuring grids remain easy to read. This change applies only to new models; existing models remain unchanged. We recommend using Headers and data for tables with fewer than 20 columns to balance readability and performance. If your tables contain 20 or more columns, set Auto column width to No to maintain optimal performance.
In addition, we have added a new enrichment Set auto column width to 'Headers and data' for every table in the menu Enrichments > Model enrichments. The enrichment allows you to quickly apply the Headers and data setting to all tables simultaneously. By default, the enrichment excludes tables with 20 or more columns to prevent possible performance issues. If you want to include these tables, set the parameter Include tables with 20 or more grid columns to True.
Models - Model import continues if base models are missing
changeWhen you imported a model in the menu Models > Model overview, the process stopped if the model referenced base models missing from the Software Factory. Now, the import process continues, and a message is displayed that identifies missing base models. This change avoids unnecessary interruptions when importing models.
A message is displayed to indicate which base models are missing
Models - Base model automatically merged into work models
newAs the Software Factory increasingly relies on objects in Thinkwise distributed base models, the absence of these models can interfere with functionality. When you upgrade to a newer platform version, the base models we distribute are often modified. The data of these base models is not merged into the linked work models upon upgrading. This resulted in work models containing data that is not up-to-date or models that do not function correctly.
To prevent these issues, the base model objects are now automatically merged into work models when upgrading to newer platform versions. This ensures that all required base model objects are always present in work models, reducing the risk of missing dependencies and improving overall stability.
Data - 'Visible for filter' setting added to reference tasks
new Universal GUIIn the 2025.2 Thinkwise platform release we added a new feature in the Universal GUI that lets you filter multiple levels deep. This new feature introduced the setting Visible for filter to help you configure filter visibility more efficiently for the filter pop-up in the Universal GUI. You can use this setting to determine whether a Detail reference or Look-up reference is visible, so you can control which related tables appear in the filter pop-up. This makes filtering easier for users by reducing clutter and improving overall performance. We have now included this setting for tasks that create or modify references.
The Visible for filter setting is now available in the following task pop-ups:
Create reference in menu Data > Data model > tab References
Modify reference in menu Data > Data model > tab References
Create detail reference in menu Data > Data model > Tables > tab References (Details)
Modify reference in menu Data > Data model > Tables > tab References (Details)
Create look-up reference in menu Data > Data model > Tables > tab References (Look-ups)
Modify reference in menu Data > Data model > Tables > tab References (Look-ups)
The setting also appears when you drag a reference into the diagram in the menu Data > Data model > tab Design.
In the group User interface, select the checkbox Show look-up or Show detail to make the drop-down menu Visible for filter available. You can set Visible for filter to:
- Always - The reference is always shown in the filter pop-up.
- Extended (default) - The reference is only available after the user manually adds it to the filter.
- Never - The reference is excluded from filtering (for example, for performance reasons).
Example: Configure the 'Visible for filter' setting
In the Software Factory the settings for employee_id
are as follows:
- Show look-up is enabled
- Show detail is enabled
- Visible for filter set to Always
This results in the employee_id
column always being visible in the filter pop-up in the Universal GUI and having a look-up popup.
Data - Improved interaction for data model diagram
changed Windows GUI (2-tier) Windows GUI (3-tier)In previous versions, when a diagram (menu Data > Data model > tab Design) in the Software Factory was generated or the associated branch was set to Read-only, it was not possible to interact with the diagram.
Now, you can interact with the data model diagram, even if it is generated or branch access is set to Read-only. You can now, for example:
- Drag tables to rearrange the layout for better clarity
- Show or hide domains
- Zoom in and out of the diagram
Note that these interactions are temporary and will not be saved.
Data - Improvements for 'Min. value' and 'Max. value' for data types
changeWe have made some improvements for the minimum and maximum value constraints. for data types in domains (menu Data > Domains > tab Form).
- Whether you can specify a Min. value or Max. value for a domain is now dependent on the settings in the master data.
- If a minimum or maximum value is not available for a data type in the master data, the fields are hidden when creating or editing a domain.
- If the entered Min. value or Max. value does not comply with the programming language and data type combination, the Software Factory will fall back to the minimum or maximum value specified in the master data.
Data - Tag names automatically converted to uppercase
changePreviously, when you created a tag, the tag name could be entered in any combination of uppercase and lowercase letters. From now on, the tag name is automatically converted to uppercase when it is created. This ensures consistency throughout your model, making tags easier to read and recognize in your code.
When you create a new tag and type lowercase characters in the field Tag name, they are automatically converted to uppercase before the tag is saved.
User Interface - Translations automatically copied for Task and Report parameters
Community idea newWe have changed how translations work when adding or renaming task or report parameters. When you add or rename a task or report parameter, the Software Factory now automatically copies the translation and form translation from a column with the same name. This improvement reduces manual translation work and helps you work more efficiently. It also prevents users from seeing untranslated parameters and developers from being shown untranslated validation messages.
The following behavior remains unchanged:
- When you add a parameter and no matching column exists, you still need to manually provide the translation.
- When you rename a parameter and no matching column exists, the parameter's old translation is retained. This is similar to the behavior of other object types.
The automatically copied translation gets a Not yet approved status, allowing you to modify the translation while reviewing it in the tab Translation.
User Interface - Improved visibility for database message capturing fields
newWhen user input violates database integrity rules, such as a duplicate key error, the database returns a technical error. The Thinkwise Platform uses regular expressions to capture these errors and translates them into more readable, user-friendly ones.
Previously, the fields for capturing database errors were only visible in the Software Factory if they were already populated in the base model. To create your own messages, you had to use workarounds to display these fields and capture database messages manually. We have made this easier for you. The following database capture fields are now always visible in the menu User Interface > Messages > tab Form > group Database message capture:
- Error code - The error code you want to use to capture database error messages.
- Regular expression - Use a regular expression to extract relevant details from database error messages and generate user-friendly translations.
You can define capturing groups and reuse them as parameters enclosed in curly braces (for example,
{group}
). Use this feature thoughtfully, as it can make the message more technical. - Priority - Allows you to prioritize one message over another when more than one is applicable. A lower number indicates a higher priority. This field is mandatory if you have populated the field Regular expression.
You can translate your messages in the tab Translations (menu User interface > Messages > tab Translations). For more information on translations, see Translations.
The screenshot below is an example of how to use the database message capturing fields to create your own general message for check constraints. It is now also possible to set up a specific message for each check constraint error, see User Interface - Simplified translation for constraint violation messages.
Database capture fields are now always visible
User Interface - Simplified translation for constraint violation messages
Community idea new Universal GUIFor tables, you can set up Check constraints to verify whether the data in your data model complies with predefined constraints. At the moment of saving, the entered data is validated against the check constraint. If a constraint is violated, the Software Factory displays a default error message.
If you wanted to make your own messages for check constraints, you had to manually create separate messages using regular expressions. We have made this easier for the Universal GUI. Now, if you select the new checkbox Translate for a check constraint (menu Data > Data model > tab Tables > tab Check constraints > tab Form), a Message translation object is automatically created. After selecting the checkbox, the tab Translations becomes available where you can directly translate the error message. The translation will be treated by the Universal GUI as an error message for this check constraint.
To add your own general messages for capturing database errors, you can now use the default available database message capturing fields, see topic User interface - Improved visibility for database message capturing fields.
Translate constraint violation messages directly
This feature requires at least Indicium 2025.2.12 when used on DB2, as support for capturing check constraint names was introduced in this version.
User Interface - Resource columns visible in Scheduler
new Universal GUIPreviously, the resources in a Scheduler were based on one resource column. Whether you used a single column or hierarchical grouping, the resources were always grouped by one column, based on the setting Group by column in the menu User interface > Schedulers > tab Tables > tab Scheduler. Here, you could select one column from the underlying table to group the resources in the Scheduler.
Now it is possible to select multiple resource columns, increasing the information for a resource. A new tab is available in the menu User interface > Schedulers > tab Default > tab Tables > tab Scheduler views > tab Resource columns. It shows all columns of the underlying table, and you can select which columns should be shown as resource columns in the Scheduler. You can also set the order of the resource columns and their column widths:
- The order is independent of the underlying table column order.
- The column widths add up to the total width of the resource area in the Scheduler. However, if a user manually resizes the splitter between the resource area and the schedule, the new width for the resource area will be cached in the browser. So, when the browser is refreshed, the width will remain as manually set.
In addition, the resource columns are now displayed as you would expect. Numbers and dates are formatted the same way as in grids and forms, and domain elements and lookup references are shown using their display values instead of their ID. In the example below, Size is a domain element, and Other table is a lookup reference.
If you do not include any resource columns, the Scheduler will behave as before, using the column selected in the field Group by column.
Adding more resource columns can, for example, result in the following Scheduler:
Setting up multiple resource columns in the Software Factory
Example of a Scheduler with multiple resource columns in the UI
User Interface - Object type shown for menu items 'Design' tab
Community idea newThe object type is now shown for menu items in the menu User interface > Menus > tab Design. The object type is displayed in parentheses after the menu item name. This makes it easier to identify the object type of a menu item. For Tile menus, both the size of the tile and the object type are shown in parentheses.
Object type information is now included in the menu item names
User Interface - Pre-configured cube view fields in the area 'Menu' no longer supported
change Universal GUI Windows 3-tier GUIIn Windows 2-tier, it was possible to pre-configure a cube view field with a specific filter, conditional layout, or custom total without including it as an active dimension or value. Dragging this pre-configured cube view field to the filters, series, categories, or values areas would apply the pre-configured settings. This was achieved by manually placing the cube field in the area Menu of the cube view, as it could not be done through the cube view modeler.
In the Universal GUI, this functionality gives unexpected results. For example, the cube view field in the area Menu will be placed in the area Values without applying any of the pre-configured filters, conditional layouts, or totals.
Because this undocumented feature is rarely used and can lead to confusing behavior for users, pre-configuring cube view fields in the Menu area will not be supported in the Windows 3-tier and Universal user interfaces. This change may affect existing cube views that rely on fields in the Menu area. If you wish to reuse your preconfigured settings in a 3-tier environment, update the Cube area from Menu to any of the other 4 areas via menu Models > Model content > tab Cube view fields.
User Interface - Save advanced filters as prefilters
Community idea new Universal GUIIn the Thinkwise platform release 2025.2 the filtering capabilities of the filter pop-up were improved, allowing you to create advanced filters. Users could already save filters as a prefilter, which added them to the action bar. As of this update, you can save advanced filters as a prefilter, making it easier to reuse complex filter conditions.
To create an advanced filter in the Universal GUI, select Filter , or use the keyboard shortcut Ctrl + R.
Enable Advanced filter and set the filter criteria.
For more information on setting up an advanced filter, see Advanced filter pop-up.
To save your filter, select Save and enter a Prefilter name.
The prefilter is then added to the action bar.
Save an advanced filter as a prefilter
To edit or remove prefilters, go to Manage prefilters in the action bar. Here, you can also select Create prefilter to set up and save prefilters.
As a main administrator, you can enable custom prefilters for users in User preferences in IAM. Select the configuration OnOff or Complete to allow users to set up custom prefilters. You can also create a custom configuration to allow users to create custom prefilters. In addition, you can view the users' saved prefilters in IAM in the menu Authorization > Users > tab User preferences > tab Prefilters > tab Prefilter nodes. If desired, you can remove prefilters in the tab Prefilters.
User Interface - Group screen types
newWhen you are developing models in the Software Factory, the number of screen types can become extensive over time. Fields were sometimes used as a workaround to specify the purpose of a screen type and group them.
To help you organize screen types more effectively, we have made it possible for you to group screen types in the menu User Interface > Screen types > tab Form. In the field Screen type group, you can specify the group to which a screen type belongs.
Organize your screen types in groups
User Interface - Query fields automatically emptied
changeWe have improved the behavior of query fields in the Software Factory. Previously, some query fields were automatically cleared as soon as they were disabled, while some query fields retained their query. For example, when you entered an Expression and then changed the Default value type without saving, the expression was lost.
Query fields now behave as follows:
- When a query field is disabled, for example by changing the Default value type from Expression to Constant value, the query field remains filled until you save the record. This means that when you switch back to the query field, the entered query will still be there.
- When you save a record, all disabled query fields are automatically cleared.
This updated behavior saves storage space by not keeping unused queries. Furthermore, it prevents false hits when you are searching through your code. It also avoids accidental data loss, since you will not lose your work immediately when you disable a query field.
Business logic - Support for longer error messages from Handler procedures
new DB2In DB2, the SIGNAL
functionality is limited to returning messages with a maximum length of 70 characters.
As a result, longer error messages were not displayed in the GUI.
To solve this, the handler procedures now include the V_MESSAGE_TEXT
parameter in the code,
available in the menu Business Logic > Functionality > tab Deploy > tab Program object.
This new parameter enables you to return longer messages in the GUI.
Business logic - Interface improvements for 'Deploy' tab
changeWe have made some interface improvements in the menu Business logic > Functionality > tab Deploy:
- The grid now displays icons that help visually differentiate which template is assigned to which Type of object.
- The form in the tab General has been reorganized into clearer logical groups and now only shows filled assignment fields to maintain a clean interface.
Improved interface of the 'Deploy' tab
Business logic - Oracle support for default handler statements for 'INSERT', 'UPDATE' and 'DELETE'
new OraclePreviously, in Oracle, you had to write code for data processing within handler procedures manually.
For SQL Server, you could already generate default INSERT
, UPDATE
and DELETE
statements for handlers, reducing the need for manual coding.
We have now added support for this feature for Oracle.
In the menu User Interface > Subjects > tab Settings > tab Performance > group Handlers the following settings are available:
- Auto generate insert
- Auto generate update
- Auto generate delete
Settings to enable auto-generation of default handler statements for 'INSERT', 'UPDATE' and 'DELETE'
In Oracle, among other RDBMS, you cannot mutate IN
parameters inside procedures, and custom variable definitions are not allowed in procedures.
As a solution, we have added a list of mutable variables for handlers for every IN
parameter.
This allows you to modify the parameter values as needed.
The generated default INSERT
, UPDATE
and DELETE
statements already use these mutable variables to process data into the linked table.
Mutable variables are always generated, even if you have disabled auto-generation of handler statements.
Example: handler procedure validating employee working hours
/* Create or replace stored procedure HANDLE_o_activity_INSERT. */
procedure "HANDLER_INSERT"
(
v_activity_id in out int,
v_name in nvarchar2,
v_description in varchar2,
v_insert_user in nvarchar2,
v_insert_date_time in timestamp,
v_update_user in nvarchar2,
v_update_date_time in timestamp
)
as
m_activity_id int := v_activity_id;
m_name nvarchar2(256) := v_name;
m_description varchar2(500 char) := v_description;
m_insert_user nvarchar2(256) := v_insert_user;
m_insert_date_time timestamp := v_insert_date_time;
m_update_user nvarchar2(256) := v_update_user;
m_update_date_time timestamp := v_update_date_time;
begin
null;
--control_proc_id: activity_handlers
--template_id: insert
--prog_object_item_id: insert
--template_description:
-- Load value
select activity_sq.NEXTVAL
into m_activity_id
from dual;
-- Generated insert statement for the insert handler
insert into activity
(
activity_id,
name,
description,
insert_user,
insert_date_time,
update_user,
update_date_time
)
values
(
m_activity_id,
m_name,
m_description,
m_insert_user,
m_insert_date_time,
m_update_user,
m_update_date_time
)
returning activity_id into v_activity_id
;
end;
Quality - Generate unit tests with AI
newUnit tests are a way of testing individual units of code to ensure they work as expected. The purpose of unit tests is to validate that each unit of the software performs as designed. For more information, see Unit tests.
We have add a task that runs the AI-driven enrichment Generate unit test with AI in the menu Quality > Unit tests
that allows you to speed up the process of creating unit tests.
With this enrichment, you can generate unit tests based on natural language.
Before you can run enrichments with AI in the Software Factory, you must set up a generative AI provider for your branch. See Set up a generative AI provider for a branch.
When you run the enrichment, you must complete the following fields:
- Description - Provide a description in natural language of what the unit test should test.
- Unit test type
- Object type
- Object ID - Depending on your selected object type, this can be Table, Task, Report, Process flow, Process action or Subroutine.
- Control procedure (optional) - Link the unit test to a specific control procedure.
For more information on these fields, see Set up a unit test and Control procedure in a unit test for more information.
After you have selected Execute, AI will extract the information you provided and convert it to:
- Input parameters
- Row filters
- Output parameters
- Expected message (if specified in the description)
You can also run this enrichment from:
- menu Business logic > Functionality > tab Unit tests
- menu Enrichments > Model enrichments
When using AI to create unit tests, you must always verify the results, as AI can make mistakes.
.
Generate unit tests with AI
Quality - Manual tests no longer require branch selection
changePreviously, users with only the Manual test role assigned were required to select a specific model and branch. They could then use manual test scenarios in the menu Quality > Manual tests. This behavior required users to repeatedly select a model and branch for the manual test scenarios they wanted to view or run. We have simplified the workflow by taking the Manual tests out of the model and branch context. Users can now view all test scenarios, without having to select a model and branch first.
Access Control - Overview of default user groups per role
new Previously, finding which default user groups contained a specific role was time-consuming. This was especially challenging in models with many user groups.
To make this easier, we have added a new overview in the menu Access Control > Roles > tab Default user groups. The overview shows which default user groups are linked to a role. From this overview, you can directly add or remove default user groups for the selected role.
The overview displays which default user groups are linked to which role
Access Control - Changed table right preset logic when assigning rights
changeIn the Thinkwise Platform release 2025.2, we significantly changed the rights assignment in the Software Factory. Because tables are among the most complex objects to assign rights to, we have optimized the task that assigns table rights. This optimization makes it easier to assign child rights to tables without affecting the table rights.
As a result, the number of combinations for assigning table rights has increased, allowing for more flexibility. At the same time, it prevents confusion about which rights will and will not be assigned or changed. It is still possible to review the changes before they are applied.
The following changes have been made to the Assign rights task pop-up for tables
(menu Access Control > Roles > Role > Tables > Assign rights):
- The choices for table Rights preset and Include children preset have been separated. Editing the one will no longer affect the other. For example, you can now assign Full rights to the table (including CRUD) and select Excluded for the children, meaning no columns, prefilters, details, etc. are included.
- The table Rights preset and all table rights checkboxes are marked as 'remain unchanged'
when the task is first executed. As long as you do not change them, no table rights are updated upon the task's execution. Even if you select child rights, the table rights remain unchanged. This change allows you to assign additional child rights to a table for which the own rights have already been set up correctly.
Add child rights to a table while keeping the table rights the same
Deployment - Track steps in the synchronization process
new Windows GUI (2-tier) Windows GUI (3-tier)When you execute the tasks Synchronize to IAM
or Synchronize to storage
in menu Deployment > Synchronization to IAM > tab Synchronization,
the Software Factory now automatically selects the active step.
This allows you to better track the progress of synchronization of your model to IAM or storage.
This behavior is the same as when you execute the task Generate definition
.
Integration & AI - Support for OpenAI-compatible AI models
Community idea newWhen setting up generative AI for a branch or applications in IAM, you could only add OpenAI and Azure OpenAI models. Now, you can connect any endpoint that provides an OpenAI-compatible model to set up generative AI in the Thinkwise platform. This allows you to use more generative AI providers, for example Anthropic (Claude) or xAI (Grok). You can also add any locally running LLMs to the endpoint, giving you flexibility to work with models hosted on your own infrastructure.
Enrichments - Import options for Thinkstore models
Community idea newPreviously, when you selected Install solution from the Thinkstore, you could choose to import it as a new model
or, if it was a base model, link it to an existing model.
To simplify this process, you can now import Thinkstore models using the following options:
- New model - The imported model is a new model.
- New branch - The imported model is added as a branch of an existing model.
- Replace complete branch - Adds, updates, and deletes all objects based on the imported model.
- Merge into branch - Only adds and updates objects based on the imported model. This option does not delete any existing objects.
These options are identical to the ones available when you import a model in the tab Model overview.
If the Thinkstore model is a base model, you are asked if you want to generate the work model linked to it.
We have also removed the status icon Installation failed and its associated message,
which previously indicated that model data was missing during Thinkstore installation.
If the model data is missing now, the import will fail entirely, something that is immediately noticeable.
New import options added when importing a Thinkstore model
System requirements - 'Full-Text Search' removed as prerequisite
changePreviously, Full-Text Search was a prerequisite when installing the Software Factory on SQL Server. Full-text indexes was primarily used by the Software Factory for DB2 models. We have made some changes to the Software Factory, making the need for this feature no longer necessary. However, Full-Text Search is still necessary if you use Full-text indexes in your model. We have added a validation to notify you if a Full-text index is present in the model.
Fixed in the Software Factory
- Previously, when configuring a conditional layout condition, switching the value type from Constant to Column did not clear the field Value. Additionally, when you switched the value type from Column to Constant, the field Value column was not cleared. We have fixed this issue so that when switching between value types, the appropriate fields are cleared upon saving.
- The checkbox Repeat after execute has been moved to the form group: menu Processes > Tasks > tab Default/Variants > tab Settings > tab General > group User interface. This location is more intuitive, since enabling this setting affects the task pop-up behavior in the user interface.
- DB2 While the foundation for Change detection for DB2 was already in place, using it would result in an error. We have implemented the necessary adjustments to ensure that it now works as expected.
- After redesigning role rights in the Thinkwise platform 2025.2 release, some functionality was unintentionally left out. This became apparent when you assigned rights for either task or report parameters. Any task or report parameter with a look-up reference to a different table/column combination would not be granted because this was missing in the enrichment executed in the background. This has been fixed.
- Previously, when switching the process action type in the menu Processes > Process flows > tab Process actions or Processes > Subflows > tab Process actions, the corresponding input and output parameters were not always properly cleaned up. We have fixed this by ensuring that the input and/or output parameters are only retained if the process action type remains the same.
New and changed in the Intelligent Application Manager
Translations - Alternative translations for task buttons in IAM
new Universal GUIIn the Thinkwise Platform 2025.2 release, we introduced a new feature where you can set up alternative translations for buttons in tasks and reports. We have now also applied this feature to several tasks in IAM. Adding an alternative translation for these buttons clarifies what action is being performed when a task is executed. For example, we have changed the default translation of the task Copy application to Copy, instead of Execute.
The default button translation 'Execute' is overridden to 'Copy'
We have also made this feature available for several tasks in the Software Factory, even though the Software Factory is currently largely unavailable in the Universal GUI. We aim to offer support for the Software Factory in the Universal GUI at the start of 2026.
Authorization - Slow query log for performance monitoring
newPerformance issues that are not detected during development may arise in a production environment. This is often due to larger datasets or more active users when the application is live. One common issue can be underperforming SQL queries that take too long to execute.
To identify these queries, we have added the screen Slow query log in IAM in the menu Analysis > Slow query log.
The Slow query log tracks underperforming SQL queries from the past 7 days, depending on your set Query threshold. You can change the Query threshold in the menu Settings > Global settings > tab Form > group Logging. The default setting is 200 ms, you can adjust this setting as needed.
The following information is logged for each query:
- Date time (UTC) of execution
- Application alias
- Database
- Object
- Server name
- Duration (ms) of execution
- Dismissed (yes/no)
- Reason for dismissal (if applicable)
The Slow query log is also available in the menu Applications > Environment monitoring > Slow query log for individual applications.
In the screen you can:
-
Filter queries using Search.
-
View logs older than 7 days by deselecting the prefilter Past week.
-
Dismiss queries by executing the task Dismiss query
. When you dismiss a query, you can choose to:
- Set a custom threshold - Enter a Custom threshold (ms) for the query. When a future instance of the query falls below the custom threshold, it is automatically dismissed.
- All instances - Dismiss all current and future instances of the query.
- This instance - Dismiss only the instance of the query.
- Dismissal reason - Optional. Enter a reason for dismissing the query.
Dismissed queries are added to the table Dismissed query objects.
-
Universal Copy the query text by selecting Copy to clipboard.
-
View dismissed queries by deselecting the prefilter Hide dismissed queries or viewing the table Dismissed query objects.
-
Remove or edit dismissed queries from the table Dismissed query objects by using the CRUD buttons.
Slow query log gives insight into underperforming queries
Authorization - Improvements for Authorization screens
change Universal GUIWe have improved and optimized the following screens in IAM for the Universal GUI:
- Users in the menu Authorization > Users
- User groups in the menu Authorization > User groups
- Applications in the menu Authorization > Applications
The screens now have a vertical layout, with a grid on the left and a form on the right of the screen. We have also applied breakpoint screen types to improve the user experience when working on smaller screens.
Improved 'Users' screen with the grid on the left and a form on the right
Web domains - Improvements for Web domains
newWe have made the following improvements to Web domains to improve user experience:
- You can now see which tenants have access to a web domain in the menu Settings > Web domains in the column Accessible by tenants.
- When you add a new web domain and only one tenant is present in IAM, the tenant is automatically linked.
- When you make a change to a web domain, Indicium will be notified and will read the new configuration of the web domain. Changes made to a web domain are visible within a minute.
See which tenants have access to a web domain in the column 'Accessible by tenants'
Data model changes
Changes Software Factory
Table changes
Changes
SF - From table | SF - To table |
---|---|
- | runtime_response_size_limit_exemption |
- | scheduler_view_resource_col |
- | screen_type_grp |
- | thinkstore_model |
Column changes
Changes
SF - Table | SF - From column | SF - To column | Mandatory | Default value |
---|---|---|---|---|
dttp | - | dttp_max_value | 0 | - |
dttp | - | dttp_min_value | 0 | - |
dttp | - | include_min_max_value | 1 | 0 |
gai_provider | - | api_key | 0 | - |
gai_provider | - | api_key_encrypted | 0 | - |
gai_provider | azure_openai_api_key | - | - | - |
gai_provider | azure_openai_api_key_encrypted | - | - | - |
gai_provider | azure_openai_endpoint | endpoint | 0 | - |
gai_provider | openai_api_key | - | - | - |
gai_provider | openai_api_key_encrypted | - | - | - |
gai_provider_configuration | - | api_key | 0 | - |
gai_provider_configuration | - | api_key_encrypted | 0 | - |
gai_provider_configuration | azure_openai_api_key | - | - | - |
gai_provider_configuration | azure_openai_api_key_encrypted | - | - | - |
gai_provider_configuration | azure_openai_endpoint | endpoint | 0 | - |
gai_provider_configuration | openai_api_key | - | - | - |
gai_provider_configuration | openai_api_key_encrypted | - | - | - |
model | - | thinkwise_base_model | 1 | 0 |
screen_type | - | screen_type_grp_id | 0 | - |
usr | appl_lang_id | - | - | - |
usr | - | tail_sync_run | 0 | 0 |
usr | tail_generation | tail_definition_generation | 0 | 0 |
Changes Intelligent Application Manager
Table changes
Changes
IAM - From table | IAM - To table |
---|---|
- | iam_response_size_limit_exemption |
- | push_notification_subscription |
- | scheduler_view_resource_col |
- | sf_response_size_limit_exemption |
- | slow_query_dismissed |
- | slow_query_log |
- | usr_pref_tab_prefilter_node |
- | usr_pref_tab_variant_prefilter_node |
Column changes
Changes
IAM - Table | IAM - From column | IAM - To column | Mandatory | Default value |
---|---|---|---|---|
global_settings | - | default_nr_locale | 0 | - |
global_settings | - | default_date_locale | 0 | - |
global_settings | - | default_time_zone_id | 1 | Etc/UTC |
global_settings | - | default_appl_lang_id | 0 | - |
global_settings | - | slow_query_threshold | 1 | 200 |
global_settings | enable_local_login_option | - | - | - |
global_settings | - | technical_contact_email_address | 0 | - |
gui_appl_environment_monitoring_settings | - | slow_query_threshold | 1 | 200 |
iam_gai_provider | - | api_key | 0 | - |
iam_gai_provider | - | api_key_encrypted | 0 | - |
iam_gai_provider | openai_api_key | - | - | - |
iam_gai_provider | openai_api_key_encrypted | - | - | - |
iam_gai_provider | azure_openai_api_key | - | - | - |
iam_gai_provider | azure_openai_api_key_encrypted | - | - | - |
iam_gai_provider | azure_openai_endpoint | endpoint | 0 | - |
iam_system_gai_provider | - | api_key | 0 | - |
iam_system_gai_provider | - | api_key_encrypted | 0 | - |
iam_system_gai_provider | - | endpoint | 0 | - |
iam_system_gai_provider | openai_api_key | - | - | - |
iam_system_gai_provider | openai_api_key_encrypted | - | - | - |
iam_system_gai_provider | azure_openai_api_key | - | - | - |
iam_system_gai_provider | azure_openai_api_key_encrypted | - | - | - |
iam_system_gai_provider | azure_openai_endpoint | - | - | - |
iam_system_gai_provider | custom_endpoint | - | - | - |
iam_system_gai_provider | custom_api_key | - | - | - |
iam_system_gai_provider | custom_api_key_encrypted | - | - | - |
notification | - | push_notification_title | 0 | - |
notification | - | deep_link_url | 0 | - |
notification | - | icon_url | 0 | - |
openid_provider_usr_template | - | nr_locale_claim_id | 0 | - |
openid_provider_usr_template | - | nr_locale_static_value | 0 | - |
openid_provider_usr_template | - | date_locale_claim_id | 0 | - |
openid_provider_usr_template | - | date_locale_static_value | 0 | - |
push_notification_subscription | - | push_notification_subscription_id | 1 | - |
sf_gai_provider | - | api_key | 0 | - |
sf_gai_provider | openai_api_key | - | - | - |
sf_gai_provider | azure_openai_api_key | - | - | - |
sf_gai_provider | azure_openai_endpoint | endpoint | 0 | - |
sf_system_gai_provider | - | api_key | 0 | - |
sf_system_gai_provider | - | api_key_encrypted | 0 | - |
sf_system_gai_provider | - | endpoint | 0 | - |
sf_system_gai_provider | openai_api_key | - | - | - |
sf_system_gai_provider | openai_api_key_encrypted | - | - | - |
sf_system_gai_provider | azure_openai_api_key | - | - | - |
sf_system_gai_provider | azure_openai_api_key_encrypted | - | - | - |
sf_system_gai_provider | azure_openai_endpoint | - | - | - |
sf_system_gai_provider | custom_endpoint | - | - | - |
sf_system_gai_provider | custom_api_key | - | - | - |
sf_system_gai_provider | custom_api_key_encrypted | - | - | - |
tab_variant_scheduler_view | enable_sliding_window | enable_sliding_window | 1 | 1 |
tab_variant_scheduler_view | use_time_scale_year | use_time_scale_year | 1 | 0 |
tab_variant_scheduler_view | use_time_scale_quarter | use_time_scale_quarter | 1 | 0 |
tab_variant_scheduler_view | use_time_scale_month | use_time_scale_month | 1 | 0 |
tab_variant_scheduler_view | use_time_scale_week | use_time_scale_week | 1 | 0 |
tab_variant_scheduler_view | use_time_scale_day | use_time_scale_day | 1 | 0 |
tab_variant_scheduler_view | use_time_scale_hour | use_time_scale_hour | 1 | 0 |
tab_variant_scheduler_view | use_time_scale_minute | use_time_scale_minute | 1 | 0 |
tab_variant_scheduler_view | show_label_lowest_time_scale | show_label_lowest_time_scale | 1 | 1 |
usr_general | - | nr_locale | 0 | - |
usr_general | - | date_locale | 0 | - |
usr_general | appl_lang_id | appl_lang_id | 0 | - |
web_domain | - | guid | 0 | - |
write_back_usr_pref_type | - | nr_locale | 0 | 0 |
write_back_usr_pref_type | - | date_locale | 0 | 0 |
Questions or suggestions?
Questions or suggestions about the release notes? Let us know in the Thinkwise Community!