` element and a JavaScript
initializer. URL query parameters could be appended directly to the Tableau Server Dashboard URL to control
rendering behavior.
In v3, Tableau dashboards are embedded using the `
` web component. The web component does not
read or forward query parameters from the `src` URL in the same way. Instead, configuration options must be
provided as **child `` elements** nested inside the `` component.
From the
[Tableau Embedding API documentation](https://help.tableau.com/current/api/embedding_api/en-us/docs/embedding_api_parameters.html#apply-custom-parameters-during-customization-using-web-components),
the correct way to pass custom parameters in v3 is:
```html theme={null}
```
***
## How Curator handles this
Curator automatically generates the appropriate `` elements when a dashboard is embedded using
Embedding API v3. This is controlled by the dashboard's **Embedded Options** settings in the Curator backend.
The following parameters are handled automatically by Curator:
| Parameter | Controlled by |
| ---------------- | ------------------------------------------------------------------ |
| `:render` | **Render Client-Side** setting in the Advanced tab |
| `:refresh` | **Refresh Data** setting in the Advanced tab |
| `:linktarget` | **Link Target** setting in the Advanced tab |
| `:subscriptions` | **Show Toolbar** + **Hide Subscribe** settings in the Advanced tab |
| `:alerts` | **Show Toolbar** + **Hide Alerts** settings in the Advanced tab |
When Curator renders a v3 embed, it translates the dashboard's saved settings into `` child
elements inside the `` component. You do **not** need to manually add parameters to the Tableau
Server Dashboard URL.
***
## Fixing broken parameters: verify client-side rendering is enabled
The most common case where this issue surfaces is with the `:render=True` parameter, which forces Tableau to use
client-side (browser) rendering instead of server-side (image) rendering. If you had appended `?:render=True`
to the Tableau Server Dashboard URL in the Curator backend, it will be ignored in v3.
In Curator, **Render Client-Side** is enabled by default, so most dashboards will already produce the correct
`` output without any changes. However, if you have previously set this to a different value
or are seeing unexpected rendering behavior, verify the setting:
1. Navigate to the Curator backend > **Tableau** > **Dashboards**.
2. Select the Dashboard you want to configure.
3. Switch to the **Advanced** tab and open the **Embedded Options** section.
4. Verify that the **Render Client-Side** toggle is enabled.
5. Save the Dashboard if you made any changes.
Curator will then render the correct `` element inside the
`` web component automatically.
***
## Curator URL parameters vs. Tableau Server Dashboard URL parameters
It is important to distinguish between two different types of URL parameters:
**Curator URL query parameters** (e.g., `https://your-curator.com/dashboard?Region=West`) are still fully
supported in v3. Curator picks these up and converts them to filter and parameter values applied via the
Tableau JavaScript API. See [Preloading Filters and Parameters](/embedding_using_analytics/filters_parameters/preloading_filters_and_parameters#preload-behavior)
for details.
**Tableau Server Dashboard URL parameters** (e.g., appending `?:render=True` to the URL in the **Tableau Server
Dashboard URL** field in the Curator backend edit page) are **not supported in v3**. These must be replaced with
the equivalent Curator embedding option settings as described above.
| Parameter type | v3 supported? | How to use it |
| ----------------------------------------------------- | ------------- | ---------------------------------------- |
| Curator URL query params (`?Region=West`) | Yes | Passed as filters/parameters via the API |
| Tableau Server Dashboard URL params (`?:render=True`) | No | Use Curator's Embedded Options instead |
***
## Additional resources
* [Tableau Embedding API v3: Custom Parameters](https://help.tableau.com/current/api/embedding_api/en-us/docs/embedding_api_parameters.html#apply-custom-parameters-during-customization-using-web-components)
* [Tableau Server: Browser Rendering](https://help.tableau.com/current/server/en-us/browser_rendering.htm)
* [Curator: Dashboard Settings](/embedding_using_analytics/tableau_dashboards/dashboard_settings)
* [Curator: Preloading Filters and Parameters](/embedding_using_analytics/filters_parameters/preloading_filters_and_parameters)
# Custom Views
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/custom_views
Configure and enable custom views functionality to allow users to save and reload dashboard states with applied filters and parameters.
Curator can allow users to save a Custom View of a Dashboard, which will include any applied filters and parameters, and
then load it again at a later date.
## Enable Custom Views
1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`).
2. Log in if prompted.
3. Click on the **Settings** > **Curator** > **Portal Settings** in the left-hand side navigation.
4. Click on the "Features" tab at the top of the main page content.
5. Click to switch on the "Custom Views" setting under the "Toolbar Buttons (Tableau Actions)" section and click the
"Save" button.
## Enable create/load a Custom View
1. Navigate to the frontend of the system (e.g. `http://curatorexample.com`).
2. Log in if prompted.
3. Navigate to the desired Dashboard by using the navigation menu.
4. Modify the filters, etc. as desired on the Dashboard.
5. Click on the Custom Views icon at the top right portion of the screen. Normally this is displayed on the right side
of the title bar in the Dashboard.
6. Enter a name for the new Custom View in the text box and click the "Create" button.
7. To load a different Custom View, select an existing view from the drop-down and click on the "Apply" button.
## Sharing Direct Links to Custom Views
Custom Views can be shared via direct URL links, allowing users to access specific Custom Views without manually
selecting them from the dropdown. This functionality works similar to Tableau's native Custom View sharing capabilities.
### How to share a Custom View via direct link
1. **Load the desired Custom View URL** — either by applying an existing Custom View using the steps above (steps 1-7),
or by creating a new Custom View (the URL updates immediately when the view is saved).
2. **Copy the current URL** from your browser's address bar. The URL will automatically include the Custom View parameter.
3. **Share the URL** with other users who have access to the Dashboard.
### URL Parameter Format
Custom Views are accessed through the `curator_custom_view` URL parameter (or the legacy `::custom_view` parameter for
backward compatibility). For example:
```txt theme={null}
http://curatorexample.com/dashboard-name?curator_custom_view=MyCustomViewName
```
When a Custom View is loaded, Curator automatically adds a Custom View ID parameter (`cvi`) to the URL:
```txt theme={null}
http://curatorexample.com/dashboard-name?curator_custom_view=MyCustomViewName&cvi=abc123def456
```
The `cvi` (Custom View ID) URL parameter contains Tableau's unique identifier (LUID) for the Custom View, which ensures the
correct view is loaded even if multiple Custom Views share the same name. This parameter gets automatically added to the
URL for troubleshooting purposes by Curator. If no Custom View ID is provided via URL load, the first Custom View by
match on name is selected and its ID is added as the cvi parameter.
If a URL contains both the Custom View name and ID parameters, the `cvi` parameter takes precedence to ensure
the exact Custom View is loaded. This means you can safely share URLs that include both parameters without
worrying about ambiguity.
#### Legacy URL Format
For backward compatibility, the legacy `::custom_view` parameter is still supported:
```txt theme={null}
http://curatorexample.com/dashboard-name?::custom_view=MyCustomViewName
```
However, new Custom View links will use the modern `curator_custom_view` parameter format.
### Sharing Private Custom Views
Private Custom Views are only visible in the dropdown for the user who created them. However, similar to
[sharing a Custom View in Tableau](https://help.tableau.com/current/pro/desktop/en-us/customview.htm#share-a-custom-view)
anyone with access to the Dashboard can see a Custom View using the direct link [outlined above](#how-to-share-a-custom-view-via-direct-link).
# Dashboard Created and Updated Dates
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/dashboard_dates
Display creation and last updated dates from Tableau Server on dashboard pages in Curator.
When enabled, the creation and last updated dates from Tableau Server are shown on each dashboard page.
These dates reflect activity on Tableau Server, not changes made within Curator.
## Enable Dashboard Dates
1. Navigate to **Settings** > **Tableau** > **Tableau Server Settings**.
2. Click the **General** tab.
3. Expand the **Dashboard Display** section.
4. Switch on **Show Tableau Dashboard Dates**.
5. Click **Save**.
# Dashboard Settings
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/dashboard_settings
Complete guide to configuring Tableau dashboard settings in Curator including display, functionality and integration options.
When adding a Tableau Dashboard to the Curator backend, there are several tabs that offer a range of settings to
customize the integration, display, and functionality of your Dashboard. This guide will walk you through each tab
and its available options, ensuring you make the most of Curator’s features to enhance your Tableau experience.
To access these settings:
1. Navigate to the backend of the system and log in if prompted.
2. Navigate to Tableau > Dashboards.
3. Select the Dashboard for which you want to adjust the settings.
If you have not added a Dashboard yet, check out our [Adding a Dashboard Guide](/embedding_using_analytics/tableau_dashboards/adding_a_dashboard)
Below, you find detailed explanations of all the toggles, input fields, and settings within each tab:
## Tab: Dashboard
This tab contains the primary settings for adding a Tableau Dashboard to Curator. When you select a Dashboard
from the dropdown fields, the input fields below will automatically populate with the corresponding values.
* **Title**: The name of the Dashboard as it will appear in the Curator portal. It automatically picks up the
title of your Dashboard from Tableau, but you can adjust it here if you prefer a different title. If you want
to change titles in Curator, ensure you have the *Use Curator Dashboard Titles* toggle enabled in your Portal
Settings (Backend > Settings > Curator > Portal Settings > Features tab > Usability section).
* **Tableau Server Dashboard URL**: The direct URL to the Dashboard on Tableau Server. No changes are needed here.
This is useful for ensuring you are embedding the correct Dashboard - copying and pasting this into a new tab
ensures you're certain of the Dashboard you're embedding.
* **Curator Dashboard URL "Slug"**: The ending of the URL used to access the Dashboard in Curator. You can adjust
this as needed, but note that special characters are not supported. The full link to your Dashboard is displayed
in the top right corner of the edit-Dashboard page.
* **Dashboard Tabs**: Determines whether or not other Dashboards published in the workbook should be shown
and how. The display options are:
1. **Off** - Do not show any other Dashboards from this workbook.
2. **Styled (Web Friendly)** - Show tabs that can be styled in the Themes (Backend > Settings > Curator > Themes >
select your Theme > *Title and Toolbar* tab). Check out our Design options [here](/site_content_design/theme/titles_and_toolbars).
3. **Tableau Server Native** - Show tabs as they appear on Tableau Server. When using this option it is important to
know that Tableau renders the Dashboard with the largest dimensions assigned in the workbook. This may lead to
scroll bars within the iframe. Please refer to the [Knowledge Base article for more info](https://help.salesforce.com/s/articleView?id=001474123\&type=1).
**Note:** This selection field is influenced by two factors:
1. To make a selection, you need to publish your workbook with sheets as tabs.
2. A global setting takes precedence over whether or not you can show tabs. This setting is found in Tableau
Server Settings (Backend > Settings > Tableau > Tableau Server Settings > Workbooks section
> **Global Dashboard Tabs** selection field). When the global setting is set to Styled or Native, it
> overrides the individual Dashboard Tabs selection — including for dashboards with **Treat as Workbook**
> enabled. The one exception is when the global setting is **Off**: dashboards with Treat as Workbook
> ignore the Off setting because workbook-mode navigation requires tabs. In that case, the form displays
> an inline message explaining the override.
## Tab: Discovery
This tab focuses on how the Dashboard will be discovered within the Curator portal.
* **Search & Content Discovery**: Add keywords to associate with your Dashboard. When users search for the specified
keyword, the Dashboard will appear in the results. To add new keywords refer to [this guide](/site_content_design/content_discovery/keywords).
If you turn on the **Hidden** switch, this Dashboard will not be discoverable through search, and it will not be
displayed in any tiles or in the Explorer.
The **Featured** flag adds the Dashboard to the list of featured Dashboards. This list can be used for content
selection in Tiles, Explorer, Feed, and List elements on your pages.
* **Description**: Add context to your Dashboard. This information can be displayed in two places:
1. **On hover over tiles**:
* The global setting can be adjusted in Themes (Backend > Settings > Curator > Themes > select your Theme >
Pages tab > Tiles Styles on the left-hand side > *Show Tile Description* selection field).
* The individual setting is on the Page > Tiles Element > Tiles Settings > *Show Description*.
* **Note:** The global setting will enable the individual setting.
2. **In the toolbar**: Show the description when navigating to the frontend page of the Dashboard. To enable this, go to
Backend > Settings > Curator > Portal Settings > Features tab > Toolbar Buttons
(Curator Actions) > switch on *Dashboard Info Button*.
* **Related Content**: Associate menu items with your Dashboard. You can set how related content is displayed in
Backend > Settings > Curator > Portal Settings > Features tab >
Usability section > *Related Content Position* selection field.
* **New & Updated Flags**: Use the toggles to manually add a flag to the Dashboard that notifies your users.
## Tab: Display
In this tab, you can configure the visual aspects and layout of how the Dashboard will be displayed within Curator.
* **Thumbnail/Icon**: This displays the current thumbnail of your Dashboard, retrieved using Tableau's REST API
during regular cron jobs. You can delete the current image by clicking the "x" next to the file name.
In *Alternate Thumbnail URL*, you can specify a different URL to retrieve the thumbnail. If you want to
refresh the thumbnail immediately, use the *Refresh Thumbnail* button. If you prefer to upload a static image,
use the *Icon Image* file upload instead.
*Note: Tableau Public dashboards cannot have their thumbnails generated automatically, because Tableau Public
retired the image download endpoint Curator relied on. These dashboards will display a generic placeholder, so
use the Icon Image upload above if you want a real image.*
*Views with very large fixed layouts are automatically scaled down to thumbnail size. In rare cases an extremely
large view may still fall back to the generic placeholder — set an Alternate Thumbnail URL pointing to a smaller
view, or upload a static image instead.*
* **Loading Screen**: Select the loading screen to display while this Dashboard is loading. If you want to add new
loading screens to the options, check out [this guide](/site_content_design/loading_screens/loading_screens).
* **Tutorial**: Select a tutorial to show when users navigate to the Dashboard.
[This guide](/site_content_design/user_notifications_and_email/tutorials)
walks you through the steps of how to create a tutorial.
* **Comments**: Enable [*User Commenting*](/embedding_using_analytics/data_manager/user_commenting)
if you want to allow users to add comments to the Dashboard. To use this feature, you need to have Data Manager
enabled. If you don't have Data Manager enabled yet, refer to [these steps](/embedding_using_analytics/data_manager/data_manager_basics).
Comments are stored in the Curator database in the `interworks_datamanager_comment` table.
* **Mobile**: Point to a different Dashboard on Tableau Server for use in mobile view. *Note* that this feature is
deprecated and will be removed in a future release.
* **Dashboard Dates**: To show the creation and last updated dates from Tableau Server on dashboard pages,
see the [Dashboard Created and Updated Dates](/embedding_using_analytics/tableau_dashboards/dashboard_dates) guide.
This is a global setting configured in Tableau Server Settings, not per-dashboard.
## Tab: Filters
The Filters tab allows you to configure the filters and parameters available for users interacting with the Dashboard.
* **Filters**: Add any of the selectable Curator filters to the Dashboard. Filters that don't match any field in your
applied data source will be greyed out.
Check out [this guide](/embedding_using_analytics/filters_parameters/filters)
to add new Filters.
* **Parameters**: Add any of the selectable Curator parameters to the Dashboard. Parameters that don't match any field
in your applied data source will be greyed out.
Check out [this guide](/embedding_using_analytics/filters_parameters/parameters)
to add new Parameters.
* **Specify Filter Sheet**: Specify a sheet from your Dashboard to retrieve filter or parameter options if you want to
customize Curator's default behavior. Check out
[this documentation](/embedding_using_analytics/filters_parameters/specify_filter_sheet)
for all the details.
* **Ignore Filter and Parameter Changes from Dashboard**: By default, Curator listens to filter and parameter changes
made within the Dashboard and adds them to the Curator URL. This allows the Dashboard to be reloaded with the same
filters and parameters applied without resetting them. If you prefer not to have this behavior for your Dashboard,
turn on this switch.
* **Enable Filter Actions**: When enabled, Curator listens for Tableau filter actions (e.g., clicking a mark to filter
other visuals) and appends them to the URL. This can be enabled individually per Dashboard or globally in
Settings > Tableau > Tableau Server Settings.
## Tab: Advanced
This tab provides access to more advanced settings and customizations.
* **Data Export Options**: Configure export options for your users. If allowing CSV and/or Excel exports, you can
either show a list of worksheets for data export or specify a worksheet for automatic download. Alternatively,
you can specify a link for the export in the *Alternate CSV Link* field. You can also provide an *Alternate PDF
Link* for downloading in PDF format. *Note*: You need to enable the export features in
Backend > Settings > Curator > Portal Settings > Features Tab > Toolbar Buttons (Tableau Actions) section.
**Alternate CSV and PDF links are not compatible with Connected Apps authentication.** When a user clicks an
alternate CSV or PDF link, the browser opens the Tableau Server or Tableau Cloud URL directly in a new tab as a
plain request with no embed token attached. Tableau validates these direct requests using a browser session cookie,
which Connected Apps authentication never creates — the signed JWT embed token authenticates only the embedded
iframe, not the browser session. As a result, users are redirected to a Tableau login page instead of receiving the
download.
If your portal uses Connected Apps, use Curator's built-in **CSV** and **Excel** export buttons instead. These run
inside the authenticated embed iframe via Tableau's Embedding API and do not depend on a browser session cookie.
* **Report Builder**: If Report Builder is enabled, you can specify a sheet for export to presentations in the
*Use PPTX Tab* field. You can also specify an *Alternate Report Builder Dashboard Link* to use this Dashboard
for export instead. More details on the Report Builder feature are documented
[here](/embedding_using_analytics/report_builder/overview_and_enabling_report_builder).
* **Embedded Options**: Adjust these settings to refine how your Dashboard is embedded in Curator. Your options are:
1. **Link Target**: Override where links from within the Dashboard should load. For more information, see
the [URL Action Overrides](/embedding_using_analytics/tableau_dashboards/url_action_overrides_link_target) guide.
2. **Show Toolbar**: Switch on if you want to show the Tableau Server toolbar below the Dashboard, in addition
to or instead of the Curator toolbar. If enabled, you can also choose to hide the Subscribe and Alert buttons from the
Tableau Server toolbar.
**Note:** There is also a global **Show Toolbar** switch. You will find it at Backend > Settings >
Curator > Portal Settings > Features tab > Toolbar Buttons (Tableau Actions). The toolbar appears
when either switch is on. While the global switch is on, every Dashboard shows the toolbar, and the
switch here cannot turn it off. Check both places if the toolbar appears where you do not want it.
3. **Refresh Data**: Switch on to ensure you are loading the latest data, not a cached version from Tableau Server.
*Note*: This might significantly affect the Dashboard's loading time.
4. **Render Client-Side**: Override the Tableau Server's configured behavior for this specific Dashboard. Check out
[this article](https://help.tableau.com/current/server/en-us/browser_rendering.htm) for more details.
If you previously passed `:render=True` as a URL parameter on the Tableau Server Dashboard URL, use this
setting instead — URL parameters on the Tableau Server Dashboard URL are not supported in Embedding API v3.
See [Custom Parameters in Tableau Embedding API v3](/embedding_using_analytics/tableau_dashboards/custom_parameters_v3)
for full details.
* **Miscellaneous**:
* **Dashboard Timer**: If enabled, a small timer is displayed in a corner of the screen when accessing a Dashboard
on the frontend.
* **Disable URL Filter**: Filter/parameter changes will not be added to the URL and will be ignored when loading the
Dashboard with respective parameters.
* **Custom Code**: Add your own JavaScript snippets here to customize the Dashboard experience. **Important**: We
cannot guarantee your code will work, as we cannot test it, and we cannot offer support for Custom Code.
Please refer to
[this article](https://curator.interworks.com/curator-is-sunsetting-custom-code-support-what-you-should-know)
for more information.
## Tab: Workbook Settings
This tab groups the workbook-scoped settings that apply to how this Dashboard behaves within its Tableau workbook.
* **Treat as a Workbook?**: Turn on if you want all Dashboards in this workbook to be listed under this Dashboard's
menu item. Turning this on also enables tabs on the Dashboard. Ensure the workbook is published with tabs on
Tableau Server.
* **Show Workbook Title**: Turn on to display the Tableau Server workbook name in place of this Dashboard's title in
the frontend heading. The heading stays fixed on the workbook name when users switch between tabs of the same
workbook or trigger URL actions on the Dashboard. The Dashboard's own Title field (used in the backend, tiles,
search results, and everywhere else the Dashboard is listed) is not affected. If the workbook name is unavailable
from the stored Tableau metadata, the frontend heading falls back to the Dashboard's Title.
## Tab: Mark Commenting
In this tab, you can configure the mark commenting functionality, allowing users to leave comments on specific
marks within the Dashboard.
* **Inline Mark Commenting**: Details on Inline Mark Commenting and how to set it up can be found in
[this documentation article](/embedding_using_analytics/data_manager/mark_commenting).
* **Tableau Group Whitelist**: Add groups from Tableau Server if you want to restrict commenting permissions to
specific groups only.
***
If you encounter any unclear areas or mistakes, feel free to reach out to your lovely Curator team!
# Data Export
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/data_export
Enable and configure multiple data export options for end-users to extract data from Curator dashboards.
There are multiple ways for end-users to export data from Curator. The current Dashboard data-exports all utilize
Tableau's standard export functionality with some optional overrides. Check out the options below for all available
data exports you can find in Curator.
## Export CSV/Excel
Curator supports the ability to set various options when exporting data to CSV or Excel. This functionality is supported
in large part by Tableau's native export capabilities, but Curator allows a more seamless export experience when some
guardrails are needed.
### Enable or Disable Export to CSV / Excel
1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
2. Navigate to the **Settings** > **Curator** > **Portal Settings** section from the left-hand menu.
3. Click on the **Features** tab and expand the Toolbar Buttons (Tableau Actions) section.
4. Toggle the switch to enable/disable Export CSV (or Export Excel) and click the "Save" button.
### Specify a worksheet when users export to CSV / Excel
If you would like to explicitly guide users to download data from a worksheet on your Dashboard (e.g. a hidden sheet
containing only the data you want them to have access to) you may find this feature very useful.
1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
2. Navigate to the **Tableau** > **Dashboards** section from the left-hand menu and select an existing Dashboard or
create a new one.
3. Click on the **Advanced** tab and toggle OFF the "Show Worksheet Options for Data Exports" feature.
4. This will populate a dropdown below the Show Worksheet Options for Data Exports" option called
"CSV / Excel Worksheet Export".
5. Select your worksheet from this list.
6. Click the save button.
### Enable or Disable specifying a worksheet for export CSV / Excel
By default Curator allows users to select which worksheet to export data from (reflecting the same default behavior on
Tableau Server). However we offer additional configuration which you can see in the previous steps above. If you would
like to disable this feature so Curator exports the first-available-worksheet follow the steps below.
On multi-tab workbooks, disabling worksheet selection or pre-selecting a single worksheet restricts exports to that one
worksheet regardless of which tab is currently active — end-users will not be able to export data from the other tabs.
To allow exports from any visible tab, keep both the global "Worksheet Select (CSV and Excel Exports)" toggle and the
per-Dashboard "Show Worksheet Options for Data Exports" toggle enabled.
1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
2. Navigate to the **Settings** > **Curator** > **Portal Settings** section from the left-hand menu.
3. Click on the **Features** tab and expand the Toolbar Buttons (Tableau Actions) section.
4. Toggle "Worksheet Select (CSV and Excel Exports)" to enable/disable worksheet selection options globally.
5. Click the save button.
### Exporting from Tableau Stories
CSV and Excel export is supported from embedded Tableau Stories. With worksheet selection
enabled, the dropdown populates with the worksheets contained in the **active story point** and
refreshes as users navigate between story points. Selecting a worksheet and choosing CSV or
Excel exports that worksheet's data, the same as on a Dashboard.
## View Data
Frequently, users need to be able to view the underlying data within a Dashboard to get more details on the data they're
looking at. The View Data option exposes this row-level data, and allows users to export this data as well.
The Data option in the Download menu carries a small information icon directly after the word "Data". Hovering over
that icon (not the Data option itself) shows the hint "Select at least one sheet before the data export can start".
Tableau does not export anything when no worksheet is selected, and it gives Curator no reliable way to detect that
after the fact, so the requirement is surfaced next to the button label rather than as an on-screen message after
clicking.
### Enable or Disable View Underlying Data
1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
2. Navigate to the **Settings** > **Curator** > **Portal Settings** section from the left-hand menu.
3. Click on the **Features** tab and expand the Toolbar Buttons (Tableau Actions) section.
4. Toggle the switch to enable/disable Export Data and click the "Save" button.
# Download Workbook
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/download_workbook
Configure and enable workbook download functionality for users to download Tableau workbooks directly from Curator.
Curator can allow users to download the Tableau workbook.
## Enable Workbook Downloads
1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`).
2. Log in if prompted.
3. Click on the **Settings** > **Curator** > **Portal Settings** in the left-hand side navigation.
4. Click on the "Features" tab at the top of the main page content.
5. Click to switch on the "Export Workbook" setting under the "Toolbar Buttons (Tableau Actions)" section and click the
"Save" button.
### Download a Tableau workbook
1. Navigate to the frontend of the system (e.g. `http://curatorexample.com`).
2. Log in if prompted.
3. Navigate to the desired Dashboard by using the navigation menu.
4. Click on the download workbook icon at the top right portion of the screen. Normally this is displayed on the right
side of the title bar in the Dashboard.
# Email Subscriptions
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/email_subscriptions
Set up automated email notifications for users when Tableau Server views are updated with new data.
Curator allows users to subscribe to dashboards where updates to the underlying Tableau Server views will be emailed to
them on a set schedule.
## Known Limitations
There is currently a limitation in Tableau's APIs that make subscribing to Custom Views unavailable for embedded
applications. Curator can only create a subscription to the Dashboard's default view through Tableau's subscription
engine. However,
[Report Builder](/embedding_using_analytics/report_builder/overview_and_enabling_report_builder)
supports subscriptions to Custom Views.
This functionality requires that the Tableau Server REST API is enabled. This allows you to subscribe to a Dashboard or
to the workbook the Dashboard belongs to on the associated Tableau Server. See the
[Tableau Connection Setup](/creating_integrations/tableau_connection/creating_a_connection)
section for more information.
***To enable email subscriptions:***
1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`).
2. Log in if prompted.
3. Click on the **Settings** > **Curator** > **Portal Settings** in the left-hand side navigation.
4. Click on the "Features" tab at the top of the main page content.
5. Click to switch on the "Subscriptions" setting under the "Toolbar Buttons (Tableau Actions)" section and click the
"Save" button.
***To subscribe to an eligible Dashboard/workbook:***
1. Navigate to the frontend of the system (e.g. `http://curatorexample.com`).
2. Log in if prompted.
3. Navigate to the desired Dashboard by using the navigation menu.
4. Click on the envelope icon at the top right portion of the screen. Normally this is displayed on the right side of
the title bar in the Dashboard.
5. Select the desired schedule.
6. Select either workbook or Dashboard in the dropdown to receive subscriptions.
7. Click on the "Add Subscription" button.
# Generating Titles
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/generating_titles
Configure how dashboard page titles are generated, choosing between Curator-defined names or Tableau Server dashboard names.
When viewing dashboards via Curator, you can choose whether or not the page title is retrieved from the name you have
entered in the edit-Dashboard page or the name of the Dashboard on Tableau Server.
## Specify where your Dashboard titles are retrieved from
1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
2. Navigate to the **Settings** > **Curator** > **Portal Settings** section from the left-hand menu.
3. In the Features tab, expand the Usability section and find the *Use Curator Dashboard Titles* switch.
4. Toggle the switch to enable/disable *Use Curator Dashboard Titles* and click the "Save" button.
## Show the Tableau Server workbook name instead
You can also override the frontend heading on a per-Dashboard basis to display the workbook name from Tableau Server
instead of the Dashboard's own name. In the Dashboard edit page, open the **Workbook Settings** tab and turn on
**Show Workbook Title**. When enabled, the frontend `` heading renders the workbook name and remains fixed on
that name as users switch between tabs of the same workbook. The Dashboard's own Title field is unchanged and is
still used everywhere the Dashboard is listed in the backend. If the workbook name is not available from the stored
Tableau metadata, the heading falls back to the Dashboard's own Title.
# Pause and Resume Changes
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/pause_and_resume_changes
Enable users to pause dashboard refreshes while applying multiple filters and parameters for better performance.
Curator can allow users to pause a Dashboard so that multiple changes (e.g. applying multiple filters) can be made
before the Dashboard is refreshed.
## Enable Dashboard Pause
1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`).
2. Log in if prompted.
3. Click on the **Settings** > **Curator** > **Portal Settings** in the left-hand side navigation.
4. Click on the "Features" tab at the top of the main page content.
5. Click to switch on the "Pause Dashboards" setting under the "Toolbar Buttons (Tableau Actions)" section and click
the "Save" button.
## Pause a Dashboard
1. Navigate to the frontend of the system (e.g. `http://curatorexample.com`).
2. Log in if prompted.
3. Navigate to the desired Dashboard by using the navigation menu.
4. Click on the pause layout updates icon at the top right portion of the screen. Normally this is displayed on the
right side of the title bar in the Dashboard.
5. Make any desired changes to the filters, parameters, etc.
6. Click on the resume layout updates icon at the top right portion of the screen to apply all changes at once.
# Share Workbook
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/share_workbook
Enable workbook sharing functionality to allow users to share Tableau workbooks directly from Curator.
Curator can allow users to share the Tableau workbook.
## Enable workbook sharing
1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`).
2. Log in if prompted.
3. Click on the **Settings** > **Curator** > **Portal Settings** in the left-hand side navigation.
4. Click on the "Features" tab at the top of the main page content.
5. Click to switch on the "Share" setting under the "Toolbar Buttons (Tableau Actions)" section and click the "Save" button.
## Share a Tableau workbook
1. Navigate to the frontend of the system (e.g. `https://www.curatorexample.com`).
2. Log in if prompted.
3. Navigate to the desired Dashboard by using the navigation menu.
4. Click on the share icon at the top right portion of the screen. Normally this is displayed on the right side of the
title bar in the Dashboard.
# Tableau Worksheets and Stories
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/tableau_worksheets_and_stories
Learn how to embed and configure individual Tableau worksheets and stories alongside dashboards in Curator.
In certain situations, especially if your Tableau Server's metadata API is disabled,you will be able to embed
single worksheets or stories instead of a Tableau Dashboard. Although it is technically possible it is not fully
supported as Tableau embedding API is limited in this area.
We added an informational popup to let the front end user know that, especially the toolbar buttons' functionality
is limited. If you wish to hide this information from your users you can simply disable it with the following steps:
1. Login to the backend of your Curator instance (e.g. `https://www.curatorexample.com/backend`).
2. Navigate to the **Settings** > **Tableau** > **Tableau Server Settings** section from the left-hand menu.
3. Under the "General" tab, look for the *Workbooks* section.
4. Enable the switch "Hide 'not a Dashboard' info".
5. Click the "Save" button.
The easiest workaround to avoid this situation of limited functionality is to put the worksheet on a Dashboard and
republish your workbook with visible sheets and stories.
# URL Action Overrides (Link Target)
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_dashboards/url_action_overrides_link_target
Configure URL actions in Tableau dashboards to control link behavior and user navigation within Curator.
When a URL action gets triggered in Curator, there are different settings that allow Curator to handle these actions in
a more sophisticated manner directing your users to the location they want to end up without much intervention in the
middle. You can find a description of the available options at the bottom of this page.
## Set the Link Target
1. Login to the backend of your Curator instance (e.g. `https://www.curatorexample.com/backend`).
2. Navigate to the **Tableau** > **Dashboards** section from the left-hand menu.
3. Click the Dashboard you'd like to edit from the list page.
4. Under the "Advanced" tab, look for the *Embedded Options* section.
5. Change the Link Target field to the desired option (see below for descriptions)
6. Click the "Save" button.
### Available Options
*Default*
By default, Curator handles the URL as defined in the Tableau Dashboard.
*Self*
The URL Action defined in the Tableau Dashboard will load within the embedded frame on the page keeping the user in the
same location.
*Parent*
The URL Action defined in the Tableau Dashboard will change the location of the current browser tab the user is on
navigating them away from the current page.
*Blank*
The URL Action defined in the Tableau Dashboard will open in a new browser tab.
*Curator Detect*
Curator inspects the URL produced by the URL Action and checks whether it matches a Dashboard page in the current
user's navigation within Curator. If a match is found, it directs the user to that Curator page in the same browser
tab — preserving any query-string filters appended to the URL. If no match is found, it opens the URL in a new browser
tab instead.
*Curator Detect New Tab*
The same behavior as Curator Detect, only in both scenarios it opens up a new tab.
### Passing Filters through URL Actions
When passing filters through URL Actions on a Tableau Dashboard, Tableau has good documentation on how to set this up
[here](https://help.tableau.com/current/server-linux/en-gb/actions_url.htm?source=productlink#Using). For a complete
walkthrough of configuring a URL Action to pass filters and navigate users to a filtered Curator Dashboard, see
[Navigate to a Filtered Curator Dashboard via a URL Action](/embedding_using_analytics/tableau_dashboards/cross_dashboard_navigation_url_actions).
# Adding a Pulse Metric
Source: https://docs.curator.interworks.com/embedding_using_analytics/tableau_metric/adding_a_pulse_metric
Add and configure Tableau Pulse metrics for real-time dashboard performance monitoring and alerts.
In December 2023, Tableau Cloud introduced an innovative feature known as Pulse,
**which is not available in Tableau Server**.
This significant update ushered in the era of Metrics. With Pulse Metrics, users gain the ability to track individual
metrics and leverage guided exploration to gain deeper insights into their data.
Beyond just viewing metrics within Curator, you can also immediately send or subscribe to insightful digests via email.
These digests highlight crucial data changes, ensuring users always stay informed and updated.
Metrics from Tableau Pulse can be added easily to Curator using your existing
[Tableau Cloud connection](/creating_integrations/tableau_connection/creating_a_connection).
You can either create a new Metric within Curator, or add an existing one that has already been created in Tableau Pulse.
## Adding a Metric to Curator
### Create a new Metric
1. Navigate to the backend of the system (e.g. [http://curatorexample.com/backend](http://curatorexample.com/backend))
and log in if prompted.
2. Navigate to **Tableau** > **Metrics**.
3. Click on the "New Metric" button.
4. Select the respective **Tableau Server** and **Site** drop-downs.
5. Set the **Metric Definition** dropdown to "Create New", then select the **Project** and **Data Source** you'd like to
use.
6. Fill out the **Definition** selections in the **Details** tab to follow the specific metric.
7. Be sure to save!
### Add an existing Metric (already created on Tableau Pulse)
1. Navigate to the backend of the system (e.g. [http://curatorexample.com/backend](http://curatorexample.com/backend))
and log in if prompted.
2. Navigate to **Tableau** > **Metrics**.
3. Click on the "New Metric" button.
4. Select the respective **Tableau Server** and **Site** and **Metric Definition** drop-downs.
5. Confirm the **Definition** selections in the **Details** tab to follow the specific metric.
6. Be sure to save!
## Embedding a Metric in Curator
By default, Metrics will have their own standalone pre-built template page that you can link to - this link can be found
on the edit-Metric page in the backend.
### Adding a Metric to a page
In addition to Curator's standalone templates, you can also add metrics to pages along side other content like images,
forms, Tableau Dashboards and even other metrics. To add a metric to a page:
1. Navigate to the backend of the system (e.g. [http://curatorexample.com/backend](http://curatorexample.com/backend))
and log in if prompted.
2. Navigate to **Content** > **Pages**.
3. Either find your page in the list you want to add your metric to or click "+ New Page" to create a new page.
4. Hover over the area of the page you'd like to add the Metric to, or click an element and click the "Change Element"
button to display the element selection options. Then select the Analytic Elements tab and click on "Tableau Metric":
5. Use the left-hand Page Styles controls to select the metric you want to embed.
6. Be sure to save!
## Supported Features
When a Pulse Metric is embedded in Curator, the following interactive features are available to end users:
* **Headline stat with comparison** -- displays the current metric value along with the relative percentage and absolute
change versus the prior period, plus the time-period range it covers.
* **Sparkline trend chart (Overview)** -- an inline Vega-Lite trend visualization rendered alongside the headline stat.
* **Dimension/breakdown toggle** -- users can switch between an *Overview* (trend) view and a *Breakdown* (dimension-level
bar) view using the *Show Breakdown* / *Show Overview* button.
* **Guided insight text** -- textual insights generated by Tableau that explain metric changes (e.g., "Revenue is up 25%").
* **Favorite/bookmark** -- users can mark a metric as a favorite so it appears in their favorites.
* **Email digest** -- users can immediately send or subscribe to email digests that include the headline stat and trend image.
## Limitations
The following Tableau Pulse features are **not** currently available in Curator's embedded metric experience:
* **Ask Questions** -- the natural language query interface available in native Tableau Pulse is not supported.
* **Top Insights / Springboard** -- exploratory insights beyond the anchor and breakdown views are not rendered on the page.
* **Dynamic filtering** -- end users cannot add or modify filters; only the pre-configured *allowed dimensions*
(set at authoring time in Tableau) are applied.
* **Custom time periods** -- the metric's granularity, time comparison, and range are fixed in its definition
(configured in Tableau / when creating the Metric) and cannot be changed by end users while viewing the page.
* **Real-time refresh** -- insights are fetched once when the page loads; there is no live refresh or user-driven data
update on demand.
## Accessing a Metric
In order to access a Metric on Curator, you must have a valid connection to Tableau Cloud. The username you log in with
to the front-end of Curator *must match exactly* with the associated username on Tableau in order to properly determine
permissions.
The permissions for Metrics on Curator are based on access to the datasource that the Pulse Metric is connected to on
Tableau Cloud, or the datasource you selected on the create-Metric page. If the user you're logged in has no associated
account on Tableau, they will not be able to access the metric by default. You can further restrict these permissions
by using the **[Restrict Access](/site_content_design/menus/restrict_access)**
menu permissions.
# ThoughtSpot Full App Embed
Source: https://docs.curator.interworks.com/embedding_using_analytics/thoughtspot_content/thoughtspot_full_app
Embed the complete ThoughtSpot application experience within Curator using the Page Builder.
If you have [integrated ThoughtSpot](/creating_integrations/thoughtspot_connection/integrating_thoughtspot_with_curator),
you can follow this guide to add a ThoughtSpot Full App Embed to Curator.
## Creating the ThoughtSpot Full App Embed
The ThoughtSpot Full App Embed is available directly in the Page Builder, allowing you to embed the complete
ThoughtSpot application experience within your Curator pages.
1. Find the page you'd like to add your embed to, or create a new page.
2. In the Page Builder, select an existing element from the preview and click the "Change Element" button. You can also
add a new element.
3. Choose the "Analytic Elements" category then the "THOUGHTSPOT FULL APP" element.
4. Once the element is added, choose the Org where your ThoughtSpot data lives from the left-hand panel:
5. Finally choose the Homepage experience you'd like to use:
* **Classic Homepage** (default) - The traditional ThoughtSpot homepage experience
* **Spotter Homepage** - ThoughtSpot's new natural language search interface
## Adding the ThoughtSpot Full App Embed to the Curator Frontend
Once configured in the Page Builder, the ThoughtSpot Full App Embed will be displayed on your page, providing users
with access to the complete ThoughtSpot application interface. Users will need appropriate ThoughtSpot permissions
on the configured Org to access the embedded application.
You can make the page containing the Full App Embed more discoverable by:
1. Adding it to your [navigation](/site_content_design/menus/managing_menus).
2. Creating a [tile](/site_content_design/pages/tiles) that links to the page.
3. Adding keywords to the page so it can be easily found via Curator's search or in the [explorer](/site_content_design/pages/explorer).
# ThoughtSpot Search
Source: https://docs.curator.interworks.com/embedding_using_analytics/thoughtspot_content/thoughtspot_search
Integrate ThoughtSpot search functionality for natural language query capabilities within Curator.
If you have [integrated ThoughtSpot](/creating_integrations/thoughtspot_connection/integrating_thoughtspot_with_curator)
you can follow this guide to add ThoughtSpot Search to Curator.
## Creating the ThoughtSpot Search
1. Navigate to the Curator backend > ThoughtSpot > ThoughtSpot Searches and click the "New ThoughtSpot Search" button.
2. Choose the Org where the data you'd like to search against lives.
3. Choose the type of search. The types include:
1. Spotter - ThoughtSpot's new natural language search feature (replaces deprecated Sage)
2. Standard Search - The standard ThoughtSpot Search experience
3. Standard Search w/ Pre-made Answer - The standard Search experience, but initially loading with an Answer
4. Choose the data source or Answer you'd like the Search to load with, or none if you'd like the user to begin with a
blank slate.
5. In the "Details" section, add a title. This will automatically generate a slug but feel free to overwrite it.
6. In the "Discovery" section, add keywords, a description, etc.
7. Hit the "Save" button.
## Adding the ThoughtSpot Search to the Curator Frontend
The ThoughtSpot Search is now created and accessible to Curator users, assuming they have ThoughtSpot users on the Org
being searched against. You can make the Search more discoverable in several ways:
1. Add it to your navigation.
2. Add it to a [page](/site_content_design/pages/pages_overview) directly.
3. Add it to a page as a [tile](/site_content_design/pages/tiles).
4. Add keywords so it can be easily found via Curator's search or in the [explorer](/site_content_design/pages/explorer).
# Curator SaaS
Source: https://docs.curator.interworks.com/get_started/curator_saas
Deploy a branded analytics portal in minutes with no-code simplicity and expert guidance
**Curator SaaS** is the recommended deployment option for most organizations, offering rapid implementation, expert guidance, and a fixed-cost model. Build a branded, no-code analytics portal in minutes, not months.
Ready to get started? Fill out our [contact form](https://interworks.com/contact) to learn more.
## Choosing Curator SaaS
Curator SaaS transforms the traditional analytics portal deployment from a months-long technical project into a streamlined 2-week implementation with expert guidance included.
### Key Advantages
**Deploy in as little as 2 weeks** with dedicated expert guidance from the InterWorks team
Build and customize your portal without any technical development resources
Scale to your entire organization with unlimited users (fair use policies apply)
Predictable pricing with no surprise infrastructure costs or maintenance fees
Dedicated support and guidance from analytics platform specialists
Always stay current with the latest features and security updates
***
## SaaS requirements
To use Curator SaaS, ensure you meet the following technical requirements:
* **Supported Browsers:** Latest versions of Chrome, Firefox, Edge, or Safari
* **Network Access:** Ability for any of your hosted platforms (e.g. Tableau) to connect to Curator SaaS endpoints.
* **Data Security:** Compliance with your organization's data security policies, as Curator SaaS acts as a pass-through
for your analytics content.
If you opt to use the legacy Self-Hosted deployment, please refer to the
[Self-Hosted Technical Requirements](https://curator.interworks.com/docs/installation/self_hosted_requirements) for
detailed specifications.
## SaaS vs. Self-Hosted
Not sure which deployment model is right for you? Here's a comparison:
| Feature | Curator SaaS | Self-Hosted |
| -------------------------------- | ----------------------- | ----------------------------------------- |
| **Technical Expertise Required** | None | Moderate to High |
| **Infrastructure Management** | Managed by InterWorks | Customer managed |
| **Maintenance & Updates** | Automatic | Manual |
| **Scalability** | Automatic | Customer configured |
| **Pricing Model** | Fixed cost, predictable | Variable infrastructure costs |
| **Best For** | Most organizations | Legacy systems, specific compliance needs |
**Recommendation:** Curator SaaS is the ideal choice for most organizations. Self-hosted deployments are primarily for existing customers or organizations with specific regulatory requirements.
***
## Quick Start Resources
Once your SaaS instance is set up, these guides will help you make the most of Curator:
Get up and running with your Curator SaaS portal
Learn the basics in just 5 minutes
Add dashboards and content to your portal
Apply branding and customize the look and feel
***
## Frequently Asked Questions
Most Curator SaaS implementations are completed in **2 weeks** with dedicated expert guidance. This includes platform integration, initial configuration, and training.
Yes! Curator SaaS supports connections to Tableau, Power BI, ThoughtSpot, and Sigma.
Curator SaaS includes **unlimited users** with fair use policies. Scale to your entire organization without worrying about per-seat licensing.
Yes. Curator SaaS follows enterprise-grade security practices. All data transmission is encrypted, and Curator acts as a secure pass-through for your analytics content. [Learn more about security →](/best_practices/security/password_settings)
Yes! InterWorks can help you migrate your existing self-hosted Curator installation to SaaS. [Contact support](https://interworks.com/help) to discuss migration options.
You won't lose any features by using Curator SaaS. In fact, SaaS users often gain additional benefits like automatic updates and dedicated support.
Curator SaaS includes dedicated support from the InterWorks team, including initial setup guidance, ongoing technical support, and access to documentation and tutorials.
***
## Ready to Get Started?
Try Curator SaaS free for 30 days
Speak with our team about your needs
Learn more about Curator SaaS features
See Curator SaaS in action
**Already have a Curator SaaS instance?** Jump straight to the [Quick Start Guide](/setup/trial_quick_start_guide/getting_started) to begin building your portal.
# Self-hosted
Source: https://docs.curator.interworks.com/get_started/self_hosted_overview
Quick start guide for installing Curator on various platforms
Self-hosted Curator CMS no longer our recommended offering. Check out our [Curator SaaS](/get_started/curator_saas) for a modern, fully managed experience with expert guidance and no infrastructure to maintain.
*If you're an existing customer looking for requirements or there is another reason why you are installing locally, this is what you need to know:*
## Server Requirements
### General Requirements
Your Curator server must be its own standalone web server. Installing on the same web server as Tableau Server is **not** supported.
Containerized deployments are also **not** currently supported.
Your Curator server will need to be able to communicate directly with your Tableau Server, and your Tableau Server will need the REST and Metadata APIs enabled.
### Curator Standard/Enterprise
If you are hosting, you will need a standalone web server on which to install the software.
This can be highly customized, but plan on following minimum specifications:
* Linux (preferred) or Windows
* At least 4 CPU, 8GB of RAM and 20GB of disk space available
* Ports open for web traffic (80 and 443)
* A disaster recovery plan
#### AWS-Hosted Instances
For AWS-hosted instances, we recommend:
| Linux (preferred) | Windows |
| ------------------------------------ | ------------------------------------ |
| m8g.large | m8i.xlarge |
| Ubuntu 24.04 LTS or above | Windows 2019 or above |
| 20GB of gp3 SSD @ 3000 IOPS/125 MB/s | 20GB of gp3 SSD @ 3000 IOPS/125 MB/s |
# Welcome to Curator
Source: https://docs.curator.interworks.com/get_started/welcome
Your central hub for unified analytics across Tableau, Power BI, ThoughtSpot, and more
Curator is a powerful analytics portal platform that centralizes and unifies your analytics content from multiple
platforms into a single, branded interface. Transform analytics from isolated tools into an integrated business
process that drives adoption and engagement.
## What is Curator?
Curator solves the common challenge of fragmented analytics ecosystems by providing a **single pane of glass** for all
your dashboards, reports, and analytics content. Whether you're using Tableau, Power BI, ThoughtSpot, or multiple
platforms, Curator brings everything together in one beautifully branded portal.
## Choose Your Deployment Model
Curator offers flexible deployment options to match your organization's needs:
**Recommended for most organizations**
* Deploy in 2 weeks
* No-code portal builder
* Unlimited users
* Expert guidance included
* Fixed-cost model
**For legacy customers or specific requirements**
* Full control over infrastructure
* Highly customizable
* Linux or Windows deployment
* Requires technical setup
***
## Common Tasks
Once you're set up, these guides will help you get the most out of Curator:
Embed Tableau, Power BI, or ThoughtSpot content
Build custom pages with tiles, text, and embeds
Organize your content with navigation menus
Manage users and groups with permissions
Customize your portal's look and feel
Add dynamic filters to your dashboards
***
## Need Help?
Get up and running with Curator in 5 minutes
Get help from our support team
Integrate with Curator's API
Learn more about Curator's capabilities
**Found a bug?** Please report it through [InterWorks.com/help](https://interworks.com/help).
To help our support team diagnose the issue quickly, include the following information:
* **What you were doing** when the issue occurred (steps to reproduce)
* **Expected behavior** vs. **actual behavior**
* **Any error messages** displayed on screen
* **Relevant log entries** from `storage/logs/` (e.g., `system-YYYY-MM-DD.log`) *(On-Prem only)*
***
**New to Curator?** We recommend starting with the
[Quick Start Guide](/setup/trial_quick_start_guide/getting_started) and the
[5-minute tutorial](/tutorials/get_started_with_curator_in_5_minutes) to get familiar with the platform.
# API Connections Overview
Source: https://docs.curator.interworks.com/server_management/architecture/api_connections_overview
Understand how Curator uses Tableau REST API connections for authentication and permission checking between Tableau Server and Curator frontend users.
To use Tableau REST API calls we need access to a Tableau Site or Server Admin account. Curator’s API calls
need a user that has high-level permissions to check another user’s permissions, access all Dashboard
projects on Tableau Server, check Tableau Group membership, and more. Tableau documents permissions in greater detail here.
When a user tries to login to the front end of Curator, we must check if that user has access to the Tableau
Server Site we have set in the Tableau Server Settings area of the backend. Curator uses the stored Site
Server admin account to ask Tableau Server if the user has access to the Tableau Server site. If the user is
on the site, then it will allow them to login to the front end of Curator. From there, Curator must check to
see what dashboards a user has access to see.
Curator requires you to select a default Tableau Server Site to authenticate against. If a user is not a
member of the chosen Tableau Server Site, and instead a member of a different Tableau Server Site, then the
user won’t be allowed to login. Therefore, we recommend having a default site that has all users and groups
on it for authentication. If you are using a Tableau Site Admin for the backend API calls, then the above
scenario will also apply. If the Site Admin is not a Site Admin of another site, then they won’t be able to
access content/users from another Tableau Sever Site. They will not have permission to use API calls on a
different site and will not be able to set up content from those Tableau Sites.
The graphic below is an example of the frontend user login flow where we have a Tableau Server Admin account for API Calls
The next graphic is an example of when a Tableau Site/Server Admin uses an API call for a Tableau Server Site
they are admin of:
This graphic is an example of an incorrect configuration where a Tableau Site Admin uses an API call for a
Tableau Server Site they are not an Administrator of:
The final graphic is an example of Curator checking if a user has view access to a Dashboard:
# Disk Speed Metrics
Source: https://docs.curator.interworks.com/server_management/system_administration/disk_speed_metrics
Performance optimization guide covering disk speed benchmarking, cloud platform recommendations, and hardware upgrades to improve Curator system performance.
## Introduction
In the modern era of cloud computing, understanding disk speed is complex, yet paramount.
Without adequate disk read/write speeds, Curator can seem sluggish or even outright slow.
Improving disk speed benchmarks can be a complex combination of software configurations, hardware upgrades,
and understanding the underlying systems' operations.
### Benchmark Thresholds
Curator runs a file system speed test once per day. The test writes 1,000 test files, then reads all 1,000
back, and grades four measurements against fixed thresholds:
| Measurement | Threshold | What it measures |
| ----------- | ------------------ | ------------------------------------------------- |
| Write | Under 0.1 seconds | The slowest *single* file write out of the 1,000 |
| Batch Write | Under 1 second | The *total* elapsed time to write all 1,000 files |
| Read | Under 0.04 seconds | The slowest *single* file read out of the 1,000 |
| Batch Read | Under 0.5 seconds | The *total* elapsed time to read all 1,000 files |
These thresholds are the same for every Curator installation. They are not configurable, and there is no
setting to raise, lower, disable, or exclude an individual measurement for a particular installation or
environment. The only way to clear a failing benchmark is to make the underlying storage faster.
When a benchmark fails on a self-hosted installation, Curator automatically re-runs the entire test once more
at a random point within the following hour. Only if that second run *also* fails does Curator record a
warning: "The underlying server file system is slow to respond. This might cause slow page loads in the
frontend and backend of Curator." The second run exists to filter out false failures caused by a temporary
spike in load on the server. On InterWorks-hosted, InterWorks-hosted-container, and trial installations this
retry-and-warning behavior does not apply, because InterWorks manages monitoring of those deployments
differently.
The warning is advisory. It does not disable or restrict any Curator functionality — it reports that the
environment is slower than Curator expects, which typically surfaces to users as sluggish page loads in the
portal and the backend.
### When Only Batch Operations Fail
It is common to pass the single Write and Read benchmarks while failing Batch Write, and sometimes Batch
Read. This combination is a meaningful signal rather than a random result, and it points at a different
underlying cause than a straightforward "slow disk".
The single-operation figures report the slowest individual write and read out of the 1,000 attempts, so
passing them means no single operation ever stalled. The batch figures report the total elapsed time for all
1,000 operations run back to back. Failing only the batch benchmarks therefore means that no individual
operation was slow, but the volume could not sustain the *rate* — the storage ran into an IOPS or throughput
ceiling partway through the run.
This is why batch-only failures are usually resolved by raising the volume's provisioned IOPS and throughput
rather than by hunting for one slow operation. Two related causes are worth checking:
* **Burst credits**: some volumes deliver high performance in short bursts, then throttle back to a much
lower baseline once the credit balance is exhausted. A 1,000-file run can be long enough to exhaust a small
credit balance, so the first portion of the test runs fast and the remainder is throttled.
* **Capacity is not performance**: a volume's IOPS ceiling is generally tied to its provisioned performance
settings or its disk tier, not to how much data is stored on it. Adding free space alone will not raise the
ceiling.
The platform-specific sections below cover how to raise IOPS and throughput on AWS, Azure, and on-premises
virtual machines.
## Benchmarking Basics
1. **The Dilemma**: Many users consider upgrading their machine CPU/RAM specifications as the primary
solution to improve speed. However, increasing this hardware is only a part of the puzzle. Disk speed can be
a huge factor in the performance of your Curator system.
2. **Windows vs. Linux**: It's essential to note that inherent differences exist between Windows and Linux
regarding OS efficiencies. Typically, Windows systems have substantially slower disk speed test results
compared to Linux counterparts because of operating system intricacies.
## Actionable Steps to Improve Disk Speed
1. **Cloud Platforms**: For those using cloud systems, such as AWS or Azure, different disk types and
instance types offer varying speeds. It's imperative to choose configurations that align with your
performance requirements. Increasing disk speed may be as easy as changing a few toggles!
2. **Instance Recommendations for AWS Users**:
* **gp3 Volumes**: If you haven't already, switch your EBS volume to a gp3 EBS volume. AWS defaults to
"gp2" type volumes,
[but gp3 is more cost efficient AND faster.](https://aws.amazon.com/blogs/storage/migrate-your-amazon-ebs-volumes-from-gp2-to-gp3-and-save-up-to-20-on-costs/)
It's literally a "win-win". EBS volumes using gp3 also allow you to configure both IOPS (Input/Output
Operations Per Second) and Throughput, enabling better control over disk performance. Consider increasing
these metrics to improve disk speed.
* **IOPS (Input/Output Operations Per Second)**: This metric defines the number of read and write
operations that the volume can perform per second. In simple terms, it's the "speed" of data
transactions. A higher IOPS value usually leads to faster disk performance. When you increase the IOPS
configuration, it can be beneficial for applications that require high random access, like Curator's
database. If your individual read/write speeds are passing benchmarks, but the batch operations are not,
increasing IOPS could be a good solution.
* **Throughput**: This measures the volume's capacity to read and write data in megabytes per second
(MB/s). It's essentially the "bandwidth" of data transactions. Throughput is especially important for
applications that move large amounts of data.
* **Instance Types**: Not all CPU types are created equal. Although it may seem unrelated, CPU resources
are a large part of disk speed metrics. Utilizing newer, faster instance types can yield drastically
better results than AWS's older instance types, usually for equivalent or better pricing. If possible,
you may wish to investigate utilizing the newer ARM infrastructure, which will yield drastically faster
performance.
3. **Instance Recommendations for Azure Users**:
* **Disk Types**: Azure offers two types of SSD drives. Instead of "Standard SSD", use "Premium SSD" for production workloads.
* **Disk Tiers (IOPS)**: Premium SSD performance is set by the disk tier — P10, P15, P20, P30, and so on
— and each tier carries its own IOPS and throughput ceiling. That ceiling applies regardless of how much
of the disk's capacity is actually in use, so if the batch read/write benchmarks are failing, move up a
tier (for example, P10 to P15 or P20) rather than only adding capacity. Larger tiers do include more
capacity, but it is the tier change, not the extra space, that raises the IOPS ceiling.
* **Instance Types**: Ensure that the instance type used for Curator is using modern CPU technology.
Older CPU types are available, however, these are significantly slower than Azure's newer generation CPUs.
Consider using Azure's 5-Series instance types, or better. A good starter instance is the "Standard\_D8ls\_v5".
4. **Instance Recommendations for Users of On-Prem Virtual Machines**:
* **Dedicated Hardware**: Systems using shared resources can see wild swings in performance depending on
the load of other systems in the virtual machine cluster. Curator recommends requesting dedicated CPU
affinity when possible.
* **vCPUs vs CPUs**: vCPUs can often be underpowered compared to physical CPU resources. A good rule of
thumb is to consider 2 vCPUs to be roughly equivalent to 1 physical CPU resource. For example, to achieve
the performance of a "4 core" environment, consider acquiring "8 vCPUs".
* **Storage IOPS**: If only the batch benchmarks are failing, ask your infrastructure team what IOPS
limit is applied to the datastore or LUN backing the virtual machine. Shared SAN and NAS storage is
frequently capped per-VM or per-datastore, and network-attached storage adds latency to every operation
that local disks do not. Raising the IOPS allocation, or moving Curator onto local NVMe or SSD storage,
addresses this directly.
* **Minimum Core Count**: Curator's baseline server requirement is **at least 4 CPU cores** (or the vCPU
equivalent per the rule of thumb above, so roughly 8 vCPUs). See the
[Server Requirements](/setup/Server_Requirements/requirements) page for the full minimum specification,
including RAM and disk space.
5. **Other Hardware Upgrades**:
* **CPU/RAM**: Although it might seem unrelated, increasing CPU and RAM can significantly improve your
read/write benchmarks, especially for Curator installations on Windows Server.
6. **Network Speed**:
* **Importance in Cloud-Based Systems**: In cloud environments, network speed plays a large role in disk
speed metrics. A capped disk speed due to low network speeds can hinder performance substantially.
* **Cloud Vendor Specifications**: Depending on your cloud service provider, you might need to shift to a
different instance type or family to achieve the desired network speed.
7. **Notes on Antivirus Software**:
* One potential cause of filesystem speed issues is antivirus software. While this software is vitally
important, it does introduce extra overhead, especially in regards to disk speed. To counter this effect,
you may need to increase hardware requirements more than you'd expect to cover the hardware requirements
of your antivirus software. (RAM/CPU/Disk Speed).
* To add exclusions, you can either whitelist the entire Curator installation directory, or specific
processes (particularly **libs\PHP\php.exe**, **libs\MariaDB\bin\mariadbd.exe**, and **libs\Apache24\bin\httpd.exe**)
8. **Windows Security Exclusions**:
* Windows Security is particularly slow. Adding exclusions can make a huge difference on Windows systems,
in particular. In some tests, disk speed benchmarks have dropped by as much as 75% by adding exclusions
in the Windows Security software.
* To add Windows Security exclusions, go to **Start**, then open **Settings** . Under
**Privacy & security** , select **Virus & threat protection**. Under
**Virus & threat protection settings**, select **Manage settings**, and then under **Exclusions**,
select **Add or remove exclusions**.
Ideally, whitelist the entire Curator install folder, or use the individual exclusions in the Antivirus section above.
# Disk Usage Management
Source: https://docs.curator.interworks.com/server_management/system_administration/disk_usage_management
Understand what consumes disk space in Curator and how to manage log retention, backups, cache, and uploaded files to keep the storage footprint under control.
## Introduction
Over time, a Curator installation accumulates data on disk: log files, database-backed logs, backup
archives, cached files, and uploaded assets. It is normal for disk usage to grow as the portal is used, and
a major version upgrade can cause a temporary spike while the migration runs and a fresh backup is retained.
This guide explains the main contributors to Curator's storage footprint, how to see current disk usage, and
how to reduce it by adjusting retention settings, pruning backups, and clearing the cache.
This page is about storage **capacity**: what fills up the disk and how to reclaim space. If instead you
are troubleshooting disk **speed** (sluggish reads/writes), see
[Disk Speed Metrics](/server_management/system_administration/disk_speed_metrics).
## What Consumes Disk Space
| Contributor | Location | Retention / cleanup |
| ----------------------------------- | -------------------------- | ---------------------------------------------- |
| **System log files** | `storage/logs/` | Rotated daily, kept 14 days |
| **Event, usage, content-view logs** | Curator database tables | Pruned on a schedule |
| **Backup archives** | Configured backup location | Manual deletion; pruned once a schedule is set |
| **Cache** | `storage/framework/cache` | Cleared via **Clear Cache** |
| **Uploaded files and assets** | `storage/app` | Not auto-pruned |
System log files are handled by the `daily` log channel in `config/logging.php`. Database log
pruning follows the **Usage Log Retention** and **Event Log Retention** settings in Portal Settings.
Uploaded files are managed through the portal's file and content areas.
## Viewing Current Disk Usage
Curator shows free disk space directly in the backend:
1. In the backend, open **Backups** (from the main backend navigation).
2. At the top of the Backups page, the **Free Space** meter shows free space as a percentage, with a tooltip
giving the exact free and total space (for example, "Free Space: 40 GB of 100 GB").
The Free Space meter is hidden on InterWorks hosted instances, where storage is managed for you.
For a per-directory breakdown on a self-hosted server, connect over SSH (Linux) or RDP (Windows) and inspect
the `storage/` folder: `storage/logs`, `storage/app`, and `storage/framework/cache` are the usual large
consumers, along with your backup location.
## Adjusting Log Retention
Curator writes two kinds of logs:
* **System log files** on disk (`storage/logs`), rotated automatically and kept for 14 days. This is
controlled by `config/logging.php` and does not normally need tuning. If your logs are not rotating and
are consuming excessive space, follow
[Updating Curator Logging](/server_management/system_administration/updating_curator_logging).
* **Event, usage, and content-view logs** stored in the database. These are pruned on a schedule according to
two settings in Portal Settings.
To change database log retention:
1. In the backend, go to **Settings → Portal Settings** and open the **General** tab.
2. Set **Usage Log Retention**: how long usage-log data (and older log files and content-view records) are
kept. Options are **1 Month** (default), **3 Months**, **6 Months**, or **12 Months**.
3. Set **Event Log Retention**: an optional shorter window for pruning event-log data on top of the
**Usage Log Retention** floor. Options are **Never (Manual)** (default), **1 Week**, **2 Weeks**,
**1 Month**, or **3 Months**. "Never (Manual)" does not mean event logs grow without bound: the scheduled
cleanup still deletes event-log rows older than **Usage Log Retention**. "Never (Manual)" only means no
*additional* shorter-window pruning is applied beyond that floor.
4. Save. Curator's scheduled cleanup task applies the new retention window on its next run and deletes older
records.
Retention works in two layers. **Usage Log Retention** is the outer floor: the scheduled cleanup prunes
event logs, usage logs, on-disk log files, and content-view records older than this window. **Event Log
Retention** adds an optional shorter inner window that prunes event logs more aggressively. Leaving **Event
Log Retention** on **Never (Manual)** does not cause unbounded growth. Event logs are still pruned by the
**Usage Log Retention** floor; it only skips the extra shorter-window pruning. Choose a finite **Event Log
Retention** if you want event logs cleared sooner than the **Usage Log Retention** window on a busy portal.
## Managing Backups
Full backups include a database dump plus portal files, so each archive can be large. They are one of the
biggest disk-usage contributors, especially when several are retained.
### Delete individual backups
1. In the backend, open **Backups**.
2. In the backup list, click the **trash** icon next to any completed backup and confirm the deletion.
### Configure scheduled-backup retention
Pruning is enabled whenever a **Backup Schedule** is set. Once a schedule is in place, **any** backup run,
whether scheduled or manually triggered, prunes the backup list down to the retention count, and manually
created archives are pruned alongside scheduled ones. If there is a backup you want to keep indefinitely,
copy it out of the backup location so it is not removed by a later pruning pass.
1. On the **Backups** page, click the **gear** icon to open **Backup Settings**.
2. Set a **Backup Schedule** (Daily, Weekly, or Monthly) if you want automatic backups. Leaving it on
**Manual** disables both scheduled backups and automatic pruning.
3. Set **Backup Retention** to the number of backups to keep (**1** to **10**). When any backup runs (scheduled
or manually triggered), Curator prunes the backup list down to this count, always keeping at least one.
4. Optionally set a **Backup Location** to store archives on a different disk or path (for example, a larger
volume) to keep them off the primary disk. If the backup location is set by an environment
variable, this field is disabled and must be changed via the environment.
5. Save.
An invalid retention value (empty or greater than 10) is automatically treated as **2**.
### Backups fail even though the Free Space meter shows available space
Before a backup runs, Curator checks that free disk space exceeds the size of your most recent completed
backup. That check is only a rough guard: backup creation is a multi-step process that temporarily needs
**more** disk space than the final archive.
1. A webroot ZIP is written to the backup location.
2. A database dump (`.sql` file) is written alongside it.
3. A final full-backup ZIP is assembled from the webroot ZIP and the database dump.
4. The intermediate webroot ZIP and database dump are deleted once the final ZIP is complete.
During step 3 the webroot ZIP, the database dump, and the final ZIP all coexist on disk, so the peak
temporary space requirement can be roughly two to three times the size of the finished backup. If the disk
fills during this window, the final ZIP cannot be written and the backup fails, even though the Free Space
meter appeared to show enough room before the backup started.
**To resolve:**
* Delete older backups (see [Delete individual backups](#delete-individual-backups)) to free up more space
than the pre-backup check alone requires.
* As a rule of thumb, keep free disk space at roughly **3x** the size of your most recent backup before
running a new one.
* If your portal is large and backups routinely run out of space, set a **Backup Location** that points to a
larger volume (see
[Configure scheduled-backup retention](#configure-scheduled-backup-retention)) to keep backups off the
primary disk.
* On Windows servers, also confirm that the account running the web server process is not subject to a
per-account disk quota: a quota can cause ZIP creation to fail even when the overall volume reports free
space.
## Clearing the Cache
Curator caches compiled templates, combined assets, and other computed data under `storage/`. Clearing the
cache reclaims that space and forces Curator to rebuild it on the next request.
1. In the backend toolbar (top of the page), click **Clear Cache**.
2. Wait for the operation to complete. The cache is rebuilt automatically as the portal is used again.
Clearing the cache is safe and non-destructive: it removes only cached files that Curator rebuilds
automatically, never your content, settings, or uploads.
## Disk Usage During Upgrades
A major version upgrade (for example, 2025.10 → 2026.04-01) can temporarily increase disk usage:
* Migration artifacts and newly generated files are written during the upgrade.
* Deprecated vendor files from previous versions are removed automatically by upgrade migrations, so some of
the increase is reclaimed once the upgrade finishes.
Before upgrading, the upgrade screen checks for a recent backup and warns you if none exists; always take a
fresh backup first. That backup counts toward your disk usage, so once the upgrade is verified you can prune
older backups as described above to reclaim space.
# Filesystem Permissions
Source: https://docs.curator.interworks.com/server_management/system_administration/filesystem_permissions
Configure proper filesystem permissions for Curator to ensure correct operation of job systems and file access controls.
Curator needs full access to its filesystem to run correctly.
Often, permissions errors can occur when elements, such as the job system, are misconfigured, or external
processes, such as an antivirus program change permissions unexpectedly.
Use the processes below to correct errant file permissions.
If permissions have to be corrected repeatedly — every morning, or after every upgrade — correcting them again
will not help on its own. See
[If Permission Errors Return on Linux](#if-permission-errors-return-on-linux) or
[If Permission Errors Return After Running FixPerms](#if-permission-errors-return-after-running-fixperms) to
resolve the underlying cause.
***Linux:***
1. Determine the user running Curator. This can be found on the Settings->Curator->Status page. On most
systems, this will be either "apache" or "www-data" (Ubuntu).
2. SSH into the webserver that is running Curator.
3. In the terminal, run a "chown" command for the user you found in Step 1.
Here are some examples:
**RHEL, Amazon Linux AMI 1/2, CentOS:**
```Linux theme={null}
sudo chown -Rf apache:apache /var/www/html;
```
**Ubuntu:**
```Ubuntu theme={null}
sudo chown -Rf www-data:www-data /var/www/html;
```
***Windows:***
1. Find where Curator is installed on your system. Often, this is in *C:\InterWorks\Curator*.
2. Within this directory, look for a folder named "htdocs" or "wwwdata".
*Note: If your system has an "htdocs" folder, your Curator installation is running Apache. If your system
has a "wwwdata" folder, your Curator installation is running a legacy IIS install.*
3. Right click on the "htdocs" or "wwwdata" folder and select "Properties".
4. On the folder's "Properties" page, **deselect** the "Read-only" attribute and hit "Apply".
5. After this process has completed, select the "Security" tab.
6. On the Security tab, click "Advanced".
7. If your folder is "htdocs" make sure "SYSTEM" is the folder's owner. If your folder is "wwwdata", IUSR
should own the folder.
8. Reselect the correct user as the owner. (Note: do this again, even if it looks correct.)
9. Check the box labeled "Replace owner on sub-containers and objects".
10. Check the box labeled "Replace all child object permission entries."
11. Hit "Apply"
## Automated Permissions Reset for Windows
If you encounter persistent file or folder permission issues with Curator on Windows, you can use the Curator FixPerms
script to automatically reset permissions to the correct settings.
### Usage Instructions
1. Download the FixPerms script from the link: [Curator\_FixPerms.exe](https://api.curator.interworks.com/Curator_FixPerms.exe)
2. Right-click on Curator\_FixPerms.exe and select Run as Administrator.
3. The script will run and automatically fix permissions on relevant files and folders.
*Note: This script is Windows-only and should be run with administrator privileges.*
## If Permission Errors Return After Running FixPerms
On some Windows deployments, permissions are reset correctly by FixPerms or the manual steps above, but cache
write errors reappear within minutes or hours. The most common cause is **antivirus or endpoint security
software** — tools such as CrowdStrike Falcon, Windows Defender, or similar agents can scan or lock files
inside Curator's storage directory, resetting ownership or denying write access shortly after the permission
fix is applied.
To prevent recurring failures, add the following paths to your antivirus exclusion list. The paths below
assume a default Curator installation under `C:\InterWorks\Curator`; adjust the drive letter and root if
Curator is installed elsewhere:
Apache (htdocs):
* `C:\InterWorks\Curator\htdocs\storage\framework\cache`
* `C:\InterWorks\Curator\htdocs\storage\framework\sessions`
* `C:\InterWorks\Curator\htdocs\storage\framework\views`
* `C:\InterWorks\Curator\htdocs\storage\cms`
* `C:\InterWorks\Curator\htdocs\storage\logs`
* `C:\InterWorks\Curator\htdocs\storage\temp`
Legacy IIS (wwwdata):
* `C:\InterWorks\Curator\wwwdata\storage\framework\cache`
* `C:\InterWorks\Curator\wwwdata\storage\framework\sessions`
* `C:\InterWorks\Curator\wwwdata\storage\framework\views`
* `C:\InterWorks\Curator\wwwdata\storage\cms`
* `C:\InterWorks\Curator\wwwdata\storage\logs`
* `C:\InterWorks\Curator\wwwdata\storage\temp`
After adding the exclusions:
1. Run the [FixPerms script](#automated-permissions-reset-for-windows) once more.
2. Use the **Clear Cache** button in the upper right of the Curator backend to discard any stale data.
3. Monitor Backend > Settings > Logs > Event log to confirm the permission-denied errors have stopped.
If you cannot add antivirus exclusions, contact your security team. Curator requires continuous write access
to its `storage\framework\cache` directory to operate correctly — persistent permission failures prevent
caching from working, which causes page load slowdowns and floods the event log with repeated warnings.
## If Permission Errors Return on Linux
If Curator's permissions have to be corrected repeatedly — for example every morning, or after every
upgrade — the `chown` command above is only treating the symptom. Something on the server is creating files
inside the webroot as the wrong user, or is resetting the security labels on files that already have the
correct owner. The common causes are covered below.
### Curator's Cron Is Running as Root
Curator's scheduled tasks are driven by an `artisan schedule:run` cron entry, and those tasks write log files,
cache files, backup archives, and temporary files inside the webroot. If that cron entry lives in **root's**
crontab instead of the crontab of the user running the web server (usually `apache` or `www-data`), every file
the scheduler creates is owned by `root`, and the web server is denied write access to it on the next request.
Because the scheduler runs every minute, permissions appear to reset continuously no matter how often `chown`
is run. Moving the cron entry to the web-server user removes the cause permanently. See the
[Linux Cron Troubleshooting](/server_management/system_administration/linux_cron_troubleshooting) guide for
step-by-step instructions, including commands for identifying which user currently owns the cron entry.
### Commands Were Run as the Wrong User
Upgrades, database migrations, and other `php artisan` commands also create files. Running them as `root`, or
prefixed with `sudo`, leaves root-owned files behind in exactly the same way — which is why permission errors
often appear immediately after an upgrade. Before running any Curator command from a terminal, confirm you are
logged in as the user shown on the **Settings** > **Curator** > **Status** page, then re-run the `chown`
command above if you are unsure what a previous command left behind.
### SELinux Contexts (RHEL, CentOS, Amazon Linux)
On distributions with SELinux enabled, ownership is only half of the requirement. Files must also carry an
SELinux type that permits the web server to write to them, and `chown` does not change a file's SELinux
context. As a result, Curator can still report permission errors immediately after a successful `chown`.
To check whether SELinux is enforcing, run:
```bash theme={null}
getenforce
```
If that returns `Enforcing`, apply the writable web content type to the webroot:
```bash theme={null}
sudo chcon -R -t httpd_sys_rw_content_t /var/www/html
```
`chcon` changes the context on disk right away, but it does not record the change in the system's file context
policy. Any relabel — from `restorecon`, a policy update, or a scheduled relabeling job — reverts it, which is
another reason permissions can appear to reset on a daily basis. To make the context survive a relabel, add it
to the policy and then apply it:
```bash theme={null}
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?"
sudo restorecon -Rv /var/www/html
```
Adjust the paths above if Curator is installed somewhere other than `/var/www/html`. On RHEL 8 and newer, the
`semanage` command is provided by the `policycoreutils-python-utils` package. If SELinux policy is managed
centrally in your organization, pass these commands to the team that owns it rather than applying them
yourself.
# Health Check Endpoint
Source: https://docs.curator.interworks.com/server_management/system_administration/health_check_endpoints
Use the /healthz endpoint to monitor Curator's database connectivity from an orchestrator or uptime monitor.
Curator exposes a `/healthz` endpoint that reports whether Curator can reach its database, as JSON. It is designed
for use by container orchestrators, load-balancer health probes, and uptime monitors that need
to know whether Curator is operational — not just whether the web server is up.
## Endpoint
```http theme={null}
GET /healthz
```
The endpoint is restricted to callers on the loopback interface or a private (RFC 1918) network range:
* `127.0.0.0/8` (loopback)
* `::1` (IPv6 loopback)
* `10.0.0.0/8` (Class A private)
* `172.16.0.0/12` (Class B private)
* `192.168.0.0/16` (Class C private)
Requests originating from any other address receive HTTP `403 Forbidden` with the body `{"error":"Forbidden"}`.
This restriction is intended to keep the detailed system information `/healthz` exposes from being publicly
accessible.
## Response
A successful health check returns HTTP `200` and a JSON body containing the result of the check:
```json theme={null}
{
"database": "success"
}
```
If the check fails, the endpoint returns HTTP `503 Service Unavailable` with the same JSON shape, with the
`database` value replaced by `"error"`.
### Checks Performed
| Key | Description |
| ---------- | ----------------------------------------------------------- |
| `database` | Verifies database connectivity by opening a PDO connection. |
## Behavior When the Database Is Unreachable
`/healthz` is designed to return a JSON response even when the database is unreachable, so an orchestrator can
distinguish "database down" from "web server down". When the database connection fails, the `database` check
reports `error` and the endpoint returns HTTP `503` rather than the framework's standard error page.
## Example Usage
From a server on the same private network as Curator:
```bash theme={null}
curl -i http://curator.internal/healthz
```
# Linux - Cron Troubleshooting
Source: https://docs.curator.interworks.com/server_management/system_administration/linux_cron_troubleshooting
Troubleshooting guide for resolving Linux cron job issues in Curator installations, including permission fixes and scheduling problems.
Curator runs regularly scheduled tasks on Linux using the web-server's cron. This takes care of things like status
checks, scheduled reports, user-syncing along with a host of other very important items. Rarely this setup can be done
incorrectly on installation, so we've provided some steps for resolving common issues related to the cron.
## Cron Troubleshooting
### Identify Current Cron User
If you're unsure which user is currently running the schedule:run cron job, use these commands:
```bash theme={null}
# Check all user crontabs for schedule:run
sudo grep -r "schedule:run" /var/spool/cron/
# Check system-wide cron files
sudo grep -r "schedule:run" /etc/cron* /etc/crontab
# Monitor processes when schedule:run executes (run this and wait)
watch -n 1 'ps aux | grep -E "artisan|schedule:run" | grep -v grep'
# Check cron logs for schedule:run execution
sudo grep "schedule:run" /var/log/cron* | tail -20
```
The first two commands will show all cron entries containing "schedule:run" and which user/file they're in. The watch command will show the user in the first column when the process runs. The cron logs should also indicate which user is executing the command.
### Permissions Error
1. Log on to the webserver that is running Curator.
2. In the terminal, login as root user by typing in `su - root`
3. View the cron by typing in `crontab -e`
4. If there is content in the crontab file, check to see if the root user is running anything related to Curator.
For example, look for "artisan" or "php" commands.
5. If these are found, copy these lines and place them somewhere you can reference later - then delete the lines from
this and press `esc` then type `:wq` to save the empty file.
6. Find the user running your web-server. If you are unsure, you can find this on the **Settings** > **Curator** >
**Status** page on the backend of Curator.
7. Ensuring you're still logged in as root, edit the crontab file associated with your server-run-as user you found in
the previous step. For example, if your user was "apache" you would type
`crontab -e -u apache` and press enter. This will open the crontab file. Press `i` to enter "insert mode" and paste in
the contents from step #5. Then press `esc` and type `:wq` to save the empty file.
NOTE: If the contents of all your cron files are empty, then revisit step #7 above (ensuring you're still logged in as
root) and paste in the contents below while in insert mode:
`* * * * * php /var/www/html/artisan schedule:run >> /dev/null 2>&1`
### Test Cron
In order to make sure your cron schedule is running properly, you can manually fire the cron task via Curator's API
using the steps below. If you do not receive a 'success' response then you may need to adjust your environment configuration:
1. Follow instructions in the
[Auto Generate API Links](/curator_api/getting_started/curator_api_overview)
section and ensure the dropdowns are set to **Portal** and **cron** respectively.
2. Click the preview link generated
3. Link will open in new tab and should display a "success" message
### Check When Cron Last Ran
The **Curator Status** widget on the backend Dashboard shows **Last Cron Run**. On a healthy install it reads a
minute or two ago; a warning icon appears once it is more than 24 hours old. If cron is running but background
jobs still pile up, see [Queued Processes](/site_administration/performance/queued_processes).
If you want a monitor or orchestrator to alert when cron has stopped running, poll the
[/portal/info](/curator_api/api_docs/curator_api#portalinfo) API endpoint. In its response, `env.cron_timestamp`
is the time of the last cron run, and `env.cron_check` is `false` once that time is more than 24 hours old. The
[Health Check Endpoint](/server_management/system_administration/health_check_endpoints) reports database
connectivity only and does not report cron status.
# Server Hardening Procedures
Source: https://docs.curator.interworks.com/server_management/system_administration/server_hardening_procedures
Security best practices and procedures for hardening Curator server installations to protect your data and infrastructure.
## Introduction
Securing your data is vitally important. Curator uses many
[checks and procedures](https://curator.interworks.com/data-and-security)
to ensure the safety of your system.
Many security settings are already set up for your site "out of the box", however, additional steps can be
taken by your system administrators to further harden the setup upon installation.
## Hardening Steps
1. **SSL Certificates:** Make sure SSL certificates are added to your website! Secure transportation of data
between the users and the server is very important. Click
[here to follow the instructions for SSL certificate installation](/setup/ssl/linux_ssl).
Both Tableau Server and Curator should utilize SSL for user traffic.
2. **Force SSL Traffic:** You will also want to force users to use this new SSL route. Curator has a simple
toggle to force users over HTTPS instead of HTTP. Simply enable this setting in
[Settings->Curator->Portal Settings](/setup/ssl/force_ssl) \
to ensure users use this route.
3. While you are in “Portal Settings” for Step #2, also set the “Forced Curator Domain” option to prevent
[Host Header Injection](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection).
4. After enabling SSL, make sure your SSL Ciphers are up to date. You can update these values using the
[SSL Protocols / Ciphers](/setup/ssl/linux_ssl)
steps on the Linux SSL installation page.
5. In addition to setting SSL Ciphers in your `curator.conf`, you may wish to adjust the default values for
`Strict-Transport-Security` and `Expect-CT`. There are four lines to set these values toward the bottom of
the file. These are commented out by default. Simply uncomment these lines and restart Curator to utilize them.
6. Other than that, Curator should pass most security scans “out of the box”. If you do run into any issues,
though, please let us know! We’d love to help you resolve them: either through core Curator changes, or (more
likely) configuration adjustments.
7. If your website is public available, you may wish to utilize
[SSLLabs.com](https://www.ssllabs.com/ssltest/analyze.html)
and [SecurityHeaders.com](https://securityheaders.com/) to further test your configuration.
## Additional Information
**!Important! Tableau Server:** Your Tableau Server must also be available to end users for them to be able to access
dashboards.
For example, if Tableau Server is on-prem and behind the firewall, the end users won’t be able to access the
dashboards unless they are using the VPN. Because of this, you will want to place Tableau Server on the open
internet as well, following [their hardening instructions](https://help.tableau.com/current/server/en-gb/security_harden.htm).
If you are using Tableau Cloud, then you do not need to worry about this, as it is already accessible.
**WAF Systems:** If you’d like an extra layer of protection, many of our customers utilize WAF systems in
front of both Tableau Server and Curator. To configure Curator for a WAF, use
[these instructions](/setup/proxy_configuration/reverse_proxy). To configure Tableau Server,
[use Tableau’s reverse proxy instructions](https://help.tableau.com/current/server/en-us/proxy.htm#configure-the-reverse-proxy-server)
,as well as Curator’s
[“alternative URL routing”](/creating_integrations/tableau_connection/alternative_url_routing)
instructions.
# Troubleshooting 502 and 504 Errors
Source: https://docs.curator.interworks.com/server_management/system_administration/troubleshooting_502_504_errors
Diagnose and resolve HTTP 502 Bad Gateway and 504 Gateway Timeout errors when accessing Curator through a reverse proxy, load balancer, or other network appliance.
HTTP 502 (Bad Gateway) and 504 (Gateway Timeout) errors indicate a problem between the user's browser and Curator,
but Curator itself never generates these specific response codes. They are always produced by a network appliance
sitting between the browser and Curator — such as a reverse proxy, load balancer, application gateway, or firewall.
Because 502 and 504 errors are generated by a middleman rather than Curator, they mask the actual underlying issue.
The error you see in the browser tells you that *something* went wrong, but not *what* went wrong or *where*. The
troubleshooting steps below focus on uncovering the real error that the 502 or 504 is hiding.
Support and troubleshooting of network appliances (reverse proxies, load balancers, application gateways, firewalls,
etc.) is outside the scope of Curator support. You will need to work with your own network administrators to
diagnose and resolve issues within those systems. Every network appliance is different, so any guidance in this
document related to one of these network appliances is intended to be generic and will need to be adapted to your specific setup.
## Understanding the Problem
When a request travels from a browser to Curator, it typically passes through one or more network appliances:
**Browser** → **Network Appliance** (reverse proxy, load balancer, WAF, etc.) → **Curator**
A 502 or 504 error means the network appliance could not get a valid response to pass back to the browser. The root
cause could be any of the following:
* **Curator itself is returning an error** — the network appliance received an error response and replaced it with a
generic 502.
* **Something between the appliance and Curator is failing** — a networking issue, DNS resolution failure, or
certificate problem is preventing the connection from completing.
* **The network appliance itself has an issue** — a misconfigured timeout, connection limit, or routing rule is
causing the appliance to generate the error on its own.
## Step 1: Bypass the Network Appliance
The single most important troubleshooting step is to see the actual response Curator is sending, without the network
appliance rewriting it. There are two ways to do this:
### Option A: Check the Network Appliance Logs
Many reverse proxies and load balancers log the upstream response they received from Curator before replacing it with
a 502 or 504. Check the appliance's access and error logs for entries corresponding to the failed requests. Look for
the HTTP status code and response body that Curator returned.
### Option B: Connect Directly to Curator
If the appliance logs don't provide enough detail, access Curator directly — bypassing the network appliance entirely.
Depending on your network setup, this might involve:
* Using the server's direct IP address (e.g. `https://192.0.2.1`)
* Using an internal DNS name that resolves directly to the Curator server
* Making the request from the Curator server itself
* **Linux:** `curl http://localhost`
* **Windows:** Navigate to `http://localhost` in a browser on the server
Once you can see Curator's actual response, you'll know whether Curator is the source of the problem or not.
## Step 2: If Curator Is Returning an Error
If your direct request reveals that Curator is returning an error (such as a 500 Internal Server Error), use Curator's
logging systems to get the details.
### Check the Event Log
Curator logs application-level errors to its Event Log.
Review recent error entries for details on what went wrong. For more information, see the
[Logging Overview](/site_administration/logging/logging_overview).
### Check the File System Logs
If the error is not in the Event Log, or if the Curator backend is inaccessible, check the system log files directly
on the server:
```
storage/logs/system-YYYY-MM-DD.log
```
These files are located relative to the Curator installation directory. For more details, see
[File-Based Logs](/site_administration/logging/file_based_logs).
### Check the Web Server Logs
In cases where the error is severe enough that Curator's application doesn't fully boot — for example, a PHP fatal
error or a misconfigured environment — Curator's built-in logging may not capture anything. In this case, check the
web server's own error logs:
* **Apache (Linux):** `/var/log/apache2/error.log` or `/var/log/httpd/error_log`
* **Apache (Windows):** `C:\InterWorks\Curator\libs\Apache24\logs\error.log`
* **FastCGI / PHP-FPM:** Check the PHP-FPM error log configured in your pool settings
## Step 3: If Curator Is Not Returning an Error
If Curator responds correctly when accessed directly, then the issue is between the network appliance and the browser,
or within the network appliance itself. At this point, focus your troubleshooting on the appliance:
* Review the appliance's error logs for connection failures or upstream timeouts.
* Verify that the appliance can reach Curator's IP and port from its own network.
* Check for TLS/SSL certificate issues between the appliance and Curator.
* Ensure health checks are configured to use the `/ping` route (see
[Reverse Proxy](/setup/proxy_configuration/reverse_proxy#health-checks) for details).
## Common Cause: Timeout Mismatch
One of the most frequent causes of 504 Gateway Timeout errors is a timeout mismatch between the network appliance
and Curator's web server.
Curator's web server has a configured maximum execution time (`max_execution_time`) that controls how long it will
spend processing a request before timing out. If the network appliance has a *shorter* timeout than Curator, the
appliance will give up and return a 504 to the browser even though Curator is still processing the request and would
have eventually responded successfully.
**Fix:** Ensure the network appliance's timeout is at least as long as Curator's `max_execution_time`. Check timeout
settings in all layers of your network path:
* **Load balancer** — idle timeout, request timeout, or backend timeout settings
* **Reverse proxy** — `proxy_read_timeout` (Nginx), `ProxyTimeout` (Apache), or equivalent
* **Application gateway / WAF** — request timeout or backend connection timeout
* **CDN** — origin response timeout
To check Curator's `max_execution_time`:
1.
2. Click to edit any API key.
3. Use the drop-downs in the middle of the edit page to select **portal** and **phpinfo**.
4. Click the resulting link below the drop-downs — this opens a new tab with the full PHP configuration.
5. Search the page for `max_execution_time` to find the current value.
The network appliance's timeout should be set to at least this value.
# Updating Curator Logging
Source: https://docs.curator.interworks.com/server_management/system_administration/updating_curator_logging
Manual steps to update Curator logging system structure and prevent log files from consuming excessive disk space.
In a recent update to Curator, we changed the structure of the logging system. In some instances, the
automated update may not work due to server configuration issues. Below you'll find the steps to manually
update the logging file. Following the steps below will ensure your logs do not consume too much space on
your server.
## Add Logging.php file to your config folder (Linux)
1. SSH to your webserver
2. cd into your config folder - on a standard install it will be: `cd /var/www/html/config`
3. Retrieve the file from the Curator website and rename it using the command below:
`wget -O logging.php https://curator.interworks.com/file/logging.php.txt`
4. Ensure permissions on the file are set correctly, on a standard install you will want to ensure the apache
user is the owner of the file:
`sudo chown apache:apache logging.php`
## Add Logging.php file to your config folder (Windows)
1. Start a remote session / RDP in to your webserver
2. Navigate to the webserver root folder and find the config file - on a standard install it will be C:\InterWorks\Curator\config
3. Download the logging file from the Assets section on the left-hand nav
4. Place the file into the config folder and rename it to **logging.php**
5. Ensure the permissions on the file are correct (confer with our [filesystem permissions guide](/server_management/system_administration/filesystem_permissions))
# Windows - Investigating CPU Spikes
Source: https://docs.curator.interworks.com/server_management/system_administration/windows_cpu_investigation
How to use the CPU investigation script to find out what a Windows Curator server was doing when its CPU spiked, and how to capture the next spike.
When a Windows Curator server hits 100% CPU, the spike is usually over before anyone can look at the server. Windows
keeps no CPU history on its own. The only way to explain a spike after the fact is to line up the records the server
does keep: the Apache access and error logs, the PHP and Curator logs, the Windows event logs, the Task Scheduler
history, and any Performance Monitor logs.
The CPU investigation script lines those records up for you. It reads each source and builds one timeline in 5-minute
buckets. The report names the busiest periods, lists what else was happening at the same time, and ranks the
configuration problems it found by severity. Two more modes capture the next spike as it happens.
The script is for self-hosted Curator installations on Windows Server that use the bundled Apache web server. It reads
the server; it does not change anything unless you ask it to register a Performance Monitor collector. Nothing is
uploaded anywhere. The report is written to the Desktop for you to review and send to the Curator support team.
## Requirements
* Windows Server 2016, 2019 or 2022 with Windows PowerShell 5.1 (installed by default).
* A PowerShell session started with **Run as administrator**. Without it, the Task Scheduler history, some event logs
and the Windows Defender settings cannot be read, and the report says so in its "Collection problems" section.
* Enough time: the first run reads every access log in the window. A busy server with 14 days of logs takes a few
minutes.
## Step 1: Run the historical analysis
Open an elevated PowerShell window on the Curator server and run:
```powershell theme={null}
Invoke-WebRequest -Uri "https://api.curator.interworks.com/scripts/curator_cpu_investigation.ps1" -OutFile "$env:TEMP\curator_cpu_investigation.ps1"
PowerShell -ExecutionPolicy Bypass -File "$env:TEMP\curator_cpu_investigation.ps1" -Days 14
```
The script finds the Curator installation on its own (any drive, any folder name), reads the Apache configuration to
learn where the access logs are and what format they use, and then works through each source. Progress prints to the
console as it goes.
When it finishes, two files are on the Desktop of the account that ran it:
| File | Contents |
| ---------------------------------------------- | -------------------------------------------------------------- |
| `curator_cpu_history__.md` | The report. Open it in any Markdown viewer or a text editor. |
| `curator_cpu_history__.csv` | One row per 5-minute bucket, for charting in Excel or Tableau. |
Use `-OutputDir` to write the files somewhere other than the Desktop.
## Step 2: Read the report
The report opens with a **Findings** block, ranked HIGH, MEDIUM, LOW and INFO. HIGH findings are known CPU sinks on
Windows Curator servers and are worth fixing whether or not they explain the spikes. The most common ones are:
* **OPcache is not enabled.** Without it, every request compiles Curator's PHP from source again. Apply the
[recommended OPcache settings](https://api.curator.interworks.com/assets/WindowsWorkingOpcacheSettings.txt) and
restart Apache.
* **Windows Defender is scanning the Curator folder.** Real-time scanning of every PHP file, cache file and database
page write shows up as `MsMpEng.exe` using the CPU and Apache looking slow. Exclude the Curator folder and the
`httpd.exe`, `php.exe` and `mariadbd.exe` processes.
* **Scheduled task runs are taking longer than a minute.** Curator's scheduled task runs `artisan schedule:run` every
minute and is meant to finish well inside that. Long runs mean a scheduled job (an export, a cache warm, a Tableau
sync) is doing heavy work in the foreground, and the report lists the longest runs so you can line them up with the
spikes.
* **Monitoring or bot traffic is a large share of requests.** A health check that hits a Curator page instead of a
static file runs the full application on every poll.
Below the findings, the **Busiest periods** section lists the buckets with the most dynamic (PHP) requests, ranked by
how far above the average they are. Each bucket shows the sites, top paths and top client addresses that made up the
traffic, plus every event, error and task run that happened within a few minutes of it. Compare the times you were
told about with this list:
* If the reported spike times line up with a traffic peak, the CPU is going to users. Look at the top paths and clients
in that bucket, and at the findings that make each request cheaper.
* If they do not line up with traffic, the CPU is going to background work. Look at the task runs, Defender scans,
Windows Update installs and errors listed next to the nearest buckets.
The **CPU history** section is empty on a first run unless the server already had Performance Monitor logs, because
Windows records no CPU history by default. The next step fixes that.
The report also lists any source the script could not read in full under **Collection problems**. An empty section for
one of those sources means "could not look", not "nothing happened". Re-run from an elevated PowerShell if the list
mentions access or permissions.
## Step 3: Capture the next spike
Register a lightweight Performance Monitor collector so the next spike is recorded with per-process CPU:
```powershell theme={null}
PowerShell -ExecutionPolicy Bypass -File "$env:TEMP\curator_cpu_investigation.ps1" -InstallPerfLog
```
The collector samples total CPU and the CPU of `httpd.exe`, `php.exe`, `mariadbd.exe`, `MsMpEng.exe` and a few other
processes every 15 seconds into a 512 MB circular file under `C:\PerfLogs\Curator`. A scheduled task restarts it after
a reboot. The overhead is negligible.
After the next spike, run Step 1 again. The report will now include a **CPU history** section with the highest CPU
buckets, the top process in each, and a correlation figure between traffic and CPU that says whether the spikes come
from users or from background work.
When the investigation is over, remove the collector:
```powershell theme={null}
PowerShell -ExecutionPolicy Bypass -File "$env:TEMP\curator_cpu_investigation.ps1" -RemovePerfLog
```
The recorded `.blg` files are left in place so they can still be analyzed.
## Step 4: Watch a spike live
If a spike is happening now, or is expected at a known time, sample the server live:
```powershell theme={null}
PowerShell -ExecutionPolicy Bypass -File "$env:TEMP\curator_cpu_investigation.ps1" -Watch -WatchMinutes 60 -CpuThreshold 80
```
The script samples CPU every 5 seconds and prints the top processes each time. Whenever total CPU crosses the
threshold, it records a snapshot: the top processes, the command lines of the `php.exe` processes (which shows which
`artisan` command is running), the number of open web connections, and the queries MariaDB is executing. Press
**Ctrl+C** to stop early. The report and a CSV of every sample are written to the Desktop either way.
## Parameters
| Parameter | Default | Purpose |
| ----------------- | -------- | ----------------------------------------------------------------------- |
| `-Days` | 7 | How many days back the historical analysis covers. |
| `-BucketMinutes` | 5 | Timeline resolution. Use 1 for a sharper look at a known spike window. |
| `-CuratorPath` | detected | Curator installation folder, if the script cannot find it. |
| `-AccessLog` | | Extra access log files or wildcards to include. |
| `-PerfLogPath` | | Extra Performance Monitor `.blg` or `.csv` files or folders to include. |
| `-OutputDir` | Desktop | Where to write the report and CSV. |
| `-Watch` | | Sample live instead of analyzing history. |
| `-WatchMinutes` | 30 | How long to watch. |
| `-CpuThreshold` | 80 | CPU percentage that triggers a snapshot while watching. |
| `-SampleSeconds` | 5 | Seconds between samples while watching. |
| `-InstallPerfLog` | | Register and start the Performance Monitor collector. |
| `-RemovePerfLog` | | Stop and delete the collector. |
## What the report contains
The report is internal material. It contains hostnames, file paths, client IP addresses and request paths from the
access logs, and messages from the error logs. A `-Watch` snapshot adds process command lines and the shape of the
running database queries. Before the script writes any of those, it strips query strings from URLs, replaces
credential-looking values, and replaces the literal values in SQL statements with placeholders.
The database credentials in each site's `.env` file are used only to run read-only status queries. The password is
never written to the report, the console or a command line.
## Send the report for analysis
Email the report and the CSV to the Curator support team, together with the files described in
[Performance Diagnostics](/site_administration/performance/performance_diagnostics), and say which spike times you were
told about. The support team will read the timeline against those times and recommend specific changes.
## Troubleshooting
* **"No Apache access logs were found."** The access log is declared by a `CustomLog` line in `curator.conf` or
`httpd.conf`. If logging was turned off, turn it back on and re-run after a day of traffic.
* **"Task Scheduler history is disabled on this server."** Open Task Scheduler and choose **Enable All Tasks History**
in the Actions pane, or run `wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true` from an elevated
prompt. The next run can then measure how long each `schedule:run` takes.
* **"The access log format has no request duration field."** Adding `%D` to the `LogFormat` line in `curator.conf`
lets the next run report how long each request took, which separates slow pages from busy ones. Restart Apache after
the change.
* **The CPU history section is empty.** Windows keeps no CPU history unless a collector is running. Follow Step 3 and
re-run after the next spike.
# Windows - Cron Troubleshooting
Source: https://docs.curator.interworks.com/server_management/system_administration/windows_cron_troubleshooting
Troubleshooting guide for resolving Windows cron job issues in Curator installations, including scheduled task path fixes and configuration problems.
Curator runs regularly scheduled tasks on Windows using Task Scheduler. This takes care of things like status checks,
scheduled reports, user-syncing along with a host of other very important items. Occasionally this setup can have
issues, so we've provided some steps for resolving common problems related to Windows scheduled tasks.
## Scheduled Task Troubleshooting
### Path Issues
The most common issue with Windows scheduled tasks for Curator is an incorrect path to the artisan file. To troubleshoot this:
1. Open Task Scheduler:
* Press `Windows Key + R`, type `taskschd.msc`, and press Enter
* Or search for "Task Scheduler" in the Start Menu
2. Find the Curator task:
* Look for tasks named "Curator Cron", "Curator Central Dispatch", or similar
* Double-click the task to open its properties
3. Check the action path:
* Click the "Actions" tab
* Click "Edit" to view the action details
* Note the full command in the "Program/script" and "Add arguments" fields
* Common format: `C:\InterWorks\Curator\libs\PHP\php.exe C:\InterWorks\Curator\htdocs\artisan schedule:run`
* **Note:** Your installation path may differ (e.g., `D:\Curator`, `E:\InterWorks\Curator`, etc.)
4. Test the command manually:
* Open Command Prompt as Administrator
* Copy the full command from the scheduled task (combining program and arguments)
* Run the command exactly as it appears in the task
* Observe the output:
* **Success**: Command runs without errors
* **"The system cannot find the path specified"**: Path to php.exe or artisan is incorrect
* **PHP errors**: Path is correct but there are application issues
* **No output**: May indicate the command is running but not producing visible output
5. Common path corrections:
* Verify your Curator installation directory (common locations: `C:\InterWorks\Curator`, `D:\Curator`, etc.)
* Ensure php.exe exists at: `[YourInstallDir]\libs\PHP\php.exe`
* Confirm artisan file exists at: `[YourInstallDir]\htdocs\artisan`
* Update the scheduled task with corrected paths if needed
* **Remember:** Replace `[YourInstallDir]` with your actual installation path
### Determine Correct Scheduled Task User
The scheduled task should run as the same user that your web server (IIS/Apache) is running as. Here's how to determine the correct user:
**Check Web Server User in Curator Backend:**
1.
2. Look for the "User" field in the System Information section
3. This shows which user account your web server is running as (e.g., IIS\_IUSRS, SYSTEM, apache, etc.)
4. Your scheduled task should be configured to run as this same user to avoid permission issues
**Verify Current Task User in Task Scheduler:**
1. In Task Scheduler, find the Curator task
2. View the user account using one of these methods:
* **Method 1:** In the main panel, look at the "Security options" column
* **Method 2:** Double-click the task, go to "General" tab
* Look for "When running the task, use the following user account:"
* Common accounts: SYSTEM, NT AUTHORITY\SYSTEM, or a service account
3. Additional task details:
* "Actions" tab shows the exact command being run
* "History" tab shows recent execution logs and any errors
* "Triggers" tab shows when the task runs (typically every minute)
**Using PowerShell:**
```powershell theme={null}
# List all Curator scheduled tasks with their run-as user
Get-ScheduledTask | Where-Object {$_.TaskName -like "*Curator*"} |
ForEach-Object {
[PSCustomObject]@{
TaskName = $_.TaskName
State = $_.State
RunAsUser = $_.Principal.UserId
Action = $_.Actions.Execute + " " + $_.Actions.Arguments
}
}
```
### Test Scheduled Task
To verify the scheduled task is working properly:
1. **Test command directly in Command Prompt:**
* Open Command Prompt as Administrator
* Navigate to your Curator directory (adjust path as needed): `cd C:\InterWorks\Curator`
* Run the exact command from your scheduled task
* **Important:** Replace the paths below with the actual paths from your Task Scheduler action:
```
C:\InterWorks\Curator\libs\PHP\php.exe C:\InterWorks\Curator\htdocs\artisan schedule:run
```
(Your paths may differ - use `D:\`, `E:\`, or different directory names as shown in Task Scheduler)
* Check the output:
* **Success**: Shows "Running scheduled command:" or similar output
* **Errors**: Note any error messages for troubleshooting
2. **Manual test via Task Scheduler:**
* Right-click the Curator task in Task Scheduler
* Select "Run"
* Check the "Last Run Result" column (should show "0x0" for success)
3. **Check via Curator API:**
* Follow instructions in the [Auto Generate API Links](/curator_api/getting_started/curator_api_overview) section
* Set dropdowns to **Portal** and **cron** respectively
* Click the preview link
* Should display a "success" message
4. **Verify in logs:**
* Check Curator logs at: `[InstallDir]\storage\logs\system-[date].log`
* Look for recent cron execution entries
### Common Issues and Solutions
1. **Task runs but nothing happens:**
* Check if the user account has permissions to the Curator directory
* Verify PHP can be executed by the task user
* Check Windows Event Viewer for errors
2. **Task shows error code:**
* `0x1`: General error - check the command syntax
* `0x2`: File not found - verify all paths
* `0x5`: Access denied - check permissions
3. **Task doesn't run on schedule:**
* Verify the trigger is set to run every minute
* Check if "Start the task only if the computer is on AC power" is unchecked
* Ensure "Run whether user is logged on or not" is selected
# Requirements
Source: https://docs.curator.interworks.com/setup/Server_Requirements/requirements
## General Requirements
Your Curator server must be its own standalone web server. Installing on the same web server as Tableau Server is
**not** supported.
Containerized deployments are also **not** currently supported.
Your Curator server will need to be able to communicate directly with your Tableau Server, and your
Tableau Server will need the REST and Metadata APIs enabled.
Curator Standard/Enterprise
If you are hosting, you will need a standalone web server on which to install the software. By
choosing to self-host, you are also accepting responsibility for:
* Ensuring a robust backup routine beyond Curator's built-in full backup functionality.
* Performing server upgrades and maintenance for security patches, etc.
* Applying and maintaining SSL/TLS certificates, DNS, and firewall protections.
This can be highly customized, but plan on following minimum specifications:
* Linux (preferred) or Windows
* At least 4 CPU, 8GB of RAM and 20GB of disk space available
* Ports open for web traffic (80 and 443)
* A disaster recovery plan
For AWS-hosted instances, we recommend:
| Linux (preferred) | Windows |
| :----------------------------------- | :----------------------------------- |
| t4g.large | t3a.xlarge |
| Ubuntu 24.04 LTS or newer | Windows 2019 or above |
| 20GB of gp3 SSD @ 3000 IOPS/125 MB/s | 20GB of gp3 SSD @ 3000 IOPS/125 MB/s |
## High Availability (Multiple Instances)
Curator Standard/Enterprise
Curator supports running multiple application instances behind a load balancer in a high availability (HA)
topology. In this setup, two or more application nodes share a single database and filesystem, allowing traffic
to be distributed across nodes for better uptime and increased concurrent user capacity.
Running multiple Curator instances on the **same single server** is **not** supported. Each Curator instance must
run on its own dedicated server (or virtual machine) that meets the standard server requirements listed above.
For full details on supported HA topologies, infrastructure components, and setup instructions, see the
[High Availability](/setup/high_availability/high_availability) guide.
# Active Directory
Source: https://docs.curator.interworks.com/setup/authentication/active_directory
A guide to setting up Active Directory authentication for Curator.
## Web Server Setup (Apache)
1. Find the **`curator.conf`** file (default location is `C:\InterWorks\Curator\curator.conf`).
2. Un-comment the lines (by deleting the `#` at the front of the line) starting at
`LoadModule authnz_sspi_module modules/mod_authnz_sspi.so` and ending at ``. See example below:
```conf theme={null}
# Uncomment the lines below for AD automatic login
LoadModule authnz_sspi_module modules/mod_authnz_sspi.so
AuthName "Curator"
AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
Require valid-user
Require user "ANONYMOUS LOGON"
```
3. After the configuration file has been edited and saved, restart the webserver.
## Curator Setup
After you have completed the Curator installation and the Web Server Setup steps above, you can enable Active
Directory/Kerberos on Curator.
1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
2. Navigate to the **Settings** > **Security** > **Authentication Settings** section from the left-hand menu.
3. Change the "Authentication Type" to **Active Directory / Kerberos**.
# Microsoft Entra ID (Azure AD)
Source: https://docs.curator.interworks.com/setup/authentication/azure_ad_saml
A guide to setting up Microsoft Entra ID (formerly Azure AD) SAML authentication for Curator.
Microsoft renamed **Azure Active Directory (Azure AD)** to **Microsoft Entra ID** in 2023.
These two names refer to the same service. This documentation applies to both.
## Switching from Another SAML Provider (e.g. Okta)
If you are moving an existing Curator instance from a different SAML identity provider (such as Okta or OneLogin) to
Microsoft Entra ID, you are replacing Curator's current SAML configuration in place. Curator supports **one active
authentication provider at a time**, so there is no way to run the old and new SAML IdPs side by side — the new
Entra configuration takes over from the old provider the moment you save.
Saving new authentication settings takes effect **immediately** for everyone. As soon as you save the Entra
configuration, all users are directed to Entra on their next login, and the previous provider is no longer used.
Plan the change for a maintenance window and validate it before announcing it to end users.
This is different from a portal-to-portal migration (moving to a new server and cutting over DNS), which is
covered in the [SAML Cutover Process](/upgrading_migration/migration/saml_cutover) guide. The steps below are for
swapping the SAML identity provider on the **same** running Curator instance.
**Recommended cutover steps:**
1. **Prepare the Entra app in advance** — Complete the [Azure App Creation](#azure-app-creation) and
[Azure to Curator Configuration](#azure-to-curator-configuration) steps below before your cutover window, and have the
Entra Federation Metadata XML ready to import so the live change is quick.
2. **Provision every user in Entra first** — Each Curator user must exist in Microsoft Entra with a username that
matches their Tableau Server username *exactly* (see the
[Provisioning Users](#provisioning-users-on-microsoft-entra-id-azure-ad) section below). Any user not provisioned in
Entra will be unable to log in after the switch.
3. **Update Curator's authentication settings during the window** — In the backend under **Settings** >
**Security** > **Authentication Settings**, import the Entra metadata (see
[Import Azure Metadata to your Curator Instance](#import-azure-metadata-to-your-curator-instance)) and save. This is
your cutover point — the previous provider is replaced immediately.
4. **Validate with a test user before announcing** — Log in as a test user through the Entra flow to confirm the
integration works end to end before telling end users the switch is complete.
5. **Decommission the old IdP app** — Once the migration is confirmed stable, remove the Curator enterprise
application from your previous identity provider.
## Provisioning Users on Microsoft Entra ID (Azure AD)
For provisioning users with Azure AD, you will need to have a user created in both Azure AD and Tableau Server - their
username's must match (the "Application username format" step in #4 below).
Once the user logs in, their username in Azure needs to match *exactly* the username of a user on Tableau Server.
## Curator Setup
If you have not installed Curator you can do this with the commands in the Installation documentation.
Also ensure you have connected to your Tableau Server instance following the [Tableau Server connections steps](/creating_integrations/tableau_connection/creating_a_connection).
## Tableau Setup
**Tableau Cloud**
Tableau has excellent documentation on connecting Azure AD to Tableau Cloud. [https://help.tableau.com/current/online/en-us/saml\_config\_azure\_ad.htm](https://help.tableau.com/current/online/en-us/saml_config_azure_ad.htm)
Make sure to follow the additional setup steps in the Tableau Cloud documentation.
**Tableau Server**
To ensure that after a user signs in to SAML via Curator they do not have to re-sign in to the embedded Tableau Server Dashboard:
On your Tableau Server run the command below:
```bash theme={null}
tsm configuration set -k wgserver.saml.iframed_idp.enabled -v true
```
Next, either run:
```bash theme={null}
tsm pending-changes apply
tsm restart
```
Or open TSM in your browser and click Pending Changes at the top of the page then click 'Apply Changes and Restart'.
## Azure App Creation
The app you create here will be in addition to the one you already setup for Tableau.
### Create your Azure App
1. Login to [https://portal.azure.com](https://portal.azure.com)
2. In the search bar search for "Azure Active Directory" and click the result that matches from the result list.
3. From the left-hand menu click "Enterprise Applications"
4. Click "Create a new application"
5. Click the "+ Create your own application"
6. Enter a name for your app and select the **non-gallery** option - We recommend the name `Curator`
7. Click "Create"
## Azure to Curator Configuration
### Import Curator Metadata to your Azure App
1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`)
2. Navigate to the **Settings** > **Security** > **Authentication Settings** section from the left-hand menu.
3. Change the "Authentication Type" to SAML
4. This will expose two buttons, click the "Download SAML Metadata" button, and save the file somewhere you can soon retrieve.
5. Return to the app you created in the steps above in the Azure portal, and from the left-hand navigation click
"Single sign-on".
6. At the top click "Upload metadata file" and upload the file you downloaded from Curator in step #4 here.
### Import Azure Metadata to your Curator Instance
1. Continuing from the steps above, while still on the same page find the section of the page titled
"SAML Signing Certificate" and click the "Download" link next to **Federation Metadata XML**
2. Save this file.
3. Click the "Import SAML Metadata" button and follow the steps to upload the file downloaded in step #7.
4. After the file is uploaded, ensure your Authentication Type is still set to SAML and re-save your settings.
#### Troubleshooting Attributes and Claims
In many cases you will need to adjust the "Attributes and Claims" section on your app by adding a new claim with the
name "username". If you see an error on logging in after setting up saying "User \[username] not found" the
\[username] is what Azure is sending to Curator. That must match exactly the username found on Tableau Server.
**Note**: If you have already created a Tableau app in Azure and your authentication is running successfully, then
simply ensure the Attributes and Claim and configuration of your Curator app matches exactly the setup you have for
your Tableau app.
**Troubleshooting Tableau Login**
If a Tableau login button appears where a Dashboard should be after configuring SAML, be sure to follow the steps to
enable iFrame embedding in the following document:
[https://help.tableau.com/current/online/en-us/saml\_config\_okta.htm#optional-enable-iframe-embedding](https://help.tableau.com/current/online/en-us/saml_config_okta.htm#optional-enable-iframe-embedding)
# Curator Users
Source: https://docs.curator.interworks.com/setup/authentication/curator_users
A guide to setting up local Curator users to authenticate with SAML.
If you would like to use SAML for authentication with your Curator users, but do not want to use a 3rd party tool
(e.g. Okta) you're in luck - you can utilize Curator as your Identity Provider (IdP)! However, there is one important
caveat: if you set up Curator as your IdP by following the instructions for Curator Users below, you will also need to
make Curator your IdP for any connected applications (e.g. Tableau Cloud).
, they will then be redirected back to whichever entry point they came in from (e.g. Tableau Cloud will redirect back to
Tableau's homepage and Curator will redirect back to Curator's homepage).
**If you set up Curator as your IdP for Tableau ALL users will see the Curator login when trying to access
Tableau directly**.
NOTE: This setup will *not* work with Tableau Server, and is not needed due to the availability of using Trusted Ticket
on Tableau Server.
## 1. Curator Setup
If you have not installed Curator yet, please refer to our installation documentation in the setup section on the
left-hand side menu.
Also ensure you have connected to your Tableau Cloud instance following the
[REST API Integration steps](/creating_integrations/tableau_connection/creating_a_connection).
## 2. Retrieve Tableau SAML Details
Next, navigate to your Tableau Cloud instance and find the Tableau Entity ID and the Assertion Consumer Service URL
(ACS) by setting your Authentication type to SAML.
[Tableau Cloud Documentation for reference](https://help.tableau.com/current/online/en-us/saml_config_okta.htm)
## 3. Curator IdP Setup
1. Navigate to the **Settings** > **Security** > **SAML IdP** section from the left-hand menu.
2. Fill out the required fields:
* For the **Curator Entity ID** enter the URL of your Curator website
* For the **Tableau Entity ID** paste in the value you retrieved from the previous step
* For the **Assertion Consumer Service URL (ACS)** paste in the values
3. Once the form is completed, click the "Auto-Generate Key/Cert" button and fill out the form, then click "Generate".
4. Save this page
5. After saved successfully, click the "Download Metadata" button at the top and save this file, it will default to
`curator_metadata.xml`.
## 4. Setup Tableau Cloud SAML
1. Return to Tableau Cloud
2. Click the **Settings** menu item on the left, then the **Authentication** tab at the top of the page.
3. Ensure "SAML" is selected under the "Enable an additional authentication method" section.
4. Find the "Import metadata file into Tableau Cloud" section, and upload the `curator_metadata.xml` file you download
in the previous step then click "Apply"
5. In the "Match attributes" below, ensure the "Identity Provider (IdP) Assertion Name" is set to "email", and select
"Full name" for "Display Name", and change the value to "full\_name" and click "Apply"
Last, you can click the "test connection" button in the *Import metadata file into Tableau Cloud* section to ensure your
SAML authentication has been set up correctly to direct users to Curator. You should see your Curator login screen
appear (if you are not already logged in).
You can now change individual users on the list-users screen in Tableau Cloud by changing the user's configuration to SAML.
## 6. Testing Your Curator Users Authentication
**NOTE**: You *must* complete Step #3 for this button to display.
1. Navigate to the **Settings** > **Tableau** > **Frontend Users** section from the left-hand menu.
2. Click the "Sync from Tableau" button
3. Once the sync has finished, open an incognito window in your web-browser
4. Visit your Tableau Cloud site and log in with a user that has been registered as a SAML user on Tableau Cloud.
5. You will be redirected to Curator to login, after which you will be redirected again to Tableau Cloud.
6. You have now set up Curator as your SAML IdP, nice work!
# Local Login Fallback
Source: https://docs.curator.interworks.com/setup/authentication/local_login_fallback
A guide to enabling an unlisted page where users sign in with their Curator credentials while the site uses SSO.
When Curator is configured for single sign-on, the standard login page at `/user/login` hands every visitor straight to
your identity provider (IdP). That is usually exactly what you want -- but it leaves no way in when the IdP is
unavailable, when its certificate has expired, or when an account exists in Curator but not in the IdP.
The **Local Login Fallback** setting adds a second, unlisted login page at `/user/local_login` that checks a user's
Curator username and password instead. Everything else on the site keeps using your configured authentication type, and
`/user/login` continues to redirect to the IdP exactly as before.
The setting is off by default. While it is off, `/user/local_login` returns a "page not found" response, so the page
does not exist until you turn it on.
## Enabling the Fallback
1. Go to **Settings** > **Security** > **Authentication**.
2. In the **Customization** section, toggle "ON" the *Local Login Fallback* switch.
3. Save these settings.
The switch is only shown when the site uses an authentication type that sends users elsewhere to sign in (SAML, OAuth,
Active Directory, Tableau Server or ThoughtSpot). It is hidden for **Curator Users** and **Pass-Through**, where the
standard login page already accepts Curator credentials and a fallback would add nothing.
## Using the Fallback
The page is deliberately unlisted -- nothing in the site's navigation, footer or login page links to it. Share the URL
with the people who need it:
```text theme={null}
https://your-curator-site.com/user/local_login
```
The form on that page looks and behaves like the standard login form, with one difference: it checks the username and
password stored on the user's **Curator** account, rather than passing the sign-in to your identity provider, Tableau
Server or ThoughtSpot. A failed attempt returns to `/user/local_login` so a mistyped password does not send the user
back to the IdP.
## Which Accounts Can Sign In
Only accounts that have a Curator password set can use this page. Users provisioned automatically at their first SSO
sign-in (just-in-time provisioning) normally have no Curator password, and cannot sign in here until one is set for
them under **Settings** > **Users** > **Frontend Users**.
The **Password** field on an individual frontend user's page appears whenever this setting is on, whatever
authentication type the site uses. While the setting is off, an SSO site hides that field, because no Curator password
is checked anywhere.
Passwords for this page are administrator-controlled. The fallback page deliberately offers no "forgot password" link,
and self-service password reset is unavailable while the site is configured for SSO -- a backend administrator sets and
changes these passwords under **Settings** > **Users** > **Frontend Users**. This keeps the page to its intended
audience: administrators, and the handful of people who need a way in when they are not in the identity provider.
Because of that, set a Curator password on at least one administrator account *before* you need the fallback. If the
only account with a password forgets it while the identity provider is down, there is no self-service way to recover
it.
This page authenticates against Curator, so any policy your identity provider enforces -- MFA, conditional access,
device or network restrictions, session limits -- does **not** apply to sign-ins made through it. Curator's own
[multifactor authentication](/setup/authentication/multifactor_authentication) setting still applies: if it is enabled,
users signing in through the fallback are challenged for a code as usual.
Treat the URL as sensitive, enable the setting only while you need it, and turn it back off afterwards.
## Auditing Its Use
Both successful and failed sign-ins through the fallback are written to the Curator log with the username and the
client IP address, so you can review use of the page under **Settings** > **Curator** > **Event Log**. Login throttling
is shared with the standard login page -- the fallback does not grant a separate set of attempts.
# Multifactor Authentication (MFA)
Source: https://docs.curator.interworks.com/setup/authentication/multifactor_authentication
A guide to setting up multifactor authentication (MFA) for Curator users.
If your Curator system is using a Curator-based authentication form, multifactor authentication is available utilizing
Google Authenticator (or another authenticator app of your choice -- see
[Customizing the Suggested Authenticator App](#customizing-the-suggested-authenticator-app) below).
After enabling multifactor authentication, users will be prompted to setup the Authenticator application using a QR
code. For more information on the frontend user interface, see our
[feature demo video](https://curator.interworks.com/page/curator-new-feature-spotlight-multi-factor-authentication).
## Curator Setup
1. To enabled MFA, go to **Settings** > **Security** > **Authentication**.
2. In "Customization", toggle "ON" the Multi-factor Authentication switch.
3. Save these settings
4. Now, all users will be prompted to setup and use multifactor authentication after their next login.
## Customizing the Suggested Authenticator App
The Curator-based MFA setup screen suggests a single authenticator app and provides per-platform download links.
The defaults are Google Authenticator, but any RFC 6238 TOTP authenticator app works with Curator's QR code -- if your
organization standardizes on a different app (for example, Microsoft Authenticator), you can change the suggestion in
**Settings** > **Security** > **Authentication** using the three fields shown when *Multi-factor Authentication* is
enabled:
* **MFA Authenticator App Name** -- The name shown in the download step (e.g. `Microsoft Authenticator`). Leave blank
to use the default (`Google Authenticator`).
* **MFA Authenticator App Store URL (iOS)** -- The link followed when a user clicks the bold app name on the iOS tab.
Must start with `https://`. Leave blank to use the default Google Authenticator App Store link.
* **MFA Authenticator App Store URL (Android)** -- The link followed when a user clicks the bold app name on the
Android tab. Must start with `https://`. Leave blank to use the default Google Authenticator Play Store link.
Each field is independent -- you can change only the name, only the URLs, or any combination, and Curator falls back
to the Google Authenticator default for any field left blank.
## Backend Administrator MFA
Backend administrator accounts (the users who sign in at `/backend`) do not have a dedicated MFA toggle of their own.
Instead, MFA is applied to backend administrators by routing their sign-in through the frontend authentication form:
1. In **Settings** > **Curator** > **Portal Settings**, on the **General** tab, enable
*Force Backend Users to Login Via Frontend Authentication Forms*.
2. Make sure every backend administrator has a frontend user with a matching username. Only backend usernames matching
frontend users will be able to access Curator's administrative interface. See the
[Backend Administrators](/site_administration/backend_administrators/overview) documentation for the full setup.
3. Enable MFA as described in [Curator Setup](#curator-setup) above.
With both settings enabled, a backend administrator visiting `/backend` is redirected to the frontend login form,
completes the standard frontend MFA challenge via their authenticator app, and is then re-routed back to the backend.
A backend session that exists without a verified MFA challenge will be redirected to `/user/mfa` before any backend
page is served.
If your Curator instance authenticates users through SAML, MFA is handled by your identity provider rather than by
Curator. Configure MFA policies (and any backend-administrator-specific MFA enforcement) at the IdP, and Curator will
honor whatever assertions the IdP returns.
## Emergency Access (Break-Glass)
Curator does not ship a dedicated break-glass authentication feature -- there is no separate emergency login flow that
bypasses MFA, SAML, or *Force Backend Users to Login Via Frontend Authentication Forms*. If the frontend authentication
path is unavailable (for example, the SAML identity provider is down, or the MFA secret for an administrator is lost),
recovery is a two-step process: disable *Force Backend Users to Login Via Frontend Authentication Forms* through one of
the supported channels below, then sign in directly at `/backend` with a backend administrator's username and password.
Curator exposes two supported ways to toggle that setting without a working admin session:
### Option 1: Artisan CLI command (On-Prem only)
On On-Prem deployments where you have SSH access to the Curator server, run the
`portal:forcefrontendloginforbackend` artisan command from the application root:
```bash theme={null}
php artisan portal:forcefrontendloginforbackend 0 --force
```
The first argument accepts `0` (disable) or `1` (enable); `--force` skips the confirmation prompt. After the command
reports success, the administrator can sign in directly at `/backend` with their backend-account credentials. Once
access is restored, re-enable forced frontend login by running the same command with `1`:
```bash theme={null}
php artisan portal:forcefrontendloginforbackend 1 --force
```
### Option 2: API endpoint
If you have a Curator API key with access to the `portal.setForceFrontendLoginForBackend` permission, send a `POST`
request to `/api/v1/portal/setForceFrontendLoginForBackend` with `force_frontend_login_for_backend=0`:
```bash theme={null}
curl -X POST "https://your-curator-domain/api/v1/portal/setForceFrontendLoginForBackend" \
-d "apikey=YOUR_API_KEY" \
-d "force_frontend_login_for_backend=0"
```
The response confirms the new value. After signing in at `/backend`, re-enable forced frontend login by sending the
same request with `force_frontend_login_for_backend=1`.
Audit `storage/logs/system-YYYY-MM-DD.log` for the sign-in event whenever break-glass access is used, and re-enable
*Force Backend Users to Login Via Frontend Authentication Forms* as soon as the underlying issue is resolved so that
backend administrators continue to authenticate through the frontend MFA/SAML flow.
## Troubleshooting
When a user reports that their authenticator codes are rejected, the cause is almost always one of three things: they
are reading a code from a stale entry in their app, their device clock has drifted, or the portal's own clock has
drifted. Work through the steps below in order.
### The user has more than one Curator entry in their authenticator app
This is the most common cause, and the easiest to miss. Curator labels the QR code with the user's username and the
portal name, and neither changes when an administrator clears a user's MFA. The secret behind the entry does change,
so **every reset adds another entry to the authenticator app with a name identical to the previous one**. Nothing in
the app distinguishes the live entry from the dead ones, and a user reading a code from an old entry sees it rejected
every time.
Have the user delete **every** Curator entry from their authenticator app before re-enrolling, not just the one they
believe is current. After they scan the new QR code there should be exactly one Curator entry left, and the code they
read from it is the only one that will be accepted.
### The user's device clock has drifted
TOTP codes are derived from the current time, so a device whose clock is wrong generates codes that are correct for the
wrong moment. Ask the user to set their phone's date and time to update automatically, then try again.
Some authenticator apps used to expose a setting that corrected their internal clock independently of the device
clock. Do not rely on finding one -- these options have been removed from several apps, including Google
Authenticator. Setting the device itself to automatic time is the step that matters, and it works regardless of which
authenticator app the user has.
### The portal's clock has drifted
Curator accepts a code from the current 30-second window and from one window on either side, so a code is valid for
roughly **30 seconds before and after** the moment it was generated. That tolerance is not configurable. It is
generous enough to absorb a user typing slowly, but not much more -- if the portal host's clock is off by more than
about half a minute, codes generated by perfectly accurate phones are rejected.
Suspect this when the symptoms do not fit a per-user problem:
* several users fail at once, rather than one;
* the failures survive repeated MFA resets, so the stored secret is clearly not the issue;
* and a user occasionally starts working again with nothing having been changed, which is what a clock sitting near
the edge of the tolerance window looks like as it drifts back and forth across the boundary.
On an On-Prem deployment, check that the Curator server's time is synchronized against a reliable time source and
correct it if it has drifted. On InterWorks-hosted deployments, raise this with InterWorks support and quote the
pattern above, since host time synchronization is managed for you.
### What to collect before escalating
If the steps above do not resolve it, gather the following before contacting support. Each one rules out a cause that
would otherwise have to be guessed at:
* confirmation that only **one** Curator entry remains in the user's authenticator app;
* the exact time and time zone shown on the user's device at the moment they submit a code that is rejected;
* whether the failure affects one user or several, and whether it has ever cleared on its own;
* the username affected and the approximate time of the most recent failed attempt, so the attempt can be matched
against `storage/logs/system-YYYY-MM-DD.log`.
An administrator clears a user's saved MFA at **Settings** > **Users** > **Frontend Users**, by opening the user and
clicking **Remove Saved MFA**. The button appears only while *Multi-factor Authentication* is enabled in
**Settings** > **Security** > **Authentication**, and requires the *Manage Frontend Users* permission. Clearing the
secret prompts the user to enroll again with a fresh QR code at their next sign-in.
# Okta
Source: https://docs.curator.interworks.com/setup/authentication/okta_saml
A guide to setting up Okta SAML authentication for Curator.
After you have installed Curator, you can being integrating your users seamlessly with your existing Okta instance.
This guide will walk you through the steps to set up Okta SAML authentication for Curator, allowing users to log in
through a single sign-on (SSO) experience.
## Tableau Setup
Before you can set up Okta SAML authentication for Curator, you need to ensure that your Tableau Server or Tableau Cloud
is configured to work with Okta. This involves setting up SAML authentication on Tableau, which is a prerequisite for
integrating with Okta.
You can either refer to the [Tableau Cloud guide to setting up Okta](https://onlinehelp.tableau.com/current/online/en-us/saml_config_okta.htm)
or the [Okta guide to configure SAML for Tableau Server](https://saml-doc.okta.com/SAML_Docs/How-to-Configure-SAML-2.0-for-Tableau-Server.html).
## Creating an Okta Application
In order to link Curator to your Okta instance, you must first create a new Application on Okta. If you already have an
Okta application set up for Tableau (Server or Cloud), you will **not** be able to re-use that application for Curator
and will need to create an application dedicated to Curator integration.
Refer to the Okta document on [creating a new SAML 2.0 integration](https://help.okta.com/en-us/content/topics/apps/apps_app_integration_wizard_saml.htm).
### Curator Details to use for your Curator Okta app
You will need to use some Curator-specific details when setting up the Okta application. Below are the details you would
use for a new Curator site installed at the url `https://mycuratorsite.com`:
* **Single sign-on URL**: `https://mycuratorsite.com`. This is the URL that users will be redirected to after logging
in. Use the URL to the homepage of Curator.
* **Audience URI (SP Entity ID)**: `curator-site.com` This is the identifier for the service provider (Curator) in the
SAML authentication process.
* **Application username format**: `Email` (typically). If your users do not use email to login to Okta applications,
then select the format that matches Tableau Okta app's usernames.
* **Application username format**: `user.email` (typically). If your users do not use email to login to Okta applications,
then select the user-attribute that matches the Tableau Okta app's usernames.
## Curator Setup
Once you've created the Okta application, you can proceed to configure Curator to use SAML authentication with Okta.
### Export Authentication Metadata from Okta
Follow the [Okta guide to downloading your SAML metadata](https://support.okta.com/help/s/article/Location-to-download-Okta-IDP-XML-metadata-for-a-SAML-app-in-the-new-Admin-User-Interface).
Ultimately, this will provide you with a `.xml` file that contains the necessary metadata for
integrating Okta with Curator.
### Add Okta metadata to Curator
#### Importing Okta Metadata
From the authentication list select "SAML". You can use the "Import SAML Metadata" button to import the XML file you generated
from Okta.
#### Manually Entering Okta Metadata
Alternatively, you can manually enter the information:
* **Entity ID**: Enter the "Audience URI (SP Entity ID)" you filled in before.
* **SignOn URL**: Enter the "Identity Provider Single Sign-On URL" URL found in the setup section.
* **IdP ID**: Enter the "Identity Provider Issuer" from the setup section.
* **SignOut URL**: Enter the URL of the application `/login/signout` (i.e.
[https://mydomain.okta.com/login/signout](https://mydomain.okta.com/login/signout))
* **Certificate**: Open the "SAML Advanced" section, copy the certificate text from Okta, and paste it in the field.
## Enabling iFrames for Tableau's Okta App
You may encounter issues with seamlessly embedding Tableau content in Curator if the Okta application is not set up to
allow iFrame embedding - if you see an image like the one below when trying to access Tableau content in Curator,
then you will need to refer to Tableau's guide on [enabling iFrame embedding for Okta](https://help.tableau.com/current/online/en-us/saml_config_okta.htm#about-enabling-iframe-embedding)
to complete your Okta integration.
### Additional Customization Options
#### Auto-launch
You may want to select a few options to make the login process more streamlined. First, set the Curator application to
"Auto-launch" in the "edit application" section on Okta.
#### Hide Tableau Cloud Icon
You may also wish to hide the Tableau Cloud icon from users. You can do this in the edit application area for the
Tableau Cloud app. Under "App Settings", select "Do not display application icon to users".
#### Sign-out Page
When users sign out of Curator, they will be redirected to the Okta sign-out page by default. This may be preferred, but
if you'd like to redirect users back to the homepage of Curator, refer to Okta's guide on
[customizing the sign-out page](https://help.okta.com/en-us/content/topics/settings/settings-configure-sign-out.htm).
# OneLogin (OIDC)
Source: https://docs.curator.interworks.com/setup/authentication/one_login_oidc
A guide to setting up OneLogin as an OpenID Connect (OIDC) provider for Curator.
## OneLogin Setup
1. Go to the Applications page in the Administration area of OneLogin and click "Add App."
2. Enter "oidc" in the search bar and select "OpenId Connect (OIDC)." The vendor should be "OneLogin, Inc."
3. Give the Application a display name like "InterWorks Curator," upload icons if you'd like, and click "Save."
4. In the Application's settings page, navigate to "Configuration" and enter the following for the URL and URI's:
* **Login URL**: Base Curator URL (i.e. `https://www.curatorexample.com`).
* **Redirect URI's**: Base Curator URL with `/user/oauth` appended (i.e.
`https://www.curatorexample.com/user/oauth`). No other URI's should be entered.
* **Post Logout Redirect URI's**: Base Curator URL (i.e. `https://www.curatorexample.com`). No other URI's should be entered.
5. In the Application's settings page, navigate to "SSO" and set the following:
* **Application Type**: Set this to "Web."
* **Token Endpoint - Authentication Method**: Set this to "POST."
6. Save the settings and stay on the "SSO" page. We'll need this info for the Curator-side of the setup.
## Curator Setup
1. Go to the Authentication Settings under Settings > Security in the Curator backend.
2. Choose "OAuth / OpenID Connect" for the Authentication Type.
3. Expand the "Customization" section and enter the following:
* **OAuth Domain**: Enter the "Issuer URL" from the "SSO" area of the Application's settings in OneLogin. This
usually ends in `/oidc/2`.
* **OAuth Client ID**: Enter the "Client ID" from OneLogin.
* **OAuth Client Secret** Enter the "Client Secret" from OneLogin. You may have to click "Show client secret" in
OneLogin to see it.
4. Save the settings.
## Users
As users log in via OAuth, user records will automatically be provisioned in Curator. If Curator is connected to an
analytic platform it will sync over details like display name or email at the same time during login. No SCIM necessary!
# OneLogin
Source: https://docs.curator.interworks.com/setup/authentication/one_login_saml
A guide to setting up OneLogin SAML authentication for Curator.
## Server Setup
If the server is not already setup for web traffic, install Apache, MySQL, PHP, and dependencies. You can do this with
the commands in the setup documentation.
## Tableau Cloud Setup
Tableau has excellent documentation on connecting OneLogin to Tableau Cloud.
[https://onlinehelp.tableau.com/current/online/en-us/saml\_config\_onelogin.htm](https://onlinehelp.tableau.com/current/online/en-us/saml_config_onelogin.htm)
Make sure to follow the additional setup steps in the Tableau Cloud documentation.
If a Tableau login button appears where a Dashboard should be after configuring SAML, be sure to follow the steps to
enable iFrame embedding in the following document:
[https://help.tableau.com/current/online/en-us/saml\_config\_okta.htm#optional-enable-iframe-embedding](https://help.tableau.com/current/online/en-us/saml_config_okta.htm#optional-enable-iframe-embedding)
## OneLogin App Setup
In the OneLogin system, ensure you have turned OFF framing protection by going to "Settings->Account Settings". At the
bottom of the page, ensure that "Framing Protection" is disabled by "checking" the box next to it. (Make sure to hit
"Save" after checking the box! They hide it at the top of the page.)
Then, setup a new App of type "Tableau Cloud SSO". (In addition to the one you already setup for Tableau Cloud)
Name this one after your Curator portal.
For the "Consumer URL", paste in the url to the homepage of Curator. For "Audience", put in the Curator URL without the
trailing /, or http/https.
Go to the "SSO" tab for the settings needed for the Curator Setup.
## Curator Setup
In the /backend settings, go to the Settings->Tableau Server Settings->Authentication area. Select "SAML". For the
Entity ID and IdP ID, put in the "Audience" that you added to OneLogin.
For the SignOn URL, put the "SAML 2.0 Endpoint (HTTP)" URL found in the SSO tab of the App in OneLogin.
For the SignOut URL, put the "SLO Endpoint (HTTP)" URL found in the SSO tab of the App in OneLogin.
Hover over "More Actions" in the OneLogin system. Export the SAML Metadata. Open this file with a text editor and
copy/paste the certificate from the file into the Certificate area of Tableau Server.
# Overview
Source: https://docs.curator.interworks.com/setup/authentication/overview
An overview of the authentication methods available in Curator.
When integrating your analytics Curator relies on those source-systems
to authorize users to see and interact with content that is embedded in Curator. However, in order to utilize those
systems that your content relies on Curator must be set up to authenticate users to the frontend of the site. Curator
can use a variety of methods to authenticate users to the frontend - each method may require additional
setup, so be sure to check out the relevant section for your established security - or reach out to our support team
using the link at the top of the page if you have questions about choosing the right method for your organization.
## Default Authentication
By default, Curator is set up to "Pass Through" authentication to your embedded content, and has no Authentication or
Authorization system in place.
When users encounter embedded content, they will be prompted to log in with their own credentials, and there will be no
menu permissions - so everyone will be able to see everything, but the source-system in question will still restrict
access to content based on the user's permissions in that system.
## Authentication Type Options
If you plan to integrate any analytic-content it's wise to get that
connection set up first. Review the steps for [creating your integration](/creating_integrations/overview) in our
documentation, and then come back here to set up your authentication.
* [SAML](/setup/authentication/okta_saml)
This allows user accounts to authenticate using your SAML Identity Provider (IdP),
such as Okta, Microsoft Entra ID (Azure AD), OneLogin, etc.
* **Tableau Server (needs documented)**
This allows user accounts to authenticate directly with a Tableau Server using their local Tableau Server username and password.
* [Curator Users](/setup/authentication/curator_users)
This allows users to be created and stored locally on the site. For Tableau Cloud customers you can use Curator as your
SAML Host (IdP), in which case you would set up your Tableau Cloud site to use Curator as the SAML authenticator.
* [Pass-Through (Security Disabled)](/setup/authentication/pass_through_authentication)
This turns off authentication to the frontend and makes all links and pages public. The user is still
required to authenticate directly to the Tableau Server for any underlying views in a Dashboard which
requires a login.
* [Active Directory](/setup/authentication/active_directory)
Users authenticate seamlessly with Microsoft Active Directory - not to be confused with [Microsoft Entra ID (Azure AD)](/setup/authentication/azure_ad_saml)
which is a cloud-based service.
* **OAuth/OpenID (needs documented)**
This allows user accounts to authenticate using your OAuth provider.
# Pass-Through Authentication
Source: https://docs.curator.interworks.com/setup/authentication/pass_through_authentication
An overview of the Pass-Through Authentication method in Curator.
"Pass-Through" authentication is the default security setting in Curator. This does not mean it's recommended though -
in fact typically it's *not* recommended as it's the lowest security setting available. However, it allows you to
quickly get started with Curator and your analytics content, and is a good way to test out the platform before
committing to a more secure or complex authentication method, or it can be useful if you would like to use Curator
in a public-facing manner where you will have almost entirely anonymous users who may or may not have access to
analytics content.
## Changing Authentication Settings to Pass-Through
Select the **Pass-Through (Security Disabled)** option and be sure to save your changes.
# SAML Troubleshooting & Maintenance
Source: https://docs.curator.interworks.com/setup/authentication/saml_troubleshooting
Diagnose broken SAML logins, rotate an expired IdP certificate, enable SAML debug logging, and recover access when SAML locks users out.
This guide is for administrators who already have SAML configured and need to **maintain or repair** it — for
example when logins suddenly stop working or the Identity Provider (IdP) certificate expires. If you are setting
SAML up for the first time, start with the provider-specific guides instead:
[Okta](/setup/authentication/okta_saml), [OneLogin](/setup/authentication/one_login_saml), or
[Microsoft Entra ID (Azure AD)](/setup/authentication/azure_ad_saml). If you are **replacing** an existing IdP with a
new one — for example moving from Okta to Microsoft Entra ID — follow [Switching from Another SAML
Provider](/setup/authentication/azure_ad_saml#switching-from-another-saml-provider-eg-okta) instead. That is a bigger
change than a certificate rotation, because every user must exist in the new IdP before the cutover, and it has its
own checklist.
## Where SAML settings live
All SAML configuration lives on a single backend page:
Select **SAML** as the **Authentication Type** to reveal the SAML fields. They are grouped into four sections:
* **General** — the **Authentication Type** selector plus the **Download SAML Metadata** and **Import SAML
Metadata** buttons.
* **SAML General** — the core IdP fields: **Entity ID**, **IdP Entity ID**, **SignOn URL (SSO)**, and **Logout
URL (SLO)**.
* **SAML Attributes** — custom attributes to retrieve and store as part of each user's profile. Not relevant to the
troubleshooting scenarios below.
* **SAML Advanced** — everything else, including the **Certificate** field, **Debug Mode**, strict-mode and
signing toggles, and the Service Provider certificate/key. This section is collapsed by default; click its
header to expand it.
The Curator **backend** login (at `/backend`) is a separate account system from the frontend SAML login. A
broken SAML configuration only locks users out of the **frontend** portal — you can still sign in to the
backend with your Curator backend credentials to reach the settings above and fix the problem.
## Common failure symptoms
| Symptom | What it usually means |
| ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Blank gray page / blank box on every page** | The frontend cannot complete authentication. This commonly indicates an expired or mismatched IdP signing certificate, or a SignOn URL that no longer matches the IdP. Enable [Debug Mode](#enabling-debug-mode) to see the underlying SAML error in the system log. |
| **Redirect loop** (the page bounces between Curator and the IdP) | The IdP returns a response Curator rejects — frequently a certificate mismatch, a clock skew between servers, or an **Entity ID** that no longer matches what the IdP is configured to send. |
| **"User not found" or access denied after a successful IdP login** | The IdP authenticated the user, but the username Curator received does not match a Curator/Tableau user. Check the **Strip Domain Prefix** setting and the **Custom User Identifier Field**, and confirm the user exists on the connected platform. |
| **Login worked yesterday, fails today with no config change** | Most often an **expired IdP certificate**. Follow [Updating the IdP certificate](#updating-an-expired-or-changed-idp-certificate). |
| **Login worked with the old IdP, but breaks right after switching to a new one** (e.g. Okta to Entra) | You replaced the provider rather than updating it in place, so every user must be provisioned again in the new IdP. Most failures trace back to a user missing from the new IdP, or a username claim that does not match the Tableau Server username exactly. See [Switching from Another SAML Provider](/setup/authentication/azure_ad_saml#switching-from-another-saml-provider-eg-okta). |
## Diagnosing a single user after an IdP switch
The guidance above is written for a cutover you have not made yet. Once the cutover is done, you are usually
dealing with a different situation: most users are fine, but one user's dashboard tabs and buttons are missing or
their content is denied.
The usual cause is that the username the new IdP sends for that user no longer matches their existing platform
user. Curator links a Frontend User to a Tableau user by username, so when the format of that username changes,
the Frontend User is left with no platform user behind it. The login itself still succeeds, which is why the
failure looks like missing content rather than a login error.
### Step 1: Find the exact username the IdP sent
Curator resolves the username from the **Custom User Identifier Field** when one is configured, then from a
`username` or `Username` attribute, and finally from the SAML NameID. It then strips the domain prefix if **Strip
Domain Prefix** is enabled and converts the result to lowercase. That final value is the one that must match the
platform user, so guessing at the claim your IdP is configured to send is not enough — read the value Curator
actually resolved.
1. Set **Debug Mode** to **Response User Information** using [Enabling Debug Mode](#enabling-debug-mode).
2. Have the affected user log in again.
3. Read the captured entry:
The entry records the attributes the IdP sent alongside the resolved `username`.
4. Set **Debug Mode** back to **Disabled**.
### Step 2: Check whether the platform user link resolved
Open the affected user, then click the tab for your platform — **Tableau Users** for a Tableau connection. The
table lists **Tableau User ID**, **Username**, **Full Name**, **Site Role**, **Site**, **Server**, and **Last
Synced**.
* A working link shows a real ID in the **Tableau User ID** column, the expected **Site** and **Site Role**, and a
recent **Last Synced** timestamp.
* A broken link shows `User not on Site ''` in the **Tableau User ID** column, meaning Curator found no
matching user for that username on that site. An empty tab reading **No Tableau users found.** means no platform
user is associated with the Frontend User at all.
If a **Sync from Tableau** button is available on the tab, click it before drawing a conclusion — that re-queries
the server and rules out a merely stale row.
### Step 3: Reconcile the username formats
Compare the username from Step 1 with the username the user has on the platform. If the two differ only in
**format** — for example the old IdP sent `domain\first.last` and the new one sends `first.last@example.com` —
configure [Username Mapping](/users_groups/user_management/username_mapping) to translate between them. Do this
instead of renaming platform users by hand, so the fix applies to every affected user at once and survives future
logins.
Username Mapping can only change the format of a username, not the username itself. If the new IdP sends a
genuinely different identifier (for example `flast@example.com` where the platform user is
`first.last@example.com`), mapping cannot reconcile it. Either have your IdP administrators send the original
value in the username claim, or point the **Custom User Identifier Field** at an attribute that still carries it.
## Updating an expired or changed IdP certificate
When your IdP rotates or renews its signing certificate, the certificate stored in Curator no longer matches and
logins break. There are two ways to update it.
### Option 1: Re-import the IdP metadata (recommended)
1. Download a fresh **Federation Metadata XML** file from your IdP. Each provider exposes this differently — see
the [Okta](/setup/authentication/okta_saml), [OneLogin](/setup/authentication/one_login_saml), or
[Azure AD](/setup/authentication/azure_ad_saml) guides for the exact location.
2.
3. With **SAML** selected as the Authentication Type, click **Import SAML Metadata** in the **General** section
and upload the XML file.
4. Curator re-reads the metadata and updates the **IdP Entity ID**, **SignOn URL (SSO)**, **Logout URL (SLO)**,
and the **Certificate** field automatically.
5. Save the page and test a login.
Re-importing metadata only updates the fields present in the XML; it does not clear your other SAML settings. If
the file does not contain a value for a field, that field is left unchanged.
### Option 2: Paste the certificate manually
If you only have the new certificate (not a full metadata file):
1.
2. Replace the contents of the **Certificate** field with the new IdP signing certificate.
3. Save the page and test a login.
The **Certificate** field holds the **IdP's** signing certificate. It is distinct from the **Service Provider
Certificate** and **Service Provider Private Key** fields lower in the SAML Advanced section, which Curator uses
to sign its *own* requests. See [Signing Login Requests](/setup/authentication/signing_saml_login_requests) for
those.
## Enabling Debug Mode
Curator has a built-in **Debug Mode** that writes detailed SAML output to the system log so you can see exactly
what the IdP is sending.
1.
2. Set **Debug Mode** to one of:
* **SAML Response** — logs the raw SAML response and prints the parsed attributes to the browser, halting the
login. Use this for a one-off inspection, not on a live production login flow.
* **Response Attributes** — logs the attributes Curator parsed from the response.
* **Response User Information** — logs the resolved username alongside the attributes and API calls.
3. Save the page and reproduce the failed login.
4. Read the captured output in the system log under `storage/logs/` (files are named
`system-YYYY-MM-DD.log`).
5. **Set Debug Mode back to Disabled when you are finished** — it logs sensitive authentication data and, in the
**SAML Response** mode, interrupts the login flow.
## Emergency recovery: regaining access when SAML is broken
If a SAML misconfiguration is preventing **all** frontend users from logging in, you can temporarily restore
frontend access while you diagnose the problem. Because the backend login is independent of SAML, you always
retain access to the settings needed to do this.
1. Sign in to the Curator backend at `/backend` with your backend credentials.
2.
3. Change the **Authentication Type** from **SAML** to **Curator Users** and save. Curator now authenticates
frontend users against locally stored accounts instead of your IdP.
4. Create or use a local frontend user so you and your team can access the portal while SAML is down. See
[Curator Users](/setup/authentication/curator_users) for managing local accounts.
5. Diagnose and fix the SAML problem — typically by [updating the IdP
certificate](#updating-an-expired-or-changed-idp-certificate) and using [Debug
Mode](#enabling-debug-mode) to confirm the response now validates.
6. Once SAML works again, switch the **Authentication Type** back to **SAML** and save.
Leave the integration on **Curator Users** only for as long as the recovery takes. While it is active, your IdP
is not enforcing authentication for the Curator frontend.
# Signing Login Requests
Source: https://docs.curator.interworks.com/setup/authentication/signing_saml_login_requests
Optional steps to configure Curator to sign SAML login requests.
This is an optional step in addition to configuring Curator for SAML authentication. See these links for help
configuring SAML within Curator first:
* [Okta](/setup/authentication/okta_saml)
* [OneLogin](/setup/authentication/one_login_saml)
* [AzureAD](/setup/authentication/azure_ad_saml)
## Configuring Curator to Sign SAML Requests
If your SAML Identity Provider (IdP) requires SAML requests to be signed, you'll need a certificate and private key in
Curator's authentication settings. Curator can automatically generate these for you, or you can provide your own.
### Automatic Certificate Generation (Recommended)
Curator will automatically generate a self-signed certificate and private key when you import your IdP's SAML metadata
for the first time. This certificate is valid for 1 year and uses 4096-bit RSA encryption.
**Steps:**
1.
2. In the **General** section at the top, click **Import SAML Metadata** and upload your IdP's metadata XML file.
3. Curator will automatically generate and populate the **Service Provider Certificate** and **Service Provider Private
Key** fields in the **SAML Advanced** section.
4. Expand the **SAML Advanced** section and toggle on the **Sign Log In Requests** and **Sign Logout Requests** options.
5. Save the changes.
6. You will likely need to send the certificate file to your SAML IdP administrator.
### Manual Certificate Generation (Optional)
If you prefer to generate certificates manually or need to regenerate them (e.g., for periodic security rotation), you
have two options:
#### Option 1: Use Curator's Regenerate Button
1.
2. Expand the **SAML Advanced** section.
3. Click the **Regenerate Certificate** button.
4. The **Service Provider Certificate** and **Service Provider Private Key** fields will be automatically populated.
#### Option 2: Generate Your Own Certificate
1. Generate a certificate and private key using an external tool (e.g., [SAMLTool.com](https://www.samltool.com/self_signed_certs.php)
or OpenSSL).
2. Navigate to Curator's **Backend** > **Settings** > **Security** > **Authentication Settings** and expand the
**SAML Advanced** section.
3. Copy the certificate contents and paste them into the **Service Provider Certificate** field.
4. Copy the private key contents and paste them into the **Service Provider Private Key** field.
5. Save the changes.
### Final Steps
After setting up your certificate (automatically or manually):
1. Toggle on the **Sign Log In Requests** and **Sign Logout Requests** options in the **SAML Advanced** section.
2. Save the changes.
3. Send the certificate file to your SAML IdP administrator.
4. If the **Certificate** field (the field above the **Service Provider Certificate**) is blank, you'll need to get an
updated metadata file from your IdP administrator and import it using the button in the **General** section at the top
of the page.
# Windows LDAP
Source: https://docs.curator.interworks.com/setup/authentication/windows_ldap_iis
A guide to setting up Windows LDAP authentication for Curator using IIS.
Curator no longer supports IIS on new installations.
For current information on how to set up Active Directory on Windows, please see our
[Active Directory](/setup/authentication/active_directory) documentation.
*The information below is only for reference on legacy/existing installations. It is *highly* recommended that you
reinstall with Apache for stability, please see our
[Windows Apache Installation](/setup/installation/windows_installation)
documentation for steps on how to achieve the best Curator experience for Windows.*
Using IIS, you can use the user's AD credentials automatically.
Enable Windows Authentication in "Add/Remove Windows Features". (Sometimes this is known as Add Roles and Features)
Server Roles > Web Server (IIS) > Web Server > Security > Window Authentication.
*Note: This may be found in the Server Manager, not IIS*
Once this is added, go to your site in IIS, click "Authentication". Change "Windows Authentication" to "Enabled" and
"Anonymous Authentication" to "Disabled".
Go to the site in the IIS Manager and open the Configuration Editor
Choose "system.webServer/serverRuntime" for the Section selection. Select UseWorkerProcessUser. Click Apply.
In Curator's Tableau Server Settings, select "Active Directory" as the Authentication Type.
If you have issues, make sure to disable UAC, to allow access to the filesystem. You can find this setting under
Control Panel > System and Security > User Account Control Settings.
# Linux Central Dispatch
Source: https://docs.curator.interworks.com/setup/central_dispatch/linux_central_dispatch
Set up distributed processing capabilities with Central Dispatch on Linux systems
1. Install Curator using [Linux installer](/setup/installation/linux_installation)
like usual.
2. You *can* make a new directory called `centraldispatch` at `/var/www` and move the contents of the webroot
(`/var/www/html`) there or you can leave it as is. The newly deployed instances will be located at
`/var/www/instance-name` while the main Central Dispatch site remains at `/var/www/html` or `/var/www/centraldispatch`.
The rest of the guide will assume `/var/www/html` so change all of the commands to the correct path if you chose
`/var/www/centraldispatch`.
3. Set up SSL for this initial instance. This
[blog by the great and powerful Orr](https://interworks.com/blog/morr/2019/10/24/portals-for-tableau-101-setting-up-ssltls-certificates-for-https/)
will get you most of the way there. NOTE: Ubuntu systems are slightly different.
4. There should already be a default conf file that has an **IncludeOptional** line that points to a directory where
additional vhost conf files can go. Make sure you know where the newly added vhost conf files should go:
* Ubuntu:
* Default conf: `etc/apache2/apache2.conf`
* Includes vhost conf files: `etc/apache2/sites-enabled/*.conf`
* Ubuntu is a little different and actually stages the conf files here before being enabled: `/etc/apache2/sites-available/*.conf`
* Everything else:
* Default conf: `/etc/httpd/conf/httpd.conf`
* Includes vhost conf files: `/etc/httpd/conf.d/*.conf`
5. Create database user using the `worker_database_user.sql` example script at
`/var/www/html/plugins/interworks/centraldispatch/workers` directory. Tweak the password if you'd like before executing.
* Run the sql file:
```bash theme={null}
mysql -u root -p curator < worker_database_user.sql
```
* Enter root password
* Test if the new user is there: **mysql -u worker -p**
* Enter worker password
6. Create directory `/var/www/archives`
7. Set up worker script
1. Copy php\_worker.example.php script to php\_worker.php in the `/var/www/html/plugins/interworks/centraldispatch/workers`
directory:
```bash theme={null}
sudo cp php_worker.example.php php_worker.php
```
2. Copy `vhost.template.example.conf` to `vhost.template.conf` in the same directory.
```bash theme={null}
sudo cp vhost.template.example.conf vhost.template.conf
```
3. Make sure apache user owns everything:
```bash theme={null}
sudo chown -R $APACHEUSER:$APACHEUSER /var/www
```
4. Tweak paths as needed in `php_worker.php`
1. DB\_ENV\_DISPATCHER uses details from step 5 above.
2. DB\_ENV\_INSTANCE uses the root database details to be able to provision users as needed. Can set up dispatcher
user with these permissions if you don’t want to use the root account.
3. Modify vhost section:
1. Uncomment `directory` and modify as needed to where the vhost conf files should go from step 4.
2. Uncomment `template` for `/var/www/html/plugins/interworks/centraldispatch/workers/vhost.template.conf`.
4. Modify worker section:
1. Uncomment `source_directory` for `/var/www/html`.
2. Uncomment `archive_directory` for `/var/www/archives`.
5. Modify \$DEFAULT\_BACKEND\_EMAIL as needed.
6. Modify \$LINUX\_APACHE\_RESTART to the relevant apache restart command for your distro.
7. Modify \$LINUX\_APACHE\_USER to the relevant apache user for your distro.
5. Tweak vhost template as needed in workers directory
1. Comment out the #apache 2.2 lines (lines 22-23) and uncomment out the #apache 2.4 lines unless using Apache 2.2.
2. Update SSLCertificateChainFile, SSLCertificateFile, and SSLCertificateKeyFile as needed.
6. Schedule root to run worker with the following command. Feel free to change the frequency (this one is every 15
minutes). Also, make sure to change `$APACHEUSER` to the relevant apache user in the chown command (this makes
sure the application owns all the files even though root is making everything).
```bash theme={null}
(sudo crontab -l ; echo "*****/15 * * * * sudo php
/var/www/html/plugins/interworks/centraldispatch/workers/php_worker.php >> /dev/null 2>&1 && sudo chown -R $APACHEUSER:$APACHEUSER /var/www****") | sudo crontab -
```
8. Restart apache
9. In the Central Dispatch Curator portal’s backend, register the workers with the dispatcher at **Backend** >
**Settings** > **Central Dispatch** > **Central Dispatch Settings**. Probably with these settings:
1. Host URL: localhost
2. Worker name: localhost (or use something more descriptive)
3. Install Path: `/var/www`
10. Attempt to deploy a new managed instance at Backend > Central Dispatch > Managed Instances.
## Configuring Managed Instances After Deployment
Each managed instance is a full, standalone Curator install with its own web root, its own database, and
its own settings. Integrations such as Tableau are configured **on the instance itself**, not on the Central
Dispatch controller. To configure an instance, browse to that instance's own backend URL — for example
`https://instance-name.example.com/backend` — and set up its Tableau connection there.
Managed instances do not share settings. Because every instance has its own isolated database, the Tableau
connection credentials you configure on one instance have no effect on any other instance. Always confirm
the URL in your browser's address bar before saving so you know which instance you are editing.
When deploying several instances in quick succession, follow this workflow to avoid configuring the wrong
instance:
1. Wait for the worker to finish provisioning before configuring an instance. In the Managed Instances list,
an instance that is still provisioning shows a pending **Status** such as `pending deployment`; once the
worker completes, the **Status** column reflects the live instance instead. The worker runs on the
schedule you set in step 7 (every 15 minutes in the example cron), so a newly requested instance may not
be ready immediately.
2. Open each instance's backend URL in its own browser tab, and check the address bar before saving, so you
can be certain which instance you are configuring.
3. After saving an instance's Tableau settings, return to Backend > Central Dispatch > Managed Instances. The
list includes a **Tableau Server** column that reports the Tableau server URL each instance is connected
to, letting you confirm from the controller that every instance has the settings you expect.
## Manual Back Out of Deployment
In case of a failure during a deployment, Central Dispatch is not yet able to automatically back out the deployment to
try again. You can determine the nature of the failure by visiting the Managed Instance record in the backend of the
Central Dispatch portal and scrolling to the bottom of the page. There will be an error field that will show any issues
the worker had during the deployment.
To back out a deployment, it's important to determine which step it failed at so you'll know which of the following
steps you'll need to take to back it out. They are in reverse order of the deployment, so you can skip steps if the
deployment didn't make it that far. When in doubt, just perform all of the steps.
1. Remove cron job with the name of this managed instance by using `sudo -u crontab -e` to edit.
*Note: This will use VI as the default editor in case you need to look up how to edit the file.*
2. If using Ubuntu, disable the vhost entry by running `sudo a2dissite `
3. Remove the vhost record specific to this managed instance in the vhosts directory (see step 4 above to determine
location). The command will be similar to `sudo rm /etc/apache2/sites-available/`
4. Remove site-specific SSL/TLS certificate, key, and (optional) chain certificate, if the managed instance supplied
them. These should be in the /etc/apache2/certs/ directory. The commands will be similar to these two commands below:
```bash theme={null}
sudo rm /etc/apache2/certs/
```
```bash theme={null}
sudo rm /etc/apache2/certs/
```
5. Remove the portal code for the managed instance in the /var/www/ directory. The command will be similar to
`sudo rm -Rf /var/www/`
6. Drop the database specific to the managed instance by using `mysql -u root -p` and the root database credentials
(see `/var/www/info.txt`). The SQL statement to drop the database would be: `DROP DATABASE '';`
7. Delete the database user specific to the managed instance by using `mysql -u root -p` and the root database
credentials (see `/var/www/info.txt`). The SQL statement to drop the database would be:
```SQL theme={null}
DROP USER IF EXISTS ''@'localhost';
```
# Windows Central Dispatch
Source: https://docs.curator.interworks.com/setup/central_dispatch/windows_central_dispatch
Configure distributed processing with Central Dispatch on Windows systems
Each section below has steps you can follow, all steps must be followed to set up Central Dispatch accordingly.
## 1. Curator install and folder Creation
1. Install Curator using Apache installer like usual.
2. Ensure the following folders exist, and if not, use a Windows Explorer window to create them
* `C:\InterWorks\Curator\vhosts`
* `C:\InterWorks\Curator\archives`
## 2. `curator.conf` file adjustments
1. Move Central Dispatch portal to subfolder of htdocs
1. Make directory `C:\InterWorks\Curator\htdocs\centraldispatch`
2. Move all other files and folders in `htdocs` directory to `centraldispatch` directory using Windows Explorer
2. Save SSL/TLS certificates and key files to `C:\InterWorks\Curator\certs` directory (create if it doesn’t exist)
3. Update `curator.conf` Located in `C:\InterWorks\Curator`
1. Point the default virtualhost’s document root and directory to `C:\InterWorks\Curator\htdocs\centraldispatch`
2. Use wildcard subdomain for servername and/or serveralias (do not use \* in the path)
3. Add include statement at the bottom to look for configuration files in `C:\InterWorks\Curator\vhosts` directory:
1. IncludeOptional `C:\InterWorks\Curator\vhosts\`
4. Configure it to listen on 443 and point at the certs and key in the certs directory by uncommenting the lines at
the bottom section.
5. Add these 2 lines to the 443 VirtualHost (usually under the DocumentRoot)
1. ErrorLog `${APACHE_LOG_DIR}/centraldispatch_error.log`
2. CustomLog `${APACHE_LOG_DIR}/centraldispatch_access.log` combined
4. Update the existing Curator cron scheduled task to fix the path to the (now) Central Dispatch portal (i.e.
`C:\InterWorks\Curator\htdocs\centraldispatch\artisan`).
5. Restart apache using the shortcuts on the desktop. If you receive an error message about access, then right click on
the `stop.bat` and `start.bat` scripts within `C:\InterWorks\Curator` and run as administrator. Ensure the portal still
works as expected.
## 3. Create the Worker Database User
1. Open the `worker_database_user.sql` example script in a text-editor, located in the
`C:\InterWorks\Curator\htdocs\centraldispatch\plugins\interworks\centraldispatch\workers` directory.
2. Change the username and password as needed before executing.
3. Open a terminal and run the command below to create the new user
```bash theme={null}
mysql -u root -p -e "source C:\InterWorks\Curator\htdocs\centraldispatch\plugins\interworks\centraldispatch\workers\worker_database_user.sql"
```
4. NOTE: You will be prompted to enter a password. Use the root user's password that was created when you installed
Curator. Refer to the [Windows Installation here](/setup/installation/windows_installation).
## 4. Create script and vhost files
1. Navigate to the `C:\InterWorks\Curator\htdocs\centraldispatch\plugins\interworks\centraldispatch\workers` directory
2. Create a copy of `php_worker.example.php`, rename it to `php_worker.php`, and move it to `C:\InterWorks\Curator`.
3. Create a copy of `vhost.template.example.conf`, rename it to `vhost.template.conf`, and move it to
`C:\InterWorks\Curator`.
4. You will have created the following files
* `C:\InterWorks\Curator\php_worker.php`
* `C:\InterWorks\Curator\vhost.template.conf`
## 5. Worker Script Setup
NOTE: Within PHP, use forward slashes, not backslashes for directory separators. Outside of PHP, use backslashes.
1. Open `php_worker.php` in a text editor
2. Modify the user section:
1. For the `DB_ENV_DISPATCHER` set the `user` and `pass` values to the user and password you set using the script in
the **Create the Worker Database User** section above.
2. `DB_ENV_INSTANCE` uses the `root` user's details for simplicity. This ensures you can provision with the highest
access. Alternatively, if you do not want to use the `root` user for this create a separate user and use those details.
3. Modify vhost section:
1. Uncomment `directory` for "C:/InterWorks/Curator/vhosts" (update path as needed).
2. Uncomment `template` for `C:/InterWorks/Curator/vhost.template.conf` (update path as needed).
4. Modify worker section:
1. Uncomment `source_directory` for "C:/InterWorks/Curator/htdocs/centraldispatch" (update path as needed).
2. Uncomment `archive_directory` for "C:/InterWorks/Curator/archives" (update path as needed).
1. Modify `$DEFAULT_BACKEND_EMAIL` as needed
2. Modify `$WINDOWS_INSTALL_DIR` if not using C:/InterWorks/Curator (i.e. if installed to D:\InterWorks\Curator)
## 6. vhost Template Setup
1. Determine the Apache version you're using by running `C:\InterWorks\Curator\libs\Apache24\bin\httpd -v` in a Command
Prompt window
2. Open `C:\InterWorks\Curator\vhost.template.conf` in a text editor
1. If using Apache 2.2:
1. Ensure lines 22-23 **do not** start with a '#', enabling those lines.
2. Ensure line 25 starts with a '#', disabling that line.
2. If using Apache 2.4:
1. Ensure line 25 **does not** start with a '#', enabling that line.
2. Ensure lines 22-23 start with a '#', disabling those lines.
3. Schedule worker by running the command in the `worker_scheduled_task.bat` example script. Tweak as needed. It
defaults to 15 minutes.
## 7. Register and Test Dispatcher
1. In the Central Dispatch Curator portal’s backend, register the workers with the dispatcher at **Backend** >
**Settings** > **Central Dispatch** > **Central Dispatch Settings**. Probably with these settings:
1. Host URL: localhost
2. Worker name: localhost (or use something more descriptive)
3. Install Path: C:/InterWorks/Curator/htdocs/
2. Attempt to deploy a new managed instance at Backend > Central Dispatch > Managed Instances.
## Manual Back Out of Deployment
In case of a failure during a deployment, Central Dispatch is not yet able to automatically back out the deployment to
try again. You can determine the nature of the failure by visiting the Managed Instance record in the backend of the
Central Dispatch portal and scrolling to the bottom of the page. There will be an error field that will show any issues
the worker had during the deployment.
To back out a deployment, it's important to determine which step it failed at so you'll know which of the following steps
you'll need to take to back it out. They are in reverse order of the deployment, so you can skip steps if the deployment
didn't make it that far. When in doubt, just perform all of the steps.
1. Remove scheduled task with the name of this managed instance by opening the Windows Task Scheduler.
2. Remove the vhost record specific to this managed instance in the `C:\InterWorks\Curator\vhosts directory` (adjust drive
letter as needed).
3. Remove site-specific SSL/TLS keys if the managed instance supplied them. These will be in the
`C:\InterWorks\Curator\certs directory` (adjust drive letter as needed).
4. Remove the portal code for the managed instance in the `C:\InterWorks\Curator\htdocs directory` (adjust drive letter
as needed).
5. Drop the database specific to the managed instance by using HeidiSQL and the root database credentials
(see `C:\InterWorks\Curator\info.txt`). The SQL statement to drop the database would be:
```SQL theme={null}
DROP DATABASE '';
```
6. Delete the database user specific to the managed instance by using HeidiSQL and the root database credentials
(see `C:\InterWorks\Curator\info.txt`). The SQL statement to drop the database would be:
```SQL theme={null}
DROP USER IF EXISTS ''@'localhost';;
```
# Email Configuration
Source: https://docs.curator.interworks.com/setup/email/email_configuration
Configure SMTP and email settings for Curator features including Report Builder and notification systems.
There are a variety of places that use e-mail settings across Curator. The largest piece is the
[Report Builder](/embedding_using_analytics/report_builder/overview_and_enabling_report_builder),
and e-mail also delivers notifications, including:
* [System Notifications](/site_administration/admin_email_notifications/system_notifications):
You can have Curator e-mail a digest of the issues and suggestions it raises about your instance. Subscribed
backend administrators receive it, plus any addresses you add.
* [Data Manager Notifications](/site_administration/admin_email_notifications/data_manager_notifications):
You can have Curator e-mail the recipients you choose when someone submits a Data Manager form.
Whatever the case, the e-mail setup will reside almost entirely with your e-mail provider or IT group that manages your
mail server. Once you have confirmed with them that you'll be able to utilize their mail service, use the steps below
to fill out the details for your e-mail configuration on Curator.
## Enabling and Testing Mail Settings
1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
2. Navigate to the **Settings** > **Mail** > **Mail Configuration** section from the left-hand menu (see "Mail
Configuration Permissions" below if you do not see this menu item).
3. Fill out the form using the details provided from your mail administrator.
4. Save the form.
5. Ensure the details are accurate by clicking the "Test Saved Settings" and entering your email.
6. Once you click send, wait up to 5 minutes (and double-check your spam inbox) - if you have not received an e-mail
double-check the settings with your mail administrator to ensure everything is set up properly
## Mail Configuration Permissions
Access to Mail configuration may not be granted by default depending on your installation. In order to view the mail
configuration, ensure that your
[Backend User](/site_administration/backend_administrators/overview) has access.
# High Availability
Source: https://docs.curator.interworks.com/setup/high_availability/high_availability
Configure Curator for high availability infrastructure to ensure reliability and handle increased load
Curator can be configured to run in a high availability (HA) infrastructure to ensure better "up time" for your users
as well as handling more concurrent user load. The standard components of the HA infrastructure are:
* **Load balancer** - Domain name is pointed here. Routes user traffic to one of the application nodes.
Example: AWS Elastic Load Balancer (ELB).
* **Application nodes** (2 or more) - Where Curator is installed.
Example: AWS Elastic Compute Cloud (EC2).
* **Database** - The application nodes will use this to store data. Having a single database keeps things synchronized.
Example: AWS Relational Database Service (RDS).
* **Filesystem** - The application nodes will use this to store thumbnails, backups, etc.
Example: AWS Elastic File System (EFS).
*Note: the example above shows AWS services but Azure and other cloud providers are viable options.*
## Requirements
Below are the specific requirements for each component of the infrastructure and what needs to be completed prior to the
install.
* **Load Balancer**
* This is where SSL will need to be handled. The most common setup is to terminate SSL at the load balancer as
opposed to having certificates on each application node.
* **Prior to install:** You don't need to have the load balancer ready prior to the install. This can be configured afterwards.
* **Application nodes**
* The same server requirements for the standard Curator installation exist for each application node. Those
requirements can be found here: [https://curator.interworks.com/requirements](https://curator.interworks.com/requirements).
* **Prior to install:** The application nodes need to be spun up and have root SSH or admin RDP access. The SSH or
RDP access should be tested before the installation.
* **Database**
* The database should be *separate* from the application nodes. Although it can be configured inside one of the
application nodes it defeats the purpose of high availability because if that node goes down none of the others will
be functional.
* **Prior to install:** The database needs to be spun up, an empty database needs to be created (it can be called
`curator` for simplicity), and it needs to be accessible from each application node. Test the accessibility from each
application node with something like this:
```bash theme={null}
sudo mysql -u $DBUSER--password=$DBPASSWORD -h $DBHOST -e "SHOW DATABASES"
```
Replace variables with your credentials and database host. You should be able to see the empty database you created
in the output.
* **Filesystem**
* Like the database, the filesystem needs to be separate from the application nodes to prevent unnecessary downtime.
Cloud services (AWS, Azure, etc.) have great options for this that have built in redundancy. If you aren't using a
cloud service and are using Windows for the infrastructure you can use the database node for the shared filesystem
with a network drive.
* **Prior to install:** The filesystem needs to be spun up and accessible by each application node. This should be
tested by creating a simple text file and ensuring it's visible from each application node.
## Other Infrastructures
There are numerous ways to do high availability that include different patterns with the database and filesystem setups.
What's described above is certainly not the only method but it is the simplest for Curator. We're happy to help
troubleshoot if you take a different route or run into issues with the infrastructure detailed above. While we're
fully responsible for errors rising from the application code, the success of the infrastructure will be dependent on
your team that manages it.
## Post Install
Once the install and configuration is complete at the server-level make sure to go to the **Curator backend** >
**Settings** > **Curator** > **Worker Nodes** and add each application node to the list. This will ensure when a
software upgrade is initiated or the application cache is cleared each node will stay synchronized.
### Worker Nodes
Worker nodes are essential for maintaining high availability and load balancing. In Curator's architecture, each worker
node runs a complete, independent installation of Curator that points to the same shared database and filesystem. This
is a **peer-to-peer architecture** where all nodes are equal - there is no master node.
You must register ALL application nodes in the Worker Nodes list, including the node you're currently
working on. Do not leave any node out thinking it will act as a "master." Each node shares the load of incoming
requests, and if one node fails, others can continue to handle traffic, minimizing downtime and improving reliability.
#### Adding Worker Nodes (Command Line)
To register a worker node to your Curator cluster, you can use the `distributed:addnode` console command. This command
registers a new node with the cluster, allowing Curator to properly sync changes with it.
* **Open the terminal** and navigate to the directory where Curator is installed.
* **Run the command** with the IP address of the new node:
```bash theme={null}
php artisan distributed:addnode {Curator Node IP}
```
Replace `{Curator Node IP}` with the actual IP address of the node you want to register.
* **Verify the node addition**: The command will output a confirmation message indicating that the node has been
registered successfully, and you can find the newly added node in the **Curator backend** >**Settings** > **Curator** >
**Worker Nodes**.
**Example:**
```bash theme={null}
php artisan distributed:addnode "http://192.168.1.2"
```
This command will register the node with IP address `192.168.1.2` to the Curator cluster.
#### Adding Worker Nodes (In the Backend)
You can also register worker nodes directly through the Curator backend interface.
1. **Navigate** to the Curator backend > Settings > Curator > Worker Nodes.
2. **Add a new node** by entering the URL (e.g., `http://192.168.1.2`) in the **URL** field.
3. **Save the changes** to register the new node with the cluster.
# IIS Installation (Unavailable)
Source: https://docs.curator.interworks.com/setup/installation/iis_installation
Information about IIS installation support status and migration recommendations for Curator.
**Curator no longer supports new installations on IIS.**
Instead, download the installer for [Windows](/setup/installation/windows_installation)
NOTE: *If you already have IIS installed, Curator's support team will continue to support your instance, but any new
installations will require our Apache installation. It is highly recommended that you migrate to Apache for increased
stability.*
# Linux Installation
Source: https://docs.curator.interworks.com/setup/installation/linux_installation
Instructions for installing Curator on Linux.
The automated installer covers the vast majority of setups, but each server is different and may require
commands specific to your IT infrastructure.
## Installation Steps
If you are using one of the following Linux Operating Systems, follow our simple instruction steps to get started:
* Ubuntu
* CentOS
* RHEL
* Oracle Linux
SSH into your web server, ensure you're using a user that has full sudo access, and run the command below:
```bash theme={null}
curl -s -o curator.sh https://api.curator.interworks.com/scripts/linux_install.sh && chmod +x ./curator.sh && ./curator.sh
```
Locate your license key (sent from InterWorks) and open `/var/www/curator_info.txt` to retrieve your default
administrator credentials.
Open `http://curatorexample.com/install.php` in a browser - replacing `curatorexample.com` with your site's URL. If
you're on the server you installed, you may also use `localhost`.
*This may be an IP address or computer name until your IT team sets up DNS.*
The installer will generate credentials for use during installation and will store them in a file in the installation
directory (Default: `/var/www/curator_info.txt` or `C:\InterWorks\Curator\curator_info.txt` in Windows). You will need
these credentials to complete the installation and to log in to the Curator backend after installation.
Enter your license key when prompted. If you do not have a license key, please contact InterWorks to obtain one.
You may be prompted to enter your database connection information if the installer is unable to automatically find the
database for you.
If the installation is successful, you will be redirected to your new Curator homepage
Using the same auto-generated credentials created in the install script above, you can log into the Curator backend which
can be accessed from `http://curatorexample.com/backend`. If you're on the server you installed, you may also use localhost.
Keep in mind this may be an IP address or computer name until your IT team sets up DNS.
## Custom Setup
The install script can take optional parameters to specify values for the installation script. This can be helpful in
distributed setups, or scripted installations.
```bash theme={null}
curl -o curator.sh https://api.curator.interworks.com/scripts/linux_install.sh
chmod +x ./curator.sh
./curator.sh -f -h [database_host] -u [database_username] -p [database_password] -P [database_port] -d [database_name] -l [license_key] -s [persistent_storage_location] -v [curator_version]
```
Arguments:
* `-h` The database hostname *Needed when using an external database host*
* `-u` The database username *`Default: curator`*
* `-p` The database password *Default: auto-generated password. Use this when you need to use a connection to a
database for a user that has already been created with a specific password.*
* `-P` The database port *`Default: 3306`*
* `-d` The database name *`Default: curator`*
* `-l` The License Key for your Curator installation. When performing a full installation, this is required.
* `-s` Path to a persistent storage location *Container-based or distributed installations typically require this.*
* `-v` Sets the version of Curator to install. *Default: most recent version.*
Options:
* `-f` Full Installation, this flag is required in most custom setups to avoid the in-browser installer.
## Key File Locations
These are the default paths for a standard Curator Linux installation. Exact locations may vary based
on your distribution and web server configuration.
To confirm the exact `php.ini` path on your system, check the `php_ini_path` field returned by the
[/portal/info](/curator_api/api_docs/curator_api#portalinfo) endpoint.
### Ubuntu 22.04 / 24.04
* Webroot: `/var/www/html`
* Environment file: `/var/www/html/.env`
* PHP.ini (Apache): `/etc/php/8.3/apache2/php.ini`
* PHP.ini (FPM): `/etc/php/8.3/fpm/php.ini`
### RHEL 9 / CentOS 9 / Oracle Linux 9+
* Webroot: `/var/www/html`
* Environment file: `/var/www/html/.env`
* PHP.ini: `/etc/opt/remi/php83/php.ini`
## Environment Configuration
Optional settings can be added to the environment file (`/var/www/html/.env`) to override Curator's
defaults. Curator ships with sensible values for all of these, so only set them if you need to change
the default behavior. Restart Apache or PHP-FPM after editing the file.
| Variable | Default | Purpose |
| ---------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `SESSION_LIFETIME` | `360` | How many minutes a session may stay idle before the user is signed out. |
| `CACHE_PREFIX` | Derived from `APP_NAME` | The prefix applied to all cache keys. |
| `FILESYSTEM_DRIVER` | `local` | The disk used for Curator media and uploads. |
| `FILESYSTEM_DISK` | `local` | The application-wide default disk used for everything else. |
| `APP_DEBUG` | `false` | Whether detailed error pages are shown when an error occurs. |
| `DISABLE_CORE_UPDATES` | `false` | Prevents the update gateway from re-downloading core files, for installs where updates are managed via composer or git. |
`FILESYSTEM_DRIVER` and `FILESYSTEM_DISK` are two separate settings, not old and new names for the same
thing. Curator media and uploads always follow `FILESYSTEM_DRIVER`. If you have only ever set
`FILESYSTEM_DRIVER`, your media and uploads continue to work unchanged and no action is required.
`CACHE_PREFIX` is derived from your `APP_NAME` unless you set it explicitly. Changing either value
changes the cache keys, so Curator rebuilds its cache on the next page load. This is safe, but the first
load afterward may be slower than usual.
`APP_DEBUG` defaults to `false`, so a generic error page is shown when something goes wrong. Set
`APP_DEBUG=true` temporarily while troubleshooting an installation to see the detailed error page with a
full stack trace, then set it back to `false` (or remove it) once you're done -- leaving it enabled can
expose sensitive information about your application and infrastructure to untrusted users.
## Log Locations
* Application Log: `/var/www/html/storage/logs/system-YYYY-MM-DD.log`
* PHP Installer Log: `/var/www/html/assets/install.log`
* Shell Installer Log: `~/iw_install.log`
## AWS EC2 Process
AWS provides a helpful outline on [how to connect to an AWS EC2 instance from Windows using Putty](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html).
## Network Whitelist Requirements
For installations in environments with restricted internet access or firewall configurations, the following URLs
should be whitelisted to ensure proper functionality:
### RHEL/CentOS/Oracle Linux Systems
* InterWorks API
* `api.curator.interworks.com`
* EPEL Repository
* `dl.fedoraproject.org`
* `download.fedoraproject.org` (covers mirrors.fedoraproject.org)
* Remi Repository (PHP packages)
* `*.remirepo.net` (covers rpms.remirepo.net, repo.remirepo.net, mirrors.remirepo.net)
* Base RHEL/CentOS Repositories
* `*.centos.org` (covers vault.centos.org, mirror.centos.org)
* `download.redhat.com`
* `cdn.redhat.com`
* Oracle Linux Repositories (Oracle Linux only)
* `yum.oracle.com`
* `oss.oracle.com`
* CDN Networks
* `*.akamaiedge.net` (covers `*.akamaitechnologies.com` - same Akamai network)
### Ubuntu Systems
* InterWorks API
* `api.curator.interworks.com`
* Ubuntu Repositories
* `*.archive.ubuntu.com` (covers archive.ubuntu.com, us.archive.ubuntu.com, gb.archive.ubuntu.com, etc.)
* `security.ubuntu.com`
* `ports.ubuntu.com`
* `changelogs.ubuntu.com`
* Launchpad PPAs (for ondrej/apache2 and ondrej/php)
* `*.launchpad.net` (covers ppa.launchpad.net, launchpad.net)
* `ppa.launchpadcontent.net`
* `keyserver.ubuntu.com`
### Testing Connectivity
To confirm `api.curator.interworks.com` is reachable through your firewall or proxy before installing or
upgrading, request the same endpoint Curator itself uses to check for new versions:
```bash theme={null}
curl -sS -w '\nHTTP status: %{http_code}\n' https://api.curator.interworks.com/widget/latest
```
A successful response returns an HTTP status of `200` with a body similar to:
```text theme={null}
$('#iw_latest_widget_wrapper').html(' 2026.08-03
');
```
The version shown in the response is the latest Curator build available, so it will differ from the example
above as new builds are released.
If the request times out, fails a TLS handshake, or returns anything other than a `200` status, the
whitelist entry is not taking effect yet -- recheck your proxy and firewall rules before continuing with
installation or upgrades.
# Windows Installation
Source: https://docs.curator.interworks.com/setup/installation/windows_installation
Instructions for installing Curator on Windows.
## Installation Steps
Log in to the server where you'd like to install Curator and [download the Curator installer for Windows](https://api.curator.interworks.com/CuratorSetup.exe).
Locate your download and right-click the file, then select "Run as Administrator" to begin the installation process.
Click the "Install" button to run initial installation process:
Click "Options" to change the installation directory.
The installer will generate credentials for use during installation and will store them in a file in the installation
directory (Default: `/var/www/curator_info.txt` or `C:\InterWorks\Curator\curator_info.txt` in Windows). You will need
these credentials to complete the installation and to log in to the Curator backend after installation.
Enter your license key when prompted. If you do not have a license key, please contact InterWorks to obtain one.
You may be prompted to enter your database connection information if the installer is unable to automatically find the
database for you.
If the installation is successful, you will be redirected to your new Curator homepage
Using the same auto-generated credentials created in the install script above, you can log into the Curator backend which
can be accessed from `http://curatorexample.com/backend`. If you're on the server you installed, you may also use localhost.
Keep in mind this may be an IP address or computer name until your IT team sets up DNS.
## Log Locations
These paths are dependant on your installation location, but these are the default paths:
* Apache: `C:\InterWorks\Curator\httpd_errors.log`
* PHP: `C:\InterWorks\Curator\php_errors.log`
* Installation Log (EXE): `C:\InterWorks\Curator\install.log`
* Installation Log (PHP Installer): `C:\InterWorks\curator\htdocs\assets\install.log`
## Network Whitelist Requirements
If you are installing Curator in a restricted network environment, the only external URL that must
be reachable from the Curator server is:
* `https://api.curator.interworks.com`
This single host covers all outbound traffic Curator needs for installation and ongoing operation on
Windows:
* Downloading the installer (`CuratorSetup.exe`)
* Checking for new versions and downloading upgrade packages
* Validating your Curator license key
Unlike the Linux installer, the Windows installer bundles all required dependencies (Apache, PHP, and
MariaDB), so no package repository URLs need to be whitelisted.
### Testing Connectivity
To confirm `api.curator.interworks.com` is reachable through your firewall or proxy before installing or
upgrading, request the same endpoint Curator itself uses to check for new versions:
```powershell theme={null}
Invoke-WebRequest -Uri "https://api.curator.interworks.com/widget/latest" -UseBasicParsing
```
A successful response returns a `StatusCode` of `200` with `Content` similar to:
```text theme={null}
$('#iw_latest_widget_wrapper').html(' 2026.08-03
');
```
The version shown in the response is the latest Curator build available, so it will differ from the example
above as new builds are released.
If the request times out, fails a TLS handshake, or returns anything other than a `200` status, the
whitelist entry is not taking effect yet -- recheck your proxy and firewall rules before continuing with
installation or upgrades.
## Other Information
These paths are dependant on your installation location, but these are the default paths:
If Curator was installed on a different drive (e.g., `D:\`), all paths below will reflect that drive
instead. To confirm the exact `php.ini` path on your system, check the `php_ini_path` field returned
by the [/portal/info](/curator_api/api_docs/curator_api#portalinfo) endpoint.
* Webroot: `C:\InterWorks\Curator\htdocs`
* Environment file: `C:\InterWorks\Curator\htdocs\.env`
* HTTPD Config: `C:\InterWorks\Curator\web.conf`
* PHP.ini: `C:\InterWorks\Curator\php.ini`
* Start Process: `C:\InterWorks\Curator\start.bat` (Also desktop shortcut)
* Stop Process: `C:\InterWorks\Curator\stop.bat` (Also desktop shortcut)
* Apache Location: `C:\InterWorks\Curator\libs\Apache24`
* Database Location: `C:\InterWorks\Curator\libs\MariaDB`
* PHP Location: `C:\InterWorks\Curator\libs\PHP`
## Environment Configuration
Optional settings can be added to the environment file (`C:\InterWorks\Curator\htdocs\.env`) to override
Curator's defaults. Curator ships with sensible values for all of these, so only set them if you need to
change the default behavior. Restart Curator using `stop.bat` and `start.bat` after editing the file.
| Variable | Default | Purpose |
| ---------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `SESSION_LIFETIME` | `360` | How many minutes a session may stay idle before the user is signed out. |
| `CACHE_PREFIX` | Derived from `APP_NAME` | The prefix applied to all cache keys. |
| `FILESYSTEM_DRIVER` | `local` | The disk used for Curator media and uploads. |
| `FILESYSTEM_DISK` | `local` | The application-wide default disk used for everything else. |
| `APP_DEBUG` | `false` | Whether detailed error pages are shown when an error occurs. |
| `DISABLE_CORE_UPDATES` | `false` | Prevents the update gateway from re-downloading core files, for installs where updates are managed via composer or git. |
`FILESYSTEM_DRIVER` and `FILESYSTEM_DISK` are two separate settings, not old and new names for the same
thing. Curator media and uploads always follow `FILESYSTEM_DRIVER`. If you have only ever set
`FILESYSTEM_DRIVER`, your media and uploads continue to work unchanged and no action is required.
`CACHE_PREFIX` is derived from your `APP_NAME` unless you set it explicitly. Changing either value
changes the cache keys, so Curator rebuilds its cache on the next page load. This is safe, but the first
load afterward may be slower than usual.
`APP_DEBUG` defaults to `false`, so a generic error page is shown when something goes wrong. Set
`APP_DEBUG=true` temporarily while troubleshooting an installation to see the detailed error page with a
full stack trace, then set it back to `false` (or remove it) once you're done -- leaving it enabled can
expose sensitive information about your application and infrastructure to untrusted users.
## Changing the Install Path
This is *not recommended* but may be necessary in rare circumstances. The installer will default to
`C:\InterWorks\Curator` if no changes are made to the install path. If you must change the install path, click the
"Options" button in the installer window
then change the Install Location path:
Please note that the paths above may no longer be valid if you change the install path.
## Installing a Specific Version
The Windows installer always installs the latest version of Curator. Unlike the
[Linux installer](/setup/installation/linux_installation), which supports a `-v` flag to specify a
particular version, the Windows installer does not offer a version selection option.
If you need to install a specific older version of Curator on Windows, please contact
[InterWorks support](https://interworks.com/contact/) for assistance.
# Forward Proxy
Source: https://docs.curator.interworks.com/setup/proxy_configuration/forward_proxy
Configure forward proxy settings for internet access and external connectivity
Curator utilizes internet access to connect to Tableau Server as well as Curator's web servers for updates.
When configured without outbound internet access, Curator upgrades must be performed manually and Tableau Server must
be accessible within the LAN.
Often, IT teams prefer to route internet traffic first through a proxy.
When configured to work through a proxy, Curator doesn't send requests directly to the internet.
Instead, it sends requests to the forward proxy, which in turn forwards the request.
To configure a forward proxy, add the following variables to Curator's `.env` file:
```bash theme={null}
proxy_override=http://proxy.example.com:3128
no_proxy_override=localhost,127.0.0.1
HTTP_PROXY=http://proxy.example.com:3128
HTTPS_PROXY=http://proxy.example.com:3128
NO_PROXY=localhost,127.0.0.1
http_proxy=http://proxy.example.com:3128
https_proxy=http://proxy.example.com:3128
no_proxy=localhost,127.0.0.1
```
Replace `proxy.example.com:3128` with the hostname and port of your organization's forward proxy.
Port `3128` is the default port for Squid-based proxies; adjust as required.
**proxy\_override** and **no\_proxy\_override** are read by Curator's own code and apply to all Curator
processes, including web requests served through Apache and PHP CLI processes such as cron jobs.
The standard `HTTP_PROXY` / `http_proxy` variables are read by bundled third-party tools such as
Composer (used during upgrades). Both upper- and lowercase forms are required because different
tools each read their own convention.
## no\_proxy\_override / NO\_PROXY / no\_proxy Values
Common values include `localhost` and `127.0.0.1`. Keep the same bypass list across all three
variables so Curator's own code and bundled tools behave consistently.
If Tableau Server is on the same LAN as Curator, add its hostname so that traffic to Tableau is
not routed through the proxy:
```bash theme={null}
no_proxy_override=localhost,127.0.0.1,tableau.internal.example.com
NO_PROXY=localhost,127.0.0.1,tableau.internal.example.com
no_proxy=localhost,127.0.0.1,tableau.internal.example.com
```
Any other internal services that Curator needs to reach directly, such as an SSO or identity
provider, should also be added to the bypass list.
Since Tableau Cloud is a remote SaaS service, its traffic should flow through the proxy rather than
bypass it.
# Reverse Proxy
Source: https://docs.curator.interworks.com/setup/proxy_configuration/reverse_proxy
Configure reverse proxy and load balancing solutions for Curator
When installing Curator, you may wish to place Curator behind a reverse proxy or load balanced solution.
## Health Checks
Health checks should be run against the `/ping` route instead of simply the base `/` route.
The base / route will often return a 302 redirect, which many load balancers view as a "down" response.
The /ping route will always return a 200 response.
## Headers
When your users access Curator over the reverse proxy, specific "headers" are used to tell Curator how to process the
request.
**X-FORWARDED-FOR** : The IP address of the end user.
**X-FORWARDED-HOST** : The host name of the request.
*Note: A "Forced Domain" in Portal Settings->Security overrides this value.*
**X-FORWARDED-PROTO** : Whether to use HTTPS or HTTP for routes.
## Unable to adjust headers
Often, reverse proxy solutions are missing some or all of these headers.
To help configure a reverse proxy with Curator, Apache configuration files can be used.
On Windows, the `curator.conf` file is a great place for this configuration.
On Linux, `/var/www/html/.htaccess`, or any of the httpd.conf files can also be utilized.
```conf theme={null}
SetEnv HOST "example.curator.interworks.com"
SetEnv HTTP_X_FORWARDED_HOST "example.curator.interworks.com"
SetEnv HTTPS "on"
SetEnv HTTP_X_FORWARDED_PROTO "https"
```
In addition to these settings, the security settings in **Settings** > **Curator** > **Portal Settings** > **General**
can be used.
In particular, **Forced Domain** and **Force SSL** should be utilized to specify the domain of Curator and to use SSL.
## Forced Domain and SSL
When Curator is behind a reverse proxy or load balancer, the server may not know the public domain name or protocol
that users access it through. This can cause Curator to generate links using the server's internal IP address or
server name (e.g., `10.40.243.235/dashboard/...`) instead of your domain name, or use `http://` instead of
`https://`.
The **Forced Curator Domain** setting overrides whatever host Curator detects, including the `X-Forwarded-Host`
header, and ensures all generated URLs use the specified domain. The **Force SSL** setting ensures all generated
URLs use `https://` instead of `http://`.
### Configuring Forced Domain and Force SSL
1. Navigate to **Settings** > **Curator** > **Portal Settings** > **General** and scroll to the **Security** section.
2. Enter your domain in the **Forced Curator Domain** field (e.g., `curator.example.com`). Do not include `https://`.
3. Enable **Force SSL** to ensure all URLs use HTTPS.
4. Save your changes.
This setting also prevents [Host Header Injection](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection)
attacks. Even if your proxy is sending the correct `X-Forwarded-Host` header today, setting a Forced Domain is
recommended as an additional security measure.
### Disabling via Command Line
If you lose access to the Curator UI after enabling these settings (for example, due to a DNS or SSL misconfiguration),
you can disable them from the server's command line:
```bash theme={null}
# Disable Force SSL
php artisan portal:setforcessl 0
# Clear the Forced Domain
php artisan portal:setdomain ""
```
## Trusted Hosts
Curator also ships a `trustedHosts` option in `config/app.php`, which is a second, code-level defense
against [Host Header Injection](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection).
It rejects any request whose host header does not match an allowed value, before Curator processes it.
It ships disabled (`false`) so that requests arriving through a proxy under an internal hostname or IP
address are not rejected. Most installations should leave it disabled and use **Forced Curator Domain**
above instead, which solves the same problem from the application side and is configurable from the UI.
Enable `trustedHosts` only if your security policy requires host validation at the framework layer. Set
it to `true` to trust the host in `app.url` plus its `www` subdomain, or to an array of domains, IP
addresses, or regular expression patterns:
```php theme={null}
'trustedHosts' => [
'curator.example.com', // Matches just curator.example.com
'^(.+\.)?example\.com$', // Matches example.com and all subdomains
],
```
If you enable `trustedHosts` and your proxy forwards a host that is not in the list, Curator rejects the
request and users cannot reach the site. Confirm which host your proxy actually sends before enabling
this, and be prepared to revert the change from the server's command line.
## Troubleshooting
### ERR\_TOO\_MANY\_REDIRECTS (redirect loop)
If users see `ERR_TOO_MANY_REDIRECTS` in the browser (or `This page isn't working - redirected you too many times`)
after enabling **Force SSL**, Curator is stuck in a redirect loop with the proxy.
**Root cause:** **Force SSL** tells Curator to redirect any request it sees as `http://` to `https://`. When the proxy
terminates SSL but does not forward the `X-Forwarded-Proto` (or `X-Forwarded-SSL`) header, Curator only sees the
plain HTTP request from the proxy and issues another redirect to HTTPS. The proxy then sends that redirected
request back to Curator as HTTP again, and the loop repeats until the browser gives up.
Clearing browser cookies does not resolve this -- the loop is on the server side.
**Recovering access:** If you can no longer reach the Curator UI, disable Force SSL from the server command line:
```bash theme={null}
php artisan portal:setforcessl 0
```
**Permanent fixes** (pick one):
1. Configure the proxy to forward `X-Forwarded-Proto: https` (and `X-Forwarded-SSL: on`) on every request it
proxies to Curator. See the **Headers** section above.
2. Set the Apache environment variables described in the **Unable to adjust headers** section above so that
Curator always treats the request as HTTPS.
3. Leave **Force SSL** disabled and instead enforce HTTPS at the proxy layer (for example, by redirecting all
port 80 traffic to port 443 at the proxy).
# Basic HTTP Authentication
Source: https://docs.curator.interworks.com/setup/ssl/basic_http_authentication
Set up basic HTTP authentication for additional browser-level security
Basic HTTP Authentication provides a secondary browser-level authentication system. Usually used to secure
non-production setups. To enable the Basic HTTP Authentication:
1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`).
2. Log in if prompted.
3. Click on **Settings** > **Curator** > **Portal Settings** in the left navigation.
4. Click on the "General" tab at the top of the main page content.
5. Click to switch on the "Basic HTTP Authentication" setting under the "Security" section and click the "Save" button.
# Force SSL
Source: https://docs.curator.interworks.com/setup/ssl/force_ssl
Configure Curator to enforce SSL/HTTPS connections for enhanced security.
Force SSL (https) will force all HTTP request to be https instead. This will require you to set up SSL certificates
first before enabling the feature. Otherwise, the site will run into an issue. To enable Force SSL (https):
1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`).
2. Log in if prompted.
3. Click on **Settings** > **Curator** > **Portal Settings** in the left navigation.
4. Click on the "General" tab at the top of the main page content.
5. Click to switch on the "Force SSL" setting under the "Security" section and click the "Save" button.
# Linux SSL
Source: https://docs.curator.interworks.com/setup/ssl/linux_ssl
Configure SSL certificates and HTTPS encryption for Curator on Linux systems
1. First, find your `curator.conf` file. For Ubuntu installations, this is located in `/etc/apache2/sites-enabled`. For
all other Linux distributions, this file is located in `/etc/httpd/conf.d/curator.conf`. If you cannot find this file,
you may have an old Curator installation. If so,
[download `curator.conf` here](https://api.curator.interworks.com/file/curator_conf).
2. Upload your SSL certificate, key, and (optionally) chain files to the webserver. This can be done with a secure copy
(SCP) client, such as FileZilla. Place these certificates in */etc/apache2/certs* for Ubuntu, or */etc/httpd/certs*, for
all other Linux distributions.
3. Replace the references to SSLCertificateChainFile, SSLCertificateFile, and SSLCertificateKeyFile in the `curator.conf`
to the location you uploaded them to in Step #2.
4. Save the contents of the file and restart apache with the commands below:
```bash theme={null}
sudo apachectl restart
```
5. Navigate to the HTTPS version of the link to your portal in your browser (i.e. `https://curatorexample.com`). You
should see a lock icon appear in the URL bar after the site loads to indicate that it is successfully encrypted. If you
don’t see the lock or if you get an error, check your certificate for invalid information, such as incorrect site name
or missing Subject Alternative Names.
## Debugging SSL
Having issues? It happens! SSL certificates can be uniquely challenging to implement. Here are a few debugging tips:
1. Make sure the certificate and key match. Often these get mismatched. Your server will not start if they do not match.
If either of these commands errors, you may not have correctly formatted certificates. Make sure you acquired Apache/PEM
certificates:
```bash theme={null}
openssl rsa -modulus -noout -in yourKeyFile.key | openssl md5
openssl x509 -modulus -noout -in myServer.crt | openssl md5
```
2. The certificate chain file is important, but can cause issues. If your Curator server won't start, try commenting out
the SSLCertificateChainFile line in `curator.conf` temporarily to ensure that the issue is not the chain file.
3. Check Apache/HTTPD's error log. This can be found in /var/log/apache2/error\_log (Ubuntu) or /var/log/httpd/error\_log
(All other distros). Also check `/var/www/curator_error.log`, if it exists. If the error message is not detailed enough,
try increasing "LogLevel" to "debug" in `curator.conf`. (Note: be sure to set this value back to "warn" after you are done!)
## Notes on obtaining SSL certificates
1. Curator uses "Apache" type certificates. These may be referred to as "OpenSSL" or PEM certificates as well.
2. These certificates may in one big bundle, or separated into key, certificate, and chain files.
3. When installing key certificates, many providers require a key-passphrase.
Once installed on the Curator server and at rest, you may wish to remove this passphrase.
If the passphrase remains, it will be required anytime there is a restart of the web server.
**STORE THE PASSPHRASE IN A SAFE PLACE. IF IT REMAINS ON THE KEY AND IS LOST YOU WILL HAVE TO GENERATE NEW CERTIFICATES.**
To remove the passphrase, use this command.
```bash theme={null}
openssl rsa -in [original.key] -out [new.key]
```
## SSL Protocols / Ciphers (Optional)
1. You may wish to update your SSL protocols and cipher suites. To do this, you'll need a little more info about your
web server. Run the command below to get the Apache and OpenSSL versions:
```bash theme={null}
httpd -V 2>/dev/null | grep version; apache2 -V 2>/dev/null | grep version; openssl version; php -v | grep cli
```
2. The expected output will look something like this:
```bash theme={null}
Server version: Apache/2.4.48 ()
OpenSSL 1.0.2k-fips 26 Jan 2017
PHP 7.4.21 (cli) (built: Jul 7 2021 17:35:08) ( NTS )
```
3. Take the information retrieved in the previous step and use it to fill out the form on this
[SSL Certificate Generator site](https://ssl-config.mozilla.org/#server=apache).
* Select **Apache** for "Server Software"
* Select **Intermediate** for "Mozilla Configuration".
* Enter your Apache version
* Enter your OpenSSL version
4. Replace the appropriate areas in the `curator.conf` file with the SSLProtocol and SSLCipherSuite that was generated
on the SSL Certificate Generator site.
For example:
```conf theme={null}
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
```
5. Have a server open to the internet? Qualys has a free tool to test the certificates, protocols/ciphers, and their
security: [https://www.ssllabs.com/ssltest/analyze.html](https://www.ssllabs.com/ssltest/analyze.html)
# Windows SSL
Source: https://docs.curator.interworks.com/setup/ssl/windows_ssl
Configure SSL/HTTPS for Curator installations on Windows servers with IIS.
## Finding relevant files
1. Find the **`curator.conf`** file (default location is `C:\InterWorks\Curator\curator.conf`).
2. Find the relevant keys. These will either be in a bundle, or separated into key, certificate, and chain files.
3. Put your keys into the correct directory (default location is `C:\InterWorks\Curator\certs\`).
## Converting .pfx / .p12 Certificates
If your certificate was provided in PKCS12 format (a `.pfx` or `.p12` file), you need to convert it to PEM format
before configuring SSL. See [Converting PFX/P12 Certificates to PEM](/setup/ssl/windows_ssl_pfx_to_pem) for
step-by-step instructions.
## Removing Passphrases (Required, if applicable)
If your certificate utilizes a passphrase, you'll need to remove it in order to use the certificate with Curator since
passphrases are not supported by Apache on Microsoft Windows servers.
1. Curator uses "Apache" type certificates. These may be referred to as "OpenSSL" or PEM certificates as well.
2. Windows is unique in that it cannot use certificates with embedded passphrases,
so these have to be removed if they are present.
These passphrases would normally be required before a restart of your web server on other operating systems,
but are not able to be used here.
3. To remove the passphrases, you can use this command in the same directory as the certificates using Powershell.
```bash theme={null}
& 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' rsa -in [original.key] -out [new.key]
```
## Replacing References
1. Locate the references in the file (listed below) and replace your new .crt, .pem, and .key files where they are
referenced in the `curator.conf` file.
2. Un-comment the lines (by deleting the `#` at the front of the line) starting at `Listen 443` and ending at
``. See example below:
```conf theme={null}
#Uncomment the lines below for SSL
Listen 443
SSLEngine on
ServerName www.example.com
DocumentRoot "C:\InterWorks\Curator\htdocs"
RewriteEngine on
SSLCertificateChainFile C:\InterWorks\Curator\certs\chain.crt
SSLCertificateFile C:\InterWorks\Curator\certs\cert.pem
SSLCertificateKeyFile C:\InterWorks\Curator\certs\cert.key
SSLProtocol [protocol]
SSLCipherSuite [ciphersuite]
SSLHonorCipherOrder on
SSLCompression off
AllowOverride All
Options Indexes FollowSymLinks
Require all granted
```
3. After the configuration file has been edited and saved, restart Curator.
## SSL Protocols / Ciphers (Optional)
1. You may wish to update your SSL protocols and cipher suites. To do this, you'll need a little more info about your
environment. Run the command below to get your Apache and OpenSSL versions, assuming default install locations for both:
```bash theme={null}
& 'C:\InterWorks\Curator\libs\Apache24\bin\httpd.exe' -v; & 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' version
```
2. The expected output will look something like this:
```bash theme={null}
Server version: Apache/2.4.59 (Win 64)
OpenSSL 3.3.1 4 Jun 2024 (Library: OpenSSL 3.3.1 4 Jun 2024)
```
3. Take the information retrieved in the previous step and use it to fill out the form on this
[SSL Certificate Generator site](https://ssl-config.mozilla.org/#server=apache).
* Select **Apache** for "Server Software"
* Select **Intermediate** for "Mozilla Configuration".
* Enter your Apache version
* Enter your OpenSSL version
4. Replace the appropriate areas in the `curator.conf` file with the SSLProtocol and SSLCipherSuite that was generated
on the SSL Certificate Generator site.
For example:
```conf theme={null}
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:
DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
```
5. Have a server open to the internet? Qualys has a free tool to test the certificates, protocols/ciphers, and their
security: [https://www.ssllabs.com/ssltest/analyze.html](https://www.ssllabs.com/ssltest/analyze.html)
## Troubleshooting
If Apache fails to start after configuring SSL, see the
[Windows Apache SSL Troubleshooting](/setup/ssl/windows_ssl_troubleshooting) guide for step-by-step diagnostics
and fixes for common issues.
# Windows SSL (IIS)
Source: https://docs.curator.interworks.com/setup/ssl/windows_ssl_iis_deprecated
Legacy SSL configuration for deprecated Windows IIS installations
Curator no longer supports IIS on new installations.
The information below is for use only for existing installs. It is *highly* recommended that you reinstall with Apache for
stability, please see our
[Windows Apache Installation](/setup/installation/windows_installation)
documentation for steps on how to achieve the best Curator experience for Windows.
## Enabling SSL
1. In IIS Manager, on the left-hand pane, select the server (note: not the site).
2. On the server Home page double-click **Server Certificates** (in the center pane).
3. On the right-hand pane click the `Complete Certificate Request` link.
4. Follow the steps below in the Complete Certificate Request wizard, then click **OK**:
**File name containing the certificate authority's response:** Your .cer file
**Friendly name:** Give your cert a name! Recommended format: `curator-cert-[expiration-date]`
**Select a certificate store for the new certificate:** Select *Web Hosting*.
5. In IIS Manager, on the left-hand pane, select the site that is running Curator.
6. On the right-hand pane under *Edit Site*, click **Bindings...**.
7. In the Bindings window, click **Add**
8. Follow the steps below in the Add Site Bindings window, then click **OK**:
**Type** Select https.
**IP address** Select the IP address of the site (or select All Unassigned).
**Port** Type port 443
**SSL certificate** Select the new SSL cert you created in step #4
9. On the right-hand pane click **Restart**
# Converting PFX/P12 Certificates to PEM
Source: https://docs.curator.interworks.com/setup/ssl/windows_ssl_pfx_to_pem
Convert PKCS12 (.pfx/.p12) certificates to PEM format for use with Curator on Windows.
If your certificate was provided in PKCS12 format (a `.pfx` or `.p12` file), you need to extract the PEM certificate
and private key before configuring SSL. Curator bundles OpenSSL, so you can run these commands directly in PowerShell.
1. Extract the certificate:
```bash theme={null}
& 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' pkcs12 -in [yourfile.pfx] -clcerts -nokeys -out [cert.pem]
```
2. Extract the private key:
```bash theme={null}
& 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' pkcs12 -in [yourfile.pfx] -nocerts -nodes -out [cert.key]
```
3. If the `.pfx` file includes a certificate chain, extract it as well:
```bash theme={null}
& 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' pkcs12 -in [yourfile.pfx] -cacerts -nokeys -chain -out [chain.crt]
```
> **Note:** If the `.pfx` / `.p12` file is password-protected, OpenSSL will prompt you for the import password when
> running these commands. The `-nodes` flag in step 2 produces an unencrypted private key, which is what Curator
> requires. If you omit `-nodes` (or are following a legacy workflow), the extracted key will be passphrase-encrypted
> — see [Removing Passphrases](/setup/ssl/windows_ssl#removing-passphrases-required-if-applicable) to remove it.
# Windows Apache SSL Troubleshooting
Source: https://docs.curator.interworks.com/setup/ssl/windows_ssl_troubleshooting
Diagnose and resolve common Apache SSL startup failures on Windows servers running Curator.
If Apache fails to start after configuring SSL on a Windows Curator installation, work through the steps below
to identify and resolve the issue.
The examples below use the default installation path `C:\InterWorks\Curator`. If Curator was installed on a
different drive or directory, adjust the paths accordingly (e.g. `D:\InterWorks\Curator`).
## Step 1: Test the Configuration From the Command Line
Open PowerShell as Administrator and run:
```bash theme={null}
& 'C:\InterWorks\Curator\libs\Apache24\bin\httpd.exe' -t
```
This validates the configuration and outputs a specific error message pointing to the exact file, line number, and
problem. If everything is valid, it outputs `Syntax OK`.
This is the fastest way to identify the issue. If the output points to a clear problem, skip to
[Common SSL Issues and Fixes](#common-ssl-issues-and-fixes) for the resolution.
## Step 2: Check the Apache Error Log
If Step 1 wasn't sufficient, check the Apache error logs:
```
C:\InterWorks\Curator\httpd_errors.log
C:\InterWorks\Curator\libs\Apache24\logs\error.log
```
Open these in Notepad — the most recent entries at the bottom will show what went wrong during the last startup attempt.
## Step 3: Check the Windows Event Log
1. Attempt to start the **Curator HTTPD Server** service from the Windows Services Manager.
2. After it fails, press **Win + R**, type `eventvwr.msc`, and press **Enter**.
3. Navigate to **Windows Logs** > **Application**.
4. The most recent error entries at the top will be from the failed startup attempt — double-click them and read
the **Description** field for the actual error message.
## Common SSL Issues and Fixes
**Error:** `SSLPassPhraseDialog builtin is not supported on Win32` or the service hangs waiting for passphrase input.
**Fix:** Strip the passphrase from the key:
```bash theme={null}
& 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' rsa -in C:\InterWorks\Curator\certs\your_key.key -out C:\InterWorks\Curator\certs\your_key_nopass.key
```
Then update `SSLCertificateKeyFile` in `C:\InterWorks\Curator\curator.conf` to point to the new key.
See also: [Removing Passphrases](/setup/ssl/windows_ssl#removing-passphrases-required-if-applicable) in the
Windows SSL setup guide.
**Error:** `SSLCertificateFile: file 'C:\...' does not exist or is empty`
**Fix:** Verify the paths in `C:\InterWorks\Curator\curator.conf` for these directives all point to files that
actually exist in `C:\InterWorks\Curator\certs\`:
* `SSLCertificateFile`
* `SSLCertificateKeyFile`
* `SSLCertificateChainFile`
**Error:** Syntax errors referencing lines in the SSL block.
**Fix:** Open `C:\InterWorks\Curator\curator.conf` and ensure the entire `` block and the
`Listen 443` line are fully uncommented (no stray `#` characters).
See: [Replacing References](/setup/ssl/windows_ssl#replacing-references) in the Windows SSL setup guide.
**Error:** `SSLCertificateChainFile: file does not exist`
**Fix:** Ensure the CA intermediate/chain certificate is in the certs directory and referenced correctly. If you
have a single combined cert, comment out the `SSLCertificateChainFile` directive.
**Error:** `certificate and private key do not match`
**Fix:** Verify they match by comparing their modulus hashes:
```bash theme={null}
& 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' x509 -noout -modulus -in C:\InterWorks\Curator\certs\your_cert.crt | & 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' md5
& 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' rsa -noout -modulus -in C:\InterWorks\Curator\certs\your_key.key | & 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' md5
```
Both commands should output the same hash. If they don't, the wrong key or certificate file is being used.
**Error:** `could not bind to address 0.0.0.0:443`
**Fix:** Check what's using port 443:
```bash theme={null}
netstat -ano | findstr :443
```
If IIS or another service is on port 443, stop it or change the Curator port.
**Error:** `error reading certificate` or `PEM routines:get_name:no start line`
**Fix:** Apache requires PEM format (text starting with `-----BEGIN CERTIFICATE-----`). Convert from DER if needed:
```bash theme={null}
& 'C:\InterWorks\Curator\libs\Apache24\bin\openssl.exe' x509 -inform DER -in your_cert.cer -out your_cert.pem
```
## After Fixing
1. Re-run the config test:
```bash theme={null}
& 'C:\InterWorks\Curator\libs\Apache24\bin\httpd.exe' -t
```
2. If it says `Syntax OK`, start the **Curator HTTPD Server** service from Services Manager.
# Adding Your First Dashboard
Source: https://docs.curator.interworks.com/setup/trial_quick_start_guide/adding_your_first_dashboard
Step-by-step guide to create your first analytics connection and add dashboards to Curator.
Click on **Integrations → Connections**
Click on **New Connection button**
* **Name**
* Name your connection
* **Slug**
* This slug (url extension) will auto-generate but can be customized
* **Description**
* **Platform**
* Options include: Tableau, Power BI, ThoughtSpot
* After selecting an option, fill out the platform specific connection information and credentials
## Tableau
### Tableau Server
1. **Enter Site name** (e.g. `https://analytics.acme.com`)
2. **Enter Service Account credentials or Personal Access Token**. To enter Personal Access Token, follow the below steps:
1. Log onto your Tableau Server
2. Click account icon on top right of screen (by default, will by a circle with your initials in it)
3. Select My Account Settings
4. Scroll to Personal Access Token
5. Enter a Name for your Token and click Create Token
Additional information on Personal Access Tokens can be found in [Tableau’s documentation](https://help.tableau.com/current/pro/desktop/en-us/useracct.htm#create-and-revoke-personal-access-tokens).
### Tableau Cloud
1. **Select the Tableau Cloud Host region** (found in the server url)
2. **Enter the Site name** (found in the server url after logging in)
3. **Enter your Personal Access Token**
4. **To enter Personal Access Token, follow the below steps:**
1. Log onto your Tableau Server
2. Click account icon on top right of screen (by default, will by a circle with your initials in it)
3. Select My Account Settings
4. Scroll to Personal Access Token
5. Enter a Name for your Token and click Create Token
Additional information on Personal Access Tokens can be found in [Tableau’s documentation](https://help.tableau.com/current/pro/desktop/en-us/useracct.htm#create-and-revoke-personal-access-tokens).
#### Power BI
**Enter your Tenant ID in Azure**. To find your Tenant ID, follow this [documentation](https://learn.microsoft.com/en-us/azure/active-directory/fundamentals/how-to-find-tenant).
#### ThoughtSpot
1. Enter your ThoughtSpot URL
2. Enter your ThoughtSpot credentials
## Adding a Dashboard From Your Server
Once you have established a connection to your server you can begin adding individual Dashboard connections. For our
example we will follow along with a Tableau Dashboard but the instructions are similar for other BI platforms.
1. **Click Tableau** (or your BI Platform Option) → **Dashboards**
2. **Click the New Dashboard Button**
Select desired Server, Site, Project, Workbook, and Dashboard then click create to establish a connection.
Connect dashboards will be listed in the Tableau → Dashboard menu:
## Adding a Menu Link to the Navigation
After a connection to a Dashboard has been established, the simplest method is to add a menu link to the navigation pane
at the top of your environment.
Click **Content → Navigation**
1. Select New Menu Link
2. Select your Dashboard Link Type
3. Select your Dashboard
4. Select Create
Once you create the link you will be brought to a page that displays the navigation hierarchy. You can control the
navigation pane’s order and drop down menus here:
After you have decided on hierarchy, navigate to the front end and see your new navigation menu items that lead to your dashboards:
# Creating Your First Page
Source: https://docs.curator.interworks.com/setup/trial_quick_start_guide/creating_your_first_page
Learn how to use the page builder to create and customize your first content page in Curator.
Click on **Content → Pages → New Page**
To get started, enter a page title and toggle whether you want to show or hide it.
## Page Builder
To get started with the page builder, click the + button on the empty page builder interface.
### Add an Element
An interface will popup which gives you the option to Add an Element.
The default container in your preview represents a single element. These elements can be broken down into 3 different types:
1. **Web Elements** (Text, Banners, etc)
2. **Analytic Elements** (BI Dashboards, SSRS, etc)
3. **Additional Elements** (Unrestricted HTML, Embedded URLS, etc)
After adding an element, select the element and a menu window will appear on the left side with options to change,
delete, and customize your element.
## Example: Creating a Page
Some of our most common elements are listed below
### Add a Hero Element
1. After naming your page, the first step in our sample page will be to add a Hero Element.
2. On the left menu window, select Hero Settings and select one of the template starter images.
3. Add in a Heading (e.g. ACME Sample Page) and Body Texts and Change Text Color if needed
4. Under Row Styles, update the Row Width to Full Width if the Hero Image should go across the full width.
### Add a Dashboard to a Page
Dashboards can be either set up as standalone items or embedded within a page for greater customization on the wider page.
To add a Dashboard to a page, go ahead and add an element, select Analytic Elements and add your desired Dashboard to
replace the element.
**Note:** If the Analytics Element is unavailable to be selected, please add the relevant connection.
### Add a Text Field
Make updates to your text like bolding, italicizing, strike-through and many more options in the text editor.
### Add Buttons
#### Buttons
Add externally linking buttons with the buttons component. Under Content Selection, link to different options like:
* Tableau/Power BI Dashboards
* Pages
* Files
* Content Tagged by Keywords
* External URLs
* Manual Selections (Combination of above options)
## Additional Options
Add more elements to customize and complete your page and then select save in the top right. Congrats your first page
has been created!
**TIP:** Clone your pages if you want to have a consistent design and save time when adding dashboards to separate pages
# Getting Started
Source: https://docs.curator.interworks.com/setup/trial_quick_start_guide/getting_started
Comprehensive guide to building your first analytics portal in Curator with step-by-step instructions.
Welcome to our comprehensive guide on building an analytics portal in Curator —a powerful tool that will empower you to
make data-driven decisions and unlock valuable insights within your organization. In today's data-driven world, the
ability to harness and interpret information is crucial for staying ahead of the competition and optimizing business
processes. Whether you're a seasoned developer or a novice enthusiast, this step-by-step tutorial will walk you through
the process of creating an analytics portal, integrating data sources, adding dashboards, and designing an intuitive user
interface. Get ready to transform your data into actionable knowledge and unleash the full potential of analytics with
our easy-to-follow instructions and best practices. Let's embark on this exciting journey of building your very own
analytics portal!
## First Steps
You’ve just reached out to an InterWorks Account Executive and have had a free trial set up.
You should have received an email that looks like this:
## Front End vs Admin
The front-end login will direct you to your portal and show you what your end users will see. The default URL should
appear as `companyname.portals.interworks.com` and is fully customizable.
The admin login will lead you to administrative settings and the URL should appear as
`companyname.portals.interworks.com/backend`. The administrative settings are where you will build your analytics portal,
control your authentication, and manage your users.
Click on the Admin login and continue to the Admin Settings below.
## Admin Settings
After entering your username and password, you should enter a screen that looks like this:
### Admin Menu Options
To the left, you’ll see the menu options. They are categorized into 4 sections.
1. **Content:** Pages, files and navigation
2. **Tableau:** Dashboards, filters and parameters
3. **Integrations:** Tableau Server connections and user group syncs
4. **Settings:** Curator settings, upgrades, security and users
### Update your Account Information and Password
In a Curator trial? Go ahead and navigate to the next page on Setting Up Your Portal. If you change your trial
credentials then we will not be able to easily troubleshoot issues for you!
If you are working on setting up your own instance, then go ahead and update your account information and password from
the defaults.
To do this, click on your icon on the top right, and update your First Name, Last Name, and Password.
Click the save button to apply your changes.
# Setting Up Your Portal
Source: https://docs.curator.interworks.com/setup/trial_quick_start_guide/setting_up_your_portal
Initial setup and configuration guide to customize your Curator portal theme and frontend access.
Click on **Settings → Curator → Themes → Main Theme**
Click on the Main Theme **Global Theme** to edit our global theme
A live view of your Curator site will appear on the screen. We recommend logging into the front end on a separate screen
before making any changes so that you can see the changes you make on your Curator site. Keep in mind that your admin
account is separate from the front end accounts. Your credentials may be different based on how you choose to
authenticate your users. If you are not able to log into the front end then click **Settings** → **Security** →
**Authentication Settings** to see how your front end user credentials are being pulled in.
**Live preview:**
**On the left-hand side:**
* **Rename your Curator Site** (e.g. ACME Analytics Portal)
* **Upload a logo**
* File formats supported: .jpg, .png, .gif, .svg
* Curator is flexible with image sizes but we recommend wider over taller logos
* Logo padding by entering pixels or percentages (Ex: 15px or 20%)
* Tip: use negative padding if you are trying to increase the size of your image
* **Upload a favicon**- the icon used in the browser tab
**Favicon example:**
**Logo and Favicon Settings:**
**Click Save button on the top right or press enter.**
## Updating the Navigation Bar
Click on the **Menu** tab
On the left-hand side you’l see various options.
* **Main Menu**
* This lets you inter-change different main menu objects you may have created
* For now, leave this as default
* **Navigation Type**
* This lets you alter the location of the menu whether Top Navigation, Mega Menu or Side Navigation
* **Navigation Background Color**
* **Navigation Text Color**
* **Navigation Highlight Color**
There’s other navigation options as well below, but for now, we’ll stick to these main ones.
## Other Settings
There’s a whole host of other settings including:
**Brand**- Site Name, Site Logo and Icons
**Home**- Default home page settings
**Global**- Search, Alerts, Mobile Settings
**Fonts**- Customizable font options
**Menu**- Menu design settings
**Titles & Toolbar**- Pages titles and toolbar settings
**Dashboards**- Dashboard tabs
**Pages**- Tile styles, tutorial styles, button options, page margins
**Footer**- Footer options
# Accessing the Backend
Source: https://docs.curator.interworks.com/site_administration/accessing_the_backend
Learn how to access the backend of Curator for configuration and management tasks.
To access the backend administration area of your Curator instance, you will need to log in with an account that has
administrative privileges. Typically this is created in the [initial setup](setup/installation/linux_installation) of
your Curator instance, or by an [existing administrator](site_administration/backend_administrators/overview).
### Logging into the Backend
1. Open your web browser and navigate to the backend URL of your Curator instance. This is usually in the format:
`https://www.yourcuratorexample.com/backend`.
2. Enter your administrator username and password in the login form.
# Activity
Source: https://docs.curator.interworks.com/site_administration/activity/activity_overview
Explore how much your portal is used, when, by whom, and what content is being viewed or ignored.
The Activity page answers the questions an administrator asks about Curator, in the order they come up: how
much is it used, when, what do people look at, who uses it, and who is being turned away. Every panel responds
to one shared set of filters at the top of the page, and every panel can be read as a table, downloaded as a
CSV file, or fetched from the API.
The Activity page is available to backend administrators who have been granted at least one core
Curator permission, for example **Manage Curator Settings**. See
[Backend Administrator Permissions](/site_administration/backend_administrators/permissions)
for the full list of permissions and what each one controls.
To pull this data into your own reporting instead of reading it here, see
[Retrieving Usage Data](/site_administration/activity/retrieving_usage_data).
The page follows your browser's color scheme.
## Filtering the view
The filter bar narrows every panel to a time period, a content type, a single content item, or a single user.
All panels update as soon as a filter changes.
* **Date Range** selects a start and end date. When no range is set, the page shows the last 30 days.
* **7d / 30d / 90d / 12m** are quick ranges that end today.
* **Content Type** narrows the page to one platform, for example Tableau dashboards or Pages.
* **Content** narrows the page to one item. The list holds the 100 most viewed items.
* **User** narrows the page to one person.
Click **Reset** to clear every filter.
Two panels cannot honor the content filters, because the data behind them records a requested path or a login
rather than a content item: the **Logins** and **Access denied** figures. When a content filter is active, those
panels show an "All content" note so the number is never read as filtered.
## Reading, downloading, and fetching a panel
Every panel has three buttons in its header:
* **Table** shows the same numbers as a plain table. Click **Table** again to return to the chart.
* **CSV** downloads the table as a CSV file with the current filters applied. The link can be bookmarked or
shared with another administrator, who must be signed in to the backend to use the link.
* **API** copies the panel's API URL to your clipboard with the current filters applied. Add your API key as
the `apikey` parameter before you use the URL. See [Activity API](/curator_api/api_docs/activity) for the
parameters and the response format.
Hover any bar, cell, tile, or line to read its exact value.
## How much is Curator being used?
Four headline figures compare the selected range with the period of the same length that came right before
it. For a 30-day range, the comparison is the 30 days before that.
* **Views** counts every content view, including views by visitors who were not signed in.
* **Viewers** counts distinct signed-in users who viewed something.
* **Logins** counts sign-ins from the usage log.
* **Access denied** counts requests that were sent to the Access Denied page. For this figure, up is bad, and
the color reflects that.
The **Views over time** chart draws the selected range in teal and the previous period in gray, aligned day
for day so the two lines can be compared directly. Use **Day**, **Week**, and **Month** to change the
aggregation. Week needs a range of at least 7 days and Month at least 30. Hover the chart to read both values
for any point, or click **Table** on any panel to see the same numbers as a table.
## When do people use it?
A weekday by hour heatmap shows the average number of views in each hour slot, in the timezone Curator is
configured to use. Each
cell divides its total by the number of times that weekday falls inside the selected range, so a range that
holds two Mondays and one Sunday does not make Monday look twice as busy. A sentence under the grid names the
busiest slot and the busiest day. Use this panel to choose maintenance windows and extract refresh times.
## What are they looking at?
* **Most viewed content** lists the top 25 items. Click a row to focus the whole page on that item, and click
the row again to clear the focus.
* **Views by content type** shows how views split across platforms, with the count and share for each.
* **Not viewed** counts the items of each content type that received no views in the selected range, and lists
them in its table with the last time each was ever viewed. Use the panel to find content to retire. This panel
ignores the content and user filters, because "not viewed" only makes sense across everything.
## Who is using it?
* **Most active viewers** lists the top 10 signed-in users. Click a row to focus the page on that user.
* **Views per viewer** groups signed-in viewers by how many views they made (1, 2 to 5, 6 to 20, 21 or more)
and shows what share of all signed-in viewing each group carried, so you can tell whether usage is broad or
carried by a few power users. The user filter does not apply to this panel.
* **Audience** places every account that existed by the end of the range into exactly one group:
* **New viewers** made their first ever view in the range.
* **Returning viewers** viewed before the range and again inside the range.
* **Dormant** viewed before the range but not inside the range.
* **Never viewed** have no views on record, including accounts that only signed in.
The headline percentage is new plus returning viewers divided by the accounts that existed by the end of the
range, so a historical range is not diluted by accounts created later. The figure counts registered accounts,
not licensed seats. A separate line reports how many accounts were created in the range.
## Who is being turned away?
* **Access denied per day** charts denials over the range. A sudden rise usually follows a permission or menu
change.
* **Who was denied, and where** groups denials by requested path and user, most attempts first, with the last
time each pair was seen. Visitors who were not signed in appear as "system (frontend)".
When nobody was denied access in the range, both panels say so.
# Retrieving Usage Data
Source: https://docs.curator.interworks.com/site_administration/activity/retrieving_usage_data
Export Curator usage and activity data programmatically using the Curator API.
The [Activity](/site_administration/activity/activity_overview) page reports on usage inside a single
portal. When you want that same data in your own warehouse, BI tool, or reporting process, read it
through the Curator API instead.
Everything below uses the Data Manager read endpoints, documented in full at
[Data Manager](/curator_api/api_docs/data_manager).
## Before you start
Each portal stores its own data. There is no combined endpoint across portals, so a multi-portal
deployment calls each portal in turn and combines the results downstream.
The set of readable tables is assembled from the plugins installed on a portal, so it varies by Curator
version. Ask a portal what it supports rather than assuming:
```
[your_domain]/api/v1/datamanager/getDataTables?apikey=[your_api_key_here]
```
Treat an API key like a password. Store it outside your scripts, and never paste a URL containing a
real key into a support ticket, a shared document, or a source repository.
## Content views
`interworks_usermgmt_content_view` is the table behind the Activity page. One row is written each time a
user opens a piece of content.
```
[your_domain]/api/v1/datamanager/getData?apikey=[your_api_key_here]&table=interworks_usermgmt_content_view
```
**Example Response:**
```JSON theme={null}
{
"result": "Success",
"data": [
{
"id": 4821,
"frontend_user_id": 112,
"username": "jane.smith",
"viewable_content_type": "InterWorks\\TableauViz\\Models\\Dashboard",
"viewable_content_id": 37,
"request_root": "https://curator.example.com",
"request_path": "/dashboard/sales-overview",
"request_query": null,
"created_at": "2025-02-19 16:11:10",
"updated_at": "2025-02-19 16:11:10"
}
]
}
```
The columns that matter for reporting:
| Column | What it holds |
| ----------------------- | ----------------------------------------------------------------------------------------- |
| `frontend_user_id` | The Curator user who viewed the content. Join this to `listUsers` below. |
| `username` | The username captured at view time, kept even if the user is later removed. |
| `viewable_content_type` | The model class of the content, for example `InterWorks\TableauViz\Models\Dashboard`. |
| `viewable_content_id` | The ID of the content within that type. |
| `request_path` | The path the user requested, useful when the same content is reachable more than one way. |
| `created_at` | When the view happened. Sort and page on this column. |
`viewable_content_type` and `viewable_content_id` together identify the content. Read the matching
content table, such as `interworks_tableauviz_dashboards` or `interworks_content_pages`, to turn that
pair into a title.
### Summary table
`interworks_usermgmt_content_view_summary` holds one row per user and content item, with a
`last_visited` timestamp instead of individual views. Use it when you want current totals rather than a
full event history, since it is much smaller than the view table.
### Favorites
`interworks_usermgmt_favorite` records which content users have marked as a favorite. It pairs well with
content views when you are measuring engagement rather than traffic.
## Users
Content view rows identify a user by ID and username. Pull the rest from the User API:
```
[your_domain]/api/v1/user/listUsers?apikey=[your_api_key_here]&num=100&pg=1
```
Each user comes back with their groups and their `analytics_id`. That `analytics_id` is the same
non-personal identifier Curator sends to your analytics platform, so it is the key that lets you combine
API exports with the analytics approach described below.
See [User API](/curator_api/api_docs/user_api) for the full endpoint.
`listUsers` covers frontend users and their groups. Backend administrator accounts are not exposed
by any API endpoint. If you need an inventory of backend administrators, read it from
[Backend Administrators](/site_administration/backend_administrators/overview) in the portal
backend.
## Administrator activity
Content views cover what your frontend users opened. To see what administrators did in the backend, read
the usage log:
```
[your_domain]/api/v1/datamanager/getData?apikey=[your_api_key_here]&table=interworks_portal_usage_log
```
Filter to `is_frontend = 0` for actions taken in the portal backend. Each row records the action `type`,
the `username` behind it, and a `details` payload describing what changed.
| Column | What it holds |
| ------------- | ------------------------------------------------------------------------------------------------------------- |
| `type` | The action, such as `interworks.portal.api_key.create` or `interworks.portal.upgrade`. |
| `username` | Who acted: a backend login, `system` for scheduled and console work, or `API (...key owner)` for an API call. |
| `is_frontend` | `0` for backend, console, and API activity, `1` for frontend activity. |
| `details` | Action-specific data, including a `_changes` set on edits. |
| `created_at` | When the action happened. Sort and page on this column. |
Secrets are masked before they reach this table. An API key appears only as its last four characters,
which is enough to tell two keys apart, and passwords are removed entirely. Older portals stored some
of these values in full, and the upgrade that introduced the masking also rewrites those earlier rows.
Because the usage log records administrator actions, treat an export of it as sensitive and restrict who
can read it, the same way you would the backend itself.
## Paging
The default page size is 1000 rows, and requests carrying an `apikey` are rate limited. Page through a
busy portal rather than requesting everything at once, and sort on `created_at` so paging stays stable
while new rows arrive:
```
[your_domain]/api/v1/datamanager/getData?apikey=[your_api_key_here]&table=interworks_usermgmt_content_view&sort_column=created_at&limit=1000&offset=0
```
Increase `offset` by `limit` on each call until a request returns fewer rows than the limit.
## Reporting across several portals
Curator has no cross-portal roll-up. Two approaches work, and they combine well:
1. **Call each portal and union the results.** Add a portal identifier as you load each response, since
IDs are only unique within a portal. This gives you the same detail the Activity page shows.
2. **Point every portal at one analytics property.** Configure the same Google Analytics 4, Google Tag
Manager, or Matomo property on each portal so page views and Dashboard events land in a single place
already combined. See
[Analytics Tracking](/site_administration/analytics_tracking/analytics_tracking).
Because Curator sends the user's `analytics_id` with each analytics event, and `listUsers` returns that
same ID, you can map analytics activity back to a named Curator user when you need to.
# Data Manager Notifications
Source: https://docs.curator.interworks.com/site_administration/admin_email_notifications/data_manager_notifications
Set up email notifications for Data Manager form submissions to stay informed of user data input and feedback.
To stay up-to-date on the data being submitted to Curator you can subscribe multiple users to receive email
notifications immediately after a form has been submitted. These emails will also contain the data from the
form that has been submitted, allowing you to instantly review anything that comes in: whether it's a Contact
Us form, a Feedback form, or tracking your users favorite pizza, you'll know right away!
**NOTE**: Email configuration on Curator is required to use this email notification system. If you have not
configured email on your Curator instance, please get in touch with your email administrator and [use these instructions](/setup/email/email_configuration)
to set up email.
## Enabling Data Manager Email Notifications
1. Login to the backend of your Curator instance (e.g. `https://www.curatorexample.com/backend` ).
2. Navigate to the **Data Manager** > **Data Groups** section from the left-hand menu.
3. Click on the Group you would like to add an email to.
4. Toggle ON the switch labelled "Email submissions"
5. This will display a repeater that you can add individual emails to. Populate them one-at-a time.
6. Click the "Save" button.
**NOTE**: If the Data Group has "Send to Webhook" enabled with a webhook selected, new submissions go to that webhook
and are not saved to Curator. No notification email is sent. See
[Sending Data to Webhooks](/embedding_using_analytics/data_manager/sending_data_to_webhooks) for details on that
option.
# System Notifications
Source: https://docs.curator.interworks.com/site_administration/admin_email_notifications/system_notifications
Configure automated email notifications for system alerts, issues, and maintenance updates to improve Curator instance management.
To ensure you are able to easily manage your Curator instance without having to check-in all the time, you
can subscribe to emails that generate from Curator's notification system. These emails will scan Curator's
running list of issues, suggestions and to-do items that will ensure you have more visibility into your
Curator instance making management easier and increasing stability.
**NOTE**: Email configuration on Curator is required to use this email notification system. If you have not
configured email on your Curator instance, please get in touch with your email administrator and [use these instructions](/setup/email/email_configuration)
to set up email.
## Enabling Email Notifications
1. Login to the backend of your Curator instance (e.g. `https://www.curatorexample.com/backend` ).
2. Navigate to the **Settings** > **Curator** > **Portal Settings** section from the left-hand menu.
3. Click on the "Notifications" tab at the top of the page.
4. Toggle ON the switch labelled "Send Curator Digests"
5. This will display scheduling options. Choose your weekly/daily/monthly scheduling options, and whiter or
not you'd like immediate notifications for new alerts.
6. Click the "Save" button.
## Subscribing to and Un-Subscribing from Email Notifications
There are two ways to manage who receives the admin digest. Subscribing a backend user is always done
from their profile (the first method below); un-subscribing can be done either from the user's profile or
directly from the recipients list on the Notifications tab.
### From the Backend Administrator's profile
1. Login to the backend of your Curator instance (e.g. `https://www.curatorexample.com/backend` ).
2. Navigate to the **Settings** > **Curator** > **Backend Administrators** section from the left-hand menu.
3. Click on the User whose settings you would like to change.
4. Check or un-check the "Subscribe to admin digest" checkbox.
5. Click the "Save" button.
### From the recipients list on the Notifications tab
1. Login to the backend of your Curator instance (e.g. `https://www.curatorexample.com/backend` ).
2. Navigate to the **Settings** > **Curator** > **Portal Settings** section from the left-hand menu.
3. Click on the "Notifications" tab at the top of the page.
4. Under **Backend Admin Recipients** you will see one row for each backend user currently subscribed to
the admin digest. Click the **X** on a row to un-subscribe that user, then click the "Save" button.
**NOTE**: This list mirrors the "Subscribe to admin digest" setting on each backend user, so removing a
row un-checks that user's checkbox. Adding a recipient is only done from the Backend Administrator's
profile (the first method above). At least one administrator must remain subscribed -- if you try to remove
the last subscribed admin, the save is rejected with a validation error, so subscribe another admin first.
### Recipients without a backend account
Digests can also go to people who do not have a backend account. Add their address to the "Additional
Non-Curator-Admin Emails" field on the "Notifications" tab of **Settings** > **Curator** > **Portal Settings**. Click
the "Save" button when you are done.
# Analytics Tracking
Source: https://docs.curator.interworks.com/site_administration/analytics_tracking/analytics_tracking
Configure web analytics tracking in Curator using Google Analytics, Google Tag Manager, or Matomo to monitor user engagement and dashboard interactions.
Curator supports integration with popular web analytics platforms so administrators can track page views, user
engagement, and Dashboard interactions. Analytics tracking is configured in the Curator backend under
**Portal Settings > Analytics**.
## Supported Platforms
Curator supports the following analytics platforms. You can enable one or more simultaneously:
| Platform | Tracking Method | User Identification |
| -------------------------------------- | --------------------------------------------------- | ---------------------------------------------------------- |
| Google Analytics (Universal Analytics) | Page views and custom events via `analytics.js` | Not sent |
| Google Analytics 4 (GA4) | Page views and custom events via `gtag.js` | `user_id` set to non-PII `analytics_id` UUID |
| Google Tag Manager (GTM) | Container-based tag management | `user_id` pushed to `dataLayer` as the `analytics_id` UUID |
| Matomo | Page views, events, and site search via `matomo.js` | `setUserId` set to non-PII `analytics_id` UUID |
## Configuration
Navigate to **Portal Settings > Analytics** in the Curator backend. All fields are optional. Fill in only the
fields for the platform(s) you use.
### Google Analytics (Universal Analytics)
**Google Analytics Tracking ID (Universal Analytics)** — Your Universal Analytics tracking ID
(e.g., `UA-XXXXXXXX-X`). Enables the `analytics.js` tracker, which sends an automatic page view on each
page load.
Universal Analytics was sunset by Google in July 2024. If you are setting up analytics tracking for the first
time, use Google Analytics 4 or Google Tag Manager instead.
### Google Analytics 4 (GA4)
**Google Analytics Tracking ID (Google Analytics 4)** — Your GA4 measurement ID
(e.g., `G-XXXXXXXXXX`). Enables the `gtag.js` tracker with automatic page views. If a user is logged in,
their non-PII `analytics_id` UUID is sent as the `user_id` property. See
[Correlating an `analytics_id` Back to a Curator User](#correlating-an-analytics_id-back-to-a-curator-user) for how
to look up the Curator user behind a UUID.
### Google Tag Manager (GTM)
**Google Analytics Tag Manager Container ID** — Your GTM container ID (e.g., `GTM-XXXX`). Loads the GTM
container script on every page. If a user is logged in, their non-PII `analytics_id` UUID is pushed to the
`dataLayer` as `user_id` before the container loads.
When using Google Tag Manager, you manage your analytics tags (including GA4) within GTM itself. You do not
need to also fill in the GA4 field unless you want a separate, direct GA4 integration outside of GTM.
### Matomo
* **Matomo Server URL** — The URL of your Matomo instance (e.g., `//matomo.example.com/`). Must include a
trailing slash.
* **Matomo Site ID** — The numeric site ID configured in your Matomo instance (e.g., `1`).
* **Enable Matomo Heartbeat** — When enabled (default: on), Matomo tracks actual time spent on the page by
monitoring whether the browser tab is active and in focus.
Both the Matomo Server URL and Matomo Site ID must be provided for Matomo tracking to activate. If a user is
logged in, their non-PII `analytics_id` UUID is sent via `setUserId`. Matomo link tracking and download
tracking are enabled automatically.
## Tracked Events
When analytics is configured, Curator automatically tracks user interactions as events. All events are sent to
every enabled analytics platform. Events use the category **Dashboard** and include the following actions:
| Event | Description |
| --------------------------------- | ---------------------------------------- |
| Custom View Applied | User applied a saved Custom View |
| Custom View Created | User created a new Custom View |
| Custom View Made Private | User changed a Custom View to private |
| Custom View Made Public | User changed a Custom View to public |
| Custom View Removed | User deleted a Custom View |
| Custom View Set as Default | User set a Custom View as the default |
| Data-Driven Alert Ceded | User left a data-driven alert |
| Data-Driven Alert Joined | User joined a data-driven alert |
| Download Workbook | User downloaded a workbook |
| Exported All Summary Data | User exported all summary data |
| Exported CSV | User exported data as CSV |
| Exported Data | User exported data |
| Exported Excel | User exported data as Excel |
| Exported Image | User exported a Dashboard as an image |
| Exported PDF | User exported a Dashboard as PDF |
| Exported Powerpoint | User exported a Dashboard as PowerPoint |
| Exported Tableau-based Powerpoint | User exported a Tableau-based PowerPoint |
| Exported Workbook Summary Data | User exported workbook summary data |
| Favorited | User favorited a Dashboard |
| Filter Applied | User applied a filter |
| Fullscreen | User entered fullscreen mode |
| Parameter Applied | User applied a parameter |
| Paused | User paused automatic updates |
| Powerpoint New Slide | User added a new PowerPoint slide |
| Powerpoint Slide Deleted | User deleted a PowerPoint slide |
| Powerpoint Slides Cleared | User cleared all PowerPoint slides |
| Print Dashboard Image | User printed a Dashboard image |
| Refresh Timer Start | User started an automatic refresh timer |
| Shared | User shared a Dashboard |
| Unfavorited | User unfavorited a Dashboard |
| Unpaused | User resumed automatic updates |
### Site Search Tracking
Curator also tracks site searches when a user uses the search feature:
* **Google Analytics 4:** Tracked using the built-in `search` event with a `search_term` parameter.
* **Matomo:** Tracked using the `trackSiteSearch` API with the search term, category, and result count.
* **Google Analytics (Universal Analytics):** Tracked as a page view to `/search?q={searchTerm}`. This only
applies when Beta Search is enabled, since the `/search` route does not exist under the standard search.
### Custom Dimensions
Events include custom dimensions that provide additional context. These dimensions are sent when available:
| Dimension | GA4 Parameter | Matomo Dimension |
| --------- | ---------------------------- | ---------------- |
| User | `custom_parameter_user` | `dimension4` |
| Value | `custom_parameter_value_str` | `dimension3` |
| Workbook | `custom_parameter_workbook` | `dimension1` |
| Worksheet | `custom_parameter_worksheet` | `dimension2` |
For Matomo, custom dimensions must be configured in your Matomo instance with matching dimension IDs for the
data to be recorded correctly.
## User Identification with `analytics_id`
Curator sends a stable, non-PII UUID called `analytics_id` to GA4, GTM, and Matomo instead of the Curator
username. Usernames are often email addresses or real names, which Google Analytics' Terms of Service
prohibit sending as `user_id`. The `analytics_id` UUID avoids that restriction while still letting
administrators correlate analytics activity to a specific Curator user.
Key points:
* Every Curator frontend user has exactly one `analytics_id`, generated automatically when the user is
created.
* The value is stable: it never changes for the life of the user record, so dashboards and audiences in
GA4/Matomo remain consistent across sessions.
* Existing users were backfilled with an `analytics_id` during the upgrade migration, so no manual setup is
required.
### Correlating an `analytics_id` Back to a Curator User
When you see a UUID in GA4, GTM, or Matomo and need to identify the underlying Curator user, query the
Curator User API. The `analytics_id` is included in the response of:
* `fetchUser` — current logged-in user
* `getUser` — user by token or `user_id`
* `listUsers` — paginated user list (use this to map UUIDs in bulk)
* `/user/info` — mobile auth response
For example, to pull a single page of users and their `analytics_id` values:
```bash theme={null}
curl -H "Authorization: Bearer " \
"https://curator.example.com/api/user/listUsers?num=100&pg=1"
```
Each user entry in the response includes `frontend_user_id`, `name`, `full_name`, `email`, and
`analytics_id`. Match the UUID you saw in GA4/Matomo to the `analytics_id` field to find the user.
For one-off lookups directly against the database, you can also query the `interworks_usermgmt_front_users`
table:
```sql theme={null}
SELECT id, name, full_name, email
FROM interworks_usermgmt_front_users
WHERE analytics_id = '';
```
## Internal Logging
In addition to sending events to external analytics platforms, Curator logs all analytics events internally using
its client-side logging utility. These log entries are visible in the browser developer console when client-side
logging is enabled, which can be helpful for verifying that events are firing correctly during setup.
## Limitations
The events listed under [Tracked Events](#tracked-events) are the Dashboard-category interactions Curator sends to
your analytics platforms. Aside from those events, clicks on top-level primary nav file-type menu items also send
a **File / Download** event (see [Navigation and Menu Clicks](#navigation-and-menu-clicks) below). The vertical
side nav is included because it renders through the primary nav template (`menu::primarynav`); the horizontal side
nav is a separate code path that does not emit this event. Other interactions not in the list above are not
reported as Curator analytics events.
### Link Clicks and File Downloads
Curator does not fire its own analytics events for clicks on standard HTML links. File downloads triggered from
file-type menu items are a special case: Curator sends a **File / Download** event for them to some platforms, as
described below. How these interactions are captured depends on the platform:
* **Google Analytics 4 / Google Tag Manager** — Curator does not send link-click or file-download events to GA4
or GTM. If your GA4 property has **Enhanced Measurement** enabled, GA4 may automatically capture outbound link
clicks and file downloads. This is a GA4 property-level feature configured in your Google Analytics account,
not a Curator feature, and its behavior depends entirely on your GA4 configuration.
* **Google Analytics (Universal Analytics)** — Curator does not send link-click events, but it does send a
**File / Download** event (category `File`, action `Download`) when a user clicks a top-level primary nav
file-type menu item — including the vertical side nav, which renders through the primary nav template
(`menu::primarynav`), but not the horizontal side nav — as long as the Universal Analytics tracker (`ga`) is
loaded. File-type items nested inside dropdown menus do not fire this event.
* **Matomo** — Curator enables Matomo's automatic link tracking and download tracking. Outbound link clicks are
recorded by Matomo, and downloads — including clicks on top-level primary nav file-type menu items (and the
vertical side nav, which renders through the primary nav template `menu::primarynav`, but not the horizontal
side nav) — are tracked for elements Curator tags with the `tracking_download` CSS class. File-type items nested
inside dropdown menus are not tagged and are not tracked.
Clicks that originate **inside an embedded iframe** — such as links or controls within a Tableau or Power BI
embed — cannot be captured by any script on the Curator page. Embedded dashboards are served from a different
origin, so the browser's same-origin policy prevents Curator's analytics integration, GA4 Enhanced Measurement,
Matomo link tracking, and any other page-level script from seeing interactions inside the frame.
### Navigation and Menu Clicks
Clicks on standard navigation and menu links are not sent as analytics events. Page views are recorded
automatically on each page load, so movement between pages is still reflected in your analytics, but the click
on the menu item itself is not reported as a separate event.
The exception is **top-level primary nav file-type menu items**: these are tagged with the `tracking_download`
CSS class, so a click fires a **File / Download** event (category `File`, action `Download`) to Matomo and to
Universal Analytics. Google Analytics 4 and Google Tag Manager do not receive this event. The vertical side nav
is included because it renders through the primary nav template (`menu::primarynav`); the horizontal side nav is
a separate code path (`sidenav.htm`) that builds menu items without a `url` key, so its file-type test never
resolves and no **File / Download** event fires for it at any depth.
File-type items nested as children under a primary nav parent are rendered through the dropdown template and do
not receive the `tracking_download` class, so no **File / Download** event fires for them.
## Custom Tracking Scripts (e.g., HotJar, FullStory)
Curator does not have built-in settings for session-recording or heatmap tools such as HotJar or FullStory.
You can still add these tools using either of the two mechanisms below.
### Through Google Tag Manager (recommended)
If you have configured a **Google Analytics Tag Manager Container ID** in **Portal Settings > Analytics**, add
the third-party script as a tag inside your GTM container. This keeps every custom script managed in one place.
1. Confirm a **Google Analytics Tag Manager Container ID** is set in **Portal Settings > Analytics**.
2. In your GTM container, create a new **Custom HTML** tag and paste in the tool's tracking snippet.
3. Set the tag's trigger to **All Pages**.
4. Submit and publish the GTM container.
### Through the theme Head Insert
If you are not using Google Tag Manager, you can paste a tracking snippet directly into the **Head Insert** field
found under the theme's custom styles settings in the Curator backend. The contents of this field are rendered
inside the `` of every page. This is a good fit when you only need to add a single script and do not want
to set up a GTM container.
1. On the theme's **Global** tab, turn on **Enable Custom Styles (CSS / HTML inserts)**. This toggle is off by
default. While it is off, the **Head Insert** field's label gains a **(Disabled)** suffix and a warning comment
is shown beneath it; content pasted there is still not applied to the page until the toggle is on.
2. Open the **Custom Styles** tab (it is always visible) and paste the tool's tracking snippet into the
**Head Insert** field.
3. Save the theme.
The **Head Insert** field is parsed as Twig before it is emitted into the page, so any `{{`, `{%`, or `{#`
sequences in a pasted vendor snippet are interpreted as Twig rather than passed through as literal text. If your
snippet contains those sequences (for example, a templating library's own placeholder syntax), it will not render
verbatim and may fail silently. Add the script through Google Tag Manager instead, or escape the Twig delimiters
using `{% verbatim %}...{% endverbatim %}`.
Both approaches inject the tool's own script into the page. As with Curator's built-in analytics, these scripts
run on the Curator page itself and cannot observe interactions inside embedded Tableau or Power BI iframes.
# Overview
Source: https://docs.curator.interworks.com/site_administration/backend_administrators/overview
Manage backend administrator accounts, permissions, and access levels separate from Tableau Server users.
Backend Administrators accounts are separate from Tableau Server users and only exist on Curator.
Permissions can be customized for a backend user to allow for a range of access.
New permissions become available as you enable "Features" and must be enabled for older users if applicable.
**To manage backend users:**
1. If a backend user is unable to view menu items, it is possible they do not have the appropriate backend
permissions. These permissions can be edited using the following steps. If the "Backend Administrators" menu
item is not visible, it is likely that user does not have the necessary permissions. A backend admin with
access to "Backend Administrators" will need to update the permissions for the other user.
2. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`).
3. Log in if prompted.
4. Click on **Settings** > **Curator** > **Backend Administrators** in the left navigation.
5. Click on the "New Backend User" button to create a new user, or click on an existing user to modify user details or permissions.
When creating a new user, the **Send Account Creation Email** toggle (enabled by default) sends a notification
email to the new administrator with their account details. Disable it to skip the email for that user, which is
useful when you intend to share credentials with the new administrator out-of-band.
The **Password** and **Confirm Password** fields each have an eye icon at their right edge. Click it to reveal what
you have typed, and click it again to hide it. This only ever shows text you typed in the current session --
both fields are always empty when the form loads, so an existing password is never revealed.
## SAML Integration
Curator can integrate backend users with the same SAML authentication that is being used on the front-end.
In order for this to work, set up your environment following the steps below:
1. Ensure your [SAML authentication](/setup/authentication/okta_saml)
has been set up properly.
2. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
3. Navigate to the **Settings** > **Curator** > **Portal Settings** section from the left-hand menu.
4. Click on the **General** tab and expand the Security section.
5. Toggle the switch to enable "Force Backend Users to Login Via Frontend Authentication Forms" then click save
After this you can create users normally, and when they visit the backend of Curator they will be redirected
to log in via SAML, then re-routed to the backend.
*Note:* You can create backend users as normal following the steps above (including a password)
however users will not be able to log in via these credentials due to *Force Backend Users to Login Via
Frontend Authentication Forms* being enabled.
Only backend usernames matching frontend usernames will be able to access Curator's administrative interface.
Compare the two by checking the Frontend User section and Backend User section.
### Using Frontend Users as Backend Users
Curator can use the same Portal Settings as SAML to allow Frontend Users to login to the backend as well.
This will restrict backend users who don't have a corresponding frontend user.
In order for this to work, set up your environment following the steps below:
1. Ensure your chosen Authentication Type is set up properly, and sign in with a frontend user of your choice.
2. Create a backend user with account info that matches the frontend user you just used.
3. Sign out of both the frontend and the backend.
4. Login to only the frontend with the corresponding account.
5. Go to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
6. It should sign you in automatically. You should then enable *Force Backend Users to Login Via
Frontend Authentication Forms*.
7. This should enable frontend users to sign into the backend automatically with the same account.
*Note:* In order to access the backend, a given frontend user will have to have a backend account manually made
by an existing backend user.
## Backend Preferences
Each backend administrator has personal preferences that can be configured by clicking on their name in the top-right
corner of the backend and selecting **My Account**, then navigating to the **Preferences** tab.
### Timezone
The **Timezone** preference controls how dates and times are displayed in the backend interface for that specific
administrator. For example, datetime picker fields (such as the Cron Debug Mode expiration) will display times
converted to this timezone.
This setting only affects the display of dates and times in the backend UI. It does not affect when cron jobs run or
when Scheduled Reports are delivered. Those are controlled by the
[Cron Timezone](/embedding_using_analytics/report_builder/scheduled_reports#global-cron-timezone) setting in Portal
Settings.
### Locale
The **Locale** preference controls the language used in the backend interface for that administrator.
### Appearance
The **Appearance** control sets whether the backend uses a light or a dark color scheme. Unlike Timezone and Locale,
it lives in the account dropdown itself rather than the **Preferences** tab: click your name in the top-right corner
of the backend and the control appears above **Sign out**.
It offers three options, and clicking one applies it immediately:
| Option | Behavior |
| ---------- | -------------------------------------------------------------------------------- |
| **System** | Follows the light or dark setting of your operating system. This is the default. |
| **Light** | Always uses the light color scheme, whatever your operating system is set to. |
| **Dark** | Always uses the dark color scheme, whatever your operating system is set to. |
This choice is remembered per browser rather than on your administrator account, so it does not follow you to a
different browser or device. Setting it on your laptop will not change the backend's appearance when you sign in from
another computer.
# Password Reset
Source: https://docs.curator.interworks.com/site_administration/backend_administrators/password_reset
Reset backend administrator passwords through self-service or administrative override when access is lost.
Forget your backend administrator password?
A Curator backend administrator user's password can easily be reset by other users who have Backend User access.
## No one left to reset your password?
If there is no one else with administrative access to the system, the account can also be reset using the steps below.
1. Connect to the server running Curator. (Windows: RDP, or with Linux: SSH)
2. Open a command prompt \[Windows Only, Linux will start in a command prompt.]
3. Change to the webroot directory where Curator is installed.
Here are some examples:
* **Windows (Apache: Standard):**
```Apache theme={null}
cd C:\InterWorks\Curator\htdocs;
```
* **Windows (IIS: Legacy):**
```Windows theme={null}
cd C:\InterWorks\Curator\wwwdata;
```
* **Linux:**
```Linux theme={null}
cd /var/www/html;
```
4. Run "artisan" to reset the administrative user:
```PHP theme={null}
php artisan winter:passwd
```
# Backend Administrator Permissions
Source: https://docs.curator.interworks.com/site_administration/backend_administrators/permissions
Reference for all available backend administrator permissions and what each one controls.
Each backend administrator can be assigned a subset of permissions to limit their access to only the areas they need.
Permissions are set per-user from **Settings** > **Curator** > **Backend Administrators**.
Some permissions are only visible when certain features or integrations are enabled on your Curator instance. So in
case you don't see the corresponding menu item on the left-hand navigation, it is because you don't have that feature currently enabled.
## Central Dispatch
| Permission | Description |
| ---------------------------------- | ---------------------------------------------------------------------------------------- |
| **Central Dispatch Administrator** | Full access to all Central Dispatch features for managing distributed Curator instances. |
| **Managed Instance Cache** | Manage cache operations across managed Curator instances. |
| **Managed Instance Upgrades** | Manage software upgrades across managed Curator instances. |
## Content
| Permission | Description |
| --------------------------- | -------------------------------------------------------------- |
| **Manage External Feed** | Configure external data feeds. |
| **Manage Files** | Upload and manage media files and documents. |
| **Manage Fonts** | Upload and manage custom fonts. |
| **Manage Keywords** | Manage searchable keywords and tags. |
| **Manage Loading Screens** | Configure loading screen messages and visuals. |
| **Manage Navigation** | Configure menus and navigation structure. |
| **Manage Notices** | Create and manage system-wide notices shown to frontend users. |
| **Manage Pages** | Create and edit static content pages in the portal. |
| **Manage Terms of Service** | Edit and publish the Terms of Service agreement. |
| **Manage Tutorials** | Create and manage in-portal tutorial content. |
## Data Manager
| Permission | Description |
| ------------------------- | ------------------------------------------------------------- |
| **Manage Data** | View, add, edit, and delete Data Manager records. |
| **Manage Data Structure** | Define and modify Data Manager schemas and field definitions. |
## Integration
| Permission | Description |
| ---------------------- | --------------------------------------------------------------- |
| **Manage API Relay** | Configure the API relay for proxying requests to external APIs. |
| **Manage Commands** | Create and configure scheduled or event-driven commands. |
| **Manage Connections** | Configure connections to external services. |
| **Manage Scripts** | Create and edit integration scripts. |
| **Run Commands** | Execute commands manually. |
| **Run Scripts** | Execute integration scripts manually. |
## Security
| Permission | Description |
| ---------------------------------- | -------------------------------------------------------- |
| **Manage Authentication Settings** | Configure authentication methods including SSO and SAML. |
## Curator
| Permission | Description |
| --------------------------- | ---------------------------------------------------------------------------------------------- |
| **Manage API Keys** | Create, view, and revoke API keys for external integrations. |
| **Manage Curator Settings** | Edit global platform settings, including general configuration, branding, and feature toggles. |
| **Manage Curator Updates** | View and apply software updates. |
| **Manage URL Redirects** | Configure URL redirect rules within the portal. |
### MCP Tokens
MCP tokens need no dedicated permission. Every backend user can generate, edit, and revoke their own tokens
from **MCP Tokens** in the username dropdown. A token can only do what its owner can do, and each MCP tool
checks the owner's permissions when it runs. See [MCP](/curator_api/api_docs/mcp).
## Power BI
| Permission | Description |
| -------------------------- | ------------------------------------------------- |
| **Power BI Administrator** | Full access to all Power BI integration features. |
## Sigma
| Permission | Description |
| ----------------------- | ---------------------------------------------- |
| **Sigma Administrator** | Full access to all Sigma integration features. |
## Tableau
| Permission | Description |
| ----------------------------- | --------------------------------------------------------------------- |
| **Manage Tableau Dashboards** | Add, edit, and organize Tableau content in the portal. |
| **Manage Tableau Settings** | Configure the Tableau Server or Tableau Cloud connection. |
| **Manage Tableau Users** | Manage Tableau user provisioning and portal-to-Tableau user mappings. |
| **Tableau Status** | View the Tableau server status page. |
## ThoughtSpot
| Permission | Description |
| ----------------------------- | ---------------------------------------------------- |
| **Manage ThoughtSpot Users** | Manage ThoughtSpot user provisioning and access. |
| **ThoughtSpot Administrator** | Full access to all ThoughtSpot integration features. |
## Translator
| Permission | Description |
| ---------------------------- | --------------------------------------------------- |
| **Translator Administrator** | Full access to all Translator integration features. |
## User Management
| Permission | Description |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| **Manage Backend Users** | Create, edit, and delete backend administrator accounts and their permissions. Required to manage other admins. |
| **Manage Frontend Users** | Create, edit, and delete frontend (end-user) accounts. |
| **Manage SAML IdP Settings** | Configure SAML Identity Provider settings for single sign-on. |
## System
| Permission | Description |
| ------------------------------ | ----------------------------------------------------------------- |
| **Manage Backend Preferences** | Manage backend preferences and settings like Locale and timezone. |
| **Manage Mail Settings** | Configure outgoing mail server settings. |
| **Manage Mail Templates** | Edit email templates used for system notifications. |
| **View System Logs** | Access system, event, and error logs. |
# Updating License Key
Source: https://docs.curator.interworks.com/site_administration/license_key/updating_license_key
Update or add your Curator license key for new installations, migrations, or license renewals.
Adding or updating your license key is only required for new installations, or migrations that have failed to
carry over your license key. Typical license keys are allowed on up to 3 instances so long as only one
instance is used for Production. If you'd like to deploy multiple Curator sites, please talk to your Account
Executive about our Enterprise offering.
If you are reactivating your license as part of moving Curator onto new server hardware, see
[Moving Curator to a New Server](/upgrading_migration/migration/moving_to_a_new_server) for the full sequence
this step belongs to.
## How to Update your License Key
In order to add or update your license key, follow the steps below:
1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
2. Navigate to the **Settings** > **Curator** > **System Upgrade** section from the left-hand menu.
3. Click on the pencil "Update Key" link
4. Enter your license key and click "Save".
## Troubleshooting
If the license key fails to activate, work through the following checks to ensure your license is valid:
1. **Check your active instance count.** Standard license keys cover up to 3 instances (with only one in Production).
If you have retired an older instance — for example after a server migration — it may still count against the
limit.
Contact support to deregister the retired instance, or talk to your Account Executive about upgrading to our Enterprise offering if you need to run more than 3 instances concurrently.
2. **Copy and paste the key exactly.** Retyping the key by hand is the most common cause of activation failures.
Paste the key directly from the email or portal where you received it, and confirm there are no leading or
trailing spaces.
3. **Verify via CLI.** If the Curator backend is unavailable or inaccessible — for example on a fresh install that
has not yet been fully configured — set the key from the command line instead:
```bash theme={null}
php artisan curator:setkey your-license-key
```
If none of the above resolves the issue, [contact support](http://interworks.com/help). Please make sure to
include your Curator version, the license key you are attempting to activate, the URL of the instance,
and a screenshot of any error messages shown in the backend.
# Backend Logs
Source: https://docs.curator.interworks.com/site_administration/logging/database_logs
Database-stored logs accessible through the Curator backend including Usage Log, Event Log, Access Log, and Alert Log.
Backend logs are stored in the Curator database and can be viewed through the Curator backend interface. These
logs are designed for day-to-day monitoring and auditing by administrators who may not have direct server access.
## Usage Log
The Usage Log serves as an audit trail for your Curator instance, tracking who made what changes and when.
This includes configuration changes, content modifications, user management actions, and administrative
operations. The Usage Log is essential for compliance, security auditing, and troubleshooting issues
caused by configuration changes.
### Viewing the Usage Log
1.
2. Use the filters to search for specific users, date ranges, or action types.
### Usage Log Retention
The Usage Log retention period can be configured in Portal Settings:
1.
2. Find the **Usage Log Retention** setting.
3. Select the desired retention period (1 Month, 3 Months, 6 Months, or 12 Months).
4. Click **Save**.
Older usage log entries will be automatically purged based on this setting.
## Event Log
The Event Log records system events including errors, warnings, informational messages, and debug output.
This is the primary log for troubleshooting issues with your Curator instance.
The Event Log is stored in the database and mirrors the file-based System Log. In rare cases where
event log entries appear to be missing, the [System Log](/site_administration/logging/file_based_logs#system-log)
may contain additional information.
### Debug Modes
Curator provides several debug modes that can drastically increase the amount of logging in the Event Log.
These modes are useful for troubleshooting specific integrations or features:
* [Tableau Debug Mode](/creating_integrations/tableau_connection/tableau_connection_troubleshooting#how-to-enable-debug-mode) - Detailed logging for Tableau Server/Cloud communication
* [Power BI Debug Mode](/creating_integrations/power_bi_connection/troubleshooting_power_bi_access#enable-debug-mode) - Detailed logging for Power BI integration
* **Cron Debug Mode** - Detailed logging for scheduled tasks
* And others depending on your enabled features
Debug modes should typically only be turned on temporarily while troubleshooting, as they can
significantly increase the volume of log entries.
### Viewing the Event Log
1.
2. Click on any entry to view its details, including the full message and any associated context data.
### Redacted Values
Curator automatically removes sensitive values from Event Log entries before they are saved. Passwords,
password reset keys, session cookies, API keys, and authorization headers are replaced with `[redacted]`
in both the entry message and its detail data.
This happens for every entry, whichever part of Curator recorded it, so `[redacted]` appearing in place of
a value is expected and does not indicate a problem. If you are troubleshooting an issue that depends on
one of these values, reproduce it with a test account rather than looking for the original value in the log.
Redaction was added in Curator **2026.08-03**. Entries recorded before you upgraded may still contain
sensitive values.
### Download Debug Package
The Event Log page includes a **Download Debug Package** button that bundles various logs and system
information into a single downloadable archive. This package is useful when reporting issues to
InterWorks Support, as it includes:
* Recent event log entries
* System log files
* System configuration information
To download the debug package, click the **Download Debug Package** button in the toolbar on the Event Log page.
The logs in this package carry the same redaction described above, so credentials are not included in what
you send to InterWorks Support.
### Event Log Retention
The Event Log retention period can be configured in Portal Settings:
1.
2. Find the **Event Log Retention** setting.
3. Select the desired retention period:
* **Never (Manual)** - Logs are not automatically purged; use the Event Log interface to manually clear entries
* **1 Week** - Entries older than 7 days are automatically purged
* **2 Weeks** - Entries older than 14 days are automatically purged
* **1 Month** - Entries older than 30 days are automatically purged
* **3 Months** - Entries older than 90 days are automatically purged
4. Click **Save**.
When automatic purging is enabled, old event log entries are removed daily at 2:00 AM (server timezone).
## Access Log
The Access Log tracks backend administrator logins and activity. This is useful for security auditing and
compliance purposes.
### Viewing the Access Log
1.
2. Review administrator access history including login times and IP addresses.
## Alert Log
The Alert Log aggregates recurring system alerts into a single, manageable view. Rather than creating
duplicate event log entries for the same recurring issue, the Alert Log consolidates these alerts and
tracks how many times they have occurred.
### Viewing the Alert Log
Alert Log entries are displayed in two locations:
1. **Status Page** - Here you can see active alerts alongside other system health information.
2. **Alert Log List** - This provides a detailed view where you can:
* View all active, resolved, and suppressed alerts
* See occurrence counts and timestamps
* Mark alerts as resolved or suppressed
* Clear alerts in bulk
### Alert Statuses
* **Active** - The alert is current and requires attention
* **Resolved** - The underlying issue has been addressed
* **Suppressed** - The alert has been acknowledged but hidden from the active view
## Tracking end-user content views
The logs above are scoped to administration. The Usage Log records configuration and content changes, the
Event Log records system events and errors, and the Access Log records backend administrator logins. None of
them record which frontend user opened which Tableau, Power BI, or other BI Dashboard. If you are asked for
a "who viewed what" report, use one of the sources below instead.
### Curator Activity page
Curator writes one content view record each time a frontend user opens a piece of content, including Tableau
Dashboards, Power BI Reports, Pages, and Files. The [Activity](/site_administration/activity/activity_overview)
page charts those records and can be filtered by date range, content item, and user.
To export the underlying records, read the `interworks_usermgmt_content_view` table through the Curator API.
Each row holds the username, the content type and ID, the requested path, and a timestamp. See
[Retrieving Usage Data](/site_administration/activity/retrieving_usage_data).
### Analytics Tracking
If you already use Google Analytics 4, Google Tag Manager, or Matomo, connect it under
**Portal Settings > Analytics**. Curator then sends page views and Dashboard interaction events, such as
filter changes and exports, to that platform and tags each one with the logged-in user's `analytics_id`.
That value is a non-personal UUID rather than the username, and the User API lets you map it back to a
Curator user. See [Analytics Tracking](/site_administration/analytics_tracking/analytics_tracking).
### BI platform audit logs
The BI platform keeps its own access records, and those cover every client, not only Curator. For Tableau,
the administrative views and the Tableau Server repository report which user viewed which view or workbook.
For Power BI, the Power BI activity log and the Microsoft Purview audit log record per-user report access.
Depending on how Curator authenticates to the BI platform, those records may attribute a view to the account
Curator embeds with rather than to the individual user, so use Curator's own content view records when you
need the Curator username.
# Server Logs
Source: https://docs.curator.interworks.com/site_administration/logging/file_based_logs
File-based logs on the Curator server including the System Log, PHP error log, and Apache error log.
Server logs are stored as files on the Curator server and require direct server or file system access to view.
These logs are typically used for deeper troubleshooting, especially when database connectivity issues prevent
backend access or when investigating web server configuration problems.
## System Log
The System Log is Curator's primary application log, recording system events, errors, warnings, and debug
information. This log mirrors much of the same information found in the
[Event Log](/site_administration/logging/database_logs#event-log), but writes directly to disk rather than
the database.
The System Log can be particularly useful when the Event Log is unavailable (such as during database
connectivity issues) or when troubleshooting errors that may not appear in the Event Log. In some cases,
database transaction rollbacks can prevent Event Log entries from being saved, but the corresponding
System Log entries will still be present.
### Log File Location
The default System Log locations are:
| Operating System | Default Path |
| ---------------- | -------------------------------------------- |
| Linux | `/var/www/html/storage/logs/` |
| Windows | `C:\InterWorks\Curator\htdocs\storage\logs\` |
These paths may vary based on your installation. Central Dispatch installations, custom installation
directories, or different Windows drive letters will affect the actual location. The log files are
always located in the `storage/logs/` directory relative to your Curator installation root.
### Log File Format
By default, Curator uses daily log rotation, creating files named `system-YYYY-MM-DD.log`. For example:
* `system-2025-01-15.log`
* `system-2025-01-14.log`
### Redacted Values
Curator automatically removes sensitive values before they are written to the System Log. Passwords,
password reset keys, session cookies, API keys, and authorization headers are written as `[redacted]`,
whether they appear in the log message itself or in the context data recorded alongside it.
The same redaction is applied to the [Event Log](/site_administration/logging/database_logs#event-log), so
a value hidden in one log is hidden in the other. Seeing `[redacted]` in place of a value is expected and
does not indicate a problem.
Redaction was added in Curator **2026.08-03**. Log files written before you upgraded may still contain
sensitive values.
### Log Rotation Configuration
File-based log retention is configured separately from the database log retention settings. The number of
log files retained and other logging behavior is controlled by the `config/logging.php` configuration file.
If your log files are consuming excessive disk space or not rotating properly, refer to the
[Updating Curator Logging](/server_management/system_administration/updating_curator_logging) guide for
configuration instructions.
## PHP Error Log
The PHP error log captures PHP runtime errors, warnings, and notices that occur outside of Curator's
application logging. This can include syntax errors, memory issues, and extension-related problems that
may prevent Curator from starting properly.
### Log File Location
The PHP error log location depends on your server configuration:
| Operating System | Default Path |
| ---------------- | ------------------------------------------------------------ |
| Linux | `/var/log/php-fpm/www-error.log` or `/var/log/php/error.log` |
| Windows | `C:\InterWorks\Curator\php_error.log` |
The actual location may vary based on your PHP and web server configuration. To find the exact path,
check the `php_ini_path` field returned by the
[/portal/info](/curator_api/api_docs/curator_api#portalinfo) endpoint.
### Common PHP Errors
| Error Type | Description |
| ----------- | ------------------------------------------------------------------------------------------------ |
| Fatal Error | Critical errors that halt script execution (e.g., missing required files, syntax errors) |
| Warning | Non-fatal issues that may indicate problems (e.g., missing optional files, deprecated functions) |
| Notice | Minor issues that don't affect functionality (e.g., undefined variables) |
### Viewing PHP Configuration
To find your PHP error log location and other settings:
```bash theme={null}
# Linux
php -i | grep error_log
# Or check the loaded php.ini file
php --ini
```
## Apache Error Log
The Apache error log records web server errors, including failed requests, configuration issues, and
module errors. This log is essential for diagnosing issues with SSL certificates, URL rewrites, and
server connectivity.
### Log File Location
| Operating System | Default Path |
| ---------------- | ---------------------------------------------------------- |
| Linux | `/var/log/httpd/error_log` or `/var/log/apache2/error.log` |
| Windows | `C:\InterWorks\Curator\libs\apache\logs\error.log` |
The location varies based on your Linux distribution. RHEL/CentOS typically use `/var/log/httpd/`,
while Debian/Ubuntu use `/var/log/apache2/`.
### Apache Access Log
In addition to the error log, Apache maintains an access log that records all HTTP requests to the server.
This can be useful for:
* Tracking request patterns
* Identifying slow requests
* Debugging authentication issues
* Monitoring for suspicious activity
| Operating System | Default Path |
| ---------------- | ------------------------------------------------------------ |
| Linux | `/var/log/httpd/access_log` or `/var/log/apache2/access.log` |
| Windows | `C:\InterWorks\Curator\libs\apache\logs\access.log` |
### Common Apache Errors
| Error | Description |
| ------------------------- | -------------------------------------------- |
| 403 Forbidden | Permission denied to access a resource |
| 404 Not Found | Requested file or page does not exist |
| 500 Internal Server Error | Server-side error, often a PHP fatal error |
| 502 Bad Gateway | PHP-FPM or backend service not responding |
| 503 Service Unavailable | Server temporarily unable to handle requests |
## Troubleshooting Workflow
When troubleshooting issues with Curator, check logs in this order:
1. **Event Log** - Start with the backend Event Log for application-level errors
2. **System Log** - Check for entries that may not have been saved to the Event Log
3. **PHP Error Log** - Look for PHP runtime errors that prevent Curator from functioning
4. **Apache Error Log** - Check for web server configuration or connectivity issues
When reporting issues to InterWorks Support, providing relevant excerpts from all applicable logs
can significantly speed up diagnosis and resolution.
# Log Rate Limiter
Source: https://docs.curator.interworks.com/site_administration/logging/log_rate_limiter
How Curator prevents the Event Log from being flooded by repeated identical messages, and what to expect when rate limiting is active.
Curator automatically prevents the Event Log from being flooded by repeated identical errors or warnings.
When the same message occurs many times in a short period, Curator begins suppressing duplicates and
periodically logs a summary entry instead. This keeps the Event Log readable and performant without
losing visibility into ongoing issues.
## How it works
1. **First 20 occurrences are always logged** — every unique message is allowed through at least 20 times.
A full page of identical entries in the Event Log is a clear signal that something is actively failing.
2. **Suppression begins after the 20th occurrence** — if the same message keeps appearing, Curator starts
holding back duplicates.
3. **Periodic summary entries** — rather than silently discarding messages, Curator logs a summary at
increasing intervals. Each summary entry is prefixed with `[Grouped]` and includes a count of
how many duplicate entries were hidden and when the message first appeared. That count covers only
the hidden duplicates, not the occurrences that were logged normally.
4. **Intervals double over time** — summaries appear at 2 minutes, then 4, 8, 16, 32, and cap at every
60 minutes for as long as the issue persists.
Rate limiting state resets after 24 hours of inactivity per message type.
## What a rate-limited entry looks like
A normal Event Log entry:
```
[error] Connection to upstream API failed
```
Once rate limiting is active, subsequent entries look like this:
```
[error] [Grouped] Connection to upstream API failed
_grouped_summary: "Curator hid 239 duplicate Event Log entries for this message since
2026-03-11 09:00:10, so this entry stands in for them. Grouping duplicates keeps the log
readable; the activity itself was not blocked or limited."
```
The `[Grouped]` prefix is searchable in the Event Log. Use it to quickly find any messages
that have been suppressed.
`[Grouped]` describes the Event Log entry, not the activity it reports. It means Curator folded the
duplicate lines into a single entry with a count. Nothing about the underlying operation is blocked,
throttled, or limited, and there is no setting to raise or lower.
## Examples
### Runaway error
Without rate limiting, a continuous error at 2 per second would produce 7,200 Event Log entries per hour.
Here is what you would actually see:
| Elapsed | What appears in the Event Log |
| ------------------ | ------------------------------------------------------------------------------------------------------------------ |
| 0 – 10 s | Occurrences 1–20 logged normally. A full page of identical entries signals a problem. |
| 10 s | First `[Grouped]` entry logged. Suppression window: **2 min**. |
| 10 – 130 s | \~239 occurrences suppressed. |
| 130 s | Summary logged: "Curator hid 239 duplicate Event Log entries … since 09:00:10". Window: **4 min**. |
| 370 s | Summary logged. Window: **8 min**. |
| 850 s | Summary logged. Window: **16 min**. |
| 1,810 s | Summary logged. Window: **32 min**. |
| 3,730 s | Summary logged. Window caps at **60 min**. |
| Every 60 min after | One summary per window; the count grows each window — it is the cumulative total since the message first appeared. |
**Result:** 7,200 entries/hour reduced to \~26, with each summary carrying the full suppression details.
### Intermittent error
If the same message appears only occasionally — say, 10 times over 10 minutes — it will never hit the
suppression threshold. All 10 occurrences are logged normally and the `[Grouped]` prefix will never appear.
| Error frequency | Threshold reached | Rate limiting active? |
| --------------- | ------------------ | ---------------------------------- |
| 2 / second | After \~10 seconds | Yes |
| 1 / minute | After \~20 minutes | Yes, if it continues |
| 1 / hour | After \~20 hours | Yes, just before the 24-hour reset |
| 1 / day | Never | No |
## Limitations and caveats
* **The Event Log is not a complete audit trail** — because suppressed occurrences are not stored, the
Event Log should not be used to count how many times something happened or as an authoritative record
of security-related events. Use Curator's Usage Log or an external audit system for that purpose.
* **Some messages are never rate-limited** — errors that include dynamic information (such as a user
name, record ID, or timestamp) in the message text are treated as distinct messages and are each
logged individually, regardless of frequency. This is expected behavior.
# Logging Overview
Source: https://docs.curator.interworks.com/site_administration/logging/logging_overview
Understanding Curator logging systems including usage logs, event logs, access logs, and alert logs.
Curator provides several logging systems to help administrators monitor, troubleshoot, and audit their Curator
instance. Logs are available through both the Curator backend interface and directly on the server file system.
## Types of Logs
Curator maintains several different log types, each serving a specific purpose:
| Log Type | Purpose | Access |
| --------------------------------------------------------------------------------- | ------------------------------------------- | ------------------ |
| [Usage Log](/site_administration/logging/database_logs#usage-log) | Audit trail of who made what changes | Curator Backend |
| [Event Log](/site_administration/logging/database_logs#event-log) | Records system events, errors, and warnings | Curator Backend |
| [Access Log](/site_administration/logging/database_logs#access-log) | Logs backend administrator access | Curator Backend |
| [Alert Log](/site_administration/logging/database_logs#alert-log) | Aggregates recurring system alerts | Curator Backend |
| [System Log](/site_administration/logging/file_based_logs#system-log) | Detailed application logs for debugging | Server File System |
| [PHP Error Log](/site_administration/logging/file_based_logs#php-error-log) | PHP runtime errors and warnings | Server File System |
| [Apache Error Log](/site_administration/logging/file_based_logs#apache-error-log) | Web server errors and access information | Server File System |
## Backend Logs vs Server Logs
**[Backend Logs](/site_administration/logging/database_logs)** are stored in the Curator database and accessible
through the Curator backend interface. These logs are designed for day-to-day monitoring and auditing by
administrators who may not have direct server access.
**[Server Logs](/site_administration/logging/file_based_logs)** are stored as files on the server and require
direct server or file system access. These logs are typically used for deeper troubleshooting, especially when
database connectivity issues prevent backend access or when investigating web server configuration problems.
## API Access
Curator provides API endpoints for programmatic access to log data. All API endpoints require a valid API key.
For general information about using the Curator API, see the
[Curator API Overview](/curator_api/getting_started/curator_api_overview).
### List Event Log
Returns event log entries with pagination support.
```
GET /api/v1/portal/listEventLog?apikey=YOUR_API_KEY
```
**Parameters:**
* `limit` (optional) - Maximum number of results to return (default: 1000)
* `offset` (optional) - Number of results to skip for pagination (default: 0)
### List Usage Log
Returns usage log entries with filtering options.
```
GET /api/v1/portal/listUsageLog?apikey=YOUR_API_KEY
```
**Parameters:**
* `limit` (optional) - Maximum number of results to return (default: 1000)
* `offset` (optional) - Number of results to skip for pagination (default: 0)
* `username` (optional) - Filter results by username
* `is_frontend` (optional) - Filter by frontend (`true`), backend (`false`), or both (omit parameter)
### List Alert Log
Returns alert log entries with filtering options.
```
GET /api/v1/portal/listAlertLogs?apikey=YOUR_API_KEY
```
**Parameters:**
* `limit` (optional) - Maximum number of results to return (default: 1000)
* `offset` (optional) - Number of results to skip for pagination (default: 0)
* `status` (optional) - Filter by status: `active`, `resolved`, `suppressed`
* `level` (optional) - Filter by level: `error`, `warning`, `info`
### Download System Log
Downloads the current system log file.
```
GET /api/v1/portal/downloadLog?apikey=YOUR_API_KEY
```
This endpoint returns the `storage/logs/system.log` file as a downloadable attachment.
## Best Practices
1. **Set appropriate retention periods** - Balance the need for historical data against database storage
requirements. For most installations, 1-3 months of event log retention is sufficient.
2. **Monitor the Alert Log** - Regularly review the Status page to catch recurring issues early.
3. **Archive logs before purging** - If compliance requirements mandate long-term log retention, use the API
endpoints to export log data before automatic purging occurs.
4. **Review Access Logs periodically** - Regular review of administrator access helps identify unauthorized
access attempts.
5. **Check multiple log sources** - When troubleshooting issues, check both backend logs and server logs for
a complete picture. The System Log may contain entries not present in the Event Log.
# Cache Warming
Source: https://docs.curator.interworks.com/site_administration/performance/cache_warming
Configure cache warming to improve initial page load times for designated user groups through automated cache preloading.
Later page load times are much quicker than the first load due to caching. The "Cache Warming" feature allows
a group of users to have their cache warmed every hour. This improves their first page load and avoids that
initial long wait for the page to render when logging in.
## Enabling the Cache Warming Feature
1. Navigate to your Curator backend > Settings > Curator > Portal Settings > Features tab.
2. Enable the “Cache Warming” feature at the top of the Functionality section.
3. In the "Priority Group for Cache Warming" field, choose a Frontend Group with less than 200 members. The
options should already be limited to applicable groups. For more information about creating Frontend Groups,
visit [the doc](/users_groups/user_management/users_and_groups_overview).
4. Hit "Save."
## Notes
* Every hour the members of the chosen group will have their cache warmed. This is ran every hour in case
another process has cleared the cache such as logging out or making a configuration change.
* The group has to contain less than 200 members because the process to warm the cache is intensive. Warming
for more than 200 members might bog down the queue that runs scheduled processes, preventing other important
functions to run.
## Common Cache Log Errors
Cache warming runs asynchronously for each user in the Priority Group, so it is normal to see warming-related
entries in the [System Log](/site_administration/logging/file_based_logs#system-log). The entries below cover
what is non-fatal and what requires action.
### "Failed to warm cache for user X"
A single `Failed to warm cache for user X` entry is non-fatal and affects only that user's next page load.
The most common cause is a transient platform API timeout (for example, a slow response from Tableau Server,
Power BI, or ThoughtSpot during the warming pass). The affected user will simply experience the normal
uncached first-page-load time on their next visit, after which their cache will be populated as usual.
No action is required unless the same user fails to warm on multiple consecutive runs, in which case
investigate the upstream platform's availability and response times for that user's content.
### Repeated OOM (Out Of Memory) Failures During Warming
If the System Log contains repeated out-of-memory failures originating from the cache warming job — for
example, PHP fatal errors mentioning `Allowed memory size of N bytes exhausted` inside the warming
schedule — the configured Priority Group for Cache Warming exceeds the memory budget available to the
queue worker on this server.
To resolve this, do one of the following:
1. Reduce the size of the Priority Group for Cache Warming so the cumulative cost of warming all members
fits within the queue worker's memory budget.
2. Move only the highest-priority users into the group and accept the normal uncached first-page-load
time for everyone else.
3. As a temporary measure while right-sizing the group, enable the **Disable All Cache Warming** toggle on
the same Portal Settings screen so the warming job stops running entirely until the group is reduced.
# Performance Diagnostics
Source: https://docs.curator.interworks.com/site_administration/performance/performance_diagnostics
Guide for collecting system performance data to help the Curator support team diagnose and resolve slow performance issues.
When experiencing slow performance with Curator, collecting detailed system information helps the support team identify
the root cause. Follow these steps to gather the necessary diagnostic files.
## Step 1: Collect Server Performance Data
Connect to your Curator server via SSH (Linux) or RDP (Windows), then run the performance script for your operating
system to generate a comprehensive report of your server's configuration, performance metrics, and usage statistics.
```bash theme={null}
curl -o /tmp/curator_server_info.sh "https://api.curator.interworks.com/scripts/curator_server_info.sh";
chmod +x /tmp/curator_server_info.sh && /tmp/curator_server_info.sh
```
```powershell theme={null}
Invoke-WebRequest -Uri "https://api.curator.interworks.com/scripts/curator_server_info.ps1" -OutFile "$env:TEMP\curator_server_info.ps1";
PowerShell -ExecutionPolicy Bypass -File "$env:TEMP\curator_server_info.ps1"
```
The generated file will contain system information including server configuration, performance metrics,
and usage statistics needed for performance analysis.
If the problem is CPU spikes on a Windows server rather than general slowness, also run the
[CPU investigation script](/server_management/system_administration/windows_cpu_investigation), which builds a
timeline of what the server was doing when the CPU spiked.
## Step 2: Access API Keys Settings
You'll use the **REST API Explorer** section on this page to generate diagnostic endpoint URLs.
## Step 3: Collect Portal Info Endpoint
1. Under **REST API Explorer**, use the dropdowns to select:
* **API Section:** Portal
* **API Method:** Info
2. Click the **REST API Access URL** link to open the endpoint in a new tab.
3. You should see raw JSON data.
4. Right-click on the page and select **Save As** to save the output to a file.
5. Save the file as `info.json` (save as JSON format, **not PDF**).
## Step 4: Collect Portal PHPInfo Endpoint
1. Return to the API Keys page and change the **API Method** dropdown to **PHPInfo** (keep Portal selected).
2. Click the **REST API Access URL** link to open the PHPInfo page.
3. Right-click on the page and select **Save As** to save the output to a file.
4. Save the file as `phpinfo.html` (save as HTML format, **not PDF**).
## Send Files for Analysis
Email the following files to the Curator support team for analysis:
* Server performance data (markdown file from Step 1)
* `info.json` (from Step 3)
* `phpinfo.html` (from Step 4)
* Feel free to include screenshots of any relevant system information.
The support team will analyze these files and provide specific recommendations to improve your system's performance.
# Queued Processes
Source: https://docs.curator.interworks.com/site_administration/performance/queued_processes
View, cancel, and clear background jobs running in Curator from the Queued Processes backend list.
Curator runs many tasks in the background -- syncing users, warming caches, importing data, cleaning up old
records, and more. Each background task is recorded as a "queued process" so you can see what is currently
running, what is waiting to run, and what has errored out. The Queued Processes list is the place to monitor
and manage that queue.
## Viewing Queued Processes
1. Navigate to your Curator backend > Settings > Curator > Queued Processes.
2. The list displays each job with its type, status (for example, "Pending", "Running", "Complete", or an
error status), and timestamps for when it was created and last updated.
3. Use the "Refresh List" button in the toolbar to reload the list and see the latest status.
## Clearing Queued Processes
The toolbar above the list provides three actions for removing jobs from the queue:
| Action | What it does |
| --------------- | ------------------------------------------------------------------------------------------ |
| Cancel Selected | Deletes the jobs you have checked in the list. Disabled until at least one row is checked. |
| Clear Pending | Removes every job currently in the "Pending" status. |
| Clear Errors | Removes every job currently in an error status. |
Use "Cancel Selected" when you want to remove a small number of specific jobs without affecting the rest of
the queue. Use "Clear Pending" when pending jobs are stuck or piling up and you want a clean slate before the
next scheduled run. Use "Clear Errors" once you have reviewed the failures and no longer need the records for
troubleshooting.
Each button asks for confirmation before deleting. Removing a job only deletes the queue record -- it does not
undo any work the job already performed.
## Automatic Cleanup
Curator automatically prunes old queued process records once per day so the list does not grow indefinitely.
The daily cleanup task removes any job whose last update was more than three days ago, regardless of status.
Recent jobs -- including pending ones -- are left in place so that in-flight work is not interrupted.
If you want to remove jobs sooner than the three-day window, use the toolbar actions described above.
## Troubleshooting a Queue That Is Not Processing
A healthy queue empties quickly. Curator's scheduled task runs once a minute, picks up every job whose "Run After"
time has passed, and works through them one at a time. Pending jobs normally disappear within a minute or two of
being created. If the Pending count keeps growing, work through the steps below in order.
### Step 1: Confirm the scheduled task is firing
Every background job in Curator depends on a server-level scheduled task (cron on Linux, Task Scheduler on
Windows) that runs `artisan schedule:run` once a minute. If that task stops, nothing in the queue moves.
1. Open the backend Dashboard and find **Last Cron Run** in the **Curator Status** widget. It should read a minute
or two ago. A warning icon appears once the value is more than 24 hours old, and the Dashboard also shows a
"Curator's Job System (cron) is not correctly configured" warning.
2. If the timestamp is old or missing, fix the scheduled task before doing anything else. See
[Linux Cron Troubleshooting](/server_management/system_administration/linux_cron_troubleshooting) or
[Windows Cron Troubleshooting](/server_management/system_administration/windows_cron_troubleshooting).
Firing the **Portal** > **cron** API endpoint by hand (see "Test Cron" in the Linux guide) runs a single pass of
the schedule. A "success" response only means Curator received the request and finished that pass. It does not
prove the server task is firing on its own, and one pass processes about a minute of queued work at most. Use
the **Last Cron Run** timestamp, not the endpoint response, to judge whether the schedule is healthy.
### Step 2: Check whether one job is holding the queue
Only one queue worker runs at a time, and it processes jobs one after another. A single long job, such as a full
backup of a large webroot, a large user sync, or a big import, keeps every job behind it in Pending until it
finishes.
1. Look for a job whose status is not "Pending". A job the worker has picked up shows "Claimed", a step
description such as "Step 1 of 3: Backing up the Curator filesystem.", or a percentage.
2. Watch its **Updated At** value across a few refreshes. If it keeps advancing, the job is still working. Leave
it alone; the Pending jobs follow once it finishes. Some jobs, such as backups, only update their status when
they move to the next step, so a long gap on its own does not mean the job is dead.
3. If the job appears stuck, open the Event Log (**Settings** > **Logs** > **Event Log**) and search for
"Curator's queue shut down prematurely". That entry means the worker died while running the job, for example
because it ran out of memory or was killed by the operating system, and it includes the underlying error. Fix
the cause if the entry names one, then remove the dead job with **Cancel Selected**. Curator requeues import
jobs on its own; every other job type keeps its last status until you remove it or the daily cleanup does. A
dead job does not block the queue by itself, so the remaining Pending jobs continue on the next pass.
### Step 3: Wait out the queue lock
Curator uses a lock to stop two queue workers from running at the same time. When a worker is killed without
warning, the lock can outlive it, and every pass until it expires skips the queue even though the scheduled
task is firing. The lock expires on its own, normally 60 minutes after the run started.
If you cannot wait, you can release the lock yourself, but only once you have confirmed that the worker that
took it is no longer running. Use the checks in Step 2: the job it was running has stopped advancing its
**Updated At** value, and the Event Log holds a "Curator's queue shut down prematurely" entry for it. If either
check fails, the worker may still be working, so wait for the lock to expire instead.
Once you are sure the worker is dead, call the
[/portal/flushAllCache](/curator_api/api_docs/curator_api#portalflushallcache) API endpoint. **Clear Cache**
in the backend does not release the lock; this endpoint does. It works on both Curator SaaS and On-Prem:
```text theme={null}
[your_domain]/api/v1/portal/flushAllCache?apikey=[your_api_key_here]
```
To generate the link with your key filled in, follow the
[Auto Generate API Links](/curator_api/getting_started/curator_api_overview) instructions and set the dropdowns
to **Portal** and **flushAllCache**. The next scheduled pass, normally within a minute, starts a fresh worker.
The endpoint flushes the whole cache, so the next few page loads are slower while Curator rebuilds it and
compiles the theme CSS again.
Do not remove the lock while a worker is still active. The next scheduled pass would start a second worker
beside it. The two workers never pick up the same job, because each job is claimed with a single atomic
database update, but they do process different jobs at the same time, which is exactly what the lock exists
to prevent. Two backups, for example, could then run at once.
### Step 4: Turn on Cron Debug Mode
If the schedule is firing and nothing above explains the backlog, turn on Cron Debug Mode to see what the
worker does on each pass.
1. Navigate to **Settings** > **Curator** > **Portal Settings** and open the **General** tab.
2. In the **Debug Settings** section, turn on **Cron Debug Mode** and click **Save**. The mode turns itself off
after 24 hours unless you change **Expiration of Cron Debug Mode**.
3. Wait a couple of minutes, then open the Event Log and look for entries that begin with "CRON DEBUG MODE".
Each pass logs "Updating cron last run timestamp" when the schedule fires and "Running queued task" each time
the worker picks up a job. If the timestamp entries appear but no "Running queued task" entries follow, the
worker is not reaching the queue and the lock in Step 3 is the most likely cause. If a "Running queued task"
entry appears and nothing follows it, that job is the one holding the queue.
### Step 5: Clear the backlog
When a job fails with an error, Curator writes the full error to the Event Log as "Error while running queued
process" and, for most job types, removes the job from the list. Jobs that stay in the list with a status
beginning with "Error:" can be removed with **Clear Errors** once you have read the log.
If the queue is draining again but the backlog is too large to be useful, or the pending work is no longer
wanted, use **Clear Pending** to remove every Pending job and start fresh.
**Clear Pending** deletes every Pending job. Work that a schedule queued, such as a scheduled backup, a user
sync, or cache warming, is queued again at its next scheduled time. Work that a person started, such as an
import or a backup taken with **Take New Backup**, is not, so start it again once the queue is draining.
## Troubleshooting Backups That Stay Pending or Never Appear
Curator runs every full backup through this queue. A scheduled backup adds a "Curator Backup" job at the
configured time, and **Take New Backup** on the Backups page adds the same job immediately. If the queue is not
processing, the backup waits in Pending with everything else, so work through the section above first. Two
backups queued back to back run one after the other, never at the same time.
While a backup runs, its status moves through "Step 1 of 3: Backing up the Curator filesystem.", "Step 2 of 3:
Backing up the Curator database." and "Step 3 of 3: Packaging the full backup file." Step 1 can take a long time
on a large webroot. When the backup finishes, the job is removed from the list and the new file appears under
**Settings** > **Curator** > **Backups**.
If the job disappears from the list but no new backup appears, or the new file name ends in `_NO_DATABASE`, the
backup failed part way through. Curator writes the reason to the Event Log. The common causes are:
**`ERROR: Not enough space for full backup.`**
Free disk space on the server is smaller than the size of the last backup. Free up space or lower
**Backup Retention**, then take a new backup. See [Curator Backup](/upgrading_migration/backups/curator_backup).
**`ERROR: Unable to backup Curator files: is not writable.`**
The web-server user cannot write to the **Backup Location** (`/storage/temp` by default). Grant the
web-server user write permission to that folder, or point **Backup Location** at a folder it can write to.
**`Unable to find mysqldump executable. Check that it has been added to PATH environment variable.`**
`mysqldump` is not on the PATH of the account that runs the scheduled task. The backup still completes, but
without the database, and the file name ends in `_NO_DATABASE`. Install the MySQL client tools and add them to
the PATH of the account that runs `schedule:run` (the Task Scheduler account on Windows), then take a new
backup.
**`ERROR: Unable to dump Curator database during backup`**
`mysqldump` ran but failed, or produced a file smaller than 100 KB. The log entry lists the dump file path and
size. Confirm the database credentials in Curator's configuration work from the Curator server, and that the
installed `mysqldump` matches the database server version.
A backup whose name ends in `_NO_DATABASE` shows "Does not include a database export!" in the Backups list and
cannot restore the database. Fix the database cause and take a new backup.
On Curator SaaS, InterWorks manages the server, its disk space, and backup storage. If a scheduled backup stays
Pending after the queue is confirmed healthy, or the Event Log shows one of the errors above, contact InterWorks
support.
# Troubleshooting Load Times
Source: https://docs.curator.interworks.com/site_administration/performance/troubleshooting_load_times
Diagnose and resolve slow loading issues using Curator debug mode for performance optimization.
When determining the root-cause of latency issues on Curator, using the debug mode for Curator is the fastest
way to rule out a number of issues that may be causing slow loading times. This can come from the location
of your servers and/or networking issues, custom code, internal Curator issues or slow Dashboard load times.
Curator's debug mode provides the Curator team with enough information to know where to start looking when
addressing these issues. Follow the steps below to view Curator's debug data, and download the debug file
and send it to the Curator support team if you have any concerns.
## Enabling Debug Mode
1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`).
2. Navigate to the **Settings** > **Curator** > **Portal Settings** section from the left-hand menu.
3. Click on the "General" tab at the top of the main page content.
4. In the "Debug" section, turn ON *Enable Frontend Debug* and click the "Save" button.
## Using the Debug Mode
1. Append `?debug=1` to the end of any url (unless there is already a `?` in the url, in which case append `&debug=1`)\*
2. Click the arrow on the bottom tray to expand the debug menu, then navigate between the tabs to view the debug output.
\*NOTE: If you are debugging slow login times, be sure to logout first, and then add the debug parameter to
your URL (e.g. `http://curatorexample.com/backend`?debug=1)
## Capturing Debugging Results
1. Once you have followed the **Using the debug mode** steps above, you can download the results of your
debugging session using the export button on the debugging tray:
2. This will output a `.iw` file which you can send to Curator support for assistance with slow load times.
# Web Accessibility
Source: https://docs.curator.interworks.com/site_administration/standards_compliance/web_accessibility
Scan and evaluate Curator portal for WCAG web accessibility compliance using browser extensions and tools.
This document provides instructions on how to scan your Curator portal for compliance with the Web Content
Accessibility Guidelines (WCAG)
## Prerequisites
Install the [WAVE Accessibility Extension for Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/wave-accessibility-tool/).
Similar extensions may exist in other browsers, but those are outside of the scope of this document.
## What to Scan
There are 3 main sections you'll need to check about when scanning your Curator portal.
1. Login Page
2. Global Structure
3. Page Content
### Login Page
Depending on which authentication type your Curator portal uses, you will likely need to scan the login page
and any related pages shown during the authentication process. If you utilize a third-party authentication
source, any accessibility issues found with it will need to be fixed within that third-party product.
### Global Structure
Once authenticated to Curator, there are elements shared across all pages, such navigation, search, theme,
logo, and footer. Any issues found with these elements will be found on each page you test, so it's worth
tracking these separately.
### Page Content
Each page on your site is by nature unique in some aspect. Whether a page has simple static text, images,
embedded content, or multiple elements of varying content types, each page will need to be checked
individually to verify that all of the content on the page meets accessibility standards.
It should be noted that any issues found with embedded content will need to be addressed in their source
system. For instance, if you determine there are accessibility issues with a Tableau Dashboard, you'll need
to correct those issues within your Tableau workbook and then republish it.
## How to Scan
Loop through each section and page listed above in Mozilla Firefox. For each one, right-click on the page
and select **WAVE this page**.
As of the time of this writing, a pane will show up in your browser that lists errors, alerts, contrast
errors, and other elements that were checked for WCAG compliance. Address the errors and contrast errors
first by clicking on the **Details** tab. After addressing those, then focus on the alerts.
You should be able to click on each issue to show the element in question and a description of the issue. If
the element is covered by the WAVE pane, you may need to toggle the styles off.
Most of the issues you may encounter will likely be:
* **Missing alternative text for images:** Each image should have some sort of alternative text to describe
the image for people with visual impairments. For instance, an image may just be a logo, but it also might
be a chart with important information being conveyed.
* **Missing title/label text for page elements:** Some elements on a page, such as buttons, form fields, etc.
require title text (often displayed as tooltips) or an explicit label in order for people to understand their
use. For instance, have you ever tried to use an app where the buttons only show an icon you've never seen
before? This issue is exacerbated if you must consume the entire page through a screen reader.
* **Low contrast:** Certain visual impairments make it difficult to discern elements that are too similar
with respect to contrast. For instance, try reading light grey text on a white background.
* **Tab order:** The order that elements are highlighted when tabbing through the site makes a big difference
of how usable or frustrating your site is. Imagine that your mouse stopped working and you had to use your
site with nothing more than your keyboard's tab key. This is how many people must navigate the web.
## Implementation vs. Core Issues
Curator provides a content management platform. Accessibility issues may exist in the core Curator
functionality or in your actual content or implementation. Issues found related to your content or
implementation will need to be fixed in your portal. The Curator development staff make a good faith effort
to routinely check that core features meet accessibility standards, but issues may still slip through. If
you find an accessibility issue in a core feature, please report it to Curator support so we can address it
in a future version.
# Session Expiration Warning
Source: https://docs.curator.interworks.com/site_administration/user_notifications/session_expiration_warning
Notifies logged-in users before their server-side session expires, giving them a chance to stay logged in or reload the page.
Curator shows a modal to logged-in users shortly before their server-side session expires. This prevents
embedded content (such as Power BI reports that rely on cached authorization tokens) from quietly breaking
when a user has left a page idle for a long time.
The warning is enabled automatically for all logged-in users. There is no setting to toggle it on or off —
the only thing you control is when it appears, via the session lifetime.
## How it works
The modal has two states:
1. **Warning** — appears before the session expires, with two buttons:
* **Continue** sends a lightweight request to the server, refreshes the session, and dismisses the modal. If the request fails (session has already expired), the modal switches to the **Expired** state with a **Reload** button instead of closing silently.
* **Log Out** redirects the user to the logout page.
2. **Expired** — if the user does not act in time, the modal switches to an expired state with a single
**Reload** button that refreshes the page so the user can log in again.
The timer also resets automatically whenever the page makes any background request to the server, so users
who are actively interacting with Curator (loading dashboards, navigating, etc.) will not see the warning.
## When the warning appears
The warning timing is derived from the session lifetime:
| Session lifetime | Warning appears |
| -------------------- | ----------------------------------- |
| 20 minutes or longer | 10 minutes before expiry |
| Less than 20 minutes | At the halfway point of the session |
| Less than 5 minutes | Not shown |
## Configuring the session lifetime
The session lifetime is controlled by the `SESSION_LIFETIME` value in your `.env` file, expressed in
minutes. The default is 360 minutes (6 hours).
```bash theme={null}
SESSION_LIFETIME=360
```
Lowering this value will cause the warning to appear sooner; raising it will delay the warning. Changes
take effect on the next request after the configuration cache is cleared.
## Relationship to automatic logout
This feature is separate from Curator's automatic logout. Both can be active at the same time:
* **Automatic logout** tracks user activity in the browser (mouse, keyboard, scrolling). It exists to log
out users who have stepped away from their desk.
* **Session expiration warning** tracks the server-side session. It exists to warn users whose session is
about to expire on the server even though they may still have the page open.
## Browser sleep and session expiry
The warning is driven by timers running in the browser, and browsers pause those timers while the computer
is asleep or the laptop lid is closed. The server-side session keeps counting down regardless. If a machine
sleeps for longer than the session lifetime, the session ends on the server first, and the warning modal
only appears once the machine wakes up and the paused timer catches up — by which point it is too late to
extend anything.
Clicking **Continue** in that situation cannot bring the session back. Continue works by sending a
lightweight request to the site, and it only switches the modal to the **Expired** state when that request
fails outright. A request made after the session has already ended can still come back as a successful
response, so the modal closes as though nothing went wrong even though the user is no longer authenticated.
The visible result is that the modal disappears, but embedded content — such as Power BI or Tableau
reports — stays blank or broken, and interacting with a report produces the same authorization error again.
**What to do:** if embedded content is still broken after clicking **Continue**, reload the page manually
(press **F5** or use the browser's refresh button). Curator will prompt for login again if needed, and
embedded content will load normally once you are signed back in.
This is a limitation of browser timers rather than a fault in the report or the analytics platform. A
proactive refresh — clicking **Continue** while the session is still alive — works seamlessly. Recovering
after the machine has slept past the session lifetime always requires a full page reload.
# Third Party Cookies
Source: https://docs.curator.interworks.com/site_administration/user_notifications/third_party_cookies
Configure third-party cookie warnings and troubleshoot embedded visualization login issues in Safari browsers.
Embedding visualizations within Curator requires third party cookies to be enabled. By default Chrome and
Firefox allow this but Safari does not. When you encounter this issue,
**the embedded visualization (e.g.Tableau) login prompt might continue to appear inside of Curator even after
successfully logging in to Curator**.
## Warning Users About Third-Party Cookie Embedding Issues
Since your Curator users may not be aware this setting is preventing them from being able to use the embedded
view in Curator, you can enable an alert that tells them if this is preventing them from being able to
seamlessly log in to their embedded visualization. To enable this warning follow the steps below:
1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`) and log in if prompted.
2. Navigate to **Settings** > **Curator** > **Portal Settings**.
3. Click on the "Features" tab.
4. Scroll down to the "Usability" section and enable *3rd Party Cookies Enabled Check*.
## Information on How to Enable Third-Party Cookies
See the steps here to allow cookies on devices that use Safari:
* [Unblocking cookies on iOS](https://support.apple.com/en-us/HT201265)
* [Unblocking cookies on MacOS](https://support.apple.com/guide/safari/manage-cookies-and-website-data-sfri11471/mac)
# Favorites
Source: https://docs.curator.interworks.com/site_content_design/content_discovery/favorites
Enable user favoriting functionality to personalize homepages and prioritize frequently accessed content.
Curator has the ability to mark dashboards as favorites. Favorited dashboards will show up first on the home page once
the user logs in.
This functionality requires any authentication method other than "Pass-Through". See the [Authentication Methods](/setup/authentication/overview)
section for more information.
If you have a [Tableau Connection](/creating_integrations/tableau_connection/creating_a_connection)
the favorites will also synchronize across to Tableau Server/Cloud.
You can also display the number of favorites a Dashboard has. This number shows up in both the Dashboard action-buttons
area when viewing a Dashboard and on the homepage when showing Dashboard tiles.
## Enabling Favorites
1.
2. Find the "Favorites" setting and toggle it on.
3. Be sure to save your changes.
## Favoriting a Dashboard
1. Navigate to the frontend of the system (e.g. `http://curatorexample.com`).
2. Log in if prompted.
3. Navigate to the desired Dashboard by using the navigation menu.
4. Click on the star icon at the top right portion of the screen. Normally this is displayed on the right side of the
title bar in the Dashboard.
## Showing the Number of Favorites
1.
2. Find the "Favorites" setting and toggle it on.
3. Be sure to save your changes.
## Troubleshooting
If a user reports that their favorites are not persisting between sessions, work through the following
checklist to identify the root cause.
### Pass-Through Authentication Is Active
Favorites require a persistent frontend user record. When the active authentication method is
[Pass-Through](/setup/authentication/pass_through_authentication), Curator does not create or maintain
persistent user records, so there is no account to attach favorites to and the star icon's state cannot
be carried across sessions.
To resolve this, switch to any authentication method other than Pass-Through. See the
[Authentication Methods](/setup/authentication/overview) overview for the available options.
### Tableau Favorites Sync Is Overwriting Curator Favorites
When a [Tableau Connection](/creating_integrations/tableau_connection/creating_a_connection) is configured,
favorites synchronize in both directions between Curator and Tableau Server/Cloud. If a Dashboard is
favorited in Curator but is later un-favorited directly in Tableau Server/Cloud (or vice versa), the next
sync will reconcile the two systems and the user may perceive their Curator favorite as having been lost.
To resolve this, confirm the user's favorites in Tableau Server/Cloud match what they expect to see in
Curator. If the favorites should only be managed inside Curator, remove the Tableau Connection or have the
user manage their favorites exclusively from one side.
### SSO Username Attribute Mismatch Creates Duplicate User Records
Favorites are stored against a single frontend user record. When SSO is configured with an inconsistent
username attribute — for example, an attribute that sometimes returns the email address and sometimes
returns the user principal name — each variation creates a separate frontend user record. The favorites
saved against one record will not appear when the user is logged in under the other record, giving the
impression that favorites are not persisting.
To resolve this, verify in the Identity Provider that the attribute mapped to the Curator username claim
returns the same value for the same user on every sign-in. Then, in the Curator backend under **Users**,
look for duplicate frontend user records for the affected user and remove the extra records so that
only one persistent record remains.
### A Tableau Cloud User's Favorites Stop Syncing
On Tableau Cloud, Curator determines which site to sync a user's favorites from by reading the site portion
of each Dashboard's Tableau URL — the `/t//` segment. If a Dashboard's stored URL is missing that
segment — for example, if the URL was edited or pasted without it — Curator cannot resolve which site the
Dashboard belongs to, and the favorites sync for that site is skipped. The user's Tableau Cloud favorites
then stop updating, and because the sync is skipped rather than failing, no error is shown.
To resolve this, open the affected Dashboard in the Curator backend and correct its Tableau URL so that it
includes the full site path — for example, `https://your-site.online.tableau.com/t/site-name/views/...`
rather than `https://your-site.online.tableau.com/site-name/views/...`. Once every Dashboard on the site has
a valid URL, the site resolves correctly and favorites sync resumes on the next run.
# Featuring Content
Source: https://docs.curator.interworks.com/site_content_design/content_discovery/featuring_content
Promote and highlight important content using featuring options to increase visibility and user engagement.
The landing page typically shows an assortment of many different dashboards from the site. These displays will show
favorited and featured dashboards first before others. While Favorited dashboards is a feature that is driven by the user
we provide the ability to bump certain dashboards to the top using the Feature switch (requires a tiled homepage). The
dashboards that are shown will only ever be dashboards the user has permission to see.
***To feature a Dashboard:***
1. While editing the Dashboard, click on the "Misc" tab.
2. Scroll to the "Discovery" section.
3. Toggle on the switch labeled "Featured".
4. Click the "Save" button.
# Hidden Content
Source: https://docs.curator.interworks.com/site_content_design/content_discovery/hidden_content
Control visibility by hiding dashboards and other content from tiles, explorer, and search results while maintaining direct access and navigation visibility.
## Hidden and Hidden from Search Toggles
You can now control where content appears throughout Curator using the **Hidden** and **Hidden from Search** toggles.
These toggles are available for most content types and allow fine-grained control over how users discover content.
### Availability
| Content Type | Hidden | Hidden from Search |
| --------------------- | :----: | :------------------: |
| File | Yes | Yes |
| Page | Yes | Yes |
| Menu | Yes | No *(not available)* |
| Power BI Dashboard | Yes | Yes |
| Power BI Report | Yes | Yes |
| Tableau Dashboard | Yes | Yes |
| Tableau Metrics | Yes | Yes |
| Sigma Workbooks | Yes | Yes |
| ThoughtSpot Liveboard | Yes | Yes |
| ThoughtSpot Search | Yes | Yes |
***
### Behavior
#### Hidden
* Removes the item from **all content displays**, including tiles and Explorer tiles.
* Prevents the content from appearing in featured or related content sections.
#### Hidden from Search
* Excludes the item only from **Curator search results**.
* The content continues to appear in other locations, such as tiles, related content, and Explorer tiles.
* This setting is **not available for Menus**.
***
### Where to Find the Hidden Settings
| Content Type | Navigation Path |
| ------------------------- | ----------------------------------- |
| **File** | Content → File → General |
| **Page** | Content → Page → Page Details |
| **Menu** | Content → Navigation → Menu |
| **Power BI Dashboard** | Power BI → Dashboards → Discovery |
| **Power BI Report** | Power BI → Reports → Discovery |
| **Tableau Dashboard** | Tableau → Dashboards → Discovery |
| **Tableau Metrics** | Tableau → Metrics → Discovery |
| **Sigma Workbooks** | Sigma → Workbooks → Discovery |
| **ThoughtSpot Liveboard** | ThoughtSpot → Liveboard → Discovery |
| **ThoughtSpot Search** | ThoughtSpot → Search → Discovery |
***
### How to Update Visibility Settings
1. Edit the desired content item (for example, a Dashboard, Report, Page, or File).
2. Navigate to the section shown in the table above.
3. Locate the **Hidden** and **Hidden from Search** toggles.
4. Use the toggles:
* **Hidden** — hides the item from content listings such as tiles, Explorer tiles, and search results. Navigation menu items linking to the item remain accessible.
* **Hidden from Search** — hides the item only from search results.
5. Click **Save** to apply your changes.
***
### Bulk Visibility Changes
For every content type except Pages, **Hidden** and **Hidden from Search** are set **per item** on that item's
own edit form. The Discovery lists do offer bulk actions on checked items — for example **Replace Dashboard
URLs** and **Create Menu Items** on Tableau → Dashboards → Discovery — but none of them change visibility.
To hide or unhide several dashboards, reports, files, menus, metrics, workbooks, or liveboards, open and save
each item individually.
#### Pages are the exception
Pages support a bulk visibility change through the **Edit Pages** action:
1. Go to **Content → Pages**.
2. Select the pages you want to change using the checkboxes in the list.
3. Click **Edit Pages** to open the bulk edit window.
4. Set the **Hidden** toggle to the value you want applied to every selected page.
5. Click **Apply Changes**.
The **Edit Pages** window applies **all** of its toggles — **Hidden**, **Favoritable**, **Blog**,
**User Commenting**, and **Featured** — to every selected page, using whatever position each switch is in
when you click **Apply Changes**. Toggles you did not intend to change are still written to the selected
pages and will overwrite their existing values. Review every switch in the window before applying.
**Hidden from Search** is not included in the **Edit Pages** window. To change it, edit each page individually.
***
### Notes
* Hidden items are still accessible through direct URLs for users with the correct permissions.
# Keywords
Source: https://docs.curator.interworks.com/site_content_design/content_discovery/keywords
Assign and manage keywords for content organization and improved search and filtering capabilities.
Keywords can be associated with dashboards, pages, individual files, and menu items. These keywords can be utilized in
the Search and Explorer feature when pulling in results, as well as when determining which content to display on a page.
A keyword page can be set up that will pull in all content tagged with the keyword.
***To create a new keyword***
1. Navigate to the **Content** section in the backend of your Curator instance.
2. Select **Keywords** from the Content dropdown.
3. Click the **New Keyword** button.
4. Assign a title to the new keyword (this will be the keyword that is created)
5. From here you can check the box next to an existing piece of content to associate it with that keyword. This new
keyword will now be available in the keywords list when creating new pieces of content as well.
***To link a keyword to a Dashboard:***
1. While editing a Dashboard, click on the **Misc** tab.
2. Scroll to the **Discovery** section.
3. Select the **Search Keywords** field.
4. Type in the text for the first keyword.
5. Check the box next to the desired keyword.
6. Click the **Save** button at the top-right corner of the page.
The above process is used for linking keywords to pages and files as well. To link a keyword to a menu item, first
create the menu item, then link it to the desired keyword in the **Keywords** section.
# Search
Source: https://docs.curator.interworks.com/site_content_design/content_discovery/search
Enable and configure search functionality to help users discover and locate content across the Curator portal.
The frontend search functionality helps explore your Curator content or access specific content directly without
navigating through the menus.
## Enabling Search
1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`) and log in if prompted.
2. Navigate to *Settings > Curator > Portal Settings > Features > Usability*
3. Switch the toggle *Search* on to enable search
*Note:* The search toggle enables the search prompt shown in the menu. You can also
[add a search element directly to a page](#adding-a-search-element-to-a-page) using Page Builder.
### Adding a Search Element to a Page
In addition to the menu search prompt, you can add a dedicated search bar to any page using Page Builder.
1. Navigate to **Content** > **Pages** in the backend of your Curator instance.
2. Click **New Page** or edit an existing page.
3. Add a new row element and/or click the **Edit Content** button (pencil icon) on a row element.
4. In the element popup, select **Search** under the Web Elements tab.
5. Optionally, set the **Element Title** field in the Element Styles section to display a heading above the search bar.
6. Optionally, set the **Search Placeholder Text** field in the Search Settings section to customize the placeholder
text shown inside the search input.
The search element on a page only works when the global Search toggle is enabled under
*Settings > Curator > Portal Settings > Features > Usability*. If the toggle is off, the search element will not
function.
### Beta Search
An optional **Beta Search** mode is now available for portals that need faster or more reliable search. To enable it,
follow the steps above to turn on Search, then switch on the *Enable Beta Search* toggle directly beneath it.
Beta Search uses a more powerful search system behind the scenes to deliver quicker and more consistent results than
the default experience. You may want to try it if:
* Your portal has many dashboards, pages, or files and search feels slow
* You need search to scale reliably as your content library grows
* You prefer more precise results that exactly match what you type
Beta Search is less forgiving of typos or vague terms, so queries should closely match titles, descriptions or
keywords. As this feature is still experimental, behavior may change in future updates.
### Content that is searched
The search considers the following components to generate the search results:
1. Titles
2. Descriptions
3. Keywords
4. From version 2023.02.15 onwards: Text content on pages
5. Extracted text content from directly-browsable Files (e.g. uploaded HTML files)
6. Text content of HTML files embedded on a page via the **Upload HTML** page source type
*Note:* For pages with unrestricted HTML content blocks, only static text present directly in HTML elements is
used for search. Content inside `