UI Customization & Custom Code
The Custom Build approach gives you full control over the Dynamixs.AI user interface and application logic. This page describes how to override platform UI files and add your own Java services — without ever modifying the platform itself.
This page assumes you have already set up the Custom Build as described in Custom Build.
Overriding UI Files
To override any file from the platform — CSS, XHTML pages, JSF components, layouts — simply copy it into your src/main/webapp/ directory. Maven will automatically prefer your version over the base during the build.
To explore all available files you can override, unpack the base platform WAR:
mvn dependency:unpack \
-Dartifact=ai.dynamixs:dynamixs-platform-ui:LATEST:war \
-DoutputDirectory=target/platform-ui
Browse target/platform-ui/ and copy any file you want to customize into the corresponding path under src/main/webapp/.
Common Customization Examples
Override the default stylesheet
src/main/webapp/layout/css/custom.css
Override a form section
src/main/webapp/pages/workitems/parts/my-section.xhtml
Add a custom JSF component
src/main/webapp/layout/components/my-component.xhtml
Any file placed under src/main/webapp/ at the correct path will silently replace the platform default — no configuration required.
Adding Custom Java Services
Customer-specific backend logic — ERP connectors, custom adapters, CDI observers — lives under src/main/java/. This code is entirely owned by your project and deployed inside the application server alongside the platform.
Example: a custom ERP connector
src/main/java/
└── com/acme/
└── erp/
└── SAPConnector.java
Add the corresponding Maven dependency to your pom.xml if needed:
<dependency>
<groupId>com.acme</groupId>
<artifactId>sap-connector</artifactId>
<version>1.0.0</version>
</dependency>
Custom CDI beans are picked up automatically by the application server — no additional registration is required.
Custom Prompt Adapters
A common use case for custom Java code in Dynamixs.AI is extending the prompt processing pipeline. For example, you can inject application-specific data into a prompt at runtime by observing the ImixsAIPromptEvent:
@ApplicationScoped
public class MyPromptAdapter {
public void onEvent(@Observes ImixsAIPromptEvent event) {
String prompt = event.getPromptTemplate();
// Replace a custom placeholder with live application data
String orderData = myERPService.getOrderData(event.getWorkitem());
prompt = prompt.replace("{order-data}", orderData);
event.setPromptTemplate(prompt);
}
}
This pattern allows business data from any external system to flow into the LLM prompt — without modifying the BPMN model or the platform itself.