v4.2.0 release

Release date: July 3, 2019

Significant new features

  • The new media module is a more user-friendly alternative to the promo module with no link option. In the new media module, you can select Image (default), Video, or Audio for the Type. To use the new media module, there are two options:
  • Image Video Audio Type

    • On the New Module content edit form, select Media for the Type.
    • Create any new content type to which content can be added (e.g., page) by selecting Add for Content > Misc > Media. Filed under: media module
  • The content management API in GraphQL now supports deleting content. Filed under: GraphQL, API
  • The following features have been added to notifications:

    • A built-in workflow subscription
    • An option to select which message formatter that Brightspot should use. (Set under Admin > Sites & Settings > Global > Main > Notifications.) Filed under: notification

Significant improvements

  • When creating or editing a custom content edit form, you can now show, hide, or rename fields. Filed under: content form
  • The blog content edit form now contains a description field with a rich-text editor, which is the same as the description field for section, page, and tag. Filed under: blog, rich-text editor
  • On the Assignment Desk dashboard, you can now save a search to run again at a later time, and you can now export the results of a search as a .csv file. Filed under: Assignment Desk, CMS search
  • The Sharing Overrides (External) options that exist on other content types such as season, franchise, episode, special, tag, and section have been added to the author content type. The Sharing Overrides, which are on the Overrides tab, are:
  • Sharing Overrides (External) Sharing Overrides Overrides

    • Share title, which displays when a visitor shares the author information via the social toolbar to Facebook, LinkedIn, etc. By default, it is the Name field on the Main tab but you can change it.
    • Share description, which displays when a visitor shares an asset via the social toolbar.
    • Share image, which displays when a visitor shares an image via the social toolbar. By default, the image is the same as the one used for the author but you can change it to another image. Filed under: author

Significant defects addressed

  • An error which appeared for the search results for SEMrush Keywords has been addressed. Filed under: SEMrush
  • Users were unable to edit their current profiles; the profile functionality now works as expected. Filed under: user profile

Breaking changes

  • This release changes SavedSearches to be stored as a record, so existing saved searches will no longer work. Use the following script to pull old saved searches and re-save them to work with the new implementation:
public class Code {

    public static Object main() throws Throwable {
        (new SavedSearchesTask()).submit();
        return new Date();

    public static class SavedSearchesTask extends Task {

        private static int TASK_WRITERS_SIZE = 4;
        private static int TASK_BATCH_SIZE = 50;
        private static boolean TASK_COMMIT_EVENTUALLY = Boolean.TRUE;

        private static final String TASK_DESCRIPTION = "Migrate SavedSearches";

        public void doTask() throws Exception {
            // set up async queue & writers
            AsyncQueue<Object> queue = new AsyncQueue<>();
            Database db = Database.Static.getDefault();
            for (int i = 0; i < TASK_WRITERS_SIZE; i++) {
                AsyncDatabaseWriter<Object> asyncDbWriter = new AsyncDatabaseWriter<>(
                    TASK_DESCRIPTION, queue, db,
                    WriteOperation.SAVE, TASK_BATCH_SIZE, TASK_COMMIT_EVENTUALLY);

            // Query
            Query<ToolUser> query = Query.from(ToolUser.class);

            for (ToolUser user : query
                .iterable(50)) {
                State state = user.getState();
                Object savedSearches = state.get("savedSearches");

                if (savedSearches instanceof Map) {
                    Map<String, String> oldSavedSearches = (Map<String, String>) savedSearches;

                    // Create new SavedSearches from existing map
                    for (Map.Entry<String, String> search : oldSavedSearches.entrySet()) {
                        SavedSearch savedSearch = new SavedSearch(search.getKey(), search.getValue(), user);

                        // Queue up new SavedSearch to be saved on its own as it's not an embedded object
                    // Remove old map of savedSearches

                    // then queue it up

            // Close the queue!

Our robust, flexible Design System provides hundreds of pre-built components you can use to build the presentation layer of your dreams.

Asset types
Module types
Page types
Brightspot is packaged with content types that get you up and running in a matter of days, including assets, modules and landing pages.

Content types
Landing pages
Everything you need to know when creating, managing, and administering content within Brightspot CMS.

Admin configurations
A guide for installing, supporting, extending, modifying and administering code on the Brightspot platform.

Field types
Content modeling
Rich-text elements
A guide to configuring Brightspot's library of integrations, including pre-built options and developer-configured extensions.

Google Analytics
Apple News