August 2026 (version 2.26.08.24)
Reviewed: 24 August 2026
This release focuses on concurrency stability, security hardening, and quality-of-life improvements across document processing, file operations, email infrastructure, and developer experience.
🚀 New Features
DOCX Space Preservation
Automatic support for space preservation in <@docx/text> content, ensuring that expected formatting is maintained throughout documents.
Word documents naturally trim leading, trailing, and consecutive spaces in text runs. By default, CaseMaster now wraps text content in xml:space="preserve" so that spaces you intend to keep, such as indentation, padding between words, or trailing whitespace, are honoured exactly as written in your templates.
<@docx/text
'Hello, world!'
preserveSpace: true() // Default
>
Lazy Loading Images
Introduced support for lazy loading images, improving page performance when rendering HTML with multiple images.
By default, browsers load all images on a page as soon as it renders, even those below the fold that the user may never scroll to see. Lazy loading defers image loading until the image enters the viewport, reducing initial page weight and speeding up render times.
<@page/image
src: script.call('web/router/static:resolveUrl', 'img/example.png')
lazy: true()
>
Auto-Directory Creation
The system now automatically creates destination directories when copying or moving files and directories, streamlining file operations and reducing manual setup requirements.
// No longer needed, fileSystem.copy will create the directory
// if not(filesystem.directoryExists([directory]))
// filesystem.createDirectory([directory])
// end-if
fileSystem.copy(
document.filePath([document]),
fileSystem.buildPath([directory], 'copy.docx')
)
Both fileSystem.copy and fileSystem.move will create any missing parent directories in the destination path automatically, so you no longer need to check and create them manually beforehand.
Test Email from Profile
Users can now send test emails directly from an email out profile, simplifying configuration verification before deployment.
If you have not already done so, we recommend updating your application maintenance entry for Email Out Profiles to use the dedicated maintenance page application/maintenance/email/outProfile:main instead of the entity-based view. This ensures you have access to the new test email functionality and future enhancements.
🛡️ Security & Compliance
Account Enumeration Prevention
We've tightened the Forgot Password flow to prevent attackers from determining if an email address exists in the system. All password reset attempts now return the same generic "sent" message, regardless of whether the account is active or exists.
Updated Microsoft SQL Driver
Migrated from System.Data.SqlClient to Microsoft.Data.SqlClient, ensuring alignment with the latest security patches and ongoing support from Microsoft.
As part of this migration, CaseMaster now logs a warning when a compatibility fallback is applied, alerting you to unencrypted database connections that may expose sensitive data in transit.
Action Required
We may enable encryption by default in a future release. To avoid unexpected connection failures, we strongly recommend explicitly applying Encrypt=True in your production connection strings now.
Migrated SMTP Handler to MailKit
Migrated the SMTP handler to MailKit, aligning with a actively maintained and security-focused library for email transport. MailKit provides better support for modern TLS standards and ongoing security updates.
This change is fully backwards compatible, and existing email out profiles should continue to work without any configuration changes. However, as with any infrastructure-level change, we strongly recommend testing your email profiles in a staging environment before deploying to production.
Parameter Encoding
Improved parameter encoding for <@page/link/target/modal> and <@page/link/target/window> specifications to guard against injection. User-supplied values passed to modals and windows are now encoded before being interpolated, preventing malicious input from executing in the rendered page context.
⚙️ Performance & Reliability
Concurrency & Thread Safety
We’ve refactored core internal data structures to guarantee stability and prevent race conditions during high-concurrency operations.
Property Bags & Collections
Push and pop operations on property bags, along with access to underlying collections, are now fully thread-safe. This eliminates potential errors when multiple threads manipulate shared state simultaneously.
Context Entries
Setting both property context entries and Query String (QS) context entries is now thread-safe, ensuring reliable state management across concurrent access.
Resource Cleanup
Word and Excel cleanup routines have been hardened to handle garbage collection in any order. This prevents resource leaks and unexpected application pool crashes in long-running or high-volume processing.
Best Practice
While CaseMaster now handles cleanup more robustly, we strongly recommend explicitly disposing of Word and Excel objects within a try/finally block. This ensures deterministic resource release and further safeguards against edge-case leaks.
Critical Fixes
Finally Statement Execution
Fixed an issue where finally blocks were prematurely truncated if a return statement appeared in the preceding try block. Previously, only the first line of the finally block would execute, silently ignoring subsequent cleanup logic.
HttpRequest Header Validation
Added support for disabling automatic header validation on httpRequest.
This enables the use of custom or non-standard headers that would otherwise trigger a validation error, such as the AWS Signature Authorization header.
httpRequest.setHeader(
[request],
'Authorization',
'AWS4-HMAC-SHA256 Credential=id/yyyymmdd/eu-west-1/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date;x-api-key, Signature=signature',
validate: false() // Disable validation
)
🔧 Developer & UX Updates
Log Maintenance
The application maintenance log viewer now displays the filename in the modal title when tailing a log file, making it easier to identify which log you're currently viewing.
Validation Metadata
Added default string length metadata to date-based attributes on business objects. This ensures that external validation schemas receive the correct length constraint (e.g., 10 for YYYY-MM-DD) when consuming CaseMaster resources.
boDesc.getAttrLength(bo.user(), 'cmCreatedWhen') // 20
📝 Upgrade Recommendations
All users should upgrade to benefit from the security fixes, including the account enumeration prevention in the password reset flow, parameter encoding hardening, and the SQL driver migration.
We strongly recommend explicitly applying Encrypt=True in your production database connection strings ahead of a future release where encryption may become the default.
If you are integrating with AWS or other services requiring custom headers, update your httpRequest calls to take advantage of the new header validation bypass.
While the SMTP handler migration to MailKit is backwards compatible, we advise testing your email out profiles in a staging environment before deploying the runtime to production.