Skip to main content


· 62 min read

Hello everyone,

This release features the further integration of AI-powered model enrichments in the Software Factory. We have added new generic model enrichments and model enrichments specifically designed for a seamless migration to the Universal GUI. Many of the generic model enrichments have been made available as tasks on the screens where they can be of immediate use. The AI code review has been improved, and is now also available as a task.

An important visual change is that we have restructured the default menu in the Software Factory. It now contains a new menu group, Integration & AI, that allows easy access to screens that were previously only available as a tab in a branch. In IAM, the tabs in the menu item Applications have been restructured as well.

Another new feature in the Software Factory is the columnstore index support. A columnstore index offers substantial data compression, resulting in improved query performance. A powerful use case for columnstore indexes is storing LLM embeddings.

We have also introduced a new process flow connector: Web connection. It is an enhanced and re-usable version of the HTTP connector.

One of the new features in IAM is the support for public OpenID Connect clients in the client apps. This allows two types of clients: confidential and public.

This release includes 9 Community ideas representing 104 votes. For a full overview of all the new features and changes, please read the release notes below.

Thinkwise Platform version 2024.2

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:

Indicium now requires .NET 8.0.

ComponentMinimum .NET version
Windows GUI4.7
Indicium Basic4.7.2

Re-generate model definition

After every platform upgrade, always re-generate the definition of your work model before you start developing it (menu Deployment > Creation > tab Generate definition). This applies changes in the base models to your work model.

Note: if you are using nested base models, re-generate all base models below the highest level before you re-generate the work models.


Activate setting for the Windows GUI

Windows GUI

This update introduces the model setting Mimic Windows GUI (classic) for smoke tests. For more information, see Quality - Setting for smoke tests for the Windows GUI.

Activate setting

If you use the Windows GUI, it is necessary to activate this setting.

This check is not necessary if you only use the Universal GUI.

change Windows GUI

The terminology related to ‘filter’, ‘find’, and ‘search’ in the Windows GUI, Software Factory, and IAM has been updated. This change brings about a more logical and consistent use of these terms. An additional advantage is that it facilitates a smoother transition for users moving from the Windows GUI to the Universal GUI.

Inform your users

When you generate your application and synchronize it to IAM, these changes are also applied to your application. Inform your users about the new terminology.

Changes in the Windows GUI

Above the menu: Filter (CTRL + Q)Menu search (CTRL + Q)
Above the grid: Filter (CTRL + G)Search (CTRL + G)

Changes in the Software Factory

In the menu User interface > Subjects > tab Data:
tab: Combined filterSearch. This includes the underlying column:
column: In combined filterIncl. in search
tab: SearchFind. This includes the underlying columns:
column: Visible in searchVisible in find
column: Search conditionFind condition
column: Search order noFind order no. This includes three tasks:
task: Move search column upMove find column up
task: Move search column downMove find column down
task: Renumber the searchRenumber the find
In the menu User interface > Subjects > tab Settings > tab Permissions > group Data:
checkbox: SearchFind
In the ribbon
Remove filterClear all filters

New translations in the Subjects screen New translations in the Subjects screen


  • The texts for validations mentioning combined filter have been rewritten to mention search instead.
  • The texts for validations mentioning search have been rewritten to mention find instead.

Changed screen types


To enable a smooth transition to the Universal GUI, we have changed the availability of the action bar in some screen types.

Check your model

The following screen types have been changed in the base model SCREEN_TYPES. They no longer have a default action bar:

  • chart
  • chart_horizontal
  • chart_no_field
  • cube
  • cube_horizontal
  • cube_no_fields
  • hierarchy_no_filter
  • master_detail_no_filter
  • pivot_grid
  • pivot_grid_horizontal
  • pivot_grid_no_field

This change impacts your work model after the first definition generation.

'Field in next column' support for the Universal GUI

new Universal GUI

The form- and parameter setting Field in next column now affects the Universal GUI. This change may affect existing configured forms, task- and report pop-ups. You can find this setting in the Software Factory in the menu User interface > Subjects > tab Default/Variants > tab Components > tab Form.

The setting Field in next column moves an existing group to a new form column, but only if available form columns exist. Availability depends on the horizontal width and other settings, such as the maximum number of form columns. If the field cannot move to a new column, there will be no visual indication that the group is separated.

A form field that is marked with Field in next column will act as a form group without a header, keeping subsequent fields together vertically:

  • In a form or form section without groups, these fields would previously be spread horizontally within the form or form section. Now, they will remain together vertically.
  • In a form or form section with groups, these fields would previously always remain in their form group. Now, they will move to a new form column, space permitting.

Additionally, when a field is marked with Field no. of positions further = 0 and with Field in next column, it will no longer be placed next to its predecessor. Instead, it will occupy a new position in the form and follow the rules mentioned in this topic.

Review your settings
  • Check your existing configured forms, task- and report pop-ups.
  • We have also updated the setting Next group. If no label or icon is specified for the group, the Universal GUI adds an empty position to the form. This empty space clearly separates the new group from the previous one, even if they are vertically placed in the same form column. If this is not intended, use Field in next column instead to create a new group without the empty position as a separator.
  • A rare occurrence is when Field in next column is set, but the entire preceding group is visually hidden. In the previous generation GUIs, the label and icon of this group would be 'inherited' by the field marked with Field in the next column. In the Universal GUI, the label and icon of the preceding group will be removed. This is intentional. To facilitate seamless migration from previous generation GUIs, we have added the enrichment Retain group label and icon for fully hidden form groups. It transfers the Field in next column setting to the hidden form field that introduces the group.

Process flows - Process action input/output views with nullable primary key

fix Universal GUI

When using the Universal GUI to work with the Software Factory, the input and output views of process actions would raise an error about a nullable primary key column.

We have introduced new smoke test steps to check this specific scenario with your own views. These steps inspect views to identify any records with a NULL primary key column.

Run the smoke tests

Run the smoke tests to see if you need to make any changes.

Authorization - Added 'Web connections' to 'Copy application' task

breaking new

In this release, we have added Web connections to the Software Factory and IAM. For more information, see Process flows - Web connection.

When you copy an application within IAM, you can now include all overridden properties of web connections. You can do this by selecting the checkbox Web connections in the task Copy application (menu Authorization > Applications > tab List). If this checkbox is not selected, the new application will not contain any overridden web connection properties of the copied application.

Update post-synchronization calls

If you execute the task create_gui_appl_from_gui_appl from post-synchronization/deployment code, in CI/CD tooling or anywhere else, update the call with the new parameter copy_gui_appl_web_connection and give it either the value True or False.

  • menu Deployment > Synchronization to IAM > tab Post synchronization code
  • menu Deployment > Deployment package > tab Post synchronization code

copy application Web connections in the task 'Copy application'

Model enrichments

Prompt chaining for AI-powered model enrichments


AI-powered enrichments now support more advanced prompting techniques by enabling prompt chaining. This functionality is used in the default model enrichments, and you also have the option to implement it in your custom enrichments.

What is prompt chaining?

By default, an enrichment contains a single set of prompts that the generative AI completes. With prompt chaining activated, additional prompts can be introduced based on the completion of earlier prompts. This feature enables the breakdown of complex tasks into smaller steps.

When running an enrichment, the completion prompt query will be re-executed after a completion. The completion prompt query has access to the temporary table #pc_data (key, completion) which contains all completions of all earlier cycles.

The model update query can access the completions of all prompt chain cycles. Because of this, the keys used for the prompts must be unique for all prompt chain cycles in a run. Re-using a key will result in errors.

To use prompt chaining in your own enrichments, select the checkbox Prompt chaining enabled in the menu Enrichment > Model Enrichments > tab Maintenance > tab Form > tab Enrichment.

You need to specify the prompts for all cycles in the same completion prompt query. To organize the prompt completion code for different cycles, use the variable @pc_cycle. It indicates the current prompt chaining cycle, starting at 1.

Example of prompt chaining

Here is an example of an AI enrichment that generates a system message based on a message translation. You want the message ID to be snake case, which is challenging to derive directly from the message translation. Instead, you can first have the AI summarize the text and then generate an ID based on the summary:

if @pc_cycle = 1
-- Summarize the user input to a handful of words
insert into #ai_data
concat('Summarize the following text to one to three words: ', @input)

if @pc_cycle = 2
-- Turn the summarized words into a camel_case variable
insert into #ai_data
concat('Provide a snake_case property name for the following word(s): ', completion)
from #pc_data
where "key" = 'prep_summarize'

You need to specify the number of cycles for an enrichment in advance. A cycle can also be completed without a prompt, for example, when a step is skipped via an enrichment parameter. In such cases, the process will move on to the next cycle.

New model enrichments


For AI-powered enrichments, use the latest AI models for the best results. For OpenAI, we recommend GPT 4 or up.

In this release, we have added new model enrichments.

  • Generate application logic based on natural language business rules - This enrichment is AI-powered. In its parameters you can enter a natural language business rule that tells the enrichment when and where the rule should occur and what should happen. The enrichment will derive the logic concept and the model object and create a logic template. It can generate Default, Layout, Context, Trigger, and Handler logic.

  • Add comments to code with AI - This enrichment is AI-powered. Adding comments to code is essential for understanding its functionality. This enrichment adds comments to a specific control procedure. It uses AI to comprehend your code and includes comment lines where needed. Comments will be added to control procedure code, template code, and dynamic model code, as applicable.

  • Set up a drag-drop link - Sets up a drag-drop link between two tables by creating the background task, settings, and functionality structure. The task is pre-populated to display a 'Todo: fill with logic' message to remind you to enter code for what needs to happen on a drag and drop action.

  • Role creation based on a table variant - After entering a role name, a table name, and a specific variant, this enrichment determines which rights must be granted to ensure that the variant is fully accessible. The role includes all objects for which rights can be set up, including menus, tasks, reports, columns, etc.


    If the role name already exists, the first suggested model update will be to revoke the existing rights. You can deselect this, but this can result in more access rights for the role than intended.

  • Role creation based on a process flow - After entering a role name and a specific process flow, this enrichment determines which rights must be granted to ensure that the process flow and all objects to which it links are fully accessible. The role includes all objects for which rights can be set up, including menus, tasks, reports, columns, etc.


    If the role name already exists, the first suggested model update will be to revoke the existing rights. You can deselect this, but this can result in more access rights for the role than intended.

New model enrichments for migration to the Universal GUI


For AI-powered enrichments, use the latest AI models for the best results. For OpenAI, we recommend GPT 4 or up.

To support a seamless transition from previous generations of user interfaces to the Universal GUI, we have added new model enrichments:

  • Add the Universal platform - Creates the platform Universal. It also adds a default theme for the Universal GUI, which is similar to the Windows GUI theme.

  • Remove obsolete platforms - Removes the two platforms that are no longer supported: Web and Mobile. In addition, it removes themes, menus, configurations, and process flows that were only used for the removed platforms. You can also choose to remove the Windows platform. Note that the Windows platform is still supported. Use this enrichment only to remove platforms other than Universal.

  • Update tree page size - Automatically updates the page size of all hierarchical trees to an acceptable value for displaying the tree in the Universal GUI.

  • Keep ungrouped form fields vertically aligned - The Universal GUI keeps form fields in form groups together vertically when repositioning fields in the form columns based on available horizontal space. The exception is when fields are neither in a group nor marked to be allowed in a new form column. These ungrouped fields spread across the available form columns. This maximizes vertical space usage but results in a different visual experience than the tabbed forms that focus on filling horizontal space. This enrichment updates the first such fields to be allowed in a new form column, causing subsequent fields to stay together vertically as a virtual group.

  • Field height limitation - In previous GUI generations, the setting Field height in positions for form fields could be set to very large values. The GUIs limited this value based on the available space of the tabbed form. However, the Universal GUI uses a scrollable (vertical) form that respects any configured value for Field height in positions. This enrichment adjusts extreme values for this setting to a suitable value compatible with a scrollable form.

  • Show default cube view - In previous GUI generations, default cube views were always shown, even if the setting Show cube view was deactivated. However, the Universal GUI respects the deactivated setting and will not show the default cube view. This enrichment adjusts the setting to show the cube view. If you do not want this, you can also change the default cube view for this cube.

  • Set up a card list configuration - This enrichment sets up a basic card list configuration for each table that has more than three visible columns in the card list. The configuration is based on the following columns:

    • The look-up value of the table. It will be shown without a label
    • If present: an image or icon
    • If present: the first checkbox or combo from the grid. It will be shown with a label

    Additional columns in the table will be hidden in the card list. This enrichment does not modify the card list setup for variants. These were made intentionally, so the enrichment should not modify these settings.

  • Update message options - When configuring messages and their corresponding options for the Windows GUI, the most common practice is to model the affirmative message option (for example, 'yes') on the left side, and the negative option (for example, 'no') on the right side on a screen. In the Universal GUI this is exactly the opposite because of different standards in web and desktop applications. This enrichment updates the message options so the negative option is positioned on the left side and the affirmative option on the right side. Any other options will be modelled in between. You can select which model updates need to be executed.

  • Set the display type to hidden for drag-drop tasks - When drag-drop tasks are used in your application, there is usually no need for visible buttons in the user interface. This enrichment sets the display type for drag-drop tasks to hidden.

  • Set the display type to Icon only for tasks and reports - Sets the display type to match the way tasks and reports used to be shown in the Windows GUI. You can set the display type for tasks and reports, which determines how they are displayed in the GUI. By default, new tasks and reports are set to Icon + text. The Universal GUI honors this setting. However, the Windows GUI does not support the textual part and only shows the icon. This means the display type would change for the end user when your application switches from the Windows GUI to the Universal GUI. To mimic the behavior of the Windows GUI, this enrichment sets the display type to Icon for all tasks and reports that are set as Icon + text or Text only.

  • Show tab icons - Ensures that your tab icons are displayed like in the Windows GUI. In the Classic theme used in the Windows GUI, there is an option to show or hide tab icons. However, this setting is not available in the Universal theme, where tab icons are hidden by default. This enrichment adds the extended property ShowTabIcons if tab icons are set to be shown in the Classic theme that is linked to the platform Windows. This achieves the same behavior in the Universal GUI as in the Windows GUI.

  • Turn off auto-introduced search - Excludes the search bar from the introduced action bar for all affected screen types. Every screen in the Universal GUI automatically gets an action bar, and every action bar automatically introduces a search bar if search settings are configured for the table. This may not be desired, so with this enrichment, you can make sure that the search bar is excluded in those cases.

  • Set the keybinding schema to Classic - Adds the ability to select 'Classic' navigation for using Enter to move from field to field. The Universal GUI uses web-oriented hotkeys for navigation. This means that it supports using Tab to move from field to field. The Enter key is used to create line breaks in multiline fields. This enrichment adds an extended property called keybindings that changes the keybinding schema to ‘Classic’. If set to 'Classic', you can use Enter to move from field to field in forms.

  • Set the default page size for pagination - Sets the page size so pagination is available in the Universal GUI. If you migrate to the Universal GUI without a page size configured, there will be no pagination.

  • Show or hide the default action bar - With this enrichment, you can configure the presence of the default action bar. This is determined by the screen components a screen type has. If at least one of the chosen components is available in a screen type, the default action bar will be enabled. If not, the default action bar will be turned off. Screen types with a modeled action bar are excluded from this enrichment. Also generated screen types will not be modified.

  • Move tasks and reports to the overflow menu - In the Windows GUI, tasks and reports are not visible when their respective bars are not included in the screen type. Users need to access them by navigating through the ribbon or by opening the context menu. In the Universal GUI, tasks and reports are shown by default in the action bar, alongside the CRUD actions. This enrichment ensures that tasks and reports are placed in the overflow menu if the assigned screen type for the subject does not contain a task bar or a report bar.

AI-powered model enrichments as tasks


In the previous release, we have started adding AI-powered model enrichments to the Software Factory. As you can read in these release notes, we have added many more to this release and will continue doing so. So far, the AI-powered model enrichments were only available in the menu Enrichment > Model enrichments. They remain available there but in this release we have started making them available as tasks on the screens where they can be of immediate use.

The following AI-powered model enrichments are now available on other Software Factory screens:

  • Create AI-generated data model - Available in the menu Data > Data model. Similar to the enrichment process, you will be prompted to provide a description of your desired data model. Upon execution, the data model will be created. The AI will generate a diagram with tables, references, and new domains as required.


    The model enrichment in the menu Enrichment > Model enrichments has more options. It allows you to select the specific tables, columns, and references to be created, and you can choose which steps to execute.

    AI generated model A description and a generated model

  • Translate using AI - Available in the menu User interface > Translations. This task is only available if your branch contains two or more languages, and at least one translation.

  • Generate table description with AI - Available in the menu Data > Data model > Tables. The selected table will be used as input for the enrichment. The table description will be filled with an AI-generated table description.

  • Generate application logic with AI - Available in the following locations:

    • Business Logic > Functionality
    • Data > Data model > tab Tables
    • User Interface > Subjects

    If you enter a description of the desired control procedure, the AI automatically derives the logic concept, the model object, and creates a logic template. It can generate Default, Layout, Context, Trigger and Handler logic.

  • Add comments to code with AI - Available in the following locations:

    • menu Business logic > Functionality (only for Assignment "SQL")
    • menu Business logic > Functionality > tab Templates
    • menu Dynamic model > tab Control procedure

    Depending on the selected control procedure or template, the code is updated to include comments.

  • Summarize template with AI - Available in the menu Business Logic > Functionality > tab Templates. The selected template will be used as input for the enrichment. The template description will be filled with an AI-generated template description based on the code of this template.

Model enrichments as tasks


We have made a start with replacing tasks with model enrichments in the Software Factory. In this release, we have replaced one task:

  • Create cube - This model enrichment replaces the task Create cube in the menu User Interface > Business Intelligence. You can customize the cube based on the selected table and choose what you want to execute exactly, which was not possible with the task.

Indication for generation by AI


When objects or code are generated using the AI-powered features of the Software Factory, the field Modified by is set to "Generative AI". This user will replace the "AI Code review" user that we introduced earlier. The history screens that can be opened with the tasks Show history in most screens will show clearly when a record was inserted or updated by AI with the following icon:

Generated by AI Generated by AI as part of the history

New and changed in the Software Factory

Process flows - New connector: Web connection


To communicate with any service or third party online, HTTP connectors were already available to send and retrieve data. However, despite all its capabilities, reusing the HTTP connector is not always easy and and altering its parameters requires writing logic.

For this reason, we have introduced a new process flow connector: Web connection. It is an enhanced and re-usable version of the HTTP connector. It stores information such as the base URL, (encrypted) authentication details, endpoints, and much more within the model (menu Integration & AI > Web connections).

You can also define parameters for use across the web connection or endpoints, facilitating dynamic field settings. Using curly brackets { }, you can add parameters to many settings. For example, you could create a Web connection parameter user_name and use it in the Username field by entering the value {user_name} there. The parameter is part of the input of the Web connection process action. The value that is set for the parameter user_name is then passed to the Username field, so the field can be filled dynamically.


Web connection settings (only web connection parameters allowed):

  • Base URL
  • Username
  • Password
  • Bearer token
  • API key name
  • API key value

Endpoint settings:

  • Path
  • Body type
  • Content type
  • Form fields
    • Name
    • Value
  • Query string parameters
    • Name
    • Value
  • Request headers
    • Name
    • Value

It is possible to override the Web connection settings:

  • In the Software Factory, you can override the Web connection settings for a specific runtime configuration (menu Maintenance > Runtime configurations > tab Web connections).
  • In IAM, you can override the settings for applications (menu Authorization > Applications > tab General settings > tab Web connections). This enables, for example, dynamic usage of web connections for different tenants.

Models - Merge changes into an arbitrary branch

Community idea new

It is now possible to merge a branch into an arbitrary branch (menu Models > Merging). You could use this, for example, when you are developing two different releases (each with their own release branch and develop branches) and need to merge changes from one release into the other.

During this process, the Software Factory determines an origin branch and point in time that are shared between the source and target branch. The merge session identifies all changes from the origin up to the current state of the source branch. This set of changes is then merged into the target branch and may include changes that were made before the source branch was created. For example, when HOTFIX_A is merged into DEVELOP, it will include all changes between MAIN 1.00 and the current HOTFIX_A branch.

To allow for merge sessions that involve source and target branches that are not the origin branch, we have renamed various elements in the screens. Instead of referring to the 'origin' and the 'branch' in the overview of actions and conflicts, in detail tabs, and conflict resolution texts, these UI elements now always refer to the 'source' and 'target' branch instead.

  • These types of merges are not shown in the branch diagram.
  • Data migration settings in the source branch will not be migrated to the target branch, as they are probably incompatible with all the existing data migrations in the target branch.

arbitrary branch Merge changes from an arbitrary branch

Models - Branch switch confirmation

Community idea new

When switching your active branch in the Software Factory (menu Models > Switch branch), you have to confirm a message that all open documents will be closed. This ensures that new documents are opened in the branch to which you are switching.

If you are familiar with this process, you may no longer want to get this message each time you switch branch. For this reason, we have added the option Always. If you select it, the message will no longer open.

You can revert this option in the menu Maintenance > Users > tab Form > checkbox Branch switch confirmation.

Confirm closing documents Confirm closing of documents when switching active branch

Models - Trace columns handled differently in a merge


Previously, when preparing and executing a merge session, the trace values of the objects were not always updated. For this reason, we have made some changes that make tracing the last person who updated an object much easier.

Note: A reciprocal merge has a minor limitation. If a value changes automatically due to a merge, the update user will be the person who executed the merge. This occurs, for example, when the absolute order number changes because columns have been added to the same table in both the origin and the branch. They cannot have the same number and will be recalculated when the merge is executed.

Models - Features available in new menu group


In IAM, we have enhanced the layout for the screen Applications (menu Authorization). For more information, see Applications - Enhanced screen overview.

In accordance with this enhancement, we have also added a tab General settings to the branche overview in the Software Factory (menu Models > Model overview > tab Branches).

In addition to this, we have updated the menu structure in the Software Factory. Certain features are more easily accessible now. They require fewer clicks to open. Opening them is also less error-prone, because they are opened in the context of your working branch automatically. These features remain available in the General settings tab, but have also become available through the menu. The menu now includes the following:

  • A new menu group Integration & AI has been introduced. This menu group is home to the following menu items:

    • Web connections
    • Email providers
    • File storage locations
    • OAuth servers
    • Generative AI
    • AutoML

    These features are all presented within the context of the current model/branch, making it easier to set up the values for each integration within the right context.

  • Since we have added AutoML to the menu group Integration & AI, the menu group Machine Learning has become obsolete and has been removed.

  • The menu group Enrichments has been moved to underneath Deployment, with the new menu group Integration & AI in between these two.

General settings General settings overview for branches

Data - Columnstore index support

new SQL Server

We have enhanced the Software Factory's support for creating indexes by introducing the option to generate columnstore indexes.

What are columnstore indexes?

A columnstore index is a type of index used in relational database management systems (RDBMS) to optimize the storage and retrieval of data in tables. Unlike traditional row-based indexes that store data in rows, a columnstore index stores data in columns. They offer substantial data compression, leading to a significant reduction in required storage space. This results in improved query performance due to reduced I/O requirements when executing queries that involve scanning and aggregating large volumes of data, typically in analytical and reporting workloads.

A columnstore index can be clustered or non-clustered. You can find both options as two new index types when creating an index in the Software Factory, in the menu Data > Data model > tab Tables > tab Indexes. If you are using SQL Server 2022 or later, you can specify an order column to improve performance.

Use case for columnstore indexes

Columnstore indexes include internal optimizations, such as SIMD and AVX-512 instructions, allowing SQL Server to compare millions of vector values in under a second. This enables semantic search within an application.

A powerful use case for columnstore indexes is storing LLM embeddings. This can be used for various purposes, such as:

  • Semantic searching in your application
  • Similarity matching of cases
  • Retrieval Augmented Generation (RAG): providing subject-related data in an AI-chat

Think about a system with a large number of emails. Each email has a subject and a text. The aim is to be able to quickly find relevant emails for various inquiries. To achieve this, the following steps are necessary:

  • Generate an embedding for each email
  • Store the embedding in a vector store

Generally, the vector store for emails would be modeled as a separate table:

table email_vector_store

The table uses a clustered columnstore index.

For each email, the LLM Embedding connector generates an embedding based on the subject and email body. Store the resulting embedding for an individual email as follows:

insert into email_vector_store

cast(e.[key] as int) as vector_value_id,
cast(e.[value] as float) as vector_value
from openjson(@embedding) e

This process is performed for each stored email in the system. Once the vector store is populated with email data, a semantic similarity search is possible. An example of this search involves finding relevant emails based on a natural-language search query by the user.

The search query can be converted into an embedding through the LLM Embedding connector and is then processed as follows:

-- Turn the search query embedding into a temporary table
cast([key] as int) as [vector_value_id],
cast([value] as float) as [vector_value]
into #search_embedding
from openjson(@search_embedding)

-- Find the 10 most comparable emails
select top (10)
sum(v1.[vector_value] * v2.[vector_value]) as score
from email_vector_store e
join #search_embedding s
on s.vector_value_id = e.vector_value_id
order by score desc

Columnstore index support

Data - Advise to update two domain controls


We have added a validation to warn you if you are using the domain controls File link or Folder link in your applications, so you can refactor them with alternatives.

These controls are especially suited for desktop applications where all users can access a file or folder from the same environment. In a 3-tier architecture and Azure, files can be in a different location where users cannot link to directly. Moreover, browser applications cannot access desktop files. So, replacing the domain controls with alternatives makes your application more suitable for use in a 3-tier architecture (with the Universal GUI) and Azure.

Refactor File link and Folder link domain controls
  • Instead of File link, consider using File upload (for both uploads and downloads). Ensure that Indicium has access.
  • Instead of Folder link, you can use what is most suitable for your situation. Some examples:
    • Remove the control entirely, converting it into a freely editable text field. In that case, the GUI no longer checks whether the path exists.
    • Use a process flow for upload/download.
    • Use a Copy to clipboard control, users can then use the link on the clipboard to go to the right environment themselves and access the folder.

We have also refactored these domain controls in the Software Factory. For more information, see Deployment - Open generated files.

Data - More options for copying columns to another table

Community idea new

We have added more options to the copy task in the tab Copy columns (menu Data > Data model > tab Tables > tab Columns > tab Copy columns). When copying columns from another table, you can now also select identity-related settings (Identity, Seed, Increment) and the setting Mandatory. This offers greater control over the desired outcome of the new column. For example, if you select Mandatory to include in your copy, it copies the setting (mandatory or not) from its source.

Mandatory and Identity settings Mandatory and Identity settings

User interface - Validations for prefilter groups


We have added new validations to alert you of prefilter groups that have been set up incorrectly. This applies to groups for all three types of prefilters (main, detail, and lookup) in the default tables and table variants.

You can set prefilter groups in the menu User interface > Subjects > tab Subjects > tab Data > tab Prefilter.

User interface - Menu designer converted into a tree-based visualization


To make the Software Factory suitable for use with the Universal GUI, the menu designers (known as modelers) have been replaced with a Tree component. Because this is a native screen component, menus can be visualized and maintained once the Software Factory uses the Universal GUI. The functionality of the menu designer has been retained. Groups and items can be moved using drag-drop.

For list bar and tiles menus:

  • Groups can be dragged onto other groups. The groups are put before the group on which they were dropped.
  • Items can be dragged onto other groups or items of other groups. The items are moved to the group where they were dropped.
  • Items can be dragged and dropped inside their current group. The items are put before the item on which they were dropped.

For tree menus, it is slightly different:

  • Groups can be dragged onto other groups. The groups are put before the group on which they were dropped within the parent groups. Groups will not be moved.
  • Groups can be dragged onto items in other groups. The groups are moved to the parent group of the item on which the row was dropped.
  • Items can be dragged onto other groups or items of other groups. The items are moved to the group where the row was dropped.
  • Items can be dragged and dropped inside their current group. The items are put before the item on which they were dropped.

Example of a list bar menu

User interface - Grouping icons

Community idea new

Icons are an essential part of any model. They are kept in the icon repository, in the menu User interface > Icons. For large models, the icon repository can contain hundreds of icons, each appearing in one or more locations.

To facilitate better organization, we have added the ability to group icons. The tab Form now contains a field Icon group where you can specify the group to which the icon belongs. You can create a new group in the field's lookup.

Icon groups Icon groups

User interface - Moved translation tasks


The tasks Generate translation objects and Delete unused translation objects have been moved one level higher on the screen (menu User interface > Translations). You can now find them above the grid with the languages.

Translation tasks Moved translation tasks

User interface - Removed the limitation on 100% field position width

change Universal GUI

Previously, fields on the same line would always equal 100% even when the field width would indicate otherwise. We removed this limitation, allowing fields on the same line to exceed 100% of the available width. This allows the Universal GUI to better scale sets of fields.

This change requires Universal GUI version 2024.1.14 or higher.

You can set the Field width in the menu User interface > Subjects > tab Default/Variants > tab Settings > tab General > group Form.

Community idea new

It is now possible to use wildcards in a code search (menu Business logic > Code search). This allows for more complex searches with specified conditions while maintaining flexibility. The possible wildcard options are:

  • % - Matches any string of zero or more characters. It can find a match on one word or on multiple words, as long as they appear in the same line, consist of the search string and appear in that specific order.
  • _ - Matches any single character.
  • [...-...] - Matches any single character within the specified range ([a-f], [0-4]) or set ([abcdef], [01234])
  • [^...] - Matches any single character not within the specified range ([^a-f], [^0-4]) or set ([^abcdef], [^01234])

Code search using wildcards Code search using wildcards

Community idea new

The Software Factory now remembers your 5 most recent code searches, allowing you to quickly switch between them. This applies not only to the search string itself, but also to its corresponding search options.

  • For quick selection, the combo box shows the sorted order number (latest on top) and the historical search string.

    Code search combo box Code search combo box

  • For additional information, the lookup pop-up shows a grid containing the corresponding search options for each historical search string.

    Code search lookup Code search lookup

Quality - Improved AI code review


Reviewing code by a generative AI provider was already available. Now, we have further enhanced this functionality by improving its results and adding an AI code review task to several convenient locations.

Activating an automatic AI code review has remained the same: in the menu Quality > Code review > tab Code review, execute the task Ready for review and select the option Review by AI. The Software Factory executes the AI code review in the background.

Additionally, you can request an AI code review manually if a control procedure is in review with the new task Review template code with AI . This task is available in the following locations:

  • Quality > Code review
  • Business logic > Functionality > Code review

AI code review A task to start the AI code review

Quality - Smoke test success in the Quality dashboard

Community idea change

In the Quality dashboard, we have replaced the measurement of Process test success with Smoke test success.

Smoke tests with status Warning are considered successful for the quality dashboard ratings, as this can only occur due to a query timeout. You can currently not prevent this.

The calculation for the number of stars for smoke tests and the impact on the summarized branch quality is the same as the calculation for the process tests; it shows the percentage of available smoke tests with a successful result. The quality improves if more tests are successful.

Smoke test success in the Quality dashboard

Quality - Setting for smoke tests for the Windows GUI

new Windows GUI

The Indicium service tier now supports expression fields in prefilters for smoke tests.

However, if you are not using Indicium (i.e. the Windows GUI), expression fields in prefilters are not supported. So, if you run a smoke test for the Windows GUI, you want it to fail for prefilters with expression fields.

To enable this, a new checkbox is available in the menu Model overview > Branches > tab Model settings. It is called Mimic Windows GUI (classic) and is cleared by default. Only select it if you are using the Windows GUI for your applications.


Do not select this setting if you are using the Universal GUI. The Universal GUI is a 3-tier user interface that supports prefilters with expression fields. Enabling this setting will lead to false negatives in your smoke tests, or prevent the use of expression fields in your prefilters.

Quality - SQL analysis removed


Last year, we introduced the AI code review feature. Consequently, the SQL code analysis has become outdated and has been removed from the Software Factory. Previously, it was available in the following locations:

  • menu Quality > Code review > tab Code analysis
  • menu Model content > Program objects > tab SQL analysis

Deployment - Open generated files


As of this release, we no longer use the domain controls File link and Folder link in the Software Factory and IAM. For more information about the reasons for this change, see Advise to update two domain controls.

These domain controls were used in the following screens:

  • menu Deployment > Creation > tab Generate source code - If you run the task Generate source code with Write to storage activated, the result screen shows folder locations.
  • menu Deployment > Synchronization to IAM > tab Synchronization - If you run the task Synchronize to storage, the result screen shows the location of the synchronization file.
  • menu Deployment > Deployment package > tab Deployment package - If you run the task Create deployment package, the result screen shows the location of the deployment package.

Previously, you could open the folders or file directly from the Software Factory. Now, a button Copy to clipboard is available instead. You can use it to copy and paste the link to where the files are available, for example, in the file explorer or an AWS bucket.

Deployment - Estimated duration


We have added an estimated duration to some Deployment screens:

  • menu Deployment > Creation > tab Generate definition
  • menu Deployment > Synchronization to IAM > tab Synchronization

The estimate shows the remaining amount of time based on the average of all previous successful processes.

Estimated duration Estimated duration

Deployment - Duration for synchronization steps


In the screen Synchronization to IAM (menu Deployment), you can now see the duration of every step in the process and all individual steps when generating synchronization scripts. This helps visualize what tasks the process is performing and how many steps remain.

Do note that some scripts take longer to generate than others. This can be because of the amount of data or that the underlying process takes more time to calculate all the necessary values, such as calculating the effective rights for (variant) columns.

Duration of synchronization steps

Dynamic model - Trace columns filled for staged strategy


Previously, the person generating the code was usually not the same as the one who initiated the change, so adding the first person to the trace columns made no sense. And since we introduced system flows for generating code, the pool user is the one who generates.

When generating dynamic model procedures with the strategy Delete, you can specify your own value for the trace columns. However, when using the strategy Staged, the trace columns were not filled.

This has been changed and now the Software Factory also fills the trace columns for all the temporary tables that are used, but only when the data is new or has actually changed.

  • When the dynamic model creates a record, the insert and update trace fields are filled.
  • When the dynamic model updates a record, the update trace fields are also updated.

Maintenance - Retention plan for unit test results


The Software Factory saves unit test results for all executed unit tests in the menu Quality > Unit tests. However, a large part of the unit test result information is usually not important enough to store for a longer period of time. Similarly to how jobs are cleaned up, we have introduced a new setting named Unit test retention (in days) in the menu Maintenance > Configuration > group Environment settings. The default value is 14 (days).

Every day at 8:00 PM UTC, the Software Factory removes the unit test result information based on the value of this setting. The clean-up process removes all related data for unit test results that exceed the retention period. Only the most recent run and the last successful run within the context of a model/branch combination will be retained.

Generic - More 'go to' options

Community idea new

We have added more 'go to' options to the Software Factory:

  • Go to model rights - With this task, you can navigate from different objects to the Model rights overview (menu Access Control > Model rights > tab Model rights).

    It is available for the following objects:

    • Table (menu Data > Datamodel > Tables) and (menu User interface > Subjects)
    • Menu (menu User Interface > Menu)
    • Process flow (menu Processes > Process flows)
    • Subflow (menu Processes > Subflows)
    • Task (menu Processes > Tasks)
    • Report (menu Processes > Reports)
    • Subroutine (menu Business Logic > Subroutines)
  • Go to the mock data - With this task, when you add mock data to a unit test, you can navigate directly to the data set. It is available in the menu Quality > Unit tests > tab Form > tab Mock data.

  • Go to [Object] - With these tasks, you can navigate to different objects from the menu Business Logic > Functionality > tab Deploy.

    The following tasks are available:

    • Go to Tasks
    • Go to Data model
    • Go to Process actions
    • Go to Subroutines
    • Go to Reports

It is now possible to navigate directly to the documentation and the release notes for the Software Factory. The new menu group Documentation contains two menu items:

This keeps the documentation accessible when working in the Software Factory in a 3-tier environment.

Generic - New validations


We added 3 validations to detect that an object uses a shortcut with a reserved Shift code value 'Shift'. The validations apply to prefilters, tasks and reports.

  • In the Windows GUI, the Shift code value 'Shift' is reserved for typing capitals and shift numeric keys. This makes it impossible to use it for activating the object using the shortcut.
  • In the Universal GUI, the Shift code value 'Shift' is reserved for activating the object using the shortcut. This makes it impossible to use it for typing capitals and shift numeric keys.

Fixed in the Software Factory

Models - Branch diagram improvements

The branch diagram did not show reciprocal merging correctly. This has been fixed, along with various color-related enhancements.

Branch diagram improvements Reciprocal merging in the branching diagram

Models - Disallowed removal of model settings

It was possible to delete the model settings of a branch in the Software Factory (menu Models > Model overview > tab Branches > tab Model settings). However, deleting these settings would cause several processes to fail. We have disabled the delete option.

Models - Open sole active branch if 'Remember selected branch' is not selected

When a user only has one branch within a model set as their own (My models ), the task pop-up Switch branch would always use the last user session when opening the Software Factory regardless of the setting Remember selected branch. This was unintended and has been resolved. Now:

  • If the checkbox Remember selected branch is cleared, the model and branch selection will be preset to the sole active model and branch that are linked to your user rather than the last user session.
  • If the checkbox Remember selected branch is selected, the model and branch used in the last session will be preset.

Models - Resolved merging base models into work model dependencies

When a base model supplied a table and a column and had the look-up display column set up for a reference, the trigger code would set the look-up display column of the table before the actual column was added to the work model. This has been corrected.

Process flows - Start and stop included in copy


When adding a new process flow and using the Copy button to create another process flow, the process actions Start and Stop were not added. This has been fixed. They are now always added when adding new process flows.

Data - Rebuild table now also results in recreating constraints in 'Smart upgrade'

When executing a smart upgrade (menu Deployment > Creation), constraints on a table selected for rebuilding were not recreated when the table was recreated. This has been fixed.

All references with the setting Check integrity selected (menu Data > Data model > tab References > tab Form) will be recreated during the smart upgrade if the table has been marked for rebuilding in the data migration (menu Data > Data migration).

Business logic - ROWGUID columns not allowed in handlers by Indicium

ROWGUID columns are now excluded from the generated statements for insert handlers and update handlers, as Indicium does not allow them to be used in these handlers. If such handlers containing ROWGUID columns were already present in your database, they will be marked as modified during the next smart upgrade.

User interface - Selected font for updated conditional layout

When updating a conditional layout with a new font that has different bold or italic configuration than the configured font, these settings would not override the existing ones. This has been fixed.

Access Control - Role simulation in the Software Factory with Always on prefilters

When you simulated a role in the Software Factory and that role had the setting Always on activated, the Software Factory ignored that setting. In IAM, it was used correctly. This led to a difference between simulated roles in the Software Factory and IAM. The Software Factory now correctly listens to the Always on setting.

Deployment - Slashes in relative paths

We resolved an issue where relative paths for code files and program objects had to contain a backslash for writing code files to disk, writing program objects to disk, and deployment package processes. These relative paths can now contain zero or more back or forward slashes.

Deployment - 'Deselect all code files task' excluded code file DB

Previously, the task Deselect all code files (menu Deployment > Creation > tab Execute source code) would also deselect the code file DB. The Software Factory automatically selects this code file if the database does not exist. Manually deselecting this code file is not allowed. This was already disabled in the list, and now it is also no longer possible with the task Deselect all code files.

Quality - Numeric with no decimals in unit test

A unit test could lead to unexpected results if you used a domain with data type Numeric without decimals, like 2,0 (2 = total length, 0 = no decimals). For example, if you expected '3' as output, the unit test would fail because the value returned by Indicium was '3.0'. Now, the Software Factory converts '3.0' to '3' to match the expected outcome.


If you used workarounds to solve this problem, you can remove them. They are no longer necessary.

Specification - Data in Work overview

Windows GUI

The menu item Work overview (menu Specification) opened without data. This has been fixed by ensuring that the prefilter Work items is always enabled when opening the screen.

Generic - Improved support for Oracle


Oracle uses packages instead of program objects. To generate and execute a single package for Oracle, select the checkbox Fixed file in the menu Models > Model content > tab Code files > tab List > tab Code file.

We have improved the support for Oracle in the following screens:

  • Functionality (menu Business logic > Functionality > tab Deploy)
  • Code overview (menu Business logic > Code overview)

These screens now include a tab page Package for the entire package of which the program object is a part.

We have also renamed some tasks to better reflect their nature:

Old nameNew name
Generate selected program objectsGenerate selected
Execute all program objectsExecute all
Execute selected program objectsExecute selected

The changes allow you to generate and execute a single package (code file) instead of a program object:

  • The tasks Generate control procedure and Generate selected assemble the package code.
  • The tasks Execute all and Execute selected execute the package on the database instead of the program object.

Additionally, the processes Create and Data migration are now similar to the ones for SQL Server.

New and changed in the Intelligent Application Manager

Client applications - Support for public OpenID Connect clients


You can now mark a client application as a public client (menu Client apps > Client applications > tab Form > tab Client application). This is only possible under the following conditions:

  • The client application supports OpenID Connect, and the Grant type is "Authorization code".
  • The client application has no secrets. If there are secrets, this option is not available.

If Public client is selected, it is no longer possible to add secrets (the tab page is disabled).


All clients that do not currently have secrets will automatically be marked as public clients when you upgrade to this version of IAM.

This feature allows two types of OpenID clients:

  • Confidential clients - Clients that can keep their secrets confidential. They can authenticate themselves to the authorization server.
  • Public clients - Clients that cannot use registered client secrets, such as applications running in a browser or native apps on a device.

Public client

Applications - Enhanced screen layout


The screen Application in IAM (Authorization > Applications) contains a lot of detail tabs. To improve the overview, we have created four main tab groups on this screen:

  • General settings - new
  • Authorization settings - new
  • Preferences - was already present
  • Analysis - was already present

These main groups each contain detail tabs. This distribution corresponds to the task Copy application we updated in a previous release.

Since the Software Factory's branche overview (Models > Model overview > tab Branches) contains mostly the same tabs as the tab General settings in IAM, its layout has been changed, too. In addition, many tabs have been moved to a new menu group, Integration & AI. See Models - Features available in new menu group for more information.

authorization tabs New tab: Authorization settings

Applications - Available languages for user preferences

Community idea change Universal GUI

We have updated the list of languages available to users to pick from via user preferences in the Universal GUI (profile menu > User preferences). They can no longer choose from all the languages known in the environment but only from languages configured for applications that users can access via a menu (menu Authorization > Applications > tab General settings > tab Translations).

Users - Pool user allowed to add users


Unauthorized users are not allowed to add users to IAM. The pool user, used by Indicium to communicate with IAM, was also not authorized to add users unless it was designated as a main administrator.

This has been changed. All database users with sufficient rights, including pool users, can now add users to IAM. This facilitates the automatic creation of users in IAM.

Users - Enhanced screen layout

new Universal GUI

We have changed the layout of the screen Users in IAM (menu Authorization > Users). The changes improve the overview and provide clearer context for the tasks. Recommendation-related tasks and most user preference-related tasks have been moved to their respective detail tabs. Additionally, the task Clean up unused preferences has been relocated to the menu Optimization.

Furthermore, the CRUD buttons are no longer shown alongside the tasks in the action bar. This further enhances the cleanliness of the user interface on this screen.


While user preference-related tasks are placed on the first tab Global, they impact not only global user preferences but all user preferences. We have adjusted the translation to reflect this.

old The old action bar

new The new action bar and some of the relocated tasks

Users - Removed "Begins on" and "Ends on" fields for Main administrator


We have removed the fields Begins on and Ends on from the screen Main administrators (menu Authorization > Users > tab Administrators) because these fields are editable by the main administrator anyway. When a row is inserted, the user is now considered a main administrator until the row is removed.

We have also changed how the fields Begins on and Ends on are handled for a user. When these fields are edited, the fields Begins on and Ends on in related tables, such as User groups and Administrator screens, are no longer updated. This means that a user will not be able to access any application if the Ends on date and time has passed. The set dates for the user are now leading.

Generic - Delete tasks hidden in IAM


In both the Software Factory and IAM, the delete tasks have already been technically replaced by handlers. In the Software Factory, they also have been hidden in the user interfaces. Objects can be deleted using the regular CRUD delete button. We have now implemented the same in IAM.

In certain cases, the delete task remains accessible because it deletes more than one single item:

  • menu Analysis > Recommendations - delete removes all unused recommendations with a specific recommendation type.
  • menu Settings > Global translations - delete removes the language tag and all global translations linked to it.
  • Advanced menu > Administration > Role sets - delete removes all role sets without roles.

Generic - Improved role lookup reference performance


To improve the checking of rights in underlying views for Indicium, we have added new tables to IAM to store the granted lookup references for each role. This eliminates the need for expensive queries to check granted lookup references for each role. The result is improved performance.

During the upgrade, the data for these tables will be automatically created based on the data in IAM for each of your models and branches. These tables will receive updated information when you synchronize your branches from the Software Factory.


In IAM, the menu group Documentation already exists. It contains the menu item Documentation. We have added a new menu item to this group: Release notes. Here, you can select the release notes for the version you need.

Fixed in the Intelligent Application Manager

Reload application in Indicium after changes in email or generative AI providers

If you made changes to email providers or generative AI providers, IAM now tells Indicium to refresh the application where the changes were made. Before, this had to be done manually, which was not always possible in production or due to lack of access.

Ensure email is mandatory when copying a user with TOTP

When a user uses TOTP (time-based one-time password), the email address is mandatory. However, this mandatory state was not enforced when copying a user with TOTP. This enforcement has been added to the copy task.

Data model changes

Data model changes for the Software Factory and IAM meta-models are listed here. This overview can be used as a reference to fix dynamic control procedures, dynamic model code or custom validations after an upgrade.

Changes Software Factory

Table changes


SF - From tableSF - To table

Column changes


SF - From tableSF - From columnSF - To tableSF - To columnMandatoryDefault value

Changes Intelligent Application Manager

Table changes


IAM - From tableIAM - To table

Column changes


IAM - From tableIAM - From columnIAM - To tableIAM - To columnMandatoryDefault value

Questions or suggestions?


Questions or suggestions about the release notes? Let us know in the Thinkwise Community!