Sitemap

Time Warp Roadmap — May 2026

Goodbye Vega. Hello Cygni.

Time Warp is an open source interactive timeline for the Salesforce platform available on the Salesforce AppExchange here.

The next release of Time Warp is planned for May 2026. We’re calling it Cygni — a release naming system based on stars. We pick a new star every release based on their ever increasing distances from Earth.

Get Dave Norris’s stories in your inbox

Join Medium for free to get updates from this writer.

Here are the planned features and bug fixes getting included.

Press enter or click to view image in full size

Time Warp — an interactive timeline for the Salesforce platform

New Features

API Versions

API numbers will be incremented on all metadata. The API version moves from 63.0 to 66.0.

Enforced FLS with stripInaccessible aligning to best practice

Aligning to best practice, we have enforced Field Level Security. Whilst this does not impact the security of the component we wanted to strip inaccessible field prior to running a SOQL query to align with best practices.

List<SObject> listOfTimelineRecords = Database.query(queryRecords);

// Enforce FLS by stripping inaccessible fields
SObjectAccessDecision parentAccessDecision = Security.stripInaccessible(
AccessType.READABLE,
listOfTimelineRecords
);

List<SObject> secureTimelineRecords = parentAccessDecision.getRecords();

Improved CPU time for Parent Object Picklist resolution

Optimizations have been made to the Parent Object Picklist resolution logic in `TimelineParentPicklist.cls`. By adding checks to ensure we only perform schema describes when necessary (specifically when `entityName` is present), we reduce unnecessary CPU time consumption. This leads to faster component configuration loading in the App Builder.

global override VisualEditor.DataRow getDefaultValue() {
try {
// Optimization: Only describe if entityName is available
if (this.context.entityName != null) {
List<Schema.DescribeSObjectResult> describes = Schema.describeSObjects(
new List<String>{ this.context.entityName }
);

String objectLabel = describes[0].getLabel();
return new VisualEditor.DataRow(‘Use This ‘ + objectLabel, ‘Default_Picklist_Value’);
}
} catch (Exception e) {
// Handle exception
}
return new VisualEditor.DataRow(‘Use Current Record’, ‘Default_Picklist_Value’);
}

Performance improvements handling String.split operations

We have improved the performance of field path parsing by caching split operations. Previously, dot-notation fields (e.g., `Account.Name`) were split repeatedly during processing. We now cache these results in a map, reducing the processing overhead when parsing field paths and other delimited strings, particularly for timelines with many configured child objects.

// Optimization: Cache field paths to avoid repeated string splitting
Map<String, Map<String, FieldPath>> configFieldPaths = new Map<String, Map<String, FieldPath>>();
// … inside loop …
if (!configFieldPaths.containsKey(fieldPathKey)) {
// FieldPath constructor handles the split once
configFieldPaths.put(fieldPathKey, new FieldPath(rawField));
}

Security improvements

General security enhancements have been implemented across the package to ensure the robustness and safety of the application. This includes standardizing error handling and suppressing false positives in static analysis tools where manual checks (like `Security.stripInaccessible`) are now in place.

Bug Fixes

Fixed issue with unused SOQL impacting performance

Refactored code to remove unnecessary SOQL queries that were executing but not being used. Specifically, we optimized the logic to ensure queries are only built and executed for objects that are actively configured and valid for the current context, improving the performance of the timeline data retrieval.

Fixed casing issue when comparing values

Resolved a bug where case-sensitive comparisons caused matches to fail unexpectedly. Values are now compared in a case-insensitive manner where appropriate, ensuring that field names and object types match correctly regardless of how they are entered in the metadata configuration.

Fixed SOQL limits issues for LookedUpFromActivity Object

Addressed an issue where queries against the `LookedUpFromActivity` object could hit SOQL limits. The query logic has been optimized to handle these special relationship objects more efficiently, ensuring they follow a performant path distinct from standard custom objects.

} else if (objName == ‘ActivityHistory’ || objName == ‘LookedUpFromActivity’) {
// Optimized query path for Activity relationships
innerQuery = innerQuery +
‘ ORDER BY ‘ +
‘ActivityDate DESC NULLS LAST, LastModifiedDate DESC LIMIT 500),’;
}

Fixed duplicate resize handlers

Fixed a bug where multiple resize event handlers were attached to the DOM, potentially causing performance degradation or erratic behavior when resizing the browser window. The fix involves properly removing the event listener in the `disconnectedCallback` and ensuring it is only added once.


disconnectedCallback() {
if (this._debouncedResizeHandler) {
window.removeEventListener(‘resize’, this._debouncedResizeHandler);
this._debouncedResizeHandler = null; // Clean up reference
}
}

renderedCallback() {
if (!this._debouncedResizeHandler) {
this._debouncedResizeHandler = this.debounce(() => {
// Resize logic
}, 200);
window.addEventListener(‘resize’, this._debouncedResizeHandler);
}
}

Fixed tooltip nubbin placement for RTL languages

Corrected the positioning of the tooltip pointer (nubbin) for Right-to-Left (RTL) languages. The logic now dynamically calculates whether to show the tooltip on the left or right based on available space and the user’s language direction, applying the correct CSS class.


if (me.isLanguageRightToLeft) {
// For RTL, prefer left side if there’s enough space
if (spaceLeft >= tooltipWidth + 15) {
left = elementRect.left — tooltipWidth — 15;
showOnRight = false;
} else {
// If not enough space on left, try right side
left = elementRect.right + 15;
showOnRight = true;
}
}
me.nubbinClass = showOnRight ? ‘slds-nubbin_left-top’ : ‘slds-nubbin_right-top’;

Upgrading from a Previous Version

Cygni will be a minor release. We plan for the upgrade path to be seamless. Time Warp upgrades are pull not push. You decide when, and if, to upgrade. When a new version is available you install the upgrade in the same way you would install any other package from the AppExchange. Just come back to the package listing in AppExchange and click ‘Get it Now’. The first page of the install wizard lists the current version you have installed, the version you’re about to install, and a list of additional components included in the new version.

We will be recommending that all users of Time Warp upgrade to the latest version in June ‘26.

Contributing

The best thing about the trailblazer community is contributions. Time Warp needs lots of help and will need people to contribute who have a diversity of skills. Here’s a link to the open source repo. All contributions welcome.

https://github.com/deejay-hub/timeline-lwc

Written by Dave Norris

Developer Advocate @ Salesforce || Interested in solving unique challenges using different cloud service providers || All opinions are mine.