6.1.0
Overview
-
- Optimisation of database queries for common CMS operations
- Improved performance working with assets
- Database query caching
- Generated column support
- Composite indexes for
default_sort - Drop indexes in
indexesconfiguration - New indexes for various database tables
- Non-blocking session handlers
- Password strength feedback
- Other new features and enhancements
- Performance documentation
- API changes
- Bug fixes
Included module versions
| Module | Version |
|---|---|
| colymba/gridfield-bulk-editing-tools | 5.1.0 |
| dnadesign/silverstripe-elemental | 6.1.0 |
| dnadesign/silverstripe-elemental-userforms | 5.0.0 |
| silverstripe/admin | 3.1.0 |
| silverstripe/asset-admin | 3.1.0 |
| silverstripe/assets | 3.1.0 |
| silverstripe/campaign-admin | 3.1.0 |
| silverstripe/cms | 6.1.0 |
| silverstripe/config | 3.0.0 |
| silverstripe/dynamodb | 6.0.0 |
| silverstripe/environmentcheck | 4.1.0 |
| silverstripe/errorpage | 3.1.0 |
| silverstripe/framework | 6.1.0 |
| silverstripe/graphql | 6.1.0 |
| silverstripe/gridfieldqueuedexport | 4.0.2 |
| silverstripe/htmleditor-tinymce | 1.0.2 |
| silverstripe/installer | 6.1.0 |
| silverstripe/linkfield | 5.1.0 |
| silverstripe/login-forms | 6.1.0 |
| silverstripe/lumberjack | 4.0.3 |
| silverstripe/mfa | 6.1.0 |
| silverstripe/mimevalidator | 4.0.0 |
| silverstripe/realme | 6.0.2 |
| silverstripe/recipe-cms | 6.1.0 |
| silverstripe/recipe-core | 6.1.0 |
| silverstripe/recipe-kitchen-sink | 6.1.0 |
| silverstripe/recipe-plugin | 2.1.0 |
| silverstripe/reports | 6.1.0 |
| silverstripe/segment-field | 4.0.2 |
| silverstripe/session-manager | 3.1.0 |
| silverstripe/sharedraftcontent | 4.1.0 |
| silverstripe/siteconfig | 6.1.0 |
| silverstripe/spamprotection | 5.0.0 |
| silverstripe/startup-theme | 1.0.11 |
| silverstripe/staticpublishqueue | 7.0.2 |
| silverstripe/tagfield | 4.1.0 |
| silverstripe/taxonomy | 4.1.0 |
| silverstripe/template-engine | 1.0.0 |
| silverstripe/textextraction | 5.0.1 |
| silverstripe/totp-authenticator | 6.0.2 |
| silverstripe/userforms | 7.0.2 |
| silverstripe/vendor-plugin | 3.0.0 |
| silverstripe/versioned | 3.1.0 |
| silverstripe/versioned-admin | 3.1.0 |
| symbiote/silverstripe-advancedworkflow | 7.1.0 |
| symbiote/silverstripe-gridfieldextensions | 5.1.0 |
| symbiote/silverstripe-queuedjobs | 6.1.0 |
| tractorcow/silverstripe-fluent | 8.1.0 |
Features and enhancements
The primary focus of this release has been on improving performance of the CMS, which will result in a smoother and more responsive experience for users.
Optimisation of database queries for common CMS operations
We've optimised several database queries used for common operations within the CMS.
They were done in a couple of ways:
- combining multiple
WHERE "ID" = <id>style SQL statements into more efficientWHERE "ID" IN (<id>, <id>, <id>, ...)queries - temporarily caching database results in memory for the current HTTP requests.
These optimisations can significantly reduce the number of database requests made, which will be particularly beneficial if your web-hosting setup has the webserver on a different physical server from the database, as there will be a degree of latency for every database request made, no matter the size of the actual query.
The following operations had database optimisation applied to them and should now perform better:
- Viewing files in asset-admin i.e.
/admin/assets - Viewing records in versioned-admin i.e.
/admin/archive - Viewing records in a
GridField
Improved performance working with assets
In projects with thousands of files in the same folder, especially with images, performance can be slow for some operations. That performance hit scales with the number of files in the folder you're dealing with. One reason for this is that Flysystem (the filesystem abstraction layer) can't assume the filesystem it's interfacing with has a way to discover if a folder is empty, or find files in a folder matching a certain pattern. This means that any time either of those operations was performed on a folder, Flysystem had to loop over every file it contained.
To remedy this, we've made the following changes:
- Reduced the number of times we check if a folder is empty by removing duplicate checks.
- Added
Filesystem::isEmpty()to check if a folder is empty. With the default local filesystem adapter, this means we check exactly one file to know if the folder is empty or not. With other adapters it depends on the implementation (e.g. the AWS S3 adapter will likely still fetch a full page of up to 1000 files). - Added
GlobContentListerandGlobbableFileIDHelperinterfaces to enable looking for image variants using a glob pattern. This dramatically improves performance with the default local filesystem adapter, but by default will have no effect for other adapters. If you are using a different adapter that might support globbing such as using FTP (for specific FTP servers), consider implementing theGlobContentListerinterface. If you use your own implementation ofFileIDHelperconsider also implementing theGlobbableFileIDHelperinterface.
Database query caching
Queries made using a DataList or SQLSelect can now be cached. The cached query result lasts until the end of the request, unless invalidated during that request.
This allows you to cache the results of repeated database queries all over your application, even if they're custom queries you write yourself.
To enable caching on a DataList, call the DataList::setUseCache method.
use App\Model\MyDataObject;
$cachedList = MyDataObject::get()->setUseCache(true);To enable caching on a SQLSelect, call the SQLSelect::setUseCache method.
use SilverStripe\ORM\Queries\SQLSelect;
$cachedQuery = SQLSelect::create(/*...*/)->setUseCache(true, 'some-namespace');As part of this change, the DataObject::get_by_id(), DataObject::get_one(), and DataObject::delete_by_id() methods have been deprecated. Usage in supported modules of these methods have been replaced with using a cached DataList instead.
See caching database queries in the performance documentation for more details.
Generated column support
Generated columns are database columns where the value is generated inside the database, rather than being set by a user. They're usually based on other columns in the database and can be either generated when the record is updated and stored, or generated when requested in which case they aren't stored.
Some good use cases for generated columns include:
- sorting in a gridfield on a complex summary field: It's common to use a getter method to get some value derived from your database fields (e.g. a discounted price), and use that in
summary_fields. With a generated column, you can remove the getter method and theGridFieldSortableHeadercomponent will be able to sort using the column. - using functional indexes: generated columns can be included in indexes, allowing you to sort or filter by complex expressions in an efficient way.
- data integrity: unlike generating values inside an
onBeforeWrite()method, generated column values will be correct even if you update the record with raw SQL. You also don't need to manually update values for historic records (e.g. when using versioning) even if you change the logic that determines the value. - reduce repetition: instead of using a complex expression in multiple different places, you can just give the expression a name with a generated column.
See data types and casting for details about using generated columns.
Support in other SQL servers
Generated column support has been added to the MySQL database connector in silverstripe/framework, but is not guaranteed to work for other database servers.
If you maintain a module that adds support for another database server, you'll need to implement the new DBSchemaManager::makeGenerated() and DBSchemaManager::needRebuildColumn() methods to support generated columns.
You likely also need to adjust your implementation of DBSchemaManager::alterTable() to drop and recreate columns (instead of just updating their schema in place) based on $advancedOptions['rebuildCols'], and DBSchemaManager::fieldList() to normalise the representation of generated columns.
Composite indexes for default_sort
The ORM automatically creates an index for each column in the default_sort configuration for your DataObject subclasses. This index might only be useful for part of the sort, or in some cases ignored entirely if the database server decides it will be faster to just traverse the whole table itself.
To remedy this, a new DataObject.default_sort_index_mode configuration property has been added, which by default will tell the ORM to create a composite index (if you're sorting by multiple fields) in addition to the individual column indexes it was already making.
When created, the composite index will always be called default_sort_composite.
There are some caveats to this, along with some other options you might want to set, so check out the indexes documentation for more details.
Drop indexes in indexes configuration
If you define some database index in the indexes configuration for a DataObject model and then remove that index from the configuration, the ORM won't drop that index for you. This means you can have indexes taking up space in your database that you don't want anymore.
Now you can set the value of the index to false instead of just removing it from the configuration, which will tell the ORM to drop the index. This can also be used to tell the ORM to not create indexes it would otherwise create by default (e.g. for relation joins). In general you should leave those alone unless you know what you're doing and intend to fine-tune your indexes to suit your specific project needs.
If you maintain an alternative database connector module (such as for postgresql) and it has a subclass of DBSchemaManager, you may need to update the alterTable() method to handle the case where the index spec is ['drop' => true].
If you are using the DataObjectSchema::databaseIndexes() method (or using its output downstream), note that the values in the array may now be false representing an index that should not be created. If you were relying on the keys in that array to tell you about the names of existing indexes, you will need to filter out the false values first.
See the indexes documentation for more details.
New indexes for various database tables
A number of new indexes are added as part of this release. Along with the composite indexes for default_sort mentioned above, the following indexes have also been added:
- If a
default_sorthas been set on the join table for amany_manyrelation (as mentioned in relations between records), those columns will be added to appropriate indexes where possible. AutoLoginHash,AutoLoginTempHash, andTempIDHashon theMembertable. These are used for the "keep me signed in" and CMS re-authentication features.Nameon theTaxonomyTermandTaxonomyTypetables.Tokenon theShareTokentable.
Note that building indexes for large tables may result in a noticable increase in the time it takes to run sake db:build the first time after upgrading your project.
Non-blocking session handlers
The default file-based session handler for PHP holds a lock on the session file while the session is open. This means that multiple concurrent requests from the same user have to wait for one another to finish processing after a session has been started. This includes AJAX requests.
To resolve this problem, we have provided three new session save handlers. Each of these are non-blocking which means that multiple concurrent requests from the same user don't have to wait for one another to finish.
| Class name | Description |
|---|---|
FileSessionHandler | Stores sessions in files like the default PHP session handler, except it doesn't lock the file. This is the new default. |
CacheSessionHandler | Stores sessions in a cache that implements the PSR-16 Psr\SimpleCache\CacheInterface. More performant than FileSessionsHandler in most scenarios, but requires additional setup. |
DatabaseSessionHandler | Stores sessions in the database. Provides a low barrier to sharing sessions across multiple servers, e.g. in a horizontally-scaled hosting scenario |
You can choose how sessions are handled by setting the Session.save_handler configuration property or the SS_SESSION_SAVE_HANDLER_CLASS environment variable to the FQCN of your preferred save handler that implements SessionHandlerInterface.
Note that in edge case scenarios, for example if your application wants to modify a session value based on the value that is already set and must do so for each request, non-blocking sessions may cause unexpected results.
If you want to use the default blocking PHP file session handler instead, you can set the Session.save_handler configuration to null.
SilverStripe\Control\Session:
save_handler: nullSee the save handler documentation for more information about the new session save handlers and how to use the new configuration.
Note that if you are using silverstripe/hybridsessions or silverstripe/dynamodb, you can continue to use these with no change, provided you update them to the latest version.
If you want this functionality in your CMS 5 projects, we have created a new silverstripe/non-blocking-sessions module that backports the file-based non-blocking session save handler to CMS 5.
Password strength feedback
The ConfirmedPasswordField now provides real-time feedback on password strength as users type. You'll see this in action on the member edit form, when setting a new password during the "lost password" process, and for any usages of ConfirmedPasswordField in your own forms if requireStrongPassword is toggled on.
In Member edit forms and the "lost password" process, this feature is active only when an EntropyPasswordValidator is in use for password validation. If you're using the alternative RulesPasswordValidator or another password validator, this strength indicator won't appear. The strength itself is assessed by Symfony's PasswordStrength validation constraint.
As part of this work, ChangePasswordForm now uses a ConfirmedPasswordField instead of separate PasswordField instances. Consequently, the ChangePasswordHandler that processes form submissions has been updated to expect a different data structure. If your site includes any custom modifications to the change password flow, please be aware of this change. The same is also true for the reset account form created and processed in the silverstripe/mfa module in SecurityExtension.
This functionality will not work in your front-end forms out of the box as the required JavaScript will not be available on the frontend theme. If your site does not have the silverstripe/login-forms module installed, then this functionality will not work for the "Lost password" flow out of the box as the required JavaScript will not be available on the frontend theme. This JavaScript can be found in the login-forms module and can be manually added to your frontend theme.
Other new features and enhancements
- New
DataList::filterByList()andDataList::excludeByList()methods allow filtering by or excluding based on the results of another list. SeefilterByList()andexcludeByList()for details. - New
DataObjectSchema::tablesAreReadyForClass()method added for checking if the database is ready for queries for a givenDataObjectsubclass. - New
FileIDHelper::VARIANT_SEPARATORimproves discoverability of the string that separates variant names from original file names in the asset system. - When executing commands via the Sake CLI application, both the
Sakeinstance and theSymfony\Component\Console\Command\Commandinstance are added to the dependency injector. See accessing sake from outside a command for more details. - The
Fileclass now has aIsFoldergenerated column which is included in a new index. This makes sorting files in the asset admin faster. - Previously there were a large number of unnecessary AJAX requests made to fetch the form schema for the search form for sections of the CMS that are searchable such as the site tree i.e. the list of pages on
/admin/page. This has been fixed so these requests are only made when the filter button is clicked. Note this enhancement was originally released as a patch for CMS 5.4. - There have been a number of other smaller performance enhancements that have been included in this release. Some of these enhacements were also released as patch releases for CMS 5.4.
- Inside your cache directory, sub-directories now include the PHP version, e.g.
my-user-8.3.23/. Previously the PHP version was not included. If you do not have asilverstripe-cache/directory in your project root, the parent cache directory that gets created no longer contains the PHP version (e.g. it will be/tmp/silverstripe-cache-var-www-html/where it used to be/tmp/silverstripe-cache-php8.3.23-var-www-html/).
Performance documentation
The performance documentation section has been updated, with some new sections and additional tips that might help make your project more performant.
API changes
Deprecated API
The following API has been deprecated in this release, and will be removed or replaced in a future major release.
It's best practice to avoid using deprecated code where possible, but sometimes it's unavoidable. This API will all continue to be available at least until the next major release.
- The
Session.session_store_pathconfiguration property has been deprecated. Usesession.save_pathin ini configuration instead. - The
Session.sessionCacheLimiterhas been deprecated and will be removed without equivalent functionality to replace it in a future major release. - The
DataObject::get_by_id()method has been deprecated. UseDataObject::get($className)->setUseCache(true)->byID($id)instead. - The
DataObject::get_one()method has been deprecated. UseDataObject::get($className)->setUseCache(true)->first()instead. - The
DataObject::delete_by_id()method has been deprecated. UseDataObject::get($className)->setUseCache(true)->byID($id)->delete()instead. UpgradePolymorphicExtensionhas been deprecated and will be removed without equivalent functionality to replace it in a future major release.- The
UserForm.upgrade_on_buildconfiguration property has been deprecated and will be removed without equivalent functionality to replace it in a future major release.
Bug fixes
This release includes a number of bug fixes to improve a broad range of areas. Check the change logs for full details of these fixes split by module. Thank you to the community members that helped contribute these fixes as part of the release!
Change log
Features and enhancements
-
silverstripe/assets (3.0.0 -> 3.1.0)
-
silverstripe/framework (6.0.0 -> 6.1.0)
- 2025-08-27 a3f1d2e3b Give better example for deprecation notice (#11846) (Guy Sartorelli)
- 2025-08-25 159f42fd5 Add note about argument we can't remove. (#11835) (Guy Sartorelli)
- 2025-08-14 c6466ea51 Optimize DataQuery::count() when there's only one table to select from (Steve Boyd)
- 2025-08-13 1a952f915 Optimise Member canEdit and canDelete checks. (#11822) (Guy Sartorelli)
- 2025-08-12 8c7cde15d
Reduce count queries for scaffolding SearchableDropdownField (#11823)(Guy Sartorelli) - 2025-08-12 dff5306f8
Optimize DataQuery::count() when there's only one table to select from(Thomas Portelange) - 2025-08-06 11dd9bb38 Do not make live HTTP request for repositories.json during unit tests (Steve Boyd)
- 2025-07-28 e8e694872
Allow backticks in "factory" injector config(Guy Sartorelli) - 2025-07-28 444af5bbf Reduce queries using new *byList methods (Guy Sartorelli)
- 2025-07-28 e9401e462 Allow filtering and excluding based on another list (Guy Sartorelli)
- 2025-07-22 8836d021d Add indexes to member for autologin and CMS auth (#11792) (Guy Sartorelli)
- 2025-07-22 164c7a149
Add index for default_sort on many_many tables (#11785)(Guy Sartorelli) - 2025-07-22 967623ac2 Add environment variable to set session save handler. (Guy Sartorelli)
- 2025-07-20 9885b46f3 Add method to check if a class is ready for db queries (#11784) (Guy Sartorelli)
- 2025-07-17 aeb599dfb Ability to add generated columns in the ORM (#11774) (Guy Sartorelli)
- 2025-07-15 123a56ff2 Add database session handler implementation (Guy Sartorelli)
- 2025-07-14 de7f9fe2d Add cache-based session handler implementation (Guy Sartorelli)
- 2025-06-25 bab584017 Give feedback of password strength (Steve Boyd)
- 2025-06-25 6e3a0c09d Improve indexes for permission codes (#11766) (Guy Sartorelli)
- 2025-06-24 358585a6c Use new DataList caching instead of DataObject caches (Guy Sartorelli)
- 2025-06-24 8fdf12365 Allow caching ORM select queries (Guy Sartorelli)
- 2025-06-16 38cf46547 Register sake and current command with injector (#11761) (Guy Sartorelli)
- 2025-06-05 3958e0361 Create composite indexes for default sort. (#11747) (Guy Sartorelli)
- 2025-06-04 90bb1c557 Allow disabling/dropping indexes via config (#11746) (Guy Sartorelli)
- 2025-06-03 618aa88dd Prepopulate version number cache for GridField canView checks (Steve Boyd)
- 2025-05-12 9adcf6de8 Prepopulate version number cache (Steve Boyd)
- 2025-05-07 c5bd2f503 Non-blocking filesystem session storage (#11701) (Guy Sartorelli)
-
silverstripe/admin (3.0.0 -> 3.1.0)
-
silverstripe/asset-admin (3.0.0 -> 3.1.0)
-
silverstripe/versioned-admin (3.0.0 -> 3.1.0)
- 2025-07-02 283618d Use new DataList caching (#412) (Guy Sartorelli)
-
silverstripe/cms (6.0.0 -> 6.1.0)
-
silverstripe/siteconfig (6.0.0 -> 6.1.0)
- 2025-07-02 db7f50c2 Use new DataList caching (#196) (Guy Sartorelli)
-
silverstripe/versioned (3.0.0 -> 3.1.0)
-
silverstripe/session-manager (3.0.0 -> 3.1.0)
- 2025-07-02 5defc46 Use new DataList caching (#249) (Guy Sartorelli)
-
silverstripe/startup-theme (1.0.0 -> 1.0.11)
- 2025-09-30 f433fe3 Make desktop menu activate on hover (#50) (Adrian Jimson)
-
silverstripe/login-forms (6.0.0 -> 6.1.0)
- 2025-06-23 3c1ec44 Use ConfirmPasswordField to show password strength (Steve Boyd)
-
silverstripe/mfa (6.0.0 -> 6.1.0)
- 2025-08-06 c1dacd5 Optimise SQL queries to improve performance (#613) (Guy Sartorelli)
- 2025-08-06 f801153 Reduce queries by using new *byList methods (#614) (Guy Sartorelli)
- 2025-07-02 272de67 Use new DataList caching (#610) (Guy Sartorelli)
- 2025-06-25 d6c461c Use ConfirmPasswordField to show password strength (Steve Boyd)
-
silverstripe/sharedraftcontent (4.0.0 -> 4.1.0)
- 2025-07-22 3986df0 Add index for share draft token (#287) (Guy Sartorelli)
-
silverstripe/tagfield (4.0.0 -> 4.1.0)
-
silverstripe/taxonomy (4.0.0 -> 4.1.0)
- 2025-07-22 1e77334
Add indexes for "Name" column for taxonomies (#132)(Guy Sartorelli)
- 2025-07-22 1e77334
-
dnadesign/silverstripe-elemental (6.0.0 -> 6.1.0)
-
symbiote/silverstripe-advancedworkflow (7.0.0 -> 7.1.0)
-
symbiote/silverstripe-gridfieldextensions (5.0.0 -> 5.1.0)
- 2025-08-06 b9d2a40 Optimise SQL queries to improve performance (#450) (Guy Sartorelli)
-
symbiote/silverstripe-queuedjobs (6.0.0 -> 6.1.0)
-
colymba/gridfield-bulk-editing-tools (5.0.0 -> 5.1.0)
- 2025-07-02 6603d46 Use new DataList caching (#336) (Guy Sartorelli)
-
tractorcow/silverstripe-fluent (8.0.0 -> 8.1.0)
-
silverstripe/graphql (6.0.0 -> 6.1.0)
-
silverstripe/campaign-admin (3.0.0 -> 3.1.0)
- 2025-08-06 38823e5 Reduce queries by using new *byList methods (#360) (Guy Sartorelli)
-
silverstripe/environmentcheck (4.0.0 -> 4.1.0)
- 2025-07-20 e683ddf Use more robust database check (#132) (Guy Sartorelli)
Bugfixes
-
silverstripe/framework (6.0.0 -> 6.1.0)
- 2025-10-10 eea078ebe ConfirmedPasswordField reports changes - even if no changes (#11859) (Johannes Hammersen)
- 2025-09-27 73761527e DBPrimaryKeyField::scaffoldSearchField should return field (johannes.hammersen)
- 2025-08-29 3f24058e4 Fix flushing in live and test modes (#11849) (Guy Sartorelli)
- 2025-08-26 304ab2775 Don't mangle sort columns for aliases of expressions (#11836) (Guy Sartorelli)
- 2025-08-06 a3460b789 Handle negatable options when using legacy args (Steve Boyd)
- 2025-08-04 9ed74923d Correctly check merge option in i18n task (#11787) (andreashochhaltervisitrans)
- 2025-07-29 e8d42f922 Check all classes and don't rely on connection_attempted() (#11807) (Guy Sartorelli)
- 2025-07-27 8318db4d4 Make backURL respect subdirectory path (#11803) (Guy Sartorelli)
- 2025-07-24 75b2862c8 Don't skip-over columns for sort index. (#11801) (Guy Sartorelli)
- 2025-07-24 77388be21 fix merge-up (#11800) (Guy Sartorelli)
- 2025-07-23 e66ed70fa Don't try to index TEXT data types (#11799) (Guy Sartorelli)
- 2025-07-21 e816fbdc9 ArrayList::dataClass() should give correct values for arrays (#11796) (Guy Sartorelli)
- 2025-07-20 063de0a19 Fix condition checking if a member exists (#11794) (Guy Sartorelli)
- 2025-07-20 3470cf18c Fix condition checking if a member exists (Guy Sartorelli)
- 2025-07-20 220724d95 Broken sort and missing column quoting for eagerloaded DataList (#11789) (Dominik Beerbohm)
- 2025-07-17 afa00a68c Add null check to ClassInfo::hasTable. (Dominik Beerbohm)
- 2025-07-08 c6c1b22bc
Allow negative keys in SelectField implementations (#11781)(Guy Sartorelli) - 2025-07-03 831ea2bb2 Make indexes for array default_sort (#11773) (Guy Sartorelli)
- 2025-07-02 e0c39675a Update dataclass when setting dataquery into datalist (#11770) (Guy Sartorelli)
- 2025-06-18 c14dfa597 Don't query to check case sensitivity more than once. (#11764) (Guy Sartorelli)
-
silverstripe/admin (3.0.0 -> 3.1.0)
- 2025-09-30 8cc7db61 Don't let one element changetrack override another. (#1996) (Guy Sartorelli)
- 2025-08-24 ff426f2a Correctly route from non-react to react section. (#1984) (Guy Sartorelli)
- 2025-08-20 c42ed880 Stop Gridfield autocomplete from bouncing in chrome (Maxime Rainville)
- 2025-08-12 c48493a4 Let admin sections have same url-segment-prefix (#1974) (Guy Sartorelli)
- 2025-08-06 76e876f4 Ensure changetracker notes first change in WYSIWYG (#1954) (Guy Sartorelli)
- 2025-06-25 3620c1a6 Allow security admin tabs to be localised (#1947) (Guy Sartorelli)
- 2025-06-24 3ddff71a Allow security admin tabs to be localised (Guy Sartorelli)
-
silverstripe/asset-admin (3.0.0 -> 3.1.0)
- 2025-09-23 c6a62be2 Show error on failed upload of TableView (Steve Boyd)
- 2025-08-29 8b2767c1 Show error on failed upload (#1607) (Guy Sartorelli)
- 2025-08-21 8d90144d File drag and drop styles (Steve Boyd)
- 2025-08-21 d41dcb78 Don't refetch files unnecessarily (#1603) (Guy Sartorelli)
- 2025-08-13 b534f7a9 Align drag and drop image with viewport scroll (Steve Boyd)
- 2025-06-26 a7b6fe03 Remove extra folder refetch (Steve Boyd)
-
silverstripe/versioned-admin (3.0.0 -> 3.1.0)
-
silverstripe/cms (6.0.0 -> 6.1.0)
-
silverstripe/versioned (3.0.0 -> 3.1.0)
- 2025-08-31 006eddf
Allow for null values returned from get_latest_version (#526)(Guy Sartorelli) - 2025-07-21 859e9d0 Make sure tests run in draft stage by default (#520) (Guy Sartorelli)
- 2025-07-17 7aa8ac5 Don't try to set values for generated columns (#518) (Guy Sartorelli)
- 2025-06-04 4440211 Handle case where index spec may be false (#513) (Guy Sartorelli)
- 2025-05-26 94cfd22 Include deleted version data where appropriate. (#511) (Guy Sartorelli)
- 2025-08-31 006eddf
-
silverstripe/startup-theme (1.0.0 -> 1.0.11)
- 2025-09-02 566ad7b refactor css (Adrian Jimson)
- 2025-08-25 2923d28 Don't let navigator overlap with nav (#45) (Guy Sartorelli)
- 2025-08-18 131d90b SDEMO-801 menu scrolling (Adrian Jimson)
- 2025-08-14 89f5488 h2 size 28px, h2 margin adjustments, navigation hover (Adrian Jimson)
- 2025-07-09 6dd4957 Ensure sidebar menu squashes on thinner widths (#32) (Guy Sartorelli)
- 2025-07-09 17cc9db Use correct variable for date (Steve Boyd)
-
silverstripe/htmleditor-tinymce (1.0.0 -> 1.0.2)
- 2025-08-06 fb47376 Notify changetracker when WYSIWYG is dirty (#19) (Guy Sartorelli)
-
silverstripe/developer-docs (6.0.0 -> 6.1.0)
- 2025-07-03 3179c7c4 Fix case in header (Ed Wilde)
-
silverstripe/lumberjack (4.0.0 -> 4.0.3)
- 2025-08-25 21d23d6
Trim sitetree with new getChildrenForTree method (#204)(Guy Sartorelli)
- 2025-08-25 21d23d6
-
dnadesign/silverstripe-elemental (6.0.0 -> 6.1.0)
-
symbiote/silverstripe-gridfieldextensions (5.0.0 -> 5.1.0)
-
symbiote/silverstripe-queuedjobs (6.0.0 -> 6.1.0)
- 2025-08-18 9653730 Remove incorrectly placed file. (#483) (Guy Sartorelli)
-
tractorcow/silverstripe-fluent (8.0.0 -> 8.1.0)
- 2025-08-06 b735a5d Use orderBy for raw SQL sort order (Guy Sartorelli)
-
silverstripe/linkfield (5.0.0 -> 5.1.0)
-
silverstripe/campaign-admin (3.0.0 -> 3.1.0)
Api changes
-
silverstripe/assets (3.0.0 -> 3.1.0)
- 2025-05-19 f4119ec Add constant for the filename variant separator. (#687) (Guy Sartorelli)
-
silverstripe/framework (6.0.0 -> 6.1.0)
- 2025-08-04 cdeb94912
Stop using deprecated DataList::subtract() method.(Guy Sartorelli)
- 2025-08-04 cdeb94912
Dependencies
-
silverstripe/recipe-kitchen-sink (6.0.0 -> 6.1.0)
- 2025-08-07 0f04ebd Remove unsupported modules (Steve Boyd)
-
silverstripe/framework (6.0.0 -> 6.1.0)
- 2025-06-18 e597153d7 Update constraint for silverstripe/supported-modules (#11762) (Guy Sartorelli)
-
silverstripe/admin (3.0.0 -> 3.1.0)
-
silverstripe/asset-admin (3.0.0 -> 3.1.0)
-
silverstripe/versioned-admin (3.0.0 -> 3.1.0)
-
silverstripe/cms (6.0.0 -> 6.1.0)
-
silverstripe/reports (6.0.0 -> 6.1.0)
-
silverstripe/session-manager (3.0.0 -> 3.1.0)
-
silverstripe/login-forms (6.0.0 -> 6.1.0)
-
silverstripe/htmleditor-tinymce (1.0.0 -> 1.0.2)
- 2025-08-18 bd4cde3 Update JS dependencies (Steve Boyd)
-
silverstripe/totp-authenticator (6.0.0 -> 6.0.2)
-
silverstripe/mfa (6.0.0 -> 6.1.0)
-
silverstripe/gridfieldqueuedexport (4.0.0 -> 4.0.2)
-
silverstripe/realme (6.0.0 -> 6.0.2)
-
silverstripe/segment-field (4.0.0 -> 4.0.2)
-
silverstripe/sharedraftcontent (4.0.0 -> 4.1.0)
-
silverstripe/lumberjack (4.0.0 -> 4.0.3)
-
silverstripe/tagfield (4.0.0 -> 4.1.0)
-
silverstripe/userforms (7.0.0 -> 7.0.2)
-
dnadesign/silverstripe-elemental (6.0.0 -> 6.1.0)
-
symbiote/silverstripe-advancedworkflow (7.0.0 -> 7.1.0)
-
colymba/gridfield-bulk-editing-tools (5.0.0 -> 5.1.0)
-
tractorcow/silverstripe-fluent (8.0.0 -> 8.1.0)
-
silverstripe/linkfield (5.0.0 -> 5.1.0)
-
silverstripe/graphql (6.0.0 -> 6.1.0)
- 2025-06-25 4b7d311 Remove alpha conflict (Steve Boyd)
-
silverstripe/campaign-admin (3.0.0 -> 3.1.0)
Documentation
-
silverstripe/reports (6.0.0 -> 6.1.0)
- 2025-07-22 d6929765 Prepare for docs site (Steve Boyd)
-
silverstripe/login-forms (6.0.0 -> 6.1.0)
- 2025-07-22 f7c5c3d Prepare for docs site (Steve Boyd)
-
silverstripe/developer-docs (6.0.0 -> 6.1.0)
- 2025-09-29 5436c193 Add 6.1.0 changelog (Steve Boyd)
- 2025-09-18 6d80069c Use correct namespace for Extension (Steve Boyd)
- 2025-08-27 637ff836 Fix example replacement for get_one() (#809) (Guy Sartorelli)
- 2025-08-25 930ba541 Fix hint callout block (#802) (Guy Sartorelli)
- 2025-08-18 4fa3c5ca Call out improved performance docs in changelog (#798) (Guy Sartorelli)
- 2025-08-18 710751cb Document performance configuration options (#797) (Guy Sartorelli)
- 2025-08-12 8380ec2f Document changes for the cache folder (#786) (Thomas Portelange)
- 2025-08-10 bea1ee49 Fix typo in release policy (#792) (Guy Sartorelli)
- 2025-08-06 347981b2 Document excluding and filtering by another list's results (#789) (Guy Sartorelli)
- 2025-08-03 8d04b722 Create unified release policy (Steve Boyd)
- 2025-07-30 ece1cf1c Document new session save handlers (#783) (Guy Sartorelli)
- 2025-07-29 d9d87b37 Apply suggestions from code review (Ed Wilde)
- 2025-07-23 d111e67a Add info for links to docs and images for modules (Steve Boyd)
- 2025-07-22 fcf3eb67 Document additional index enhancements (#779) (Guy Sartorelli)
- 2025-07-21 0e9f60f7 Document backporting non-blocking sessions (#778) (Guy Sartorelli)
- 2025-07-20 58c72548 Document new method for checking if db is ready (#777) (Guy Sartorelli)
- 2025-07-17 6421c9ef Add parameter naming code convention (Steve Boyd)
- 2025-07-17 c14e0a96 Document generated column support in the ORM (#775) (Guy Sartorelli)
- 2025-07-10 358d2fb6 Remove performance improvements heading (Steve Boyd)
- 2025-07-07 a84b3190 Document query caching (#771) (Guy Sartorelli)
- 2025-07-03 70d2582f Adding subresource integrity notes to JavaScript includes (Ed Wilde)
- 2025-06-25 ed6d0708 Add password strength indicator to changelog (Steve Boyd)
- 2025-06-18 02a7c255 Update links (Steve Boyd)
- 2025-06-18 77eae3fd Tidy up writing style of performance section (Steve Boyd)
- 2025-06-16 0530be4f Improve performance section (Steve Boyd)
- 2025-06-16 d029242a Document adding sake and command to injector (#765) (Guy Sartorelli)
- 2025-06-11 620662da Add various performance improvements to 6.1.0 changelog (Steve Boyd)
- 2025-06-10 078ad118 Remove reference to RC in stable changelog (#763) (Guy Sartorelli)
- 2025-06-04 b33e26ea Document how to drop indexes (#754) (Guy Sartorelli)
- 2025-05-22 e855c31d Document filesystem performance improvements (#737) (Guy Sartorelli)
- 2025-05-07 3a32dbbd Document new non-blocking sessions solution (#733) (Guy Sartorelli)
-
silverstripe/totp-authenticator (6.0.0 -> 6.0.2)
- 2025-07-17 c07bcfc Prepare for docs site (Steve Boyd)
-
silverstripe/mfa (6.0.0 -> 6.1.0)
- 2025-07-13 04db017 Anonymise example QR code / key (Garion Herman)
-
silverstripe/realme (6.0.0 -> 6.0.2)
- 2025-07-22 f995530 Prepare for docs site (Steve Boyd)
-
silverstripe/staticpublishqueue (7.0.0 -> 7.0.2)
-
silverstripe/tagfield (4.0.0 -> 4.1.0)
- 2025-07-22 f48acbc Prepare for docs site (Steve Boyd)
-
silverstripe/textextraction (5.0.0 -> 5.0.1)
- 2025-07-22 dd7f2ff Prepare for docs site (Steve Boyd)
-
dnadesign/silverstripe-elemental (6.0.0 -> 6.1.0)
- 2025-08-17 eaf9b26 Fix typo in recent patch (Ed Wilde)
-
symbiote/silverstripe-advancedworkflow (7.0.0 -> 7.1.0)
- 2025-07-22 cad1d61 Prepare for docs site (Steve Boyd)
-
symbiote/silverstripe-gridfieldextensions (5.0.0 -> 5.1.0)
- 2025-07-23 ece6bc1 Prepare for docs site (Steve Boyd)
-
symbiote/silverstripe-queuedjobs (6.0.0 -> 6.1.0)
- 2025-07-21 c32421e Prepare for docs site (Steve Boyd)
-
colymba/gridfield-bulk-editing-tools (5.0.0 -> 5.1.0)
- 2025-07-21 1dc9312 Prepare for docs site (Steve Boyd)
-
tractorcow/silverstripe-fluent (8.0.0 -> 8.1.0)
- 2025-07-22 c25a010 Prepare for docs site (Steve Boyd)
Translations
-
silverstripe/assets (3.0.0 -> 3.1.0)
-
silverstripe/framework (6.0.0 -> 6.1.0)
-
silverstripe/admin (3.0.0 -> 3.1.0)
-
silverstripe/asset-admin (3.0.0 -> 3.1.0)
-
silverstripe/versioned-admin (3.0.0 -> 3.1.0)
-
silverstripe/cms (6.0.0 -> 6.1.0)
- 2025-05-18 139c8fd5 Update translations (#3080) (Guy Sartorelli)
-
silverstripe/reports (6.0.0 -> 6.1.0)
- 2025-05-16 4f7ad4d8 Update translations (#219) (Guy Sartorelli)
-
silverstripe/versioned (3.0.0 -> 3.1.0)
- 2025-05-16 86eb140 Update translations (#508) (Guy Sartorelli)
-
silverstripe/userforms (7.0.0 -> 7.0.2)
- 2025-08-17 d12f5d5 Update translations (Steve Boyd)
-
dnadesign/silverstripe-elemental (6.0.0 -> 6.1.0)
- 2025-05-16 c4142e6 Update translations (#1352) (Guy Sartorelli)
-
symbiote/silverstripe-queuedjobs (6.0.0 -> 6.1.0)
- 2025-05-18 9b4e4cf Update translations (#471) (Guy Sartorelli)
-
colymba/gridfield-bulk-editing-tools (5.0.0 -> 5.1.0)
- 2025-05-16 39ca551 Update translations (#331) (Guy Sartorelli)
-
silverstripe/linkfield (5.0.0 -> 5.1.0)
-
silverstripe/campaign-admin (3.0.0 -> 3.1.0)
- 2025-05-16 10cbb29 Update translations (#354) (Guy Sartorelli)
Other changes
-
silverstripe/recipe-kitchen-sink (6.0.0 -> 6.1.0)
- 2025-07-24 68161fc Disable markdown lint for module list (Steve Boyd)
-
silverstripe/framework (6.0.0 -> 6.1.0)
- 2025-06-06 10db7d3e9 Update and rename CoreTest.php to TempFolderTest.php (Thomas Portelange)
- 2025-06-06 cbd39c9a7 always append php version to username folder (Thomas Portelange)
- 2025-06-04 b9f60e518 Update TempFolder.php (Thomas Portelange)
- 2025-06-03 2188166c7 Update src/Core/TempFolder.php (Thomas Portelange)
- 2025-06-03 3d5da773a Update src/Core/TempFolder.php (Thomas Portelange)
- 2025-06-03 a8b30896d Update src/Core/TempFolder.php (Thomas Portelange)
- 2025-05-30 f796b9104 FEAT Allow appending php version to username folder (Thomas Portelange)
-
silverstripe/startup-theme (1.0.0 -> 1.0.11)
- 2025-08-07 7061e04 SDEMO-774 svg flip attribute (Adrian Jimson)
- 2025-08-06 cbb21aa SDEMO-774 Mobile menu to match design (Adrian Jimson)
- 2025-08-06 40ebb56 SDEMO-767 Peer review fixes (Adrian Jimson)
- 2025-07-25 621d688 SDEMO-767 re-add home link in crumbs (Adrian Jimson)
- 2025-07-24 67b62ac SDEMO-783 peer review adjustments (Adrian Jimson)
- 2025-07-22 76b5d8a SDEMO-783 Design review adjustments (Adrian Jimson)
- 2025-07-22 e2242ec SDEMO-783 Design review adjustments (Adrian Jimson)
- 2025-07-20 f97d78d
#25 SDEMO-783 sidebar adjustments(Adrian Jimson) - 2025-07-14 11a4fc1 SDEMO-766 #18 Page content contained width (Adrian Jimson)
- 2025-05-13 f630add
#20 SDEMO-769 fix font size(Adrian Jimson)
-
silverstripe/linkfield (5.0.0 -> 5.1.0)