# Cache Warming Source: https://docs.curator.interworks.com/best_practices/performance/cache_warming Improve initial page load times by pre-warming caches for better user experience Sometimes the initial page load or log in flow for your users can be very slow. This is because we must perform API calls to check if the user has permission to see each navigation item related to analytic content. Single API calls are fast but when your menu is large and many calls must be made it can really anchor the load time. This feature allows you to choose a select group of Curator users to warm the cache for. This improves the initial page load and skips the long wait caused by permission checks. The affect is even greater if your menu is very large. ## Global Cache Warming (Default Behavior) By default, Curator warms the cache for every user when they log in via the `/curator/loading` route. This runs the same permission checks and menu-building logic upfront so that subsequent page loads are fast for the entire user base, not just the smaller Frontend Group described in the next section. This default behavior works well for most portals, but on installations with a very large user base or a very large analytic content menu it can drive significant memory usage as each login warms a full cache slice. In rare cases this can lead to PHP memory exhaustion or HTTP 503 errors during peak login periods. To disable global cache warming without affecting the targeted Frontend Group warming described below: 1. Navigate to **Curator Backend > Settings > Curator > Portal Settings > Features**. 2. Enable the “Disable All Cache Warming” toggle. 3. Click **Save**. Disabling global cache warming will make the first page load after login slower for users, since permission checks and menu building will happen on demand instead of upfront. On-Prem: if you are hitting memory limits, also review the `memory_limit` setting in your `php.ini` against the [Server Requirements](/get_started/self_hosted_overview#server-requirements) before disabling global cache warming. ## Setting Up the Group First, we need to make sure you have a Frontend Group that contains the users needing their cache warmed. This Frontend Group needs to have less than 200 users because this process is intensive. Increasing the number of users could clog the queue and hurt performance. We're still playing with the sweet spot for number of users so this may change in the future. 1. Navigate to your Curator backend > Settings > Users > Frontend Groups. If you already have a group with less than 200 members that contains the users you’d like to receive the speed bump, you’re good to go and can skip to “Setting Up the Feature”! Otherwise, hit the “New Frontend Group” button: 2. Give your group a name: 3. Either manually select users in the “Group Members” section or choose a group from one of your analytic platforms in the sections below: 4. Hit “Save!” ## Enabling Cache Warming for your Group 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. Choose the Frontend Group we created earlier. 4. Hit “Save!” ## Changing the Cache Driver Curator's cache driver is set by the `CACHE_DRIVER` environment variable in the `.env` file at the Curator webroot (on Linux this is `/var/www/html/.env`). When `CACHE_DRIVER` is not set, Curator defaults to the `file` driver. Supported drivers: | Driver | `CACHE_DRIVER` value | Notes | | ----------- | -------------------- | ----------------------------------------------------------------------------------- | | File system | `file` | Default; no extra services required | | Memcached | `memcached` | Requires memcached (Recommended on Linux installations) | | Database | `database` | Uses the `cache` table in Curator's database (Not usually recommended due to speed) | To switch away from memcached (or any other driver) to file-based caching: 1. Open the `.env` file in the Curator webroot. 2. Add or update the `CACHE_DRIVER` line: ``` CACHE_DRIVER=file ``` 3. Clear the existing cache by clicking the **Clear Cache** button in the Curator backend (or run `php artisan cache:clear` from the webroot). 4. Restart your web server so the new environment value is picked up. Switching drivers does not migrate previously cached data. Cached items are rebuilt on the next user request or cache warming cycle. # Menu Tuning Source: https://docs.curator.interworks.com/best_practices/performance/menu_tuning Optimize menu system performance with tips and configuration recommendations ## Menu Overview While Curator’s menu system is about as streamlined as possible, there are some tips and tricks you can use to tune its performance if fancy yourself as a Vin Diesel type. Most of the delays Curator clients see when rendering their navigation relates to the permission checking that ensures each user only sees the links they have access to view. One of the big selling points with Curator is that it inherits permissions from the connected platforms by default, so this is a necessary step. The good news is that Curator does cache all of those permission checks, so it’s really only an issue when users first log in to Curator for the day. However, that’s also the first impression users get to your Curator portal, so it’s understandable that this should be as fast as possible. With a little thought, this is where performance gains can be realized. ## The Obvious Stuff The first thing to check is always that Curator and any platforms it is connected to are running at full speed. If your Tableau Server is underpowered or is being bombarded by users, that will slow down the permission checks Curator needs to make. Same goes if the network connection between Curator and the other platforms is handled by letter-carrying snails instead of bullet train-esque transfers. Lastly, the most common cause of general performance issues with Curator itself is file system speed. If the storage mounted to your Curator server runs through the laziest of digital stonemasons hand chiseling each bit on the drive platters, it’s going to slow down things like Curator’s caching system and generally make life unbearable. Many times, the file system itself is fast but malware detection running on the server prevents it from running at full speed. ## Short-Circuiting Let’s say your main navigation is organized by high level categories. If most of your users only have access to one or two of those categories, then it doesn’t make sense to check permissions on each link under the others. By using Curator’s restrict access functionality, you can set which groups have access to each category and this will essentially short circuit the permission checking for any top-level categories where the user is restricted. For instance, if you have a category for human resources and you set its restrict access to only allow users in the HR group, any user who isn’t in the HR group will skip checking the links under the human resources category. Any permission checks that get skipped means the navigation will render that much faster. ## Utilizing Landing Pages If you’ve got hundreds or thousands of links in your navigation and can’t use the short-circuiting approach above, then you could try creating landing pages for sections of the navigation to reduce the number of links it needs to check permissions against. Using the same human resources example, you could create a human resources page that has links to the various human resources content using the built-in tiles or lists. When you add this page to the navigation, Curator only has to check whether the user is allowed to see that page, which should be quick. Only when a user clicks to open that human resources page will Curator check permissions for each of those links on the page. If you repeat this for several sections of the navigation, it really cuts down on the number of permission checks the menu system needs to make before showing the home page. Combining Tableau Workbooks The way Curator checks permissions for Tableau is by getting the list of workbooks a user has access to on a per site basis and then checking which dashboards are in each of those workbooks. This means that if you have a million dashboards and they are all in their own workbook, Curator is going to have to make a million API (application programming interface – or a fancy way to say that Curator is talking to Tableau) calls to Tableau just to determine whether a link should be shown in the navigation. On the other hand, if you combined those into a single workbook with a million dashboards, Curator would only have to make one API request to Tableau to check. While your network connection and Tableau Server might be supercharged, there will always be overhead delays when increasing the number of API calls over the web. By minimizing the number of API calls, you’ll see better performance. ## Combining Tableau Sites Tableau sites are wonderful for making sure your various audiences are segregated from each other, since each site is independent from the others. However, this also means that if you have content published from multiple sites, Curator has to make separate API calls to check permissions for each one. Like combining your dashboards into fewer workbooks, combining your workbooks into fewer sites will also see those gains. Connecting to Tableau Server’s Repository As mentioned earlier, making API calls between Curator and Tableau incurs some overhead which slows down the process. An alternative to that is allowing Curator to connect directly to Tableau Server’s underlying database (AKA repository). This avoids a lot of that overhead. Additionally, Curator is able to create custom queries to pull exactly the information it needs in a single request. This includes checking all workbooks at the same time as well as only requiring Curator to authenticate once instead of once per Tableau site. Needless to say, whenever Curator can use the repository connection instead of the API, it’s able to shave precious seconds off of its quarter mile time. Unfortunately, connecting to the repository is only possible for Tableau Server; so if you’re using Tableau Cloud, this won’t be an option for you. ## Warming the Cache (Advanced) As you’ve probably seen in a lot of motor sports, racers often spin their tires to warm them up before a race. This increases traction and allows them to go faster around the track. Since Curator uses cache for permission checks, one way you can make it go faster around the track is to warm its cache at the beginning of each day. In a nutshell, this is scheduling something each morning to call Curator’s API to generate the navigation for each user before they try to log in for the first time. When a user does log in for the first time, all of the permission checks will have already been cached, so Curator can build the navigation fast and furious. Curator’s API end point can be found at /api/v1/Content/generateNavMenus. You’ll need to pass it a valid API key, the ID of the menu to generate, and the username to generate it for. Documentation on how to call this API endpoint can be found by navigating to Backend >Settings >Curator >API Keys, click on one of the keys, and change the drop-downs at the bottom to “Content” and “generateNavMenus,” respectively. If you don’t have a good way to schedule API calls, you can take advantage of Curator’s automation scripts. This feature is disabled by default, so to enable it navigate to Backend >Settings >Curator >Portal Settings >Features tab > Functionality Section >Integration Automation switch and save. Once enabled, refresh the page and you should see a new section under Backend >Integrations >Automation to create scripts or commands. This is an advanced topic, so we’ll leave the rest up to you to implement, but if you want to create a script to call the API you’ll use Manage Scripts. If you want to issue commands on Curator’s server to call the API, you’ll use Manage Commands. Both can be configured for whatever schedule makes sense in your environment. # Password Settings Source: https://docs.curator.interworks.com/best_practices/security/password_settings Configure password complexity requirements and security policies for enhanced site security It’s always a good idea to keep your site as secure as possible. Beyond settings like https, multi-factor authentication and firewalls, you can now set better password policies. Password complexity options allow you to set stricter rules for passwords to prevent users from creating weak passwords. Password expiration allows you to require users to change their passwords on a frequent basis. Let’s take a deeper look into these two settings. ## Password Complexity Options Password complexity allows you to set rules to require stronger passwords. To enable and configure password complexity options, go to Backend > Settings > Curator > Portal Settings. Under the general tab, you will find a section called Security. Expand that, and you can now find the Password Complexity Options toggle. Please note that in order to view and configure this setting, you must have Password Change or Password Reset settings (or both) enabled, which require you to use Tableau or Curator as your authentication: Once you toggle on Password Complexity Options, you will see three different options you can set to require stronger passwords: It’s a good idea to set a long length requirement, the longer the better, but don’t go too overboard or your users may want to write their passwords down on a Post-it note attached to their display. The first time you enable this setting, it will default to 10. Once enabled, you will now see these requirements on pages that allow you to set a password: ## Password Expiration Password expiration can be found on the same Portal Settings page and tab, right next to the Password Complexity Options. Like the prior option we looked at, you must have Password Change or Password Reset enabled to be able to view password expiration. Click the toggle to enable it, and you will now see you can set the number of days until user passwords will expire: If enabled, the login page will check to see if the user’s password is expired and, if so, redirect them to a page to set a new password. Once this is done, they will be able to log in with the new password. Setting a prudent expiration date, such as 90 days, and turning on password complexity options are easy, effective ways to make your Curator portal even more secure. # API Relays Source: https://docs.curator.interworks.com/creating_integrations/api_relay Forward requests to external APIs through Curator, keeping credentials secure and centralizing access control. ## Overview An API relay is a server-side proxy that sits between your users and an external API, letting Curator call third-party services without exposing credentials to the browser. You configure the relay once; Curator then attaches your stored credentials, validates incoming calls, and forwards the assembled request to the external service on the caller's behalf. The result: sensitive credentials never leave your server, your external API surface is limited to exactly what you expose, and you get a single, auditable integration point you can monitor, update, or disable without touching the calling code. ## When to use an API relay API relays bridge Curator with any third-party API. Common scenarios: * **Custom BI embeds from non-integrated platforms** — a custom JavaScript embed that fetches live data from an external REST API, with the API key stored as a Curator constant instead of in the browser. * **Submitting form data to a webhook** — Data Manager routes mark-commenting submissions to any HTTP endpoint, using an API relay as the connection point. See [Sending Data to Webhooks](/embedding_using_analytics/data_manager/sending_data_to_webhooks). * **AI chat integration** — let users talk to an AI assistant without exposing your paid AI account credentials. ## Prerequisites API relays require the **Integration Automation** feature to be enabled: 1. Log in to the Curator backend. 2. Navigate to **Settings** > **Portal Settings** > **Features**. 3. Enable **Integration Automation** under the Functionality section. 4. Save and refresh the page. After enabling, the **Integrations** > **Automation** > **API Relay** section will appear in the left-hand menu. ## Creating an API relay 1. Navigate to **Integrations** > **Automation** > **API Relay**. 2. Click **New** at the top of the list. 3. Fill in the form (see the field reference below) and click **Save**. 4. Once saved, the **Link** shown at the top of the edit form is the URL you will call to trigger the relay. Copy it and use it in your integration. > **Security note:** The Portal Link is publicly accessible by default — any caller who knows the URL can trigger > the relay, and it is not tied to a logged-in user. If the relay exposes a sensitive upstream API, restrict > access (see [Securing a relay](#securing-a-relay) below). ## Field reference ### Basic settings | Field | Description | | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Name** | A descriptive label for the relay. Used only in the backend list — not exposed to callers. | | **Description** | Optional free-text notes. Useful for documenting what the relay does and who relies on it. | | **Log Relay Usage?** | When enabled, Curator writes a log entry every time the relay is triggered. Includes the incoming input, outgoing request details, and the response. Useful for debugging but may be noisy in production. | *** ### Outgoing Request URL This section controls where Curator sends the relayed request. | Field | Description | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **URL** | The full external API endpoint URL. Do not include a query string here, variables and constants are appended automatically. | | **Allow Dynamic URL** | When enabled, a caller can supply a different target URL at call time via the variable name set in **Dynamic URL Variable**. If the caller omits the variable, the static URL above is used. | | **Dynamic URL Variable** | The query parameter name the caller should use to pass an override URL. Only shown when **Allow Dynamic URL** is enabled. | | **Used In Webhook?** | Changes how the outgoing request body is constructed. When enabled, Curator forwards the entire incoming request body to the upstream URL rather than only the configured variables and constants. Enable this when the relay will be selected in a Data Manager Data Group's **Send to Webhook** setting, where the full submitted payload needs to be forwarded. | *** ### Outgoing Request Content This section defines what Curator sends to the external API: the headers, fixed values, caller-supplied values, and body content. #### Headers HTTP headers to attach to every outgoing request (e.g. `Content-Type: application/json`, `Accept: application/json`). Each header entry has a **Key**, a **Value**, and an **Allow Dynamic Values** toggle. When dynamic values are enabled, a caller can override that header's value by sending an HTTP header of the same name in their request to the relay. #### Constants Fixed key-value pairs that are always sent with the outgoing request regardless of what the caller provides. This is the right place for credentials, API keys, tokens, or any other value that must remain server-side and must never be visible to the caller. Constants cannot be overridden by incoming requests. Each constant also has an **Encrypt Value** toggle. Turn it on for sensitive values such as API keys or client secrets: the value is then stored encrypted in the database and shown as `***redacted***` in relay logs instead of in plain text. The outgoing request still receives the real value. Encryption is one-way. Once saved, the form only ever shows the encrypted form of the value, and Curator never decrypts it back for display. Turning **Encrypt Value** off while the encrypted value is still in the field is rejected when the relay is saved. To store a constant unencrypted again, clear the field and enter a new value. #### Variables Named parameters that the caller is expected to supply at call time (e.g. `start_date`, `region`, `user_id`). Each variable has a **Key** (the parameter name) and an **Is Required?** toggle. Required variables will cause the relay to reject the call if they are missing. Variables are passed by the caller as query string parameters or POST body fields using the same key name defined here. #### Body Content Static body content to include in the outgoing request (e.g. a fixed JSON or XML payload). Leave blank if the request body is built entirely from variables and constants. Body content applies to POST relays only — a GET relay sends its parameters on the URL and ignores the body. To let an incoming request set or edit the body at call time — whole-body replacement, placeholder substitution, or transforming the value before it is injected — enable **Allow Dynamic Body Content**. This is covered in full in [Dynamic Body Content in the API Relay](/embedding_using_analytics/data_manager/api_relay_dynamic_body_content). *** ### Response Caching Optional. A relay makes a fresh outgoing request on every call by default. Turn on caching when the same response is valid for more than one caller or more than one moment, so repeated calls skip the round trip to the upstream API. * **Cache Relay Responses?** — off by default. When on, Curator stores the upstream response and reuses it for any later call that would have produced the same outgoing request. Calls that differ in their HTTP method or in the parameters they send are cached separately; parameter order does not matter, so `?a=1&b=2` and `?b=2&a=1` share one cached response. * **Cache Duration (seconds)** — how long a cached response stays valid. Defaults to 60. Keep this shorter than the lifetime of anything the response contains: a relay that returns a short-lived OAuth token should expire its cache well before the token does. * **Cache Per User?** — off by default, which is correct when every caller legitimately receives the same response, such as a client credentials OAuth flow. Turn it on when the upstream response differs per user. Curator then keeps a separate cached response for each signed-in user, and any call it cannot attribute to a specific user is not cached at all — including calls to the relay's own unauthenticated URL, and every call on a portal using Pass-Through authentication, where all visitors share one identity. Three things are never served from, or written to, the cache: * **Webhook relays.** A webhook forwards the incoming payload upstream as a write, so replaying an earlier response would silently drop a repeated submission. * **Requests carrying a file upload**, which cannot be matched against an earlier call. * **Requests that fail Incoming Request Validation**, which are rejected before the cache is consulted. Saving the relay clears its cached responses, so any configuration change takes effect on the next call rather than after the cache duration elapses. *** ### Incoming Request Validation Optional rules that Curator evaluates before forwarding any request. If a request fails validation, the relay is not called and Curator returns an error. #### Header-based validation Define conditions on specific HTTP headers in the incoming request. For each rule, specify: * **Header** — the HTTP header name to inspect. * **Condition** — one of: Matches, Does not match, Contains, Does not contain, Starts with, Ends with. * **Value** — the value to test against. All defined rules must pass for the relay to proceed. #### Variable-based validation The same conditional structure applied to query string or POST body parameters rather than headers. #### Validation failure response By default, a validation failure returns an **HTTP 403** response. Disable **Should validation failures respond with error code?** to return an **HTTP 200** with an error message in the body instead. Some webhook endpoints or client-side integrations expect 200 for all responses; use this toggle if the caller cannot handle 4xx status codes. *** ## Securing a relay The relay endpoint is public and unauthenticated — it does not require a logged-in user, and any caller who knows the Portal Link can trigger it. Your credentials stay safe (they live in **Constants**, server-side), but the endpoint itself is open. To lock it down: * **Require a shared secret (recommended).** Add an **Incoming Request Validation** rule that checks for a header or variable only authorized callers know — e.g. a header `X-Relay-Token` with condition **Matches** and a long random value. Requests without it are rejected before the relay forwards anything. * **Restrict by IP at the network layer.** Curator has no built-in per-relay IP allowlist. To limit the relay to specific source IPs, enforce it in front of Curator — in your web server (nginx/Apache), load balancer, firewall, or WAF — by allowing only trusted IPs to reach the `/api/v1/integration/apiRelay` path. Do not rely on a validation rule against a forwarded header such as `X-Forwarded-For`: that header is caller-supplied and can be spoofed. ## Calling the relay Once a relay is saved, Curator generates a **Portal Link** shown at the top of the edit form. This is the URL you call to trigger the relay. Its structure is: ``` https://your-curator-instance.com/api/v1/integration/apiRelay?api_relay_id=X&variable1=X&variable2=X ``` * `api_relay_id` is the numeric ID of the relay record (fixed). * Each configured **Variable** appears as a query parameter. The relay accepts both **GET** and **POST** requests. For POST, variables can be supplied in the request body instead of the query string. ### Response format Curator returns a JSON object in all cases. The shape depends on whether the relay succeeded, failed, or was blocked by validation. **On success:** ```json theme={null} { "result": "Success", "msg": { ... } } ``` | Field | Description | | -------- | -------------------------------------------------------------------------------- | | `result` | `"Success"` or `"Failure"`. | | `msg` | The external API's response body — parsed if it is JSON, otherwise a raw string. | **On failure** — `result` is `"Failure"` and `msg` is a human-readable error. This covers both relay-level problems (missing or invalid `api_relay_id`, a missing required variable) **and** upstream API errors: if the external API responds with an HTTP status of 400 or higher, the relay reports failure with a message like `There was an error processing your request: API Relay call failed with HTTP code 500`. ```json theme={null} { "result": "Failure", "msg": "There was an error processing your request: ..." } ``` **When Incoming Request Validation blocks the call:** ```json theme={null} { "status": "error", "msg": "Invalid incoming request for API relay" } ``` Validation failures use a different envelope (`status` instead of `result`) and return HTTP 403 by default (or HTTP 200 if you have disabled the **Should validation failures respond with error code?** toggle). *** ## Good to know * **Constants are never exposed to callers.** They are stored server-side and merged into the outgoing request by Curator. A caller inspecting browser network traffic will only see the Curator relay URL and their own variables — not the upstream API credentials. * **Variable names are pass-through.** A variable named `start_date` in the relay configuration must be sent as `start_date` in the incoming request. Curator does not rename or transform variable names — only dynamic body content advanced processing can modify values. * **Headers sent by the caller are not forwarded by default.** Only headers you explicitly define in the **Headers** section are included in the outgoing request. This prevents accidental forwarding of cookies, session tokens, or other browser headers to the external API. * **Relay calls are unauthenticated by default.** Curator does not require the caller to be a logged-in user to hit the relay endpoint — see [Securing a relay](#securing-a-relay) if you need to restrict access. * **Enabling Log Relay Usage adds full request/response logging.** This is useful during development and debugging but can be verbose. Logs are written to Curator's standard application log files under `storage/logs/`. Disable logging in production once the integration is confirmed working. Constants flagged with **Encrypt Value** are redacted from these logs (shown as `***redacted***`) in the logged arguments and outgoing URL, and are also scrubbed from the logged upstream response when it echoes the value back. Values shorter than 8 characters are only redacted from the arguments and URL, since matching such short strings elsewhere would corrupt unrelated parts of the log. * **The relay is a thin forwarder.** It returns the upstream response body largely as-is (parsing it if it is JSON) rather than reshaping it. The one thing it does act on is the upstream HTTP status: a 400-or-higher response is turned into a `"Failure"` envelope rather than passed through as a success. * **`[Grouped] API Relay X was used` in the Event Log is log grouping, not a cap on relay calls.** When the same Event Log message repeats often enough, Curator stops writing a separate line for every occurrence and logs one entry standing in for the duplicates instead — see [Log Rate Limiter](/site_administration/logging/log_rate_limiter). Nothing about the relay is throttled or blocked, and there is no per-relay limit to raise. Read it as a signal that something is repeating: open the grouped entry for the count and the time it started, and look at the entries logged before grouping began to find the underlying error. Turning on **Log Relay Usage?** temporarily captures the request and response detail behind those entries. *** ## Related * [Sending Data to Webhooks](/embedding_using_analytics/data_manager/sending_data_to_webhooks) — how to connect an API relay to Data Manager for mark-commenting webhook submissions. * [Dynamic Body Content in the API Relay](/embedding_using_analytics/data_manager/api_relay_dynamic_body_content) — letting an incoming request set or edit the outgoing request body. # Overview Source: https://docs.curator.interworks.com/creating_integrations/overview Overview of creating and managing integrations with external platforms in Curator ## Overview Integrations connect Curator to your business intelligence platforms, allowing you to embed dashboards, synchronize users, and centralize analytics access. ### What are Integrations? Integrations (also called "Connections") allow Curator to communicate with external BI platforms. Once configured, these connections enable you to: * **Embed visualizations**: Add dashboards and reports from your BI platforms directly to Curator by selecting dropdown options * **Synchronize users**: Keep user access and permissions in sync between Curator and your BI platforms * **Monitor health**: Automatically detect connection issues and receive email alerts when problems occur * **Automate tasks**: Schedule data refreshes, run scripts, and execute platform-specific commands ### How Connections Work Each connection stores the server details and authentication credentials needed to communicate with the external platform. Curator securely encrypts sensitive information and continuously monitors connection health to ensure reliable access to your analytics. Follow the platform-specific setup guides to create and configure the connection to your BI tool. ### Backend User Permissions When a backend user saves a new connection, Curator automatically grants that user the backend permissions needed to access the integration. **Other backend users do not receive these permissions automatically** — they must be granted access manually by a super-administrator. If an integration does not appear in the backend navigation for a particular user after a connection has been created, the most likely cause is that the user has not been granted the required permissions. To resolve this: 1. Log in to the Curator backend as a super-administrator. 2. Navigate to **Settings** > **Administrators**. 3. Click on the backend user who cannot see the integration. 4. Open the **Permissions** tab and locate the section for the relevant platform (e.g., **Sigma**, **PowerBI**, **Tableau**, or **ThoughtSpot**). 5. Enable the required permissions for that user and save. ### Supported Platforms Curator supports integrations with the following platforms: * [Tableau Cloud](/creating_integrations/tableau_connection/tableau_cloud_setup) * [Tableau Server](/creating_integrations/tableau_connection/creating_a_connection) * [Power BI](/creating_integrations/power_bi_connection/azure_app_setup) * [ThoughtSpot](/creating_integrations/thoughtspot_connection/integrating_thoughtspot_with_curator) * [Sigma Computing](/creating_integrations/sigma_connection/creating_a_sigma_connection) # Azure Admin Registered App Setup Source: https://docs.curator.interworks.com/creating_integrations/power_bi_connection/azure_admin_app_setup Step-by-step guide to set up Azure application registration for Power BI's Admin API integration with Curator. ## Steps ## Creating a registered app for the admin API within the Azure Portal This will be a very similar process to creating the non-admin registered app in the previous step, but this registered app will be used for authentication to the read-only Power BI **Admin API** for Curator to be able to check permissions, etc. on behalf of Power BI users. 1. Log in to the [Azure Portal](https://portal.azure.com); 2. Search for “App Registrations” to start the process. You may also find them inside the *Microsoft Entra ID* > *Manage* > *App Registrations*. 3. Click the button to register a new application. 4. Add a distinct and descriptive name. It's suggested to clarify that this is for the Admin API (e.g. "Curator Power BI Admin API App"). * You should skip the "Redirect URI" step for this registered app as it will not be used. Make sure to create this app registration under the same Azure tenant as the non-admin registered app created previously. 5. Once the app is registered, make note of the following details from the “Overview” page as you will need them when setting up the configuration on Curator: * Application (client) ID - This will be used as the **Admin Client ID** in Curator. * Directory (tenant) ID - This should be the same as the tenant ID used for the registered app. ## API Permissions Do **not** add any API permissions to this registered app. It does not need permissions assigned in order to access the read-only admin APIs, and in fact adding them will actually prevent it from being able to access those APIs. ## Create a Client Secret Curator's Power BI integration supports client secret authentication only. Do not use the *Certificates* tab to configure certificate-based authentication, as it is not supported. 1. While still viewing the admin registered app, click on *Manage* > *Certificates & secrets* in the left navigation. 2. Click the button to add a new client secret. This will be used as the **Admin Client Secret** in Curator. 3. Fill in the description and adjust the expiration date as desired, and click the save button. 4. Copy the client secret **value** and document it in a secure place. You will not be able to retrieve the value again once you leave this screen. Do not confuse this with the *Secret ID*. Curator must have the secret *value* to authenticate. Until this Admin Registered App setup is complete and the credentials are saved in Curator, Power BI items in the **User Menu Access** tab will display amber warning icons and access previewing will be unavailable. Complete this setup and enter the credentials under **Settings** > **Power BI Settings** on the **Admin** tab to enable access previewing. # Azure Registered App Setup Source: https://docs.curator.interworks.com/creating_integrations/power_bi_connection/azure_app_setup Step-by-step guide to set up Azure application registration for non-admin Power BI integration with Curator. ## Steps ## Creating a Registered App within the Azure Portal This registered app will be used for authentication to the Power BI non-admin APIs on behalf of users accessing Power BI content within Curator. 1. Log in to the [Azure Portal](https://portal.azure.com); 2. Search for “App Registrations” to start the process. You may also find them inside the *Microsoft Entra ID* > *Manage* > *App Registrations*. 3. Click the button to register a new application. 4. Give the app a distinct and descriptive name and provide a redirect URI during this process under the "Web" platform. The redirect URI should follow this format: `https://curatorexample.com/powerbi` If the redirect URI is not configured correctly, users will see an error like: `AADSTS50011: The redirect URI specified in the request does not match the redirect URIs configured for the application.` **To fix this:** 1. Go to [Azure Portal](https://portal.azure.com) 2. Find your app registration 3. Click **Manage** > **Authentication (Preview)** in the left navigation 4. Add a **Web** redirect URI using your Curator portal's domain with the `/powerbi` suffix (e.g., `https://curatorexample.com/powerbi`) 5. Once the app is registered, make note of the following details from the “Overview” page as you will need them when setting up the configuration on Curator: * Application (client) ID * Directory (tenant) ID * Application ID URI ## API Permissions Your InterWorks Curator Azure Registered App will need several delegated API permissions. While still viewing the registered app, click on *Manage* > *API permissions* in the left navigation. Add the following permissions as delegated permissions: Curator uses the OAuth delegated permission flow, which requires each user to sign in with their own Microsoft account. Application-level (service principal) permissions are not compatible with this registered app. If you need to configure a service principal for the Admin API, see the [Azure Admin Registered App Setup](/creating_integrations/power_bi_connection/azure_admin_app_setup) page. * Microsoft Graph * User.Read * Power BI Service * Dashboard.Read.All * Dataset.Read.All * Report.Read.All * Workspace.Read.All If you intend to use **persistent filters** or other functionality that tracks user state, you'll also need to add: * Power BI Service * UserState.ReadWrite.All Depending on your level of access, you may need to ask Azure administrators to grant admin consent for these permissions. ## Create a Client Secret Curator's Power BI integration supports client secret authentication only. Do not use the *Certificates* tab to configure certificate-based authentication, as it is not supported. 1. While still viewing the registered app, click on *Manage* > *Certificates & secrets* in the left navigation. 2. Click the button to add a new client secret. 3. Fill in the description and adjust the expiration date as desired, and click the save button. 4. Copy the client secret **value** and document it in a secure place. You will not be able to retrieve the value again once you leave this screen. Do not confuse this with the *Secret ID*. Curator must have the secret *value* to authenticate. # Curator Connection Source: https://docs.curator.interworks.com/creating_integrations/power_bi_connection/curator_connection Final setup steps to create and configure the Power BI connection within Curator backend. ## Steps ## Creating Curator Connection to Power BI Note: You will need details from your non-admin registered app and your admin registered app. See steps 1-3 above if you have not configured those yet. If your Curator license allows you to connect to Power BI, you can connect to it by following this process: 1. 2. Click the button at the top to create a new connection. 3. From here, fill out the details under the *Power BI Connection* section, then click save. The first 3 fields need to be filled in, but the 2 admin fields are highly recommended because they will lead to a better overall experience. * **Cloud Environment**: Leave on *Commercial (default)* unless this tenant is hosted in a Microsoft US Government sovereign cloud (GCC, GCC High, or DoD). See [US Government Cloud (GCC) Setup](./us_government_cloud) for details. * **Client ID**: "Application (client) ID" from the non-admin registered app (see [Azure App Setup](/creating_integrations/power_bi_connection/azure_app_setup)). * **Tenant ID**: "Directory (tenant) ID" from the non-admin registered app (see [Azure App Setup](/creating_integrations/power_bi_connection/azure_app_setup)). * **Client Secret**: "Client secret" value (again, not the client secret ID) from the non-admin registered app (see [Azure App Setup](/creating_integrations/power_bi_connection/azure_app_setup)). * **Admin Client ID**: "Application (client) ID" from the *admin* registered app (see [Azure Admin App Setup](/creating_integrations/power_bi_connection/azure_admin_app_setup)). * **Admin Client Secret**: "Client secret" value (again, not the client secret ID) from the *admin* registered app (see [Azure Admin App Setup](/creating_integrations/power_bi_connection/azure_admin_app_setup)). 4. Refresh the page after saving and you should see a Power BI section show up in the left navigation. ### Authentication Groups (optional) Under the *Authentication Groups* section on the Power BI connection, you can control which Frontend Groups are sent through the Microsoft authentication flow. This is useful when only a subset of your users actually need Power BI access -- skipping the Microsoft login for everyone else avoids unnecessary prompts for content they cannot view. The **Authentication Group Mode** toggle determines how the *Frontend Groups* list below it is interpreted: * **Exclude listed groups from Microsoft authentication** (default): Users in any listed group skip the Microsoft login flow. All other users go through it. Use this when most of your users need Power BI authentication and only a few groups should be excluded. * **Only require Microsoft authentication for listed groups**: Only users in a listed group are sent through the Microsoft login flow. All other users bypass it. Use this when only a small subset of your users need Power BI authentication. If the *Frontend Groups* list is empty, the toggle has no effect -- every user is sent through Microsoft authentication, matching the default Power BI behavior. ### Validate a successful connection * The admin registered app connection was successful if the dropdowns in the backend under **Power BI** > **Reports** > **Create** a new report populate. * The non-admin registered app connection was successful if reports load in the frontend. Be sure to log out of the frontend and log back in fresh. If you run into any issues, you can refer to the [Troubleshooting Power BI Access](./troubleshooting_power_bi_access) documentation for help. # Power BI Workspace Access Source: https://docs.curator.interworks.com/creating_integrations/power_bi_connection/power_bi_workspace_access Configure workspace permissions for Power BI integration with Curator. ## Steps ## A Note on Terminology The terms "registered app", "service principal", and "client" are technically not the same thing, however, for the purposes of this documentation you can think of them as the same thing. Similarly, "Power BI" and "Fabric" can also be considered the same things for the purposes of this documentation. If you already understand the differences, you probably also understand how to adjust the steps outlined in this documentation to meet your own needs. ## Allow service principals to use Fabric APIs The registered apps created in the previous steps need to be able to access Power BI APIs in order to query which workspaces, Dashboard, reports, etc. exist in your environment when publishing content to Curator. To enable the Power BI APIs: 1. Log in to the [Power BI portal](https://app.powerbi.com) with an account that has access to the admin portal. 2. Navigate to the [admin portal](https://app.powerbi.com/admin-portal) by clicking on the gear icon at the top right. 3. Select "Tenant Settings" on the left if not already selected. 4. Scroll to the "Developer settings" section and expand the "Allow service principals to use Fabric APIs" group. 5. Click the switch to enable. If desired, restrict access to only specific security groups (make sure the registered apps that Curator will be using are included in a security group specified here). Enabling this setting may take \~15 minutes to take effect. ## Allow service principals to access read-only admin APIs The admin registered app needs read-only access to the Power BI Admin APIs in order to query permissions, etc. on behalf of Power BI users. To enable the read-only admin APIs: 1. Log in to the [Power BI portal](https://app.powerbi.com) with an account that has access to the admin portal. 2. Navigate to the [admin portal](https://app.powerbi.com/admin-portal) by clicking on the gear icon at the top right. 3. Select "Tenant Settings" on the left if not already selected. 4. Scroll to the "Admin API settings" section and expand the "Service principals can access read-only admin APIs" group. 5. Click the switch to enable. If desired, restrict access to only specific security groups (make sure the admin registered app that Curator will be using is included in a security group specified here). Enabling this setting may take \~15 minutes to take effect. ## Add Registered Apps to Power BI Workspace(s) In order for the non-admin and admin registered apps to have access to your Power BI content, they must have permissions to the Power BI workspace(s) you intend to use with Curator. To add access to a workspace: 1. Log in to the [Power BI portal](https://app.powerbi.com). 2. In the left navigation, click on “Workspaces”. 3. Hover your mouse over one of the workspaces and click on the 3 dots that appear on the right. Choose “Workspace access”. 4. Search for the non-admin registered app name and give it the "Admin" permission. This ensures Curator will have access to add any content from Power BI that your Curator admins would like to add. 5. Repeat step 4 for the admin registered app name, also giving it "Admin" permission. 6. (optional) Repeat steps 2-5 for any remaining workspaces that need access. There are other paths to get to the screens mentioned above, but there have been times when those paths don't work correctly. The steps above are the most reliable way to get to the correct screens. # Troubleshooting Power BI Access Source: https://docs.curator.interworks.com/creating_integrations/power_bi_connection/troubleshooting_power_bi_access Common issues and solutions for Power BI connection problems in both frontend and backend access scenarios. Power BI connections have separate frontend and backend functionality, even though everything is configured from the backend connection. When troubleshooting issues, it's important to test each area separately since one might work perfectly while the other fails completely. *** ## Backend User Permissions After a Power BI connection is saved, the **Power BI** section may not appear in the backend navigation for some users. This is a permissions issue — the connection is valid, but the backend user has not been granted access to the Power BI plugin. Curator automatically grants backend permissions to the user who saves the connection. Other backend users must be granted access manually: 1. Log in as a super-administrator. 2. Navigate to **Settings** > **Administrators**. 3. Open the affected user's record and click the **Permissions** tab. 4. Under the **PowerBI** section, enable **Power BI administrator**. 5. Save the user record. *** ## User Menu Access Warnings When viewing the **User Menu Access** tab in the backend, Power BI items may display an amber warning icon (⚠) next to the menu entry. This icon means Curator cannot preview a user's access to that item because the **Admin Registered App** is not configured. Without an Admin connection, Curator has no way to query Power BI's Admin API to determine which workspaces and reports a user can see. **How to resolve:** Complete the [Azure Admin Registered App Setup](/creating_integrations/power_bi_connection/azure_admin_app_setup) and enter the resulting credentials under on the **Admin** tab. Once the Admin connection is saved, the warning icons will disappear and User Menu Access will correctly reflect each user's Power BI permissions. *** ## Backend Troubleshooting The backend integration with Power BI is straightforward - there's one reliable way to test it and only a few common failure points. ### Test if Backend is Working Follow these steps to verify your backend connection: 1. 2. Click the **Clear Cache** button (top right) to ensure fresh data. 3. Click the **New Report** button to navigate to the "Create Report" page. 4. Use the dropdown menus to select a workspace and report * **Success:** If you can select both workspace and report, your backend is working! Skip to the [Frontend section](#frontend-troubleshooting) * **Problem:** If either dropdown is empty when it shouldn't be, continue to the troubleshooting steps below Power BI Backend Success ### Debug Backend Issues When the backend isn't working, you need to see what Power BI is actually telling Curator. #### Enable Debug Mode 1. Click on the **Advanced** tab. 2. **Enable debugging** Toggle on **Debug Mode for Power BI** and click save Debug mode increases logging and can fill up your server. Set a reasonable **Debug Mode Expiration** (default: 24 hours). 3. **Repeat the steps to recreate the issue** Follow the steps in [Test if Backend is Working](#test-if-backend-is-working) again to recreate the issue while debug logging is enabled. 4. **Check the logs:** 1. 2. **Find Power BI calls** Filter for `Power BI API Call` using the search box (top right) 3. **Review responses** Click on entries to see Power BI's detailed responses For more information about Curator's logging systems, see the [Logging Overview](/site_administration/logging/logging_overview). #### Common Solutions **If you see error messages:** The solution depends on the specific error. Contact Curator support if the fix isn't obvious. Some errors may be prefixed with `POWER BI ERROR` or `ERROR during powerbi flow`, but others may have different text. **If responses are blank:** This means Curator can connect to Power BI, but the admin registered app (or non-admin registered app if not using admin) lacks workspace access. Try these fixes: ##### 1. Grant workspace access Follow the [Add Registered App to Power BI Workspace(s)](/creating_integrations/power_bi_connection/power_bi_workspace_access) instructions ##### 2. Enable Fabric APIs Follow the [Allow service principals to use Fabric APIs](/creating_integrations/power_bi_connection/power_bi_workspace_access) instructions *(Note: This change can take time to take effect in Power BI)* ##### 3. Check security groups If Fabric APIs are restricted to specific security groups, ensure your registered apps are a member of one of those groups. ### Expired or Rotated Client Secret Azure client secrets have a finite lifetime. When you create a client secret in Azure, you choose an expiration period (commonly 6, 12, or 24 months). Once the secret expires, Power BI will reject Curator's authentication requests and all Power BI content will stop loading until a new secret value is generated in Azure and saved in Curator's Power BI settings. **Symptoms:** * Power BI dashboards and reports that previously worked stop loading for all users at once. * Backend test pages (such as **Power BI** > **Reports**) return authentication errors when fetching workspaces or reports. * Event logs show errors mentioning `AADSTS7000222`, `Invalid client secret provided`, or `client secret has expired`. * The **Admin** and **Non-Admin** tabs under may still display the previously saved secret, but Azure no longer accepts it. Curator authenticates to Power BI using a client secret only. Certificate-based authentication is not currently supported, so rotating the client secret is the only way to restore access once the existing secret has expired. To rotate the client secret, follow the [Create a Client Secret](/creating_integrations/power_bi_connection/azure_app_setup#create-a-client-secret) steps in the Azure App Setup guide for the non-admin registered app (and the matching [Create a Client Secret](/creating_integrations/power_bi_connection/azure_admin_app_setup#create-a-client-secret) steps in the Azure Admin App Setup guide if you have configured an Admin Registered App). Then enter the new secret value in Curator as described in the [Curator Connection](/creating_integrations/power_bi_connection/curator_connection) guide. ### Admin Permissions Appear Then Disappear Sometimes the Admin Registered App works right after you save its credentials, then stops working within hours or days. The pattern can repeat: access comes back, then disappears again. This pattern is different from an expired secret, which fails once and stays failed until you rotate it. **Symptoms:** * The workspace and report dropdowns under **Power BI** > **Reports** > **New Report** populate at first, then come back empty. These dropdowns use the non-admin registered app, so this symptom points at that app. * Users see Power BI items in navigation after they log in, then lose them later in the same day. Navigation uses the admin registered app, so this symptom points at that app. * Event log entries for `Power BI API Call` alternate between full responses and blank or `401`/`403` responses. Curator caches the result of each Power BI permission check for up to 60 minutes, so a change in Power BI or Azure can take up to an hour to show in the backend. Click the **Clear Cache** button in the top right of the backend to drop that cache. Frontend navigation works differently. When an Admin Registered App is configured, Curator downloads the list of reports each user can see at the moment that user logs in to Power BI, and stores that list in the Curator database. Clear Cache does not download the list again. A user must log in to Power BI again, for example by logging out of Curator and back in, before a change in Power BI or Azure shows in their navigation. There are three common causes. Check them in this order. #### 1. Tenant setting has not propagated or was turned off The Admin Registered App depends on two Power BI tenant settings: **Service principals can call Fabric public APIs** under *Developer settings*, and **Service principals can access read-only admin APIs** under *Admin API settings*. Older tenants show the first setting as **Allow service principals to use Fabric APIs** or **Allow service principals to use Power BI APIs**. Both settings can take up to 15 minutes to propagate across your organization after you enable them. During that window, some requests succeed and others fail. If another admin later turns a setting off, or removes the admin app from the security group that the setting allows, access stops as soon as the cached permission checks expire. 1. Log in to the [Power BI admin portal](https://app.powerbi.com/admin-portal) and select **Tenant settings**. 2. Confirm that **Service principals can call Fabric public APIs** is enabled. 3. Confirm that **Service principals can access read-only admin APIs** is enabled. 4. If either setting is restricted to specific security groups, confirm that the admin registered app is still a member of one of those groups. 5. If you changed a setting, wait 15 minutes before you test again. See [Power BI Workspace Access](/creating_integrations/power_bi_connection/power_bi_workspace_access) for the full steps to enable each setting. #### 2. Registered app was removed from a workspace You manage workspace membership in Power BI, not in Curator. If another admin removes the registered app from a workspace, or lowers its role, Curator loses access to that workspace once the cached permission checks expire. Reports in other workspaces keep working, so the problem can look intermittent. 1. Log in to the [Power BI portal](https://app.powerbi.com) and click **Workspaces** in the left navigation. 2. Hover over a workspace that Curator uses, click the three dots, and choose **Workspace access**. 3. Confirm that both the non-admin and admin registered apps are listed with the **Admin** role. 4. Repeat for each workspace that Curator uses. If an app is missing, follow the [Add Registered Apps to Power BI Workspace(s)](/creating_integrations/power_bi_connection/power_bi_workspace_access#add-registered-apps-to-power-bi-workspaces) steps to add it back. #### 3. Client secret was created with a short expiry Azure lets you choose a custom expiry date when you create a client secret. A secret created with an expiry of hours or days works during setup and then fails as soon as the date passes. If an admin then creates another short-lived secret, the cycle repeats. 1. Log in to the [Azure Portal](https://portal.azure.com) and open **App registrations**. 2. Open the admin registered app and click **Manage** > **Certificates & secrets**. 3. Check the **Expires** column for the secret that Curator uses. 4. If the secret has expired or expires soon, create a new one with an expiry of months rather than days. 5. Repeat steps 2 through 4 for the non-admin registered app. 6. Follow the [Expired or Rotated Client Secret](#expired-or-rotated-client-secret) steps to save the new value in Curator. After you correct any of these causes, click the **Clear Cache** button in the top right of the backend and repeat the steps in [Test if Backend is Working](#test-if-backend-is-working). Then ask an affected user to log out of Curator and log back in, so that Curator downloads their Power BI report list again, and confirm that the Power BI items return to their navigation. *** ## Frontend Troubleshooting Once your backend connection works and you've published Power BI content to Curator's navigation, users should be able to access it seamlessly. ### Expected User Flow When everything is configured correctly (following [setup steps 1-4](/creating_integrations/power_bi_connection/azure_app_setup)), users should experience: 1. **Log in to Curator** Using the method configured in your [Authentication Settings](/setup/authentication/overview). 2. **Authenticate with Power BI** *(This may happen automatically with SSO)* 3. **Access content** Curator displays all accessible content based on platform permissions: * Tableau content: controlled by Tableau * ThoughtSpot content: controlled by ThoughtSpot * Power BI content: controlled by Power BI Curator can add additional restrictions but cannot expand access beyond what the source platform allows. ### Content Loads But Displays Blank If Power BI content appears in Curator's navigation and the page itself loads, but the report area renders as a blank space with no visible error, the failure is happening inside the Power BI JavaScript SDK after Curator has already handed off the embed. Curator embeds Power BI content using *user-owns-data* embedding: the report is loaded with the signed-in user's own Microsoft Entra ID (Azure AD) access token, and Power BI then decides what that individual user is allowed to see. This means Curator's server-side work can succeed completely — the content is published, the user passes Curator's own permission checks, and the embed URL is retrieved — while Power BI still declines to render the report for that particular user. Because this failure happens in the browser, it is not recorded in , and enabling **Debug Mode for Power BI** will not capture it. The error is reported to the browser console instead: 1. Open the blank report page in Curator. 2. Open your browser's developer tools (**F12**) and select the **Console** tab. 3. Reload the page and look for an entry beginning with `onerror called`. Expand it to read the error message returned by Power BI. This is most common the first time a newly onboarded group of users logs in, and it is usually caused by the user's Power BI setup rather than by Curator: * The user does not have a **Power BI Pro** or **Premium Per User (PPU)** license assigned. * The user has not been granted access to the workspace, the report, or the report's underlying dataset. * The report uses **Row-Level Security (RLS)** and the user has not been assigned to an RLS role. To confirm where the problem lies, have the affected user open the same report directly in the Power BI service at [app.powerbi.com](https://app.powerbi.com). If it does not render there either, the access must be corrected in Power BI before Curator can display it. Newly granted access can also take a short while to show up. Microsoft can take a few minutes to finish applying new licenses, group memberships, or workspace roles, and when Power BI declines a report for a user, Curator briefly remembers that result (30 seconds by default) before checking again. If a report is still blank right after access was corrected, wait a moment and reload the page, or have the user fully sign out of Curator and sign back in — completing the Microsoft sign-in prompt re-checks the user's access immediately. If your portal intentionally restricts many reports and you would rather Curator re-check declined access less often, raise the **Failed Permission Re-Check Interval** in Power BI Settings (up to one hour). Expired access tokens are handled separately. Curator detects a `TokenExpired` error and requests a fresh token automatically, so an expired token is not a typical cause of a permanently blank report. ### Debug Frontend Issues If users see other Curator content but Power BI content is missing from navigation, follow these steps: #### Verify Power BI Authentication 1. **Enable frontend debug mode** Follow the steps to [enable frontend debug mode](/site_administration/performance/troubleshooting_load_times). Remember to disable this after troubleshooting. 2. **Add debug parameter** In your browser, add `?debug=1` to the URL * Example: `https://curator.yourcompany.com/` becomes `https://curator.yourcompany.com/?debug=1` If URL already has a `?` character in it, use `&debug=1` instead 3. **Check session data** * Look for the debug bar at the bottom of the screen * Click **Session** tab * Look for a **`powerbi`** > **`user`** entry to ensure it has an "accessToken" value. 4. **Interpret results** * **Missing entry:** Authentication failed → Log out and log back into Curator * **Valid entry:** Authentication succeeded but Power BI reports no accessible content → Continue to next section #### Check Power BI API Responses 1. Click on the **Advanced** tab. Enable the **Debug Mode for Power BI** toggle and click save. This increases logging significantly. Set a reasonable **Debug Mode Expiration** (default: 24 hours). 2. **Clear cache:** Click **Clear Cache** button (top right) to force fresh API calls. 3. **Refresh frontend:** Go back to Curator's frontend and refresh the page. 4. **Check API logs:** If Power BI content still doesn't appear: * * Look for Power BI API calls * Click entries to view detailed responses 5. **Get support:** API responses can be complex. Send the details to Curator support for analysis. Meanwhile, verify the user has proper access to the Power BI workspace and content in question. ### Redirect URI Mismatch If you see an error containing `AADSTS50011: The redirect URI specified in the request does not match the redirect URIs configured for the application`, the Azure app registration is missing the correct redirect URI. **To fix this:** 1. Go to the [Azure Portal](https://portal.azure.com) and find your app registration 2. Click **Manage** > **Authentication (Preview)** in the left navigation 3. Under the **Web** platform, add a redirect URI using your Curator portal's domain with the `/powerbi` suffix * Example: `https://curatorexample.com/powerbi` 4. Save the changes 5. Log out and log back in to Curator to verify the fix ### SSL Certificate Errors If you encounter an error like this when testing Power BI connections: ```txt theme={null} GuzzleHttp\Exception\RequestException: cURL error 60: SSL certificate problem: unable to get local issuer certificate ``` This occurs when PHP cannot verify SSL certificates for HTTPS connections to Power BI API and Azure AD OAuth endpoints. This is most common on Windows servers where the CA certificate bundle is not properly configured. Curator provides three ways to configure SSL certificate verification through the `POWER_BI_SSL_VERIFY` environment variable: * **Default**: Standard SSL verification (works on properly configured servers) * **CA Bundle**: Download and configure a certificate bundle for secure verification * **Off (*not recommended*)**: Turn off verification entirely (development only) #### Enabling SSL CA Bundle This is the most secure solution. You'll download a trusted certificate bundle and configure Curator to use it. 1. **Download the CA bundle:** Visit [https://curl.se/ca/cacert.pem](https://curl.se/ca/cacert.pem) and save the file to your server in a location readable by your web server. On Windows, a good location is `C:\InterWorks\cacert.pem` or in your Curator installation directory. On Linux, consider `/etc/ssl/certs/cacert.pem` or `/var/www/curator/cacert.pem` 2. **Configure the environment variable:** Add or update the following line in your `.env` file with the full path to your downloaded CA bundle: ```env theme={null} POWER_BI_SSL_VERIFY="C:\InterWorks\cacert.pem" ``` 3. **Test the connection:** Follow the steps in [Test if Backend is Working](#test-if-backend-is-working) to verify the error is resolved. #### Disable SSL Verification You can disable SSL verification entirely, but this creates serious security risks. Disabling SSL verification exposes your application to man-in-the-middle attacks where an attacker could intercept credentials and data. **NEVER use this in production environments.** This should only be used temporarily in isolated development environments. 1. **Set the environment variable:** Add or update the following line in your `.env` file: ```env theme={null} POWER_BI_SSL_VERIFY=false ``` 2. **Test the connection:** Follow the steps in [Test if Backend is Working](#test-if-backend-is-working) to verify the error is resolved. # US Government Cloud (GCC) Setup Source: https://docs.curator.interworks.com/creating_integrations/power_bi_connection/us_government_cloud Configure Curator to connect to Power BI tenants hosted in Microsoft US Government sovereign clouds (GCC, GCC High, DoD). Power BI tenants on Microsoft US Government licenses (GCC, GCC High, or DoD) live in sovereign clouds with different REST API and authentication endpoints than the commercial Power BI service. Curator supports these sovereign clouds, but the connection must be configured to route requests to the correct endpoints. This page covers the differences from the standard commercial setup. If your Power BI tenant is on a standard commercial Microsoft license, you do not need this page. Follow the standard [Curator Connection](./curator_connection) flow instead. ## Selecting the Cloud Environment When configuring the Curator Power BI connection (under **Integrations** > **Connections**), the **Cloud Environment** dropdown at the top of the Power BI Connection section determines which Microsoft cloud Curator targets for all API and authentication calls. | Option | When to use it | | ---------------------------------------------------------- | ----------------------------------------------------------- | | **Commercial (default)** | Standard Power BI tenants on commercial Microsoft licenses. | | **US Government Community Cloud (GCC)** | Power BI tenants on a GCC license. | | **US Government Community Cloud High (GCC High / DoDCON)** | Power BI tenants on a GCC High license. | | **US Department of Defense (DoD)** | Power BI tenants on a DoD license. | Existing Power BI connections that predate this setting continue to use the Commercial cloud without any change in behavior. ## Differences When Registering Azure Apps for GCC Most of the [Azure App Setup](./azure_app_setup) steps still apply, with two specific differences for sovereign cloud tenants: ### 1. Use the Government Power BI Service API When adding API permissions to the registered app, the **"Power BI Service"** API listed by default in Azure is the commercial version and will not work for sovereign cloud tenants. Instead, search under **APIs my organization uses** for: > **Microsoft Power BI Government Community Cloud** > Application (client) ID: `fc4979e5-0aa5-429f-b13a-5d1365be5566` Grant the same delegated permissions described in the standard setup, but on this government-specific API. ### 2. The "Allow service principals to use Fabric APIs" Tenant Setting Does Not Exist Microsoft Fabric is not deployed in US Government sovereign clouds. The Power BI Admin portal in a GCC tenant therefore does not surface the **"Allow service principals to use Fabric APIs"** tenant setting referenced in commercial documentation. The equivalent setting for sovereign cloud tenants is: > **Allow service principals to use Power BI APIs** Enable this setting and apply it to the security group containing your Curator non-admin and admin registered apps. The **"Apply to entire organization"** toggle is typically locked in GCC-hardened tenants, so you must use the security group approach: 1. In **Microsoft Entra**, create a security group (for example, `Curator Power BI Apps`). 2. Add both the non-admin and admin registered apps as members of that group. 3. In the **Power BI Admin portal** > **Tenant settings** > **Developer settings**, scope the **"Allow service principals to use Power BI APIs"** setting to that security group. 4. Apply the same scoping to any other developer settings Curator needs (for example, **Embed content in apps**). ## Capacity Licensing in Sovereign Clouds Power BI capacity licensing differs in US Government clouds. Specifically, **F SKU** (Azure Embedded) and **A SKU** capacities are not available in GCC. Only EM, P, and Premium Per User (PPU) licensing are supported. This does not affect Curator configuration directly, but it may affect how you license capacity for embedded reports. ## Endpoints Curator Uses Per Cloud Environment For reference, the following endpoints are used by Curator depending on the selected cloud environment. You do not need to configure these manually — they are derived automatically from the Cloud Environment selection. | Endpoint | Commercial | GCC | GCC High (DoDCON) | DoD | | ---------------------------------- | ---------------------------------- | ---------------------------------------- | --------------------------------------------- | -------------------------------------------- | | Power BI API base | `api.powerbi.com` | `api.powerbigov.us` | `api.high.powerbigov.us` | `api.mil.powerbigov.us` | | Microsoft Entra authority | `login.microsoftonline.com` | `login.microsoftonline.com` | `login.microsoftonline.us` | `login.microsoftonline.us` | | Power BI resource (OAuth audience) | `analysis.windows.net/powerbi/api` | `analysis.usgovcloudapi.net/powerbi/api` | `high.analysis.usgovcloudapi.net/powerbi/api` | `mil.analysis.usgovcloudapi.net/powerbi/api` | | Web application host | `app.powerbi.com` | `app.powerbigov.us` | `app.high.powerbigov.us` | `app.mil.powerbigov.us` | ## References * [Power BI embedding for national/government clouds](https://learn.microsoft.com/en-us/power-bi/developer/embedded/embed-sample-for-customers-national-clouds) * [Power BI for US Government — endpoint reference](https://learn.microsoft.com/en-us/fabric/enterprise/powerbi/service-government-us-overview) * [Microsoft Entra authentication for national clouds](https://learn.microsoft.com/en-us/entra/identity-platform/authentication-national-cloud) * [Enable service principal authentication for admin APIs](https://learn.microsoft.com/en-us/fabric/admin/enable-service-principal-admin-apis) # Creating a Sigma Connection Source: https://docs.curator.interworks.com/creating_integrations/sigma_connection/creating_a_sigma_connection Set up and configure a connection to your Sigma analytics platform You can follow this guide to connect to your Sigma instance to Curator. ## Preparing Sigma 1. Obtain your Sigma API URL. To determine which URL to use, see Sigma's [documentation](https://help.sigmacomputing.com/reference/get-started-sigma-api#identify-your-api-request-url). 2. Generate embed client credentials (Client ID and Client Secret) in your Sigma instance. See Sigma's [documentation](https://help.sigmacomputing.com/docs/generate-embed-client-credentials) for detailed instructions. ## Connect to Curator 1. Go to the backend of your Curator instance. Navigate to **Integrations** > **Connections** using the left-hand menu. 2. Click the **New Connection** button at the top of the page. 3. Enter a name for the connection (something like "Sigma" is sufficient) and edit the slug if you'd like (but you don't need to). 4. Choose "Sigma" in the Platform dropdown. If the option is disabled then you already have a Sigma Connection created. 5. Fill out the form that appears below the Platform dropdown: * **Sigma API URL**: Select your Sigma API URL from the dropdown, or choose "Manual Entry" to enter a custom URL. * **Custom Sigma API URL**: If you selected "Manual Entry" above, enter your custom Sigma API URL here. * **Sigma Client ID**: The client ID generated from your Sigma embed client credentials. * **Sigma Client Secret**: The client secret generated from your Sigma embed client credentials. 6. Hit **Save** at the top of the page. ## Validate Connection After saving, the connection form will show an authentication check section that verifies your credentials are working properly with the Sigma API. ## Troubleshooting ### Sigma Does Not Appear in the Backend Navigation After saving a Sigma connection, the **Sigma** section may not appear in the backend navigation for some users. This is a permissions issue, not a connection issue — the connection itself is valid, but the backend user has not been granted access to the Sigma plugin. When a connection is saved, Curator automatically grants permissions to the user who saved it. Other backend users must be granted access manually: 1. Log in as a super-administrator. 2. Navigate to **Settings** > **Administrators**. 3. Open the affected user's record and click the **Permissions** tab. 4. Under the **Sigma** section, enable **Sigma administrator**. 5. Save the user record. The Sigma navigation items will appear for that user on their next page load. ### Workbooks List Is Empty If the Sigma connection validates successfully but no workbooks appear when creating Sigma content in Curator, the embed client credentials (Client ID and Client Secret) may not have access to those workbooks within Sigma. The Sigma API authenticates successfully with valid credentials but only returns workbooks the embed client can access. To resolve this, ensure the embed client credentials used in the connection have been granted access to the relevant workbooks or folders inside your Sigma instance. Refer to Sigma's [documentation on embed client credentials](https://help.sigmacomputing.com/docs/generate-embed-client-credentials) for details on managing permissions. ## Next Steps Once your Sigma connection is validated, the **Sigma Workbook** page builder element will still appear grayed out until at least one Sigma Workbook record exists in Curator. To make the element selectable: 1. Navigate to **Content** > **Sigma Workbooks** in the backend menu. 2. Create one or more Sigma Workbook records pointing at the workbooks you want to embed. 3. Once at least one workbook exists, you can add the **Sigma Workbook** element to any page via the page builder and select the workbook to embed. # Alternative URL Routing Source: https://docs.curator.interworks.com/creating_integrations/tableau_connection/alternative_url_routing Configure URL routing for Tableau Server connections when using reverse proxies or alternative network configurations. Curator connects to Tableau Server to verify a user's access and permissions. Sometimes, Tableau Server is configured to live behind a "Reverse Proxy". There are many reasons why this configuration may be preferable. Often, though, Reverse Proxy setups with Tableau are misconfigured. This can lead to trusted ticket whitelisting issues. Since the Tableau Server whitelisting for issuing a trusted ticket is based on an IP address, when proxies are misconfigured, Tableau Server sees the proxy/load balancer, instead of Curator and rejects the ticket request. Tableau Server requires [tsm configuration options, gateway whitelisting and several headers](https://help.tableau.com/current/server/en-us/proxy.htm#configure-the-reverse-proxy-server) for these API calls to work correctly. ## Working Around Reverse Proxy Setups Usually, instead of fixing Tableau Server Reverse Proxy setups, routing Curator around them is quicker and easier. Of course, end users should continue to be routed over the reverse proxy/load balancer. **To configure alternative routing:** * Go to **Integrations** > **Connections** and click on your Tableau Server connection. * Place the *internal route* to Tableau Server in *Tableau Server URL*. * Place the user-facing route to Tableau Server in *Alternate Tableau Server URL*. Reverse Proxy Alt URL # Creating a Tableau Connection Source: https://docs.curator.interworks.com/creating_integrations/tableau_connection/creating_a_connection Learn how to connect Curator to your Tableau Server or Tableau Cloud site using REST API for seamless dashboard integration. Curator leverages Tableau’s REST API to communicate with your Tableau Server or Tableau Cloud Site to retrieve data related to your dashboards and users, so it can display the right information to the right people. To connect Curator to your Tableau Server/Tableau Cloud Site: 1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`). 2. Navigate to the **Integration** > **Connections** section from the left-hand menu. 3. Click on the **New Connection** button at the top of the page. 4. Fill out the form, and select *Tableau* from the platform dropdown to reveal the connection details form below. 5. Expand the *Tableau Connection* section, select whether *Tableau Server* or *Tableau Cloud*, and enter in your Tableau Server URL or select your Tableau Cloud host, respectively. Once the server check has been confirmed, you can begin filling out the authentication details using **either** a username + password or a Personal Access Token (PAT) using the steps below: ### Tableau Cloud: Finding Your Host and Site Content URL When connecting to Tableau Cloud, both the **host** and the **site content URL** are derived from the URL you see in your browser after signing in to Tableau Cloud. Split that URL into two pieces: the host (the pod, selected from the dropdown) and the site content URL (the value entered into the *Tableau Server Site (Custom)* field). | Browser URL | Host (dropdown) | Site content URL | | ------------------------------------------------------------------- | ------------------------------ | ---------------- | | `https://us-east-1.online.tableau.com/#/site/CuratorDemo/home` | `us-east-1.online.tableau.com` | `CuratorDemo` | | `https://10ax.online.tableau.com/#/site/Marketing/workbooks` | `10ax.online.tableau.com` | `Marketing` | | `https://prod-uk-a.online.tableau.com/#/site/SalesReports/projects` | `prod-uk-a.online.tableau.com` | `SalesReports` | **The Server URL must be the origin only** -- the scheme plus the host, with no `/#/site/...` path appended. Pasting the full browser URL (including `/#/site/CuratorDemo`) into the Server URL field is the most common cause of a failed server check for Tableau Cloud. If your pod does not appear in the host dropdown, select **Custom** and enter the host portion of your browser URL (everything between `https://` and the next `/`). Then enter your site content URL into the *Tableau Server Site (Custom)* field as shown above. If the server check still fails after confirming both values, see [Tableau Connection Troubleshooting](./tableau_connection_troubleshooting) for next steps. *Note: Only 1 connection to a specific Tableau Server URL or Tableau Cloud host can be made at a time.* ## Tableau Connections ### Tableau Server / Tableau Cloud: Personal Access Token (PAT) **This connection-type is more stable and preferred over username and password due to changes in Tableau's APIs.** 1. Enable the toggle for *Use Personal Access Token for REST API Connection* in the "Tableau Connection" section 2. Ensure you have [created up Personal Access token on Tableau Server](https://help.tableau.com/current/pro/desktop/en-us/useracct.htm#create-and-revoke-personal-access-tokens), with at least a site administrator role and that you have the name and token. 3. Fill out the fields below, and once the confirmation check has been successful, save your settings: * **Personal Access Token Name** PAT Token Name * **Personal Access Token** PAT Token * **Tableau Server Site** Tableau Server Site\* * **Tableau Server Site (Custom)** Manually entered Tableau Server site\* ### Username & Password connection (not recommended - Tableau Server only) **This connection type is not recommended and should only be used when absolutely required.** Fill out the fields below, and once the confirmation check has been successful, save your settings: * **Service Username** Tableau Server Admin Username * **Service Password** Tableau Server Admin Password * **Tableau Server Site** Tableau Server Site\* * **Tableau Server Site (Custom)** Manually entered Tableau Server site\* ## Tableau Server Site (Custom) Before saving your Tableau Connection settings for the the first time, when switching Tableau Servers, or when connecting to Tableau Cloud you may need to use the "Tableau Server Site (Custom)" field. 1. Select "Custom" in the *Tableau Server Site* dropdown to enable the *Tableau Server Site (Custom)* field. 2. Manually enter the name of the site you wish to connect to **Tableau Server Site (Custom)** The value is derived from the url on Tableau Server. For example: using `https://tableau.interworks.com/#/site/CuratorDemo`, you would enter **CuratorDemo**. 3. Save your settings. *Note:* If you try to connect to a Custom Site with a Server Administrator account and get an error, make sure the user account is specifically added to the Tableau Site you are trying to connect to. Even though it is a Server Administrator and has frontend access to everything, it needs to be added to the site to get REST API access. ## Supported Tableau Server Versions Curator supports Tableau Server version 2019.1 and on. This includes the latest version of Tableau Server as well. Due to the fact that each new version of Tableau Server includes the older versions of the APIs we can support the latest version. In some cases people confuse support of a Tableau Server version with inclusion of new Tableau features. We strive to integrate many of these new features when possible. Many times this is dependent on the API support. If there is a feature you are interested in, or would like us to integrate, please reach out to our support team. # Embed Authentication Source: https://docs.curator.interworks.com/creating_integrations/tableau_connection/embed_authentication Configure secure authentication methods for embedding Tableau dashboards in Curator with single sign-on options. Embedded Authentication is how we securely connect users on the frontend to their Tableau Dashboards. Depending on your selected method it automatically establishes a single sign-on experience or requires additional configuration outside of Curator to avoid a second login screen to authenticate to Tableau. Different authentication methods are available, including: * [Connected Apps (Recommended)](#connected-apps-recommended) * [Tableau Default Authentication](#tableau-default-authentication) * [Trusted Tickets (Deprecated - End of Life in October 2025)](#trusted-tickets-deprecated---end-of-life-in-october-2025) This article will guide you through setting up Embed Authentication using these methods. ## Connected Apps (Recommended) Connected Apps establish a trusted relationship between Curator and Tableau, enabling secure authentication for embedded Tableau content and REST API access. Unlike Trusted Tickets and Tableau Default Authentication, Connected Apps do not depend on third-party cookies, which are increasingly being blocked by modern web browsers. ### Requirements * Connected Apps are supported on * **Tableau Cloud** * **Tableau Server version 2022.4 and higher**. * The Service Account User must be a * **Site Admin** on Tableau Cloud and * **Server Admin** on Tableau Server (Site Admin cannot manage Connected Apps on Tableau Server!) * Both **Tableau Server and Curator must use SSL** to establish a trusted relationship. *Note:* You can set up Connected Apps with either Service Username and Password or Personal Access Token. ### Service Account Best Practices The service account used for Connected Apps is the identity Curator uses to create and manage Connected Apps and to generate embed tokens for your users. Choosing the right account and credential type helps prevent integration failures caused by staff turnover, credential revocations, or accidental role changes. #### Use a Dedicated, Non-Personal Service Account Create a dedicated service account (e.g., `curator-service@yourorg.com`) rather than using an individual employee's Tableau account. A personal account is tied to a specific person; if that person leaves the organization, changes roles, or has their account suspended, Curator loses access to the Connected App and all embedded dashboards stop loading. A dedicated service account remains stable through staffing changes and makes it clear that the account exists solely for Curator's integration. #### Personal Access Token Considerations Personal Access Tokens (PATs) expire on a fixed schedule and are revoked automatically when the issuing user's password changes or their account is deactivated. If a PAT expires or is revoked without being replaced, Curator cannot authenticate and embedded dashboards will fail to load. Tableau Cloud connections require a PAT for authentication, so set a calendar reminder well before the expiration date to rotate the token. For Tableau Server connections, username and password credentials are also available and do not carry an automatic expiration date. #### Retain the Required Tableau Role The service account must keep the required role at all times: * **Tableau Cloud**: Site Admin * **Tableau Server**: Server Admin If the role is downgraded, Curator will no longer be able to manage Connected Apps or generate embed tokens. Dashboards will fail to load for all users until the role is restored. #### Recovery Steps After a Role Change or Credential Failure If the service account's role is changed or its credentials become invalid, follow these steps to restore the integration: 1. Restore the service account to the required role (Site Admin on Tableau Cloud or Server Admin on Tableau Server). 2. If using a PAT, generate a new token and update it in the Curator connection settings. 3. Navigate to Integrations > Connections in the Curator backend and open the affected Tableau connection. 4. Verify the Connected App details are displayed and save the connection. 5. Clear the Curator backend cache to remove any stale session data. 6. Test by loading an embedded Dashboard in the frontend to confirm the connection is working. ### Setup To set up Embed Authentication using Connected Apps you need to have an existing Connection to either Tableau Cloud or Tableau Server. If not, follow our [Tableau Connection setup guide](/creating_integrations/tableau_connection/creating_a_connection). 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`). 2. Navigate to Integrations > Connections and select your Tableau connection that you want to set up Connected Apps for. 3. Scroll down to the ***Embed Authentication*** section and expand it. 4. Select **Connected Apps**. 5. Save the Connection. After saving, Curator will create the Connected App and display following details: * Primary Site Connected App * Client ID & Secret - the secret is obfuscated, but a placeholder represents successful retrieval * Creation Timestamps If multiple Connected Apps are detected, you can select in the Primary Site Connected App dropdown which one to use. All other fields are automatically populated and show information for troubleshooting purposes only. If you are embedding Dashboards from multiple sites add each additional site you'd like to connect Curator to under *Secondary Sites* ensuring each has its own Connected App. ### Authenticate with Active Directory Domain Some Tableau Server instances using Active Directory authentication require the domain to be included with the username during Connected Apps authentication (e.g., `domain\username`). If authentication fails and your Tableau Server logs show errors like "Could not find AD user based on username", enable the **Include AD Domain** toggle in the Connected App Settings section of your Tableau connection. The domain is automatically retrieved from Tableau's user API and applies to the backend REST username during authentication. ### Troubleshooting The following scenarios have been encountered during the process of updating an existing connection to use Connected Apps. We have added the steps to resolve here. > * Trying to save my connection, I get an error message that contains: > `Missing Site from the list of secondary site.` Curator detected that you are embedding Dashboards from multiple sites but not all the sites have been added to your connection so far. Use the **Secondary Sites** section to add an item for each individual site. Curator requires a separate Connected App for each individual site! > * The details of the Connected App show blank. If you are updating a Trusted Ticket connection, cached data may cause display issues. Clear the backend cache and reload the Connection page. If this issue persists, please reach out to Curator support. > * Trying to save my connection, I get an error saying > `A syntax error was detected in .. No such file or directory` Clear the cache from the backend and apply the changes again. Hit save and the connection should be updated. > * My Dashboards load indefinitely when trying to access them in the frontend. The browser may be storing outdated settings or old Tableau session data. If you can log in and access the Dashboard using an Incognito Window, then your users will need to hard-refresh their browsers, or clear site site cookies. If not, this issue generally resolves itself after 24 hours, so it's helpful to consider upgrading to connected apps just prior to the weekend. > * When accessing the Dashboard in the frontend, I get a 401. Follow the steps in the *My Dashboards load indefinitely* section to resolve. > * After updating my dev environment, my prod environment stopped working If both Curator environments (test/dev and production) connect to the same Tableau Server, switching between Trusted Tickets and Connected Apps can cause cookie conflicts when migrating one instance after the other. To prevent issues: * Test each environment in a separate browser or incognito window. * Ensure users testing Connected Apps clear their cookies before switching to the production environment again. If further issues persist, reach out to your friendly Curator support team. > * A Dashboard from a secondary site fails with a 401002 Unauthorized Access error that references the secondary > site's credentials. If a secondary site's Content URL is missing or does not match the site exactly, or if either of its PAT fields (PAT name or PAT secret) is left blank, Curator silently falls back to the primary site's credentials when generating the embed token. Tableau then rejects the request with a 401002 Unauthorized Access error because the primary site's credentials are not valid for the secondary site. To resolve: 1. Confirm the secondary site's Content URL matches the value shown in Tableau exactly (case-sensitive, no trailing slashes). 2. Populate both the PAT name and PAT secret fields for the secondary site. 3. Save the connection. 4. Clear the Curator backend cache and reload the Connection page. ### Allowed Domains - additional configuration option on Tableau Server/Cloud Connected Apps can be configured to allow embedding from a specified domain only. You can find more details on Tableau's Connected Apps in their [Knowledge Base](https://help.tableau.com/current/online/en-us/connected_apps_direct.htm). ## Tableau Default Authentication Using Tableau Default Authentication for your Embed Authentication mechanism means that your users will either be prompted with a Tableau login screen when accessing a Dashboard, or you need to configure your own SSO mechanism (e.g. SAML, OAuth, Active Directory etc.) to enable seamless authentication. For organizations that require an integrated authentication experience, we **strongly recommend** using **Connected Apps** instead of relying on Tableau Default Authentication. ### Browser Security Behavior: OAuth Data Sources in Embedded Contexts When a Tableau workbook uses an OAuth-authenticated data source (such as Databricks, Snowflake, or Google BigQuery), some users may find the Dashboard stalls in an incomplete state, or in Safari may receive a downloaded file, rather than loading data transparently. **This is not a defect in Curator or Tableau.** It is a consequence of how modern browsers enforce cross-site security restrictions inside embedded iframes. #### What happens Curator loads Tableau inside an HTML `` - if this string is found in your code it means you are using an iFrame to embed. 7. Once you've pasted the correct information in, click "Add" ## URL Parameter Substitution When you use the **iFrame** option (a plain URL), Curator can substitute the following placeholders in the URL with the signed-in user's details. Substitution happens server-side, only when a user is logged in, and only for the iFrame option — placeholders are **not** processed in the Embed Code (HTML) option. | Placeholder | Replaced with | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `[USERNAME]` | The logged-in user's Curator username (often their email address) | | `[DISPLAY_NAME]` | The logged-in user's display name | | `[IW_TOKEN]` | A short-lived, cryptographically signed identity token for the logged-in user (see [Passing a verified identity with `[IW_TOKEN]`](#passing-a-verified-identity-with-iw_token) below) | Placeholder matching is case-insensitive. For example, `https://myapp.example.com/report?user=[USERNAME]` renders as `https://myapp.example.com/report?user=jane.smith@company.com` for the signed-in user. This lets the embedded application receive the current user's identity in the URL without Curator forwarding any session tokens. `[USERNAME]` and `[DISPLAY_NAME]` are plain strings, so an embedded application cannot tell whether they were genuinely set by Curator or forged by whoever crafted the URL. When the embedded application needs to *trust* the identity — not just display it — use `[IW_TOKEN]` instead. ## Passing a verified identity with `[IW_TOKEN]` `[IW_TOKEN]` substitutes a short-lived JSON Web Token (JWT) that the embedded application can cryptographically verify, so it can trust *which Curator user* is viewing the embed without any login flow inside the iframe and without Curator forwarding session cookies. Append it to the iFrame URL as a query parameter, for example: ```text theme={null} https://myapp.example.com/form?iw_token=[IW_TOKEN] ``` At render, for a logged-in user, Curator replaces `[IW_TOKEN]` with a freshly signed token. The token: * is signed with RS256 and lasts about **60 seconds**, so it must be verified as soon as the embed loads; * carries **identity only** — the user's id (`sub`), username (`preferred_username`), display name (`name`), and email (`email`, when the user has one). It carries **no groups or roles**, so the embedded application remains responsible for its own authorization; * is **scoped to the embed's host** (the `aud` claim is the iFrame URL's host), so a token minted for one embed cannot be replayed against a different application; * includes a unique token id (`jti`) the embedded application should record to enforce single use; * names Curator's JWKS URL in the `jku` claim, so the application does not have to hard-code or reconstruct it. The embedded application verifies the token against Curator's public keys, published as a JWKS (JSON Web Key Set). Read the JWKS URL from the token's `jku` claim rather than assuming a fixed location — it is the endpoint below, and it already accounts for portals hosted under a base path (e.g. `https:////user/embedauth/jwks.json`): ```text theme={null} https:///user/embedauth/jwks.json ``` The token's header names the key (`kid`) used to sign it; the application matches that against the JWKS, checks the signature, and confirms the `iss` (your Curator URL), `aud` (its own host), and expiry before trusting the identity. The JWKS endpoint is public and unauthenticated — it exposes only public keys — so the embedded application can fetch it without a Curator session. No Curator-side configuration is required — signing keys are created automatically the first time a token is minted. `[IW_TOKEN]` is only substituted for the **iFrame** option and only when a user is logged in; for an anonymous visitor it resolves to an empty value. As with the other placeholders, it is not processed in the Embed Code (HTML) option. ## Authentication Limitations Curator's iFrame embed renders the target URL inside a browser frame — it does not broker authentication between Curator and the embedded application. Specifically, Curator does **not**: * Forward Curator session cookies or authentication tokens to the embedded application. * Intercept HTTP 3xx authentication redirects that happen inside the iframe. * Detect when an iframe is displaying a login page instead of the intended content. If the embedded application has its own authentication requirement (for example, an OIDC/OAuth login flow), users who are not already authenticated to that application will see the application's own login UI inside the iframe. Whether the iframe renders at all depends on the target application's own framing policy: * `X-Frame-Options: DENY` — The application refuses all iframe embedding; the frame appears blank. * `X-Frame-Options: SAMEORIGIN` — The application only allows framing from its own origin, so it will not load inside Curator (a different origin). The frame appears blank. * A `Content-Security-Policy` header on the target — The browser may block the frame depending on the policy. When you add or edit an iFrame URL in the **page builder**, Curator checks the target URL's response headers and warns you in the editor if the target appears to block framing (an `X-Frame-Options` of `DENY`, a `SAMEORIGIN` value that doesn't match your Curator host, or the presence of a `Content-Security-Policy` header). This check is a build-time convenience in the editor; it does not run when visitors view the published page, so always confirm the embed renders correctly on the live page. **Recommended approach for applications with their own authentication:** 1. Work with the target application's team to explicitly allow framing from your Curator domain — for example, by setting `Content-Security-Policy: frame-ancestors 'self' https://analytics.yourcompany.com` on the target application. 2. Ensure the target application's session cookies use `SameSite=None; Secure` so browsers transmit them in cross-site iframe requests. 3. If you control the target application, use the [`[IW_TOKEN]` placeholder](#passing-a-verified-identity-with-iw_token) to pass a signed, verifiable identity into the embed — the application verifies it against Curator's JWKS and establishes its own session for that user, with no inline login form and no redirect. This is the preferred option when the embed needs to *trust* the Curator user's identity (for example, an authenticated Streamlit form). 4. If the target application only supports a plain-string deep link, use the `[USERNAME]` placeholder to pass the user's identity to a token-exchange endpoint on the target side instead. Note that, unlike `[IW_TOKEN]`, a plain username is not verifiable, so only use it where the target endpoint applies its own trust checks. There is no Curator-side configuration to open an authentication flow in a new tab and return to the embed once authentication is complete. ## Content Security Policy and Framing Headers Curator sets the following security-related response headers on **its own pages**. These govern how Curator pages behave — they do not restrict which origins Curator's iframes may load from: * **`X-Frame-Options: sameorigin`** — Controls whether Curator itself can be framed by another site. On rendered pages this header is omitted when the portal **Allow iframe embedding** setting is enabled, so that Curator can be embedded elsewhere. * **`Content-Security-Policy: upgrade-insecure-requests`** — Applied when the portal **Force SSL** setting is enabled. It upgrades mixed HTTP/HTTPS sub-resource requests; it does not restrict iframe sources. * **`X-Content-Type-Options: nosniff`** — Prevents MIME-type sniffing; it does not affect iframe loading. Cross-origin embedding restrictions are enforced by the **target application's** headers, not by Curator's. # Pages Overview Source: https://docs.curator.interworks.com/site_content_design/pages/pages_overview Introduction to creating and managing custom pages within Curator using the page builder for flexible content organization and presentation. When adding content from your analytics environments, Curator will automatically create default template pages for you. These can be accessed via the edit page of those individual pieces of content. However, you may want to create something more tailored for your users to showcase certain content. In this case, using Curator's page builder allows a huge amount of flexibility for creating and styling your pages, while still allowing you to link to content that is both secured to the user viewing the page as well as relevant based on their recent browsing activity. ## Building Pages in Curator ### To create a page in Curator 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`). 2. Navigate to the **Content** > **Pages** section from the left-hand menu. 3. Click "New Page" to create a new page. ### To add content to your page 1. Hover over the element on the page-preview on the right-hand side of the page builder and click the "edit" icon 2. Choose the content you'd like to add to your page ## To style content to your page 1. Click on an item on the page-preview on the right-hand side of the page builder. 2. This will expand a side-panel over the menu on the left-hand side of the page that will give you styling controls related to the active content. ## Creating a Page from an HTML File, URL, or Embed Code When all a page needs to show is a single piece of embedded content -- for example a standalone HTML page generated by an AI tool -- Curator can build the page for you: 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`). 2. Navigate to the **Content** > **Pages** section from the left-hand menu. 3. Click the **Upload HTML** button in the toolbar. 4. Enter a title for the new page, then choose a source: upload an `.html` file, link to a URL, or paste embed code. 5. Optionally enable **Add new Page to Navigation** to add the new page to the main navigation, and **Hide new Page from Search** to keep the page out of search results while it stays visible in tiles and the explorer. Both are off by default. 6. Click **Create Page**. The new page contains a single full-width element holding your content, and its title display is turned off so the content takes up the whole page area. Both can be changed later in the page builder, just like any other page. For security, uploaded HTML files are displayed inside a sandboxed frame isolated from the viewer's Curator session, so scripts inside the file cannot interact with Curator itself. Pages can also be created this way programmatically via the [`/content/createPage`](/curator_api/api_docs/content#contentcreatepage) API endpoint. ## Controlling Page Width Curator gives you two ways to control how wide your page content appears: a global side-margin that applies to every page on the site, and a per-row override that lets individual rows break out to the full width of the browser window. See [Controlling Page Width](/site_content_design/pages/controlling_page_width) for the full guide. ## Page Security Pages will first inherit any [Restrict Access](/site_content_design/menus/restrict_access) permission that have been set on the individual menu item. Continuing from there, the permissions will apply according to the sections below. ### Restricting a Page to Groups A page can restrict access directly in its own settings, without creating a menu link just to hold the restriction: 1. Navigate to **Content** > **Pages** and open the page. 2. Expand the **Page Details** section and toggle **Restrict Access** to ON. 3. In the **User Group Access** list that appears, check the [groups](/users_groups/user_management/users_and_groups_overview) that should be able to see the page. 4. Save the page. Page-level Restrict Access is enforced everywhere the page can be reached: menu links, direct or shared URLs, search results, tiles, keyword pages, and when the page is embedded inside another page. It stacks with any Restrict Access set on the page's menu links, so a user must satisfy both to see the page. If Restrict Access is on but no groups are selected, nobody can see the page. When **Restrict Access is Always Enabled** is turned on in **Settings** > **Security** > **Authentication Settings**, every page is treated as restricted and must have at least one group selected before users can see it, the same way menu links behave under that setting. In the backend, menu links pointing at a restricted page show a lock icon on the **Reorder Navigation** page, and the menu link's edit form notes that the page restricts access in its own settings with a link back to the page. Page security for embedded-content was added in the 2024.03-02 release, all prior releases have no security applied when loading embedded content for pages. The following section only applies to 2024.03-02 and later. Proceed to the **Security for Pages Without Embedded Content** section if you are on an earlier version. ### Security for Pages With Embedded Content When embedding analytic-content into pages, for example a Dashboard, Curator will check permissions on that embedded piece of content. If the user does not have access to the embedded content it will deny them access, routing them to the [Access Denied page](/site_content_design/user_notifications_and_email/error_pages). This applies to both menu items as well as loading the page directly. #### Disabling Embedded Content Security To disable the security check in versions released after 2024.03-02: 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`). 2. Click on **Settings** > **Curator** > **Portal Settings** in the left-hand menu. 3. On the **General** tab, scroll down to the **Security** section and expand it. 4. Toggle the switch **Disable Page Element Security Checks** to ON and click the "Save" button. ### Security for Pages Without Embedded Content Content that is *linked* on a page, for example Tiles, will run through permissions checks while loading the page. check when rendering the tiles. So if a page contains a *Tile* that links to a Dashboard that a user does not have access to the user will simply not see the tile. However, for pages that have content *embedded* in them, see the **Security for Pages With Embedded Content** section above. ## Deleting a Page To delete a page, including troubleshooting the homepage-block error, see [Deleting a Page](/site_content_design/pages/deleting_a_page). # SSRS Embedding Source: https://docs.curator.interworks.com/site_content_design/pages/ssrs_embedding Embed SQL Server Reporting Services (SSRS) reports directly into Curator pages for integrated reporting. ## Getting the Report URL In your web browser, navigate to the SSRS report you wish to embed within Curator. Once the report has loaded, copy the link in the URL bar of your browser. ### Adding SSRS to a Curator Page Start by either creating a new page or editing an existing Curator page from Curator's backend. Click on the plus (+) icon in the Page Builder preview pane to add a new blank element to the page. This blank element is a placeholder that you'll use to embed the desired SSRS report by following these steps: 1. Hover your mouse over the blank element and click on the pencil icon. 2. Click on the **Analytic Elements** tab at the top of the pop-up. 3. Select the **SQL Server Reporting Services (SSRS)** option. 4. The pop-up will close and the SSRS settings will appear on the left. Paste the link you copied above into the **Report URL** field. You should see the Page Builder preview update to show the SSRS report. 5. Once you're happy with the layout, click on the **Save** button. # Text Element Source: https://docs.curator.interworks.com/site_content_design/pages/text_element WYSIWYG text elements for adding formatted text, links, and images to your Curator pages. ## Adding a Text Element 1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`). 2. Navigate to the **Content** > **Pages** section from the left-hand menu. 3. Find the page you want to add your form to from the Pages list or click "New Page" to create a new page. 4. Add a new element to your page, and when the modal pops-up select the "Text" option. Curator Text element 5. You will then be prompted with the WYSIWYG editor, where you can add and format your text, add links, and images. Curator Text element ## Page Variables Page variables can be used to display important user or session based information on pages. * `{{ full_name }}` : Displays the full name for the logged in user * `{{ first_name }}` : Displays the first name for the logged in user * `{{ last_name }}` : Displays the last name for the logged in user * `{{ username }}` : Displays the Curator username for the logged in user * `{{ original_username }}` : Displays the original username for the logged in user # Tiles Source: https://docs.curator.interworks.com/site_content_design/pages/tiles Create visual tile layouts to organize and link content from multiple source systems with automatic permission handling. Creating a central location to link all of the content users have access to is a breeze with Curator's tiles feature. You can bring in content that pulls across different source-systems, from Curator's page system, as well as adding in your own custom links to send users to other useful websites. NOTE: All tiles, unless specifically overridden, will respect the permissions of what the user has access to. If there are any group restrictions on menu items, those will be taken into account. Second, it will check the source-system permission (e.g. Tableau, Power BI, etc.). Then finally will look at the individual item's permission (e.g. [Restrict Access](/site_content_design/menus/restrict_access) on a file). ## Tile Types You can quickly add tiles into your page in a few clicks. To give you more insight into what each of these tiles allow you to display for your users, we've provided a brief description of each section below: **Dashboards** Dashboard Tiles allow you to link to analytic content that you have brought into Curator. This links from any source-system, be it Tableau, Power BI, or ThoughtSpot - anything that Curator supports natively! This runs through a permissions check to make sure the user has access, and can be sorted to your preference. The default sorting after your preference will be to place user-favorited dashboards first, then order them by visit, and finally by alphabetical order. **Pages** Page Tiles allow you to link to other pages you have created on Curator. You may want to embed a "contact us" page, create a feedback form, link to other detail pages, or maybe even use our explorer feature to allow users to browse through all the content they can see. Whatever you want to create within Curator, Page Tiles can specifically link to that content. **Menus** Menu Tiles repeat the same-level menu items as the menu you've linked to. So if you want to display all the top-level menu items someone has access to, you can add in a link to your highest menu item, and it will display all the links one level below the link you've selected. It's an easy way to allow people a more visual exploration while still maintaining the guardrails of your neatly maintained menu system. **Keyword Pages** Keyword Page Tiles pull in content of any sort so long as it has been associated with a specific keyword on Curator. Linking this content together allows you to logically group things at a topic level that may not make sense to be grouped in other ways. It unifies areas that cut across your site in a categorically succinct manner. **External URL** External URLs can be created in the Navigation section, and allow you to link to other websites. **Media** Media brings in any content that has been uploaded to Curator's Files system. This allows you to link to specific files (e.g. PDFs) that are hosted on Curator. Files can have security applied directly to them without needing to be added to the menu. **External (RSS) Feeds** Allows you to bring in external and RSS feeds as tiles, that serve as links to the host page. **Custom Mix** For when you want bring in anything and everything someone has access to. This combines all the tile types listed here and displays content based on the criteria you've chosen. **Managed Instances (Enterprise Only)** If your users have access to multiple Curator sites that you've deployed through Central Dispatch, this tile-type will allow them to view all the different Curator sites they have access to. ## Tile Style **Tile Style** can be selected on the Page Styles menu when tiles are selected in the Page Builder. The tile style selection includes shapes in Square, Small Horizontal, Boxy, Circle, and Hex. Tile styles in Page Builder is independent of the Global tile styles in Portal Settings. You are able to have different tile styles for different Pages, but the same Dashboards have to have the same tile style. ## Open in New Tab The **Open in new tab** toggle in the Content Selection panel controls whether tiles open their linked content in a new browser tab. When it is on, every tile in that element opens in a new tab; when it is off, tiles open in the same tab. This toggle applies to dynamically filtered content - that is, any selection that pulls content automatically, such as a Content Type of "All" combined with a Content Filter (e.g. "User Favorites"), as well as keyword, menu, and feed selections. It sets the behavior for the whole group of tiles at once. Manually selected content does not use this toggle. Instead, each manually added item has its own **Open in new tab** switch in the Manually Selected Content list, so you can set the behavior per tile. ## Tile Thumbnails **Tableau Dashboards** can generate thumbnails automatically and they will be updated regularly if you want them to. Yet, this might display data that you do not want to show on a thumbnail. To show a generic thumbnail for this Dashboard: 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`). 2. Navigate to the Tableau > Dashboards section from the left-hand menu. 3. Click on the Dashboard you want to change the thumbnail for. 4. Open the Misc tab and expand the Look/ Feel section. 5. Delete the auto-generated thumbnail. 6. Use the Upload button to upload your custom thumbnail. 7. Click Save. **Pages**' thumbnails default to the global default thumbnail unless you set one on the Page itself: 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`). 2. Navigate to the Content > Pages section from the left-hand menu. 3. Click on the page you want to change the thumbnail for. 4. Scroll down, under the Preview window. 5. Use the Upload button for the Thumbnail Image to upload your custom thumbnail. 6. Click Save. **Files & Keywords**' thumbnails default to the global default thumbnail unless you set one on the Page itself: 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`). 2. Navigate to the Content > Files or Keywords section from the left-hand menu. 3. Click on the file or keyword you want to change the thumbnail for. 4. Use the Upload button for the Thumbnail Image to upload your custom thumbnail. 5. Click Save. Most of the **Navigation** items can have an icon associated with them. If there is no additional explicit option to upload a thumbnail for it, the default thumbnail will be the icon. To set the icon or thumbnail for a navigation item: 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`). 2. Navigate to the Content > Reorder Navigation section from the left-hand menu. 3. Click on the pen icon (edit button) of the navigation item you want to change the icon or thumbnail for. 4. Use the Upload button for the Icon or if existent the Thumbnail Image to upload your custom icon/ thumbnail. 5. Click Save. If you want to customize the **default thumbnail** to show for any content type that does not have a thumbnail set: 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`). 2. Navigate to the Settings > Curator > Themes section from the left-hand menu. 3. Click on the Pages tab in the middle of the screen. 4. In the new left-hand-side menu, Pages Options, expand the Tile Styles section. 5. Use the Upload button for the Custom Default Thumbnail to upload your default thumbnail. 6. Click Save. ***2024.02-02 Default Thumbnail update*** The default tile was updated in the 2024.02-03 release to a more modern design. If you wish to re-upload the old file, you can right click the file link to save this image: [Old Default Thumbnail](/assets/images/site_content_design/pages/old_default_thumbnail_file.png). # User Customized Metrics Source: https://docs.curator.interworks.com/site_content_design/pages/user_customized_metrics Enable users to personalize their landing pages with custom dashboard selections displayed in a grid layout. User Customized Metrics gives your users the ability to customize their landing page with their desired dashboards that will be displayed in a grid layout. For the best experience it’s recommended to create smaller dashboards or Dashboard cards, for example this could be Dashboard with your KPIs. **To enable User Customized Metrics:** 1. Navigate to the **Content** section in the backend of your Curator instance. 2. Select **Pages** from the Content dropdown. 3. Click the **New Page** button or edit an existing one. 4. Add a new row element and/or click the **Edit Content** button (pencil) icon of a row element. 5. Select **User Customized Metrics** under the Web Elements tab. 6. You may wish to tweak some settings by expanding **Custom Metrics Settings** on the left: * **Use Keywords** allows you to pre-filter the list of dashboards displayed by a specific keyword. This ensures your users can only pick from dashboards tagged with that keyword. To find out more about keywords [click here](/site_content_design/content_discovery/keywords). * **Default Dashboards** allows you to pre-select the Dashboard which are displayed to your user by default. **To select your Customized Metrics on the frontend:** 1. Navigate to the page which has the User Customized Metrics Element. 2. Login if prompted (you must be logged in). 3. Click on the **Edit button** on the top right. 4. Drag your desired Dashboard(s) from **Available Dashboards** to **Selected Tiles**. 5. Click on **Save**. # Video Uploads Source: https://docs.curator.interworks.com/site_content_design/pages/video_uploads Learn how to upload, embed, and host video content in Curator using Page Builder elements and external hosting options. Curator supports uploading a variety of file types including images, documents, and video files such as **MP4** and **MOV**. ## Embedding Videos with Page Builder Curator's Page Builder provides dedicated elements for embedding videos on pages: * **YouTube** — Use the [YouTube embed element](/site_content_design/pages/youtube_embedding) to embed YouTube videos directly on a page. * **Vimeo and other platforms** — Use the [custom/manual embed element](/site_content_design/pages/manual_embed_iframes) to embed Vimeo videos or content from other video platforms. ## Hosting Large Videos Externally For large video files, hosting externally is recommended rather than uploading directly to Curator. Large videos can slow down page load times and consume significant server storage. Consider using one of the following external hosting options: * **YouTube** or **Vimeo** — Upload the video to the platform and embed it on your page using the appropriate Page Builder element as described above. # YouTube Embedding Source: https://docs.curator.interworks.com/site_content_design/pages/youtube_embedding Embed YouTube videos directly into Curator pages for educational content and multimedia presentations. ## Getting the Video URL In your web browser, navigate to the YouTube video you wish to embed within Curator. Once the video has loaded, copy the link in the URL bar of your browser. ### Adding a YouTube video to a Curator Page Start by either creating a new page or editing an existing Curator page from Curator's backend. Click on the plus (+) icon in the Page Builder preview pane to add a new blank element to the page. This blank element is a placeholder that you'll use to embed the desired YouTube video by following these steps: 1. Hover your mouse over the blank element and click on the pencil icon. 2. Click on the **Additional Elements** tab at the top of the pop-up. 3. Select the **YouTube** option. 4. The pop-up will close and the YouTube settings will appear on the left. Paste the link you copied above into the **Video URL** field. You should see the Page Builder preview update to show the YouTube video. 5. Once you're happy with the layout, click on the **Save** button. GIF illustrating the steps written above For information on uploading video files directly to Curator, see [Video Uploads](/site_content_design/pages/video_uploads). # Curator Styles Source: https://docs.curator.interworks.com/site_content_design/theme/curator_styles Customize the visual appearance of your Curator portal with built-in styling options and theme configurations. Curator allows controls related to your site design across all content types, however having a central place to modify styles that will impact every page your user visits allows you to create a standard and consistent brand. The live preview makes this even easier, allowing you to change the configuration of options in the Curator Styles section while previewing those changes (across device sizes too). It's best to look through all of the options, and toggle each selection on or off. Deleting any content that is input into a text box will revert it back to the default setting. Feel free to play around and revisit your design as much as you'd like! ## Creating a new Theme 1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`). 2. Navigate to: * **Settings** > **Curator** > **Theme** section from the left-hand menu. Select the Theme you'd like to update. * *Pre 2022-11-30:* **Settings** > **Curator** > **Portal Settings** section from the left-hand menu. 3. Click through each tab, expand the sections on the left-hand navigation to see more advanced styling options. Changing the the selections will update the live preview on the screen and will show the pending changes. 4. Once you have configured your theme the way you would like, click "Save" to apply your changes to this Theme. ## Applying a Theme to your Site This feature is only available for Curator instances running 2022-11-30 and above. 1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`). 2. Navigate to **Settings** > **Curator** > **Portal Settings** section from the left-hand menu. 3. On the "General" tab, use the "Global Theme" dropdown to change the theme applied to your Curator site. If you would like to apply your Theme to a specific group of users, see the [Group Override instructions](/site_content_design/theme/group_overrides). 4. Click "Save" to apply your changes. ## Defaults when Using Multiple Themes When you create a new theme, its fields start **blank** rather than pre-filled with Curator's out-of-the-box values, and **Use Global Theme for Defaults** is enabled automatically. This means a brand-new theme inherits the look of your Global Theme from the start — you only need to fill in the specific fields you want to change, instead of clearing every field first. Any field you leave blank (an empty text input, no color selected, or the "Default" dropdown option) is resolved when the page is rendered — the inherited value is not copied into the form controls, so blank fields stay blank in the backend. A blank field resolves in one of two ways: * If **Use Global Theme for Defaults** is enabled (the default for new themes) and the theme is not itself the Global Theme, the blank field inherits the matching value from your Global Theme (chosen in **Settings** > **Curator** > **Portal Settings**). * Otherwise, the blank field falls back to Curator's built-in out-of-the-box default. This is particularly useful if you have [Group Overrides](/site_content_design/theme/group_overrides) that need to use themes that look exactly like the Global Theme with just a few minor changes. You can switch **Use Global Theme for Defaults** on or off in any theme that isn't the Global Theme. The Global Theme itself cannot inherit from another theme, so its own blank fields always use Curator's built-in defaults. ## Custom Styles (CSS / HTML Inserts) Curator supports injecting custom CSS and HTML into your site through the theme settings. For step-by-step instructions on enabling and using custom styles, see the [Custom Styles](/site_content_design/theme/custom_styles) page. # Custom Styles Source: https://docs.curator.interworks.com/site_content_design/theme/custom_styles Add custom CSS and HTML head inserts to your Curator theme for advanced styling and third-party integrations. Curator supports injecting custom CSS and HTML into your site through the theme settings. This is useful for adding custom fonts, third-party scripts, or styling overrides that go beyond the built-in theme options. The code in this section is not supported by the Curator team and will need to be self-managed. ## Enabling Custom Styles 1. 2. Toggle on **Enable Custom Styles (CSS / HTML inserts)**. 3. Click "Save" to apply your changes. A new **Custom Styles** tab will appear in the theme editor. ## Using the Custom Styles Tab Once the toggle is enabled, the **Custom Styles** tab provides two code editors: * **Head Insert** — A code editor for custom HTML that is inserted into the `` section of every page. Use this for JavaScript, external libraries, fonts, or any other tags that belong in the document head. * **Custom Stylesheet** — A code editor for custom CSS that is appended to the end of your compiled theme stylesheet. Use this for all custom page styles. Because it is appended last, these styles will override any default theme styles. ## Fallback Behavior for Secondary Themes If a secondary theme (one that is not the Global Theme) does not have **Enable Custom Styles** toggled on but does have **Use Global Theme for Defaults** enabled, Curator will check the Global Theme. If the Global Theme has custom styles enabled, the secondary theme will inherit the Global Theme's custom CSS. The same fallback does not apply to the Head Insert, which is resolved through group overrides independently. # Group Overrides Source: https://docs.curator.interworks.com/site_content_design/theme/group_overrides Apply group-specific theme customizations and styling overrides to provide tailored experiences for different user groups. When using Curator, you may want to surface different content to different users. You can achieve this using Curator's Group Overrides. Whether you want to show a homepage to a certain subset of users or you want to change the colors and logos for a specific client, you can use groups (synced from Tableau or your SAML provider) to modify the look and feel of your Curator site. For additional info, view our [Group Overrides blog post](https://interworks.com/blog/morr/2018/04/09/portals-tableau-new-feature-spotlight-overriding-settings-tableau-group/). ## To Create a new Group Override 1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`). 2. Navigate to the **Settings** > **Users** > **Frontend Group Overrides** section from the left-hand menu. 3. Click the 'New Group Override' button at the top. 4. From the Frontend Group list, select the group you would like these settings to apply to. 5. Give the group override a title, if a user has access to multiple groups, this will be the title that is displayed that allows them to switch between group overrides\*. 6. Modify the settings you wish to override for this group using the tabbed form fields at the bottom of the page, and once you're done, click Save. ## Using the Theme-switcher If you are logged in to the front-end of Curator and your user is a member of multiple groups, by default you will see a dropdown in your menu that allows you to view either the "Default" setting\*, or individual Themes. The experience when selecting these themes will depend on whether or not "Use Global Theme for Defaults" has been enabled for the theme. \***Group Override Inheritance - Use Global Theme for Defaults Enabled** When "Use Global Theme for Defaults" is enabled, and your use is a member of multiple groups, they will see all settings that have been saved inside of Themes across those groups. For example, if there are two groups: * Group 1 - Green menu, default/no bg color * Group 2 - Default/no bg menu color, black background "Default" would show you a Green menu and black background, whereas selecting Group 1, you will see a Green menu and the remainder of settings will show the default settings, and the same goes for Group 2 where you will see a default menu color but the background of the site will be black. \***Group Override Inheritance - Use Global Theme for Defaults Disabled** If you create a group override with the Global Theme Default disabled, this group override will remain distinct and separate from the inheritance flow, only allowing you to see this if: 1. You are a member of that group and *only* that group. 2. You are a member of multiple groups, and have chosen that group from the Theme-switcher dropdown on the front-end of Curator. ## Disabling Group Switching By default, users who have access to multiple group overrides will be allowed to cycle through the group overrides they belong to. Group Overrides are inherited by creation-date, with the oldest group-override taking the highest priority. If you do not want to give users access to changing this to view distinct Themes on a per-group basis you can disable that dropdown using the steps below: 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 'Usability' section at the bottom of the page. 4. Toggle **Group Override Selector** to the off position. 5. Save your settings. # Homepage Source: https://docs.curator.interworks.com/site_content_design/theme/homepage Configure and customize the homepage layout, content, and design elements to create an engaging user landing experience. Curator allows you to create unique web pages using [Curator's page builder](/site_content_design/pages/pages_overview) to customize the layout and content of any page on your site. This is particularly useful when creating your homepage to ensure users start off with all the information they need. By default, Curator comes installed with some sample pages, but if you no longer have that page or want to start by creating a new page, follow the [steps to create a page](/site_content_design/pages/pages_overview) first. Once your page has been created use the steps below to set that page as your homepage. ## Setting the Homepage 1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`). 2. Navigate to **Settings** > **Curator** > **Theme** section from the left-hand menu. Select the Theme to apply the new homepage to. 3. Click on the 'Home' tab at the top of the page. 4. Change the Homepage Type dropdown to **Page**. 5. Change the Homepage Page dropdown to the page you'd like to set as your homepage. 6. Optional - the homepage hides page titles by default. To show your page's title at the top of the homepage, change the **Show Page Title on Homepage** dropdown to **On**. 7. Click "Save" to apply your changes. # Mobile Styles Source: https://docs.curator.interworks.com/site_content_design/theme/mobile_overrides Fine-tune the mobile and responsive behavior of your Curator portal with these settings. Curator pages automatically adapt to screen sizes based on the default settings and industry standard design practices. For example, when viewing Curator from a mobile device: * The desktop navigation is replaced by a hamburger menu (☰). * Page layout stacks vertically. * The toolbar repositions to suit the narrower layout. The default threshold is **1025 pixels**. That means any device whose content area is narrower than 1025px will display the mobile layout (hamburger menu, etc.), while devices at 1025px or wider display the full desktop layout. Note that the majority of the design of Curator is responsive (i.e. does *not* require a page re-load) but that some of the vendors we rely on like Tableau do require a page re-load to determine the correct layout. Therefore, resizing the browser window may not always trigger the correct layout for all content. If you would like to fine-tune the existing mobile behavior, you can do so by adjusting the following settings in your theme. ## Configuring the Mobile Breakpoint To change the width at which the portal switches to mobile view: 1. 2. Change the **Mobile Width** value (default: 1025 pixels) to your preferred breakpoint. 3. Click **Save** to apply your changes. ## Device Layout Override The **Device Layout Override** setting controls breakpoints specifically for Dashboard rendering, independent of the navigation breakpoint described above. When enabled, two additional fields appear: * **Tablet Layout Size** — the width threshold below which Dashboards render at tablet dimensions (default: 992px). * **Mobile Layout Size** — the width threshold below which Dashboards render at mobile dimensions (default: 768px). If your Tableau Workbook was designed for a bigger tablet or your users view Dashboards in landscape orientation on devices like an iPad Pro, consider increasing *Tablet Layout Size* to around 1380px. As with the Mobile Width setting, these breakpoints are evaluated at page load and are not re-evaluated when the browser window is resized after the page has loaded. To enable and configure Device Layout Override: 1. 2. Toggle **Device Layout Override** on. 3. Set your preferred **Tablet Layout Size** and **Mobile Layout Size** pixel values. 4. Click **Save** to apply your changes. ## Override Tableau Container Size on Mobile/Tablet The **Override Tableau Container Size on Mobile/Tablet** setting resizes the Tableau embed container to fit the viewable screen area on mobile and tablet devices. This does not change the Tableau Dashboard itself — only the container Curator renders around it. Enable this setting when filters, toolbars, or other UI elements overflow off-screen on smaller devices. This setting only appears when at least one Tableau connection is configured in your portal. To enable the override: 1. 2. Set **Override Tableau Container Size on Mobile/Tablet** to **On**. 3. Click **Save** to apply your changes. ## Mobile Menu Styling The colors used in the mobile navigation menu are configured separately from the desktop menu. 1. 2. Update any of the following color settings as needed: * **Side/Mobile Navigation Trigger Color** — sets the color of the hamburger (☰) icon and the close (✕) button that appear when the portal is in mobile view. Default: `#999999`. * **Mobile Navigation Background Color** — sets the background color of the expanded mobile menu panel. Default: `#000000`. * **Mobile Navigation Text Color** — sets the color of the menu item text inside the mobile menu. Default: `#ffffff`. * **Mobile Navigation Underline Color** — sets the color of the divider lines between menu items in the mobile menu. Default: `#ffffff`. * **Mobile Navigation Active Item Color** — sets the background highlight color for the currently active menu item. Default: `#000000`. * **Mobile Navigation Active Item Text Color** — sets the text color of the currently active menu item. Default: `#ffffff`. 3. Click **Save** to apply your changes. ## Toolbar Mobile Settings When the portal is in mobile view, the toolbar appears as a slide-out panel. 1. 2. Update the **Toolbar Mobile Background Color** — sets the background color of the slide-out toolbar in mobile view. Default: `#ffffff`. 3. Click **Save** to apply your changes. *** For a full list of all mobile-related theme fields and their descriptions, refer to the [Themes controls reference](/site_content_design/theme/reference). # Page Meta Titles (SEO) Source: https://docs.curator.interworks.com/site_content_design/theme/page_meta_titles_seo Configure page meta titles and SEO metadata to improve search engine visibility and social media sharing. Meta titles play a crucial role in the realm of Search Engine Optimization (SEO) and website usability. When displayed in search engine results or shared links via internal communication tools (e.g. Slack) meta titles serve as the first impression of your content. You can take advantage of Curator's meta title controls impacting the the meta titles for your entire site by creating a site name, specifying a title on the home page. *All other meta titles will be auto-generated based on the title of the content (e.g. Page Title, Dashboard Title).* All Meta titles for individual pages will have this structure: `Page Meta Title | Site Meta Title` So for example, if we were to call our site "My Website", and create a page with a title of "My Page" that would result in `My Page | My Website` ## Changing the Site Meta Title 1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`). 2. Navigate to **Settings** > **Curator** > **Themes** section from the left-hand menu. 3. Click on the Theme you'd like to modify. 4. Click on the **Brand** tab and change the *Curator Site Name* field to show the Site Name you'd like to appear on every page. 5. Be sure to save your Theme settings. ## Changing the Homepage Page Meta Title 1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`). 2. Navigate to **Settings** > **Curator** > **Themes** section from the left-hand menu. 3. Click on the Theme you'd like to modify. 4. Click on the **Home** tab and change the *Curator Home Title (Meta tag)* field to show the Homepage Name you'd like to appear on the home page. If you would like to have no homepage title, simply delete any text in this field. 5. Be sure to save your Theme settings. ## Changing the Page Meta Title for an individual Page When creating a page, or analytic element (e.g. Tableau Dashboard), the Page Meta title will draw from the name of the content given on the edit page. The only exception to this is the homepage Meta Title which will override the page being displayed on the homepage. If you wish to change a Page's Meta title you must change teh Page's title itself. ## SEO Considerations Remember that meta titles play a crucial role in SEO and determining how your website appears in search engine results. Make sure to use relevant keywords, keep the titles concise (usually between 50-60 characters), and create compelling titles that entice users to click through to your site. Also, check your website regularly to ensure the meta titles are accurately representing the content and objectives of your pages. # Themes Controls Reference Source: https://docs.curator.interworks.com/site_content_design/theme/reference Setting up a New Theme or revamping an existing one? There are dozens of customizations you can make to your Curator Portal's theme, and the controls can be a bit overwhelming. This page will help you find just the controls you're looking for. When utilizing these controls, the control area will populate on the left side of your page an a preview pane will take up the majority of the main space. For most changes, you should be able to see the live update to the preview. **Default Themes**: When editing the Main Theme Default will follow the notes below. If you are editing a secondary theme (not set in Portal Settings as your Global Theme), the "Default" option will follow the notes below unless you have the **Use Global Theme for Defaults** toggle enabled at the top of your theme. If that toggle is switched to ON, Default options in your Theme will follow the settings chosen for your **Main Theme**. image.png More information can be found in the [Themes](https://docs.curator.interworks.com/site_content_design/theme/curator_styles) section. ## Brand This section allows you to customize the branding, logos and search result descriptions for your portal. **Logo** - upload a logo image (.jpg, .gif, .svg, or .png format) for your homepage and menu bar **Logo Padding** - adds padding to your logo image. By default, adding padding to one side adds an equal padding to all sides, but this can be unlocked for independent padding on all sides as well. **Favicon** - upload an icon to be used in browser tabs and location bar (.jpg or .png format) **Portal Description** - Adds a \ tag or description for search results if your portal will be searchable via search engine. **Default Preview Image** - upload and add a default preview image to search results and copied/embedded links. **App Icon** - Upload an icon that will be used on the home screen when someone bookmarks your portal on a mobile device ## Home You can add and control the behavior of your Portal's homepage from this section **Homepage** - This controls the content displayed on your portal's homepage. You can choose a created home/landing , show a specific or random dashboard, or employ a redirect. By Default, Curator's default homepage is chosen. **Homepage Page** - When the Homepage Type is set to "Page" or "Default," use this option to choose the [page ](https://docs.curator.interworks.com/site_content_design/pages/pages_overview)you display as your portal's Homepage. **Show Page Title on Homepage** - When the Homepage Type is set to "Page," use this option to display the selected page's title at the top of the homepage. Options are Off and On. Default is Off, as the homepage hides page titles. The title only appears when all three of the following allow it: 1. Hide All Titles and Hide Page Titles in the Title Display section. If either is set to "Hide," no title appears, whatever this option is set to. 2. This option. If it is Off, no title appears on the homepage, even when the page shows its title everywhere else. 3. The page's own Show Title toggle in the page editor, which applies when the two settings above are set to "Show." **Redirect Location** - When the Homepage Type is set to "Redirect," use this option to set the URL for your homepage to redirect to. **Curator Home Title \[Meta Tag]** - add a meta tag here to be appended to the homepage for SEO and link previews in search engine results. ## Global **Main Body Background Color** - Sets the background color for the main body of the site. This control impacts pages, dashboards, and forms throughout the site. **Background Image** - Ad an image instead of a solid background color to your portal. This will also impact pages, dashboards, an forms throughout the site. ### Search Options **\*Note: (Search must be enabled in Portal Settings to utilize these options)** **Search Icon** - Upload a custom icon for search on your portal. This icon will appear in the menu/navigation bar of your portal when search is enabled. The default icon is a magnifying glass. **Search Result Background Color** - Sets the color for the background of search results from the menu/navigation search bar. **Search Result Text Color** - Sets the color for the text of search results from the menu/navigation search bar ### Alerts Options * **Flash Error Text Color** - Sets text color for flash error messages * \*\*Flash Error Background Color \*\*-Sets background color for clash error messages (default is red) * **Flash Info Text Color** - Sets text color for flash information messages (informational notices, etc.) * **Flash Info Background Color** - Sets background color for flash information messages (default blue) * **Flash Success Text Color** - Sets text color for flash success messages (slide capture, form submission success) * \*\*Flash Success Background Color \*\*- Sets background color for flash success messages (default is green) * **Flash Warning Text Color** - Sets text color for flash warning messages * **Flash Warning Background Color** - sets background color for flash warning messages (default is yellow) ### Loading Bar Options * \*\*Loading Indicator Color \*\*- Sets color for loading bar across the top of a page when it is loading inside the portal ### Mobile Settings * **Mobile Width** - Sets the screen width (in pixels) that triggers the portal to change from desktop to mobile view * **Device Layout Override** - When enabled, allows you to manually input screen size trigger for both tablet and mobile layouts for dashboard rendering. * **Override Tableau Container Size on Mobile/Tablet** - When enabled, resizes the Tableau embed container to fit the viewable screen area on mobile and tablet devices. This affects only the Curator container, not the Tableau Dashboard itself. Only visible when a Tableau connection is configured. ## Fonts This section allows you to control the font family(ies), weight, size, and color throughout your portal. The top section controls the default, and each sub-section allows you to further customize the fonts for different areas and uses inside the portal. ## Menu This section allows you to control the navigation section of your portal, including the menu your portal will use. Menu items can be added and edited in the Navigation section of the portal. **Menu Dropdown** - Allows you to choose the Menu to use in your portal. The option you choose here will be the highest level of the menu and all navigation items nested underneath will show in your portal's navigation bar. **Navigation Type** - Controls the location and format of the menu bar in your portal. You can choose between Top Navigation, Side Navigation, and Mega Menu. The Default option is Top Navigation. Examples of these options are located in the [Titles & Toolbar section](https://docs.curator.interworks.com/site_content_design/theme/titles_and_toolbars). **Hide Menu on Scroll** - When enabled, the navigation bar automatically hides when the user scrolls down and reappears when they scroll back up. Options are Off and On. Default is Off. This option is available when Navigation Type is set to Top Navigation or Mega Menu. **Navigation Background Color** - Controls the background color of your menu bar/navigation **Navigation Text Color** - Controls the color of the Text in your menu bar/navigation **Navigation Highlight Color** - Controls the color of the of a highlighted menu item. This option also controls the color for the text on Menu Breadcrumbs for side navigation that can be enabled under **Theme > Titles & Toolbar > Enable Menu Breadcrumbs**. ### Menu Styles * **Navigation Alignment** - Sets whether navigation items align to the right or left. Default is Right-aligned. * **Menu Height** - Allows you to set the height of your menu/navigation bar in pixels * **Drop Shadow** - Allows you to turn on or off the shadow for your menu/navigation bar. * **Navigation Border Width (px)** - Allows you to set the width of the border on your navigation menu/bar * **Menu icon size** - when you elect to add a menu icon, this control allows you to choose the size of the icons next to your menu/navigation items. Options are small, medium, and large. * **Menu icon spacing** - Sets the distance between a menu icon and its label in pixels. The default distance is 2 pixels. ### Menu Text Options * **Top Level Menu Font Transform** - Allows you to transform the top level menu font. Options are Default, None, Capitalize, Uppercase, Lowercase. Default is no transformation. * **Top Level Menu Font Style** - Sets font style for top level menu items. Options are Default, Normal, Italic, Oblique. Default is Normal style. * **Top Level Menu Font On Hover** - Allows for Top Level Menu Items to be Underlined on hover. Options are Default, Normal, and Underline. Default is Normal/Not Underlined * **Drop Down Font Transform** - allows you to transform the dropdown/sub items menu font. Options are Default, None, Capitalize, Uppercase, Lowercase. Default is no transformation. * **Drop Down Font Style** - Sets font style for dropdown menu items. Options are Default, Normal, Italic, Oblique. Default is Normal style. * **Drop Down Font on Hover** - Allows for Dropdown Menu Items to be Underlined on hover. Options are Default, Normal, and Underline. Default is Normal/Not Underlined ### Menu Color Options * **Top Level Active Item Color** - Sets the background color for the active top-level menu item. Default is Black * **Top Level Active Item Text Color** - Sets the text color for the active top-level menu item. Default is white. * **Dropdown Background Color** - Sets the background color for the dropdown menu items. Default is Black. * **Dropdown Text Color** - Sets the text color for the dropdown menu items. Default is white. * **Dropdown Hover Background Color** - Sets the background color for dropdown menu items on hover. Default is black. * **Dropdown Hover Text Color** - Sets the text color for dropdown menu items on hover. Default is white. ### Side Navigation These options appear on the **Menu** tab when **Navigation Type** is set to Side Navigation. * **Collapse Side Nav By Default** - When enabled, the side navigation loads collapsed to a narrow icon-only rail (with the logo still visible) on desktop, leaving more room for content. This option appears only when **Collapsable Side Nav** is enabled. On mobile the full-size menu is always used, so this setting has no effect there. Options are Off and On. Default is Off. * **Expand Collapsed Nav By** - Controls how users expand the collapsed side navigation. **Button** (the default) shows a control users click to expand and collapse the rail. **Hover** expands the rail while the pointer or keyboard focus is over it and collapses it again when they move away, with no button shown. This option appears only when **Collapse Side Nav By Default** is enabled. ### Mobile Menu The mobile menu is triggered under the default settings when the browser window reaches 1025 pixels wide. You can adjust the window width for triggering the mobile menu in the Themes editor under **Menu > Mobile Settings > Mobile Width**. * **Side/Mobile Navigation Trigger Color** - Sets the color for the mobile menu trigger (hamburger menu and 'X'). Default is white. * \*\*Mobile Navigation Background Color \*\*- Sets the background color for menu items in the mobile menu. Default is black. * **Mobile Navigation Text Color** - Sets the text color for menu items in the mobile menu. Default is white. * **Mobile Navigation Active Item Color** - Sets the background color for the active menu item in the mobile menu. Default is black. * **Mobile Navigation Active Item Text Color** - Sets the text color for the active menu item in the mobile menu. Default is white. * **Mobile Navigation Underline Color** - Sets the color for the dividing line between mobile menu items. Default is white (set to blue in example below). * image.png ## Titles and Toolbar **Title and Toolbar Location** - Defines where content titles and toolbars should be located within your portal. Options are Default, Top of Page, Inside Top Nav, Beneath Top Nav, and Side Toolbar & Title Top of Page. Default is Top of Page. Examples of these options are located in the [Titles & Toolbar section](https://docs.curator.interworks.com/site_content_design/theme/titles_and_toolbars). ### Title Display * **Hide All Titles** - Allows you to hide titles across every page type. Options are Default, Show, and Hide. Default is Show. * **Hide Dashboard Titles** - Allows you to hide or show titles across Tableau and Sigma Dashboard Pages and Power BI Report Pages. These are dashboards and reports brought in directly from your analytics platform. Options are Default, Show, and Hide. Default is Show. Note - Sigma workbooks also have their own Show Title toggle in the workbook editor, which defaults to on. This theme setting takes precedence. If titles are hidden here, they stay hidden for every workbook and the toggle has no effect. If titles are shown here, each workbook can use its toggle to hide just its own title. * **Hide Page Titles** - Allows you to hide or show titles across all Page content. Options are Default, Show, and Hide. Default is Show. Note - this option can be overridden on a page-by-page basis using the Show Title toggle in the page editor, or by placing a Page Title element in the page builder, which acts as a page-level override and always displays its title. ### Toolbar Styles * **Hide Action Titles** - Allows you to show or hide the text/title under Action buttons on the Dashboard toolbar (Tableau Dashboards only). Options are Default, Show, and Hide. Default is Show. * **Action Button Size** - Sets the size of Toolbar action buttons. Options are Small, Medium, and Large. Default is Large. * **Enable Menu Breadcrumbs** - When enabled, shows breadcrumbs in sub-navigation that reflect menu item hierarchy (Side Navigation only). Options are Default, Off, and On. Default is Off. ### Toolbar Colors * **Subnav Background Color** - Sets the background color for toolbar sub-navigation items. Default is white. Color is set to green in example image below. image.png * \*\*Subnav Text Color \*\*- Sets the text color for toolbar sub-navigation items. Default is Black. Color is set to default in example image above. * \*\*Action Button Color \*\*- Controls the color of Action Buttons and text/titles on the toolbar. Default is black. Color is set to black in the example image above. * **Accent Color** - The accent color applies to elements in Custom Views, Dashboard Export, Report Builder, Tutorials, Org Charts, Explorer Elements, Favorites, Dashboard commenting, Scorecard, and New and Updated flags. It is recommended to use a distinct color (not white or black) to indicate users are able to click on these elements to perform an action. The accent color also applies to buttons within the toolbar for Dashboards. The default color is white. * **Accent Text Color** - Sets the text color for accent-button elements. The background color of these elements is generally controlled by **Accent Color**. Ensure that the Accent Color and Accent Text Color have sufficient contrast to make the text visible. The accent text color also applies to buttons within the toolbar for Dashboards. The default color is black. ### Toolbar Mobile Settings * **Toolbar Mobile Background Color** - Sets the background color for the slide-out toolbar when in mobile view. Default is White. ## Dashboards **Dashboard Full-Screen Margin** - Sets the left and right margins (in pixels) for fullscreen-width dashboards. This setting will apply only to dashboards that take up the full width of the screen and are set to 'range' or 'automatic' sizing. ### Dashboard Tabs Styles * **Tab Shape** - Sets the corner shape for dashboard tabs. Options are Default, Square, Rounded, and Pill. Default rounds the top two corners and leaves the bottom two squared, so the active tab blends into the line beneath the tab strip. Square makes all four corners sharp. Rounded and Pill round all four corners and remove the line beneath the tab strip. * **Default** - These controls set the background, text, and border color for dashboard tabs when enabled. Default for tab color is white. Default for text color is black. Default for tabs border color is black. * **Active** - These controls set the background, text, and border color for the active dashboard tab when enabled. Default for tab color is black. Default for text color is white. Default for tabs border color is black. * **Hover** - These controls set the background, text, and border color for the dashboard tabs on hover when enabled. Default for tab color is white. Default for text color is black. Default for tabs border color is black. ## Metrics This section controls metrics chart and background colors for Tableau Metrics when in use within the portal. ## Pages This section allows you to set default colors, styles, and options for tiles, tutorials, buttons, margins, and form styles across your portal. **Thumbnail Tile Style** - Sets the default shape of tile elements across the Curator portal. Options are Default, Square, Landscape, Boxy, and Hex. Default is Square. Note - The default tile style can be overridden on an element-by-element basis in the Edit Page section of the backend. more information. More information can be found in the [Tiles](https://docs.curator.interworks.com/site_content_design/pages/tiles) section. **Tile Text Color** - Controls the color of Text below tiles across Curator. The default is black. **Button Shape** - Sets the default shape for buttons in your portal. Options are default, square, rounded, pill, and oval. Default is Square. \*\*Hyperlink Color \*\*- Controls the hyperlink text color inside buttons. The default is black. ### Tile Styles * **Tile Background Color** - Controls the background color for tiles. Default is white. * **Tile Overlay** - Gives the ability to add a description or action buttons on hover for tiles. If the "Show Tile Description" control is set to 'On Hover,' the Action button option will not be shown. The default setting is None. * **Show Tile Description** - Shows Description for tiles - description will only show for content that has a description added. Options are Default, Do Not Show, On Hover, and Below Tile. Default is to show the description on Hover. * **Show Tile Title** - Controls the default setting for showing Tile titles across Curator. Options are Default, Show, and Hide. Default setting is to show titles. * **Show Tile Dates** - Shows a Tableau Dashboard's created and/or last updated dates in the tile hover overlay, above the description. The dates are the ones reported by Tableau, so they match the dates shown on the Dashboard itself, and only appear for Tableau Dashboard tiles. Options are Off, Created Date, Updated Date, and Created and Updated Dates. Default is Off. * \*\*Custom Default Thumbnail \*\*- Enables you to add a custom 'default' thumbnail for tiles where a thumbnail is not set within the content itself. If a file is not uploaded here, Curator will use its own default thumbnail for content where there is not a custom thumbnail, or when dashboard thumbnails cannot be retrieved. ### Tutorial Styles * **Tutorial Title Text Color** - Controls the Color of the Title Text for Tutorials * **Tutorial Header Font Size** - Sets the tutorial title font size (in pixels), independent of the theme's Header Font Size. Default is 18. Located on the **Fonts** tab. image.png ### Button Options * **Primary Buttons** - Submit buttons on forms, Close/Close and Do Not Show Again Buttons on Tutorials, Button elements on pages set to "Primary" under the Button Settings section will use these color settings. * **Primary Button Color** - Sets background color for primary buttons across the Curator portal. The Default setting is White. * **Primary Button Text Color** - Sets the text color for primary buttons across the Curator portal. The Default setting is Black. * **Primary Button Border Color** - Sets border color for primary buttons across the Curator portal. The Default setting is Black. * **Secondary Buttons** - Button Elements on Pages set to "Secondary" under the Button Settings section will use these settings * **Secondary Button Color** - Sets background color for secondary buttons across the Curator portal. The Default setting is Black. * **Secondary Button Text Color** - Sets the text color for secondary buttons across the Curator portal. The Default setting is White. * **Secondary Button Border Color** - Sets border color for secondary buttons across the Curator portal. The Default setting is Black. * **Cancel Buttons** - Clear and Cancel buttons on forms * **Cancel Button Color** - Sets background color for Cancel buttons across the Curator portal. The Default setting is White. * **Cancel Button Text Color** - Sets the text color for cancel buttons across the Curator portal. The Default setting is Black. * **Cancel Button Border Color** - Sets border color for cancel buttons across the Curator portal. The Default setting is Black. ### Page Margin **Page Margin** - Sets the margins for pages in percentage. Default is 0% ### Form Styles **Form Font Color** - Controls the font color for form elements on pages, including the text shown in a dropdown both when it is closed and in the open list of options. Default settings is black. \*\*Form Background Color \*\*- Controls the background color for dropdowns in form element dropdowns. Default setting is white. \*\*Form Highlight Color \*\*- Controls the highlight color for dropdowns in form elements. Default setting is blue. \ Form Font, Background and Highlight color controls also affect dropdowns (Custom views, download options, etc.) inside the toolbar for dashboards\ ### Accordion Collapse Styles \These controls apply to Accordion elements on pages\ **Accordion Header Font Color** - Controls the font color for the section headers for accordion elements. The default color is white \*\*Accordion Header Background Color \*\*- Controls the background color for the section headers for accordion elements. The default color is blue. \*\*Accordion Header Border Color \*\*- Controls the border color for the section headers for accordion elements. The default color is white. \*\*Accordion Body Background Color \*\*- Controls the background color for the body section for accordion elements. The default color is white. Text color for the body section is controlled within the element's text editor itself. ## Loading Screens Curator Loading Screen - This control allows for loading screens while users are waiting for content to load in the portal. Options are Default, Off, and On. Default option is On. In order to enable the additional controls in this section, the Loading Screen must be set to Default or On. **Default Loading Screen** - This controls the loading screen that shows by default for elements in Curator. Some elements in Curator, such as Tableau Dashboards, can have individually set loading screens. **Show Dashboard Thumbnail During Load** - This option must be de-selected if Curator Loading Screen is set to On or Default. When loading screens are not enabled, this control allows for dashboard thumbnails to display while dashboards load. **Display Loading Screen During Login** - This control allows the default loading screen to show after a user logs into Curator while homepage content loads. ## Footer **Footer Menu** - This control allows you to select a menu to be displayed in the footer throughout the Curator portal. More information on creating and managing menus can be found in the [Menu section](https://docs.curator.interworks.com/site_content_design/menus/managing_menus). You can choose a footer menu or footer page for your portal. By default, no footer is shown. **Footer Insert Page** - This control allows for a page to be inserted as a footer throughout the portal. More information on creating pages can be found in the [Pages section](https://docs.curator.interworks.com/site_content_design/pages/pages_overview). ### Footer Colors \*\*Footer Background Color \*\*- controls the background color for footer pages and menu bars. The default is blue. **Footer Text Color** - controls the text/font color for footer menu items. The default option is white. # Titles and Toolbars Source: https://docs.curator.interworks.com/site_content_design/theme/titles_and_toolbars Customize page titles, toolbar elements, and navigation components to match your brand and improve user experience. The title and toolbar location, for most options, are dependent upon one another for the styling of your site. While titles help your users understand where they are and what they are looking at, Toolbars contain the action buttons that allow your users to interact with, filter, export and even send scheduled emails of your embedded visualization. **NOTE**: As of now, all actions are available for Tableau Dashboards. There is no feature parity for Power BI or ThoughtSpot. ## Title & Toolbar Location (examples 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** > **Themes** from the left-hand menu and select the Theme you'd like to update\*. 3. Chang the "Title and Toolbar Location" dropdown to modify the layout, using the live-preview to view your pending changes. 4. Click "Save" to apply your changes. ## Title Settings Titles can be controlled globally, or by content type. Follow the steps below to show or hide titles: 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`) and log in if prompted. 2. Navigate to **Settings** > **Curator** > **Themes** from the left-hand menu and select the Theme you'd like to update\*. 3. Click on the \**Titles & Toolbar* tab and expand the "Title Display" section. 4. Choose from one of the options below * Hide All Titles: Hides all titles - this will ensure that no titles display across your entire site, regardless of the page-type. * Hide Dashboard Titles: This allows control for titles on the page level, and automatically displays them (except for the homepage). This setting is typically most useful if your dashboards already contain titles. * Hide Page Titles: This ensures all titles are displayed on Dashboard pages, but will not show up on Pages created with the page-builder. The exception is a page that contains an explicit Page Title element in the page-builder, which will still display that title. 5. Click "Save" to apply your changes. Prior to the 2022-11-30, these setting can be found under: **Settings** > **Curator** > **Portal Settings** > **Styles tab**. Title and Toolbar location are found in the "Menu options" section, global title settings are found in the the "Global Settings" section, Dashboard title settings are under the "Dashboard Styles" section, and Page title settings are under the "Page Styles" section. ## Title & Toolbar location examples ### Top Navigation and Mega Menu #### Top of page: Top Navigation and Mega Menu Have your title at the top of a page and the toolbar situated right beneath it. With this option, you can further adjust your toolbar in the *Toolbar Styles* and *Toolbar Colors* sections. Top Navigation and Top of page Title/Toolbar Location * *Hide Action Titles* - If enabled the toolbar buttons will not show any titles on a desktop screen. Hovering over a button will show the title to clarify functionalities. * *Action Button Size* - Choose between large, medium, and small-sized buttons to save space or prevent wrapping. The default size is large. #### Inside of top nav: Top Navigation and Mega Menu The title and toolbar move inside the navigation bar along the top of the screen. They are placed between the menu items and the user menu. Make sure you have enough space to have everything readable. Top Navigation and Inside of top nav Title/Toolbar Location #### Beneath top nav: Top Navigation and Mega Menu Create a second navigation-like bar right beneath your actual navigation. The title and toolbar move next to each other inside one row. You can set the background, *Subnav Background Color*, and text color, *Subnav Text Color*, in the *Toolbar Colors* section. Top Navigation and Beneath top nav Title/Toolbar Location #### Side toolbar & title top of page: Top Navigation and Mega Menu The title and toolbar get separated using this configuration. The title moves inside a second navigation-like bar right beneath your actual navigation. The toolbar moves to the right side of the screen, next to your Dashboard. Clicking a button triggers a slide-out to view further actions. You can set the background, *Subnav Background Color*, and text color, *Subnav Text Color*, in the *Toolbar Colors* section. Top Navigation and Side Slide-out Title/Toolbar Location ### Side Navigation #### Top of page: Side Navigation Have your title at the top of a page and the toolbar situated right beneath it. With this option, you can further adjust your toolbar in the *Toolbar Styles* and *Toolbar Colors* sections. Side Navigation and Top of page Title/Toolbar Location * *Hide Action Titles* - If enabled the toolbar buttons will not show any titles on a desktop screen. Hovering over a button will show the title to clarify functionalities. * *Action Button Size* - Choose between large, medium, and small-sized buttons to save space or prevent wrapping. The default size is large. #### Top nav bar: Side Navigation Create a second navigation-like bar right beneath your actual navigation. The title and toolbar move next to each other inside one row. You can set the background, *Subnav Background Color*, and text color, *Subnav Text Color*, in the *Toolbar Colors* section. Side Navigation and Beneath top nav Title/Toolbar Location The color of the toolbar buttons can be set under in the *Toolbar Colors* section. # Email Formatting Source: https://docs.curator.interworks.com/site_content_design/user_notifications_and_email/email_formatting Customize email templates and formatting for automated notifications, reports, and user communications. ## Requirements Before moving on, it's important that you follow the [steps to configure email](/setup/email/email_configuration) on Curator. ## Email Template Formatting When users from both the front-end and back-end are notified via Curator, they will be notified via e-mail. This will include all notifications such as password reset, welcome-messages on first log in, backend administrators gaining access, and scheduled report emails. In order to modify the background, body-color, as well as adding a header image to your emails, you can find all the available controls for email formatting on the left-hand menu under **Settings** > **Mail** > **Mail branding**. ## Email Content If you would like to change the messages inside of your emails, you *can* modify the templates on the backend via the left-hand menu under **Settings** > **Mail** > **Mail templates**. **Proceed with caution if you are modifying these templates - they require very exact specifications**. If you need to reset your templates and are unable to do so please reach out to Curator support. # Error Pages Source: https://docs.curator.interworks.com/site_content_design/user_notifications_and_email/error_pages Configure custom error pages to provide helpful messaging when users encounter access issues or broken links. When things go wrong, you want to be sure to send the right messages to your audience. By default, Curator has error pages that will let users know when they don't have access, they visit a broken link, or a system is down. Communicating exactly what you'd like in these situations can be made even easier by sending your users to a custom-made error page. **NOTE**: You must [create a page](/site_content_design/pages/pages_overview) first before setting it to your error page ## Setting up "Not Found" or "Access Denied" Pages 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 and expand the "Error Pages" section. 4. Using the dropdown, select a page from the list of pages you have created on Curator. You can set two pages here: * Access Denied (403) - Displays when a user does not have access to a specific link on Curator. * Not Found (404) - Displays when a user visits a link that does not exist on Curator, or visits an old deleted/moved link. 5. After making your selection from these dropdowns, save the Settings page. **NOTE**: The Access Denied page is a portal-wide setting. Curator does not support per-Dashboard or per-group overrides for this page, so the same Access Denied page displays for every restricted link regardless of which Dashboard or user group triggered it. As a best practice, create a single custom page with general access-request guidance (for example, instructions for contacting an administrator to request access) rather than Dashboard-specific messaging. For more context, see the [Pages Overview](/site_content_design/pages/pages_overview) and [Frontend User Permissions](/users_groups/user_security/frontend_user_permissions) documentation. ## Setting up "Tableau Server Down" (503 error) Page Occasionally your Tableau Server may go down for maintenance reasons, or even unplanned issues. In this case it's helpful to tell your users that things will be back shortly, and redirect them to useful resources. Follow the steps below to ensure your custom page displays when your Tableau Server is unavailable. 1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`). 2. Navigate to the **Settings** > **Tableau** > **Tableau Server Settings** section from the left-hand menu. 3. From the "General" tab expand the "Errors" section. 4. Using the "Tableau 503 Error Page" dropdown, select a page from the list of pages you have created on Curator. 5. After making your selection from this dropdown, save the Settings page. ## Troubleshooting If you have configured a custom Access Denied (403) or Not Found (404) page but users are still seeing the default Curator error page instead of being redirected to your custom page, work through the steps below. ### Verify Your Curator Version A bug in earlier Curator releases could prevent custom error pages from being saved or applied correctly. Confirm that your instance is running Curator version `2026.04-05` or later, where this issue was fixed. The version is shown in the backend under **Settings** > **Curator** > **System Upgrade**, or to the right on the backend home page. ### Confirm the Page Is Still Selected 1. Navigate to **Settings** > **Curator** > **Portal Settings** and expand the "Error Pages" section under the "General" tab. 2. Verify that your custom page is still selected in the Access Denied (403) or Not Found (404) dropdown. If the dropdown is empty, the page may have been deleted or renamed -- re-select it and save. 3. Open the page itself under **Content** > **Pages** and confirm it still exists and is published. ### Rule Out Browser Caching Browsers can cache error responses, which may make it appear that the custom page is not being served even after the configuration is correct. Open a private/incognito browser window and revisit the URL that triggers the error to confirm the custom page is displayed for a fresh session. # Notices Source: https://docs.curator.interworks.com/site_content_design/user_notifications_and_email/notices Create and manage site-wide or page-specific notice banners to communicate important information to users. Curator supports adding a text banner across the top of individual pages. These can either be created on a per-menu-item basis, or set globally to appear across every page on your site. ***To create a notice:*** 1. Login to the backend of your Curator instance (e.g. `http://curatorexample.com/backend`). 2. Navigate to the **Content** > **Notices** section from the left-hand menu. 3. Create the notice by filling out the title and body of the notice. 4. Click the checkboxes at the bottom of the page next to the menu links you would like the notice to be associated with. 5. Save the notice to create it. 6. (optional) After the notice has been saved/created, you can now check the "Set this as the Global Notice"checkbox and save again to set the global notice. # Tutorials Source: https://docs.curator.interworks.com/site_content_design/user_notifications_and_email/tutorials Create interactive tutorials and help documentation to guide users through dashboard features and site functionality. Tutorials can be used to explain how to use a page, embedded visualization, or for any other supporting documentation related to content on your Curator site. They can be shown every time a Dashboard is viewed, a fixed number of times the Dashboard is viewed, or only when clicked on by a user. ***To create a tutorial:*** 1. Navigate to the backend of the system (e.g. `http://curatorexample.com/backend`). 2. Log in if prompted. 3. Click on **Content** > **Tutorials** in the left-hand menu. (or in earlier versions **Tableau** > **Tutorials**). 4. Click the "New Tutorial" button. 5. Enter the title, description and content of the tutorial in the appropriate fields. The content field allows for fully formatted content, including images, links, etc. 6. Enter the number of times the tutorial should be shown in the "Maximum Views" field. * Entering zero in this field means the tutorial will only be shown if the user clicks to see it. * Entering -1 in the field means the tutorial will be shown each time the user views the Dashboard until they click to not show it again. 7. You can control the size and location of the tutorial on the page by adjusting the pixel value for width, height, top position and left position. Leave blank to use the system default. * Top position is the number of pixels below the top of the page (0px is at the very top) * Left position is the number of pixels from the left of the page (0px is at the very left) 8. A highlighted image can be added by selecting an image from "Highlight Image". Once selected you can control the highlighted section by adjusting the pixel value for top position, left position, right position and bottom position. * Pixel value determines the size of highlighted area, starting from the top left. For example, if top position is 10px and bottom position is 100px, the highlighted area will start 10px below the top of the image and end 100px below the top. 9. Multiple slides can be created by clicking "Add New Item" 10. Click the "Create" button. ## Styling the Tutorial Header The tutorial title font size is controlled independently of the rest of your portal's typography. Set it under **Theme > Fonts > Tutorial Header Font Size (px)**. Adjusting this value affects only the tutorial modal title and leaves the theme's **Header Font Size** (and the page titles and sub-headings it drives) unchanged. The default is 18px. ## Setting Tutorials on Individual Content Pages **Dashboards:** 1. While editing the Dashboard, click on the "Misc" tab. 2. Expand the "Education" section. 3. Select the desired tutorial. 4. Click the "Save" button. **Pages:** 1. While editing a page, click on the "Misc" tab. 2. Scroll to the "Page Details" section at the bottom of the page. 3. Select the desired tutorial for the **Tutorial** field. 4. Click the "Save" button. On a page that has an assigned tutorial but no embedded Dashboards, a tutorial button (a graduation-cap icon) appears in the page title bar so users can re-open the tutorial at any time. This button is only shown while the page title is visible — it is hidden if **Show title** is disabled for the page, or if no tutorial is assigned. On pages with embedded Dashboards, each Dashboard's tutorial button continues to appear in that Dashboard's toolbar. ## Setting Tutorials Across Multiple Pages **Global Tutorials\***(applied across every page of your Curator portal): 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 menu. 4. In the Portal Settings page, click on the "General" tab at the top. 5. Select the desired tutorial in the "Global Tutorial" field under the "Global Settings" section. 6. Click the "Save" button. \*NOTE: \*\*For versions prior to the **2023.05.31-10** release, "Global tutorials" were not truly global. To enable a tutorial across all pages for these versions, you will also need to explicitly select a homepage tutorial (instructions below). \*NOTE: \*\*For versions prior to the **2023.05.31-10** release to set tutorials across *every single page* on your Curator site, you will also need to explicitly select a homepage tutorial **Homepage Tutorials:** 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 menu. 4. In the Portal Settings page, click on the "General" tab at the top. 5. Select the desired tutorial in the "Homepage Tutorial" field under the "Global Settings" section. 6. Click the "Save" button. # Backend Administration Tutorial: Adding Content Source: https://docs.curator.interworks.com/tutorials/backend_administration/quick_start_adding_content Step-by-step tutorial for adding content to Curator backend including dashboards and data sources.