From 6996cdc6d82732175f03d064dcc40dd9d0a9b69d Mon Sep 17 00:00:00 2001
From: Jake Peterson <5532776+jpetey75@users.noreply.github.com>
Date: Wed, 7 May 2025 13:13:52 -0500
Subject: [PATCH 01/37] fix: cli ref doc formatting (#44)
---
references/lightdash-cli.mdx | 124 +++++++++++++++++++----------------
1 file changed, 67 insertions(+), 57 deletions(-)
diff --git a/references/lightdash-cli.mdx b/references/lightdash-cli.mdx
index 5ce5402..f242ada 100644
--- a/references/lightdash-cli.mdx
+++ b/references/lightdash-cli.mdx
@@ -27,7 +27,7 @@ There are three global options that can be used with any Lightdash CLI command:
### Version
-`--version` or `\-V`
+`--version` or `-V`
Ignores the preceding command and shows the installed CLI version. Usually it's used right after `lightdash`, like this:
@@ -44,7 +44,7 @@ lightdash --version
### Help
-`--help` or `\-h`
+`--help` or `-h`
Tells you what the preceding command does and lists all command-specific options. You can view the Lightdash CLI help like this:
@@ -58,7 +58,7 @@ That returns the Lightdash CLI help menu:

-When you use the `--help` or `\-h` option with a speific command:
+When you use the `--help` or `-h` option with a speific command:
```console
lightdash validate -h
@@ -86,22 +86,22 @@ The table below includes a complete list of all commands available in the Lightd
For examples and command-specific options, click through the command in the table for docs, or install the Lightdash CLI and use the [global help option](#help).
-| Command | Description |
-| ---------------------------- | ---------------------------------------------------------------------------------- |
-|`lightdash login` | Log in to a Lightdash instance using email/password or a token |
-|`lightdash config set-project`| Choose or set the Lightdash project you are working on |
-|`lightdash compile` | Compile lightdash resources using your local project files |
-|`lightdash preview` | Create a temporary preview project, then wait for a keypress to stop |
-|`lightdash start-preview` | Create a preview project that stays open until it is stopped |
-|`lightdash stop-preview` | Shut down an open preview project |
-|`lightdash deploy` | Compile and deploy a Lightdash project using your local project and credentials |
-|`lightdash refresh` | Refresh Lightdash project with remote repository |
-|`lightdash validate` | Validates content from your active project against your local project files |
-|`lightdash generate` | Generates or updates schema.yml file(s) for the selected model(s) |
-|`lightdash dbt run` | Runs dbt and then generates or updates schema.yml file(s) for the selected model(s)|
-|`lightdash generate-exposures`| \[Experimental command\] Generates a .yml file for Lightdash exposures |
-|`lightdash download` | Downloads all charts and dashboards from your Lightdash project as code |
-|`lightdash upload` | Uploads all updates to charts and dashboards as code to your Lightdash project |
+| Command | Description |
+| --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
+|[`lightdash login`](/references/lightdash-cli#lightdash-login) | Log in to a Lightdash instance using email/password or a token |
+|[`lightdash config set-project`](/references/lightdash-cli#lightdash-config-set-project) | Choose or set the Lightdash project you are working on |
+|[`lightdash compile`](/references/lightdash-cli#lightdash-compile) | Compile lightdash resources using your local project files |
+|[`lightdash preview`](/references/lightdash-cli#lightdash-preview) | Create a temporary preview project, then wait for a keypress to stop |
+|[`lightdash start-preview`](/references/lightdash-cli#lightdash-start-preview) | Create a preview project that stays open until it is stopped |
+|[`lightdash stop-preview`](/references/lightdash-cli#lightdash-stop-preview) | Shut down an open preview project |
+|[`lightdash deploy`](/references/lightdash-cli#lightdash-deploy) | Compile and deploy a Lightdash project using your local project and credentials |
+|[`lightdash refresh`](/references/lightdash-cli#lightdash-refresh) | Refresh Lightdash project with remote repository |
+|[`lightdash validate`](/references/lightdash-cli#lightdash-validate) | Validates content from your active project against your local project files |
+|[`lightdash generate`](/references/lightdash-cli#lightdash-generate) | Generates or updates schema.yml file(s) for the selected model(s) |
+|[`lightdash dbt run`](/references/lightdash-cli#lightdash-dbt-run) | Runs dbt and then generates or updates schema.yml file(s) for the selected model(s)|
+|[`lightdash generate-exposures`](/references/lightdash-cli#lightdash-generate-exposures) | [Experimental command] Generates a .yml file for Lightdash exposures |
+|[`lightdash download`](/references/lightdash-cli#lightdash-download) | Downloads all charts and dashboards from your Lightdash project as code |
+|[`lightdash upload`](/references/lightdash-cli#lightdash-upload) | Uploads all updates to charts and dashboards as code to your Lightdash project |
---
@@ -115,7 +115,7 @@ lightdash login [URL]
**Argument:**
-- `\[URL\]`
+- `[URL]`
- The URL for your Lightdash instance (see examples below)
**Options:**
@@ -146,7 +146,7 @@ lightdash login https://custom.lightdash.domain --token bv6105f53cb127087189cfib
### `lightdash config set-project`
-Choose the project you're developing in so the CLI knows which project content to look at for other commands like `lightdash validate` and `lightdash preview`. If your organization only has one project you won't need to use this\!
+Choose the project you're developing in so the CLI knows which project content to look at for other commands like `lightdash validate` and `lightdash preview`. If your organization only has one project you won't need to use this!
```bash
lightdash config set-project
@@ -211,9 +211,9 @@ All standard [dbt options](#dbt-options) work with `lightdash preview`.
**Options:**
-- `--name \[preview name\]`
+- `--name [preview name]`
- Custom name for the preview project. If a name is not provided, a unique, randomly generated name will be created.
-- `--start-of-week \[number\]`
+- `--start-of-week [number]`
- Specifies the first day of the week (used by week-related date functions).
- 0 (Monday) to 6 (Sunday)
- `--skip-dbt-compile`
@@ -222,7 +222,7 @@ All standard [dbt options](#dbt-options) work with `lightdash preview`.
- `--skip-warehouse-catalog`
- (default: false)
- Skip fetch warehouse catalog and use types defined in the YAML.
-- `--use-dbt-list \[true/false\]`
+- `--use-dbt-list [true/false]`
- (default: true)
- Use `dbt list` instead of `dbt compile` to generate dbt manifest.json
- `--ignore-errors`
@@ -251,12 +251,12 @@ All standard [dbt options](#dbt-options) work with `lightdash start-preview`.
**Required argument:**
-- `--name \[preview name\]`
+- `--name [preview name]`
- Name for the preview project. If a preview project with this name already exists, it will be updated, otherwise it will create a new preview project.
**Options:**
-- `--start-of-week \[number\]`
+- `--start-of-week [number]`
- Specifies the first day of the week (used by week-related date functions).
- 0 (Monday) to 6 (Sunday)
- `--skip-dbt-compile`
@@ -265,7 +265,7 @@ All standard [dbt options](#dbt-options) work with `lightdash start-preview`.
- `--skip-warehouse-catalog`
- (default: false)
- Skip fetch warehouse catalog and use the types defined in YAML
-- `--use-dbt-list \[true/false\]`
+- `--use-dbt-list [true/false]`
- (default: true)
- Use `dbt list` instead of `dbt compile` to generate dbt manifest.json
- `--ignore-errors`
@@ -280,7 +280,7 @@ This command does not support using dbt options.
**Required argument:**
-- `--name \[preview name\]`
+- `--name [preview name]`
- Name of the preview project to be deleted.
**Example:**
@@ -296,7 +296,7 @@ lightdash stop-preview "neon unicorn"
Compiles and deploys the current project to your [selected Lightdash Cloud project](#lightdash-config-set-project).
- **It is not common practice to use **
+ **It is not common practice to use this command from the CLI after initial project creation.**
This command is usually [used in Github Actions](/guides/cli/how-to-use-lightdash-deploy#automatically-deploy-your-changes-to-lightdash-using-a-github-action) or other deploy scripts.
@@ -305,12 +305,12 @@ All standard [dbt options](#dbt-options) work with `lightdash deploy`.
**Options:**
-- `--create \[project_name\]`
+- `--create [project_name]`
- Create a new project. If a project name is not provided, you'll be prompted for one on creation.
- `--ignore-errors`
- (default: false)
- Allows deploy with errors on compile.
-- `--start-of-week \[number\]`
+- `--start-of-week [number]`
- Specifies the first day of the week (used by week-related date functions).
- 0 (Monday) to 6 (Sunday)
- `--skip-dbt-compile`
@@ -319,10 +319,20 @@ All standard [dbt options](#dbt-options) work with `lightdash deploy`.
- `--skip-warehouse-catalog`
- (default: false)
- Skip fetch warehouse catalog and use types defined in the YAML.
-- `--use-dbt-list \[true|false\]`
+- `--use-dbt-list [true|false]`
- (default: true)
- Use `dbt list` instead of `dbt compile` to generate dbt manifest.json.
+
+**Example:**
+
+Create a new project that uses the `production` credentials from your local dbt `profiles.yml`:
+
+```bash
+lightdash deploy --create --target production
+```
+
+
### `lightdash refresh`
Refreshes your hosted Lightdash project using the latest code from your linked Github repository. This is equivalent to pressing **Refresh dbt** in the UI as an admin.
@@ -337,7 +347,7 @@ All standard [dbt options](#dbt-options) work with `lightdash validate`.
**Options:**
-- `--project \[project uuid\]`
+- `--project [project uuid]`
- Project UUID to validate, if not provided, the last preview will be used
- `--preview`
- (default: false)
@@ -348,11 +358,11 @@ All standard [dbt options](#dbt-options) work with `lightdash validate`.
- `--skip-warehouse-catalog`
- (default: false)
- Skip fetch warehouse catalog and use types defined in the YAML.
-- `--use-dbt-list \[true/false\]`
+- `--use-dbt-list [true/false]`
- (default: true)
- Use `dbt list` instead of `dbt compile` to generate dbt manifest.json.
-- `--only \[elems...\]`
- - (default: \["charts","dashboards","tables"\])
+- `--only [elems...]`
+ - (default: ["charts","dashboards","tables"])
- Specify project elements to validate.
**Example:**
@@ -371,7 +381,7 @@ All standard [dbt options](#dbt-options) work with `lightdash generate`.
**Options:**
-- `\-y` or `--assume-yes`
+- `-y` or `--assume-yes`
- (default: false)
- assume yes to prompts
- `--exclude-meta`
@@ -400,10 +410,10 @@ This command does not support using dbt options.
**Options:**
-- `--project-dir \[path\]`
+- `--project-dir [path]`
- (default: ".")
- The directory of the dbt project
-- `--output \[path\]`
+- `--output [path]`
- The path where the output exposures YAML file will be written
**Example:**
@@ -425,9 +435,9 @@ Any dbt option that works with `dbt run` will also work with `lightdash dbt run`
- `--exclude-meta`
- (default: false)
- exclude Lightdash metadata from the generated .yml
-- `\-y` or `--assume-yes`
+- `-y` or `--assume-yes`
- assume yes to prompts (default: false)
-- `\-no` or `--assume-no`
+- `-no` or `--assume-no`
- assume no to prompts (default: false)
**Examples:**
@@ -448,11 +458,11 @@ You can make changes to the code and upload these changes back to your Lightdash
**Options:**
-- `--charts` or `\-c`
+- `--charts` or `-c`
- select specific charts as code to download from your project. Use the chart SLUG, UUID or URL to specify the chart.
-- `--dashboards` or `\-d`
+- `--dashboards` or `-d`
- select specific dashboards as code to download from your project. This will also download all charts in the dashboard as code. Use the dashboard SLUG, UUID or URL to specify the dashboard.
-- `--path` or `\-p`
+- `--path` or `-p`
- specify a custom path to a directory where you want the downloaded files to be written to. You can use the full path, or a relative path to a directory.
- `--project `
- download all charts and dashboards from a specific project. You can find the project UUID for a project from a Lightdash URL. E.g. here, the project UUID is `123-project-uuid` `https://app.lightdash.cloud/projects/123-project-uuid/`
@@ -501,11 +511,11 @@ If there have been changes made to a chart or dashboard in the application that
- `--force`
- if you've created new content as code that doesn't exist in your Lightdash project yet, you need to run `lightdash upload --force` to create these new charts and dashboards. Otherwise, `lightdash upload` only uploads updates to existing content.
-- `--charts` or `\-c`
+- `--charts` or `-c`
- select specific charts as code to upload back to your project. Use the chart SLUG to specify the chart.
-- `--dashboards` or `\-d`
+- `--dashboards` or `-d`
- select specific dashboards as code to upload back to your project. Use the dashboard SLUG to specify the dashboard.
-- `--path` or `\-p`
+- `--path` or `-p`
- specify a custom path to a directory where the files you want to upload are. You can use the full path, or a relative path to a directory.
- `--project `
- upload all charts and dashboards from a specific project. You can find the project UUID for a project from a Lightdash URL. E.g. here, the project UUID is `123-project-uuid` `https://app.lightdash.cloud/projects/123-project-uuid/`
@@ -554,33 +564,33 @@ You can select a subset of your dbt models by using the following options on any
**Node selection:**
-- `--select \[models...\]` or `\-s \[models...\]`
+- `--select [models...]` or `-s [models...]`
- [Read the dbt docs on select](https://docs.getdbt.com/reference/node-selection/syntax#shorthand)
-- `--exclude \[models...\]`
+- `--exclude [models...]`
- [Read the dbt docs on exclude](https://docs.getdbt.com/reference/node-selection/exclude)
-- `--selector \[selector_name\]`
+- `--selector [selector_name]`
- [Read the dbt docs on selector](https://docs.getdbt.com/reference/node-selection/yaml-selectors)
### dbt flags
These dbt flags work with Lightdash commands that support dbt options. [Read the dbt docs on global config flags](https://docs.getdbt.com/reference/global-configs/about-global-configs#available-flags) for details.
-- `--project-dir \[path\]`
-- `--profiles-dir \[path\]`
-- `--profile \[name\]`
-- `--target \[name\]`
+- `--project-dir [path]`
+- `--profiles-dir [path]`
+- `--profile [name]`
+- `--target [name]`
- `--no-version-check`
-- `--state \[state\]`
+- `--state [state]`
- `--full-refresh`
### dbt project variables
You can set dbt project variables in Lightdash commands that support dbt options. [Read the dbt docs on project variables](https://docs.getdbt.com/docs/build/project-variables) for details.
-`--vars \[vars\]`
+`--vars [vars]`
### dbt threads
You can set the number of threads for dbt in Lightdash commands that support dbt options. [Read the dbt docs on threads](https://docs.getdbt.com/docs/running-a-dbt-project/using-threads) for details.
-`--threads \[number\]`
\ No newline at end of file
+`--threads [number]`
\ No newline at end of file
From 3a0f65f57cf46ef2fcb9afe13c15e2211f4ba7f2 Mon Sep 17 00:00:00 2001
From: John Lloyd <127076043+xpall@users.noreply.github.com>
Date: Thu, 8 May 2025 02:39:45 +0800
Subject: [PATCH 02/37] fix: correct typo
fix: correct typo from "dashbaords" to "dashboards"
---
references/slack-integration.mdx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/references/slack-integration.mdx b/references/slack-integration.mdx
index 6ef1438..20c206e 100644
--- a/references/slack-integration.mdx
+++ b/references/slack-integration.mdx
@@ -39,7 +39,7 @@ Here you can choose which project is used by the Lightdash AI analyst co-pilot f
After installing the Slack app it will automatically unfurl links you share in Slack from your Lightdash project. The Lightdash app must be invited to a channel before it will unfurl links in that channel.
-Chart and dashbaord links unfurl for links copied from the URL field and also "share" links copied by clicking the link icon.
+Chart and dashboard links unfurl for links copied from the URL field and also "share" links copied by clicking the link icon.
Here's what an individual chart looks like unfurled:
@@ -61,7 +61,7 @@ The result will look like this for charts if you choose to attach an image of th

-And like this for dashbaords if you chose _not_ to include an image:
+And like this for dashboards if you chose _not_ to include an image:

From af1cd78ab4c9ecf0d81b622413b4305c7cfdd4d4 Mon Sep 17 00:00:00 2001
From: Jake Peterson <5532776+jpetey75@users.noreply.github.com>
Date: Fri, 9 May 2025 07:37:31 -0500
Subject: [PATCH 03/37] update: cli docs, add dbt defer option (#45)
---
references/lightdash-cli.mdx | 1 +
1 file changed, 1 insertion(+)
diff --git a/references/lightdash-cli.mdx b/references/lightdash-cli.mdx
index f242ada..a3e3980 100644
--- a/references/lightdash-cli.mdx
+++ b/references/lightdash-cli.mdx
@@ -582,6 +582,7 @@ These dbt flags work with Lightdash commands that support dbt options. [Read the
- `--no-version-check`
- `--state [state]`
- `--full-refresh`
+- `--defer` (works with `lightdash preview` and `lightdash compile`)
### dbt project variables
From 5f1a334df446805967255b8024f9836c662fbabd Mon Sep 17 00:00:00 2001
From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com>
Date: Fri, 9 May 2025 15:20:06 +0000
Subject: [PATCH 04/37] Documentation edits made through Mintlify web editor
---
.../environment-variables.mdx | 31 ++++++++++++++-----
1 file changed, 23 insertions(+), 8 deletions(-)
diff --git a/self-host/customize-deployment/environment-variables.mdx b/self-host/customize-deployment/environment-variables.mdx
index f7fea0a..81c579a 100644
--- a/self-host/customize-deployment/environment-variables.mdx
+++ b/self-host/customize-deployment/environment-variables.mdx
@@ -83,6 +83,21 @@ These variables enable you to control Single Sign On (SSO) functionality.
| `AUTH_AZURE_AD_PRIVATE_KEY_PATH` | Optional for Azure AD | | |
| `AUTH_AZURE_AD_PRIVATE_KEY` | Optional for Azure AD | | |
+## S3
+
+| Variable | Description | Required? | Default |
+| :--------------------------- | :---------------------------------------------- | :-------: | :-----: |
+| `RESULTS_CACHE_ENABLED` | Enables caching for chart results | | `false` |
+| `AUTOCOMPLETE_CACHE_ENABLED` | Enables caching for filter autocomplete results | | `false` |
+| `AUTOCOMPLETE_CACHE_ENABLED` | Enables caching for filter autocomplete results | | `false` |
+| `S3_ENDPOINT` | S3 endpoint for storing cached results | | |
+| | | | |
+| | | | |
+| | | | |
+| | | | |
+| | | | |
+| | | | |
+
## Cache
| Variable | Description | Required? | Default |
@@ -175,14 +190,14 @@ These variables enable you to configure the [Slack integration](/guides/using-sl
These variables enable you to configure [Github integrations](/self-host/customize-deployment/configure-github-for-lightdash)
-| Variable | Description | Required? | Default |
-| :----------------------- | :----------------------------------------------- | :------------------------------------------: | :-----: |
-| `GITHUB_PRIVATE_KEY` | GitHub private key for GitHub App authentication | | |
-| `GITHUB_APP_ID` | GitHub Application ID | | |
-| `GITHUB_CLIENT_ID` | GitHub OAuth client ID | | |
-| `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret | | |
-| `GITHUB_APP_NAME` | Name of the GitHub App | | |
-| `GITHUB_REDIRECT_DOMAIN` | Domain for GitHub OAuth redirection | | |
+| Variable | Description | Required? | Default |
+| :----------------------- | :----------------------------------------------- | :-------------------------------------------: | :-----: |
+| `GITHUB_PRIVATE_KEY` | GitHub private key for GitHub App authentication | | |
+| `GITHUB_APP_ID` | GitHub Application ID | | |
+| `GITHUB_CLIENT_ID` | GitHub OAuth client ID | | |
+| `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret | | |
+| `GITHUB_APP_NAME` | Name of the GitHub App | | |
+| `GITHUB_REDIRECT_DOMAIN` | Domain for GitHub OAuth redirection | | |
### **Organization appearance**
From d3792f5c7ecda616955e7d8815b2887a81028055 Mon Sep 17 00:00:00 2001
From: almeidabbm
Date: Fri, 9 May 2025 16:27:16 +0100
Subject: [PATCH 05/37] chore: add s3 variables
---
.../environment-variables.mdx | 113 +++++++++---------
1 file changed, 54 insertions(+), 59 deletions(-)
diff --git a/self-host/customize-deployment/environment-variables.mdx b/self-host/customize-deployment/environment-variables.mdx
index 81c579a..a2e7765 100644
--- a/self-host/customize-deployment/environment-variables.mdx
+++ b/self-host/customize-deployment/environment-variables.mdx
@@ -4,7 +4,7 @@ title: "Environment variables"
This is a reference to all environment variables that can be used to configure a Lightdash deployment.
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------: | :---------------------: |
| `PGHOST` | Hostname of postgres server to store Lightdash data | | |
| `PGPORT` | Port of postgres server to store Lightdash data | | |
@@ -13,27 +13,27 @@ This is a reference to all environment variables that can be used to configure a
| `PGDATABASE` | Database name inside postgres server to store Lightdash data | | |
| `PGCONNECTIONURI` | Connection URI for postgres server to store Lightdash data in the format postgresql://user:password@host:port/db?params. This is an alternative to providing the previous PG variables. | | |
| `LIGHTDASH_SECRET` | Secret key used to secure various tokens in Lightdash. This **must** be fixed between deployments. If the secret changes, you won't have access to Lightdash data. | | |
-| `SECURE_COOKIES` | Only allows cookies to be stored over a https connection. We use cookies to keep you logged in. This is recommended to be set to true in production. | | `false` |
+| `SECURE_COOKIES` | Only allows cookies to be stored over a https connection. We use cookies to keep you logged in. This is recommended to be set to true in production. | | `false` |
| `COOKIES_MAX_AGE_HOURS` | How many hours a user session exists before the user is automatically signed out. For example if 24, then the user will be automatically after 24 hours of inactivity. | | |
-| `TRUST_PROXY` | This tells the Lightdash server that it can trust the X-Forwarded-Proto header it receives in requests. This is useful if you use `SECURE_COOKIES=true` behind a HTTPS terminated proxy that you can trust. | | `false` |
+| `TRUST_PROXY` | This tells the Lightdash server that it can trust the X-Forwarded-Proto header it receives in requests. This is useful if you use `SECURE_COOKIES=true` behind a HTTPS terminated proxy that you can trust. | | `false` |
| `SITE_URL` | Site url where Lightdash is being hosted. It should include the protocol. E.g https://lightdash.mycompany.com | | `http://localhost:8080` |
-| `INTERNAL_LIGHTDASH_HOST` | Internal Lightdash host for the Headless browser to send requests when your Lightdash instance is not accessible from the Internet. Needs to support `https` if `SECURE_COOKIES=true` | | Same as `SITE_URL` |
+| `INTERNAL_LIGHTDASH_HOST` | Internal Lightdash host for the Headless browser to send requests when your Lightdash instance is not accessible from the Internet. Needs to support `https` if `SECURE_COOKIES=true` | | Same as `SITE_URL` |
| `STATIC_IP` | Server static IP so users can add the IP to their warehouse allow-list. | | `http://localhost:8080` |
-| `LIGHTDASH_QUERY_MAX_LIMIT` | Query max rows limit | | `5000` |
-| `SCHEDULER_ENABLED` | Enables/Disables the scheduler worker that triggers the scheduled deliveries. | | `true` |
-| `SCHEDULER_CONCURRENCY` | How many scheduled delivery jobs can be processed concurrently. | | `3` |
-| `SCHEDULER_JOB_TIMEOUT` | After how many milliseconds the job should be timeout so the scheduler worker can pick other jobs. | | `600000` (10 minutes) |
-| `LIGHTDASH_CSV_CELLS_LIMIT` | Max cells on CSV file exports | | `100000` |
-| `LIGHTDASH_CHART_VERSION_HISTORY_DAYS_LIMIT` | Configure how far back the chart versions history goes in days | | `3` |
-| `LIGHTDASH_PIVOT_TABLE_MAX_COLUMN_LIMIT` | Configure maximum number of columns in pivot table | | `60` |
-| `GROUPS_ENABLED` | Enables/Disables groups functionality | | `false` |
-| `AUTH_ENABLE_OIDC_LINKING` | Enables/Disables linking the new OIDC(aka SSO) identity to an existing user if they already have another OIDC with the same email | | `false` |
-| `CUSTOM_VISUALIZATIONS_ENABLED` | Enables/Disables custom chart functionality | | `false` |
-| `LIGHTDASH_MAX_PAYLOAD` | Maximum HTTP request body size | | `5mb` |
+| `LIGHTDASH_QUERY_MAX_LIMIT` | Query max rows limit | | `5000` |
+| `SCHEDULER_ENABLED` | Enables/Disables the scheduler worker that triggers the scheduled deliveries. | | `true` |
+| `SCHEDULER_CONCURRENCY` | How many scheduled delivery jobs can be processed concurrently. | | `3` |
+| `SCHEDULER_JOB_TIMEOUT` | After how many milliseconds the job should be timeout so the scheduler worker can pick other jobs. | | `600000` (10 minutes) |
+| `LIGHTDASH_CSV_CELLS_LIMIT` | Max cells on CSV file exports | | `100000` |
+| `LIGHTDASH_CHART_VERSION_HISTORY_DAYS_LIMIT` | Configure how far back the chart versions history goes in days | | `3` |
+| `LIGHTDASH_PIVOT_TABLE_MAX_COLUMN_LIMIT` | Configure maximum number of columns in pivot table | | `60` |
+| `GROUPS_ENABLED` | Enables/Disables groups functionality | | `false` |
+| `AUTH_ENABLE_OIDC_LINKING` | Enables/Disables linking the new OIDC(aka SSO) identity to an existing user if they already have another OIDC with the same email | | `false` |
+| `CUSTOM_VISUALIZATIONS_ENABLED` | Enables/Disables custom chart functionality | | `false` |
+| `LIGHTDASH_MAX_PAYLOAD` | Maximum HTTP request body size | | `5mb` |
| `LIGHTDASH_LICENSE_KEY` | License key for Lightdash Enterprise Edition. [Talk to us about Lightdash Enterprise Edition](https://calendly.com/lightdash-cloud/enterprise?utm_source=docs&utm_medium=referral&utm_campaign=enterprise_licensing&utm_content=license_key_cta) | | |
-| `HEADLESS_BROWSER_HOST` | Hostname for the headless browser | | — |
-| `HEADLESS_BROWSER_PORT` | Port for the headless browser | | `3001` |
-| `ALLOW_MULTIPLE_ORGS` | If set to `true`, new users registering on Lightdash will have their own organization, separated from others | | `false` |
+| `HEADLESS_BROWSER_HOST` | Hostname for the headless browser | | — |
+| `HEADLESS_BROWSER_PORT` | Port for the headless browser | | `3001` |
+| `ALLOW_MULTIPLE_ORGS` | If set to `true`, new users registering on Lightdash will have their own organization, separated from others | | `false` |
Lightdash also accepts all [standard postgres environment variables](https://www.postgresql.org/docs/9.3/libpq-envars.html)
@@ -41,15 +41,15 @@ Lightdash also accepts all [standard postgres environment variables](https://www
This is a reference to all the SMTP environment variables that can be used to configure a Lightdash email client.
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :------------------------------ | :------------------------------------------------------------------------- | :-------------------------------------------: | :---------: |
| `EMAIL_SMTP_HOST` | Hostname of email server | | |
-| `EMAIL_SMTP_PORT` | Port of email server | | `587` |
-| `EMAIL_SMTP_SECURE` | Secure connection | | `true` |
+| `EMAIL_SMTP_PORT` | Port of email server | | `587` |
+| `EMAIL_SMTP_SECURE` | Secure connection | | `true` |
| `EMAIL_SMTP_USER` | Auth user | | |
-| `EMAIL_SMTP_PASSWORD` | Auth password | `[1]` | |
-| `EMAIL_SMTP_ACCESS_TOKEN` | Auth access token for Oauth2 authentication | `[1]` | |
-| `EMAIL_SMTP_ALLOW_INVALID_CERT` | Allow connection to TLS server with self-signed or invalid TLS certificate | | `false` |
+| `EMAIL_SMTP_PASSWORD` | Auth password | `[1]` | |
+| `EMAIL_SMTP_ACCESS_TOKEN` | Auth access token for Oauth2 authentication | `[1]` | |
+| `EMAIL_SMTP_ALLOW_INVALID_CERT` | Allow connection to TLS server with self-signed or invalid TLS certificate | | `false` |
| `EMAIL_SMTP_SENDER_EMAIL` | The email address that sends emails | | |
| `EMAIL_SMTP_SENDER_NAME` | The name of the email address that sends emails | | `Lightdash` |
@@ -85,59 +85,54 @@ These variables enable you to control Single Sign On (SSO) functionality.
## S3
-| Variable | Description | Required? | Default |
-| :--------------------------- | :---------------------------------------------- | :-------: | :-----: |
-| `RESULTS_CACHE_ENABLED` | Enables caching for chart results | | `false` |
-| `AUTOCOMPLETE_CACHE_ENABLED` | Enables caching for filter autocomplete results | | `false` |
-| `AUTOCOMPLETE_CACHE_ENABLED` | Enables caching for filter autocomplete results | | `false` |
-| `S3_ENDPOINT` | S3 endpoint for storing cached results | | |
-| | | | |
-| | | | |
-| | | | |
-| | | | |
-| | | | |
-| | | | |
+| Variable | Description | Required? | Default |
+| :------------------- | :------------------------------------------------ | :-------------------------------------------: | :---------: |
+| `S3_ENDPOINT` | S3 endpoint for storing cached results | | |
+| `S3_BUCKET` | Name of the S3 bucket for storing files | | |
+| `S3_REGION` | Region where the S3 bucket is located. | | |
+| `S3_ACCESS_KEY` | Access key for authenticating with the S3 bucket. | | |
+| `S3_SECRET_KEY` | Secret key for authenticating with the S3 bucket. | | |
+| `S3_EXPIRATION_TIME` | Expiration time for scheduled deliveries files | | 259200 (3d) |
## Cache
-| Variable | Description | Required? | Default |
-| :---------------------------- | :-------------------------------------------------------------------------- | :-------------------------------------------: | :---------: |
-| `RESULTS_CACHE_ENABLED` | Enables caching for chart results | | `false` |
-| `AUTOCOMPLETE_CACHE_ENABLED` | Enables caching for filter autocomplete results | | `false` |
-| `S3_ENDPOINT` | S3 endpoint for storing cached results | | |
-| `RESULTS_CACHE_S3_BUCKET` | Name of the S3 bucket used for caching query results. | | |
-| `RESULTS_CACHE_S3_ACCESS_KEY` | Access key for authenticating with the S3 bucket. | | |
-| `RESULTS_CACHE_S3_SECRET_KEY` | Secret key for authenticating with the S3 bucket. | | |
-| `RESULTS_CACHE_S3_REGION` | Region where the S3 bucket is located. | | |
-| `CACHE_STALE_TIME_SECONDS` | Defines how long cached results remain valid before being considered stale. | | 86400 (24h) |
+| Variable | Description | Required? | Default |
+| :---------------------------- | :-------------------------------------------------------------------------- | :-------: | :-------------: |
+| `RESULTS_CACHE_ENABLED` | Enables caching for chart results | | `false` |
+| `AUTOCOMPLETE_CACHE_ENABLED` | Enables caching for filter autocomplete results | | `false` |
+| `RESULTS_CACHE_S3_BUCKET` | Name of the S3 bucket used for caching query results. | | `S3_BUCKET` |
+| `RESULTS_CACHE_S3_REGION` | Region where the S3 bucket is located. | | `S3_REGION` |
+| `RESULTS_CACHE_S3_ACCESS_KEY` | Access key for authenticating with the S3 bucket. | | `S3_ACCESS_KEY` |
+| `RESULTS_CACHE_S3_SECRET_KEY` | Secret key for authenticating with the S3 bucket. | | `S3_SECRET_KEY` |
+| `CACHE_STALE_TIME_SECONDS` | Defines how long cached results remain valid before being considered stale. | | 86400 (24h) |
- Note that you will need an Enterprise License Key for this functionality.
+ Note that you will need an Enterprise License Key for this functionality.
## Logging
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :----------------------------- | :---------------------------------------------------------- | :-------: | :--------------------: |
-| `LIGHTDASH_LOG_LEVEL` | The minimum level of log messages to display | | `INFO` |
-| `LIGHTDASH_LOG_FORMAT` | The format of log messages | | `pretty` |
-| LIGHTDASH_LOG_OUTPUTS | The outputs to send log messages to | | `console` |
+| `LIGHTDASH_LOG_LEVEL` | The minimum level of log messages to display | | `INFO` |
+| `LIGHTDASH_LOG_FORMAT` | The format of log messages | | `pretty` |
+| LIGHTDASH_LOG_OUTPUTS | The outputs to send log messages to | | `console` |
| `LIGHTDASH_LOG_CONSOLE_LEVEL` | The minimum level of log messages to display on the console | | `LIGHTDASH_LOG_LEVEL` |
| `LIGHTDASH_LOG_CONSOLE_FORMAT` | The format of log messages on the console | | `LIGHTDASH_LOG_FORMAT` |
| `LIGHTDASH_LOG_FILE_LEVEL` | The minimum level of log messages to write to the log file | | `LIGHTDASH_LOG_LEVEL` |
| `LIGHTDASH_LOG_FILE_FORMAT` | The format of log messages in the log file | | `LIGHTDASH_LOG_FORMAT` |
-| `LIGHTDASH_LOG_FILE_PATH` | The path to the log file | | `./logs/all.log` |
+| `LIGHTDASH_LOG_FILE_PATH` | The path to the log file | | `./logs/all.log` |
## Prometheus
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :------------------------------------------ | :------------------------------------------------------------------------------ | :-------: | :-------------------------: |
-| `LIGHTDASH_PROMETHEUS_ENABLED` | Enables/Disables Prometheus metrics endpoint | | `false` |
-| `LIGHTDASH_PROMETHEUS_PORT` | Port for Prometheus metrics endpoint | | `9090` |
-| `LIGHTDASH_PROMETHEUS_PATH` | Path for Prometheus metrics endpoint | | `/metrics` |
+| `LIGHTDASH_PROMETHEUS_ENABLED` | Enables/Disables Prometheus metrics endpoint | | `false` |
+| `LIGHTDASH_PROMETHEUS_PORT` | Port for Prometheus metrics endpoint | | `9090` |
+| `LIGHTDASH_PROMETHEUS_PATH` | Path for Prometheus metrics endpoint | | `/metrics` |
| `LIGHTDASH_PROMETHEUS_PREFIX` | Prefix for metric names. | | |
| `LIGHTDASH_GC_DURATION_BUCKETS` | Buckets for duration histogram in seconds. | | `0.001, 0.01, 0.1, 1, 2, 5` |
-| `LIGHTDASH_EVENT_LOOP_MONITORING_PRECISION` | Precision for event loop monitoring in milliseconds. Must be greater than zero. | | `10` |
+| `LIGHTDASH_EVENT_LOOP_MONITORING_PRECISION` | Precision for event loop monitoring in milliseconds. Must be greater than zero. | | `10` |
| `LIGHTDASH_PROMETHEUS_LABELS` | Labels to add to all metrics. Must be valid JSON | | |
## Security
@@ -190,7 +185,7 @@ These variables enable you to configure the [Slack integration](/guides/using-sl
These variables enable you to configure [Github integrations](/self-host/customize-deployment/configure-github-for-lightdash)
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :----------------------- | :----------------------------------------------- | :-------------------------------------------: | :-----: |
| `GITHUB_PRIVATE_KEY` | GitHub private key for GitHub App authentication | | |
| `GITHUB_APP_ID` | GitHub Application ID | | |
@@ -206,4 +201,4 @@ These variables allow you to customize the default appearance settings for your
| Variable | Description | Required? | Default |
| :------------------------------ | :---------------------------------------------------------------------------------------- | :-------: | :-----: |
| `OVERRIDE_COLOR_PALETTE_NAME` | Name of the default color palette | | |
-| `OVERRIDE_COLOR_PALETTE_COLORS` | Comma-separated list of hex color codes for the default color palette (must be 20 colors) | | |
\ No newline at end of file
+| `OVERRIDE_COLOR_PALETTE_COLORS` | Comma-separated list of hex color codes for the default color palette (must be 20 colors) | | |
From 596a36cfdc1f2b61b17de75f2c48933a735b1384 Mon Sep 17 00:00:00 2001
From: almeidabbm
Date: Fri, 9 May 2025 16:29:10 +0100
Subject: [PATCH 06/37] chore: remove dots
---
.../environment-variables.mdx | 34 +++++++++----------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/self-host/customize-deployment/environment-variables.mdx b/self-host/customize-deployment/environment-variables.mdx
index a2e7765..6d82b61 100644
--- a/self-host/customize-deployment/environment-variables.mdx
+++ b/self-host/customize-deployment/environment-variables.mdx
@@ -85,26 +85,26 @@ These variables enable you to control Single Sign On (SSO) functionality.
## S3
-| Variable | Description | Required? | Default |
-| :------------------- | :------------------------------------------------ | :-------------------------------------------: | :---------: |
-| `S3_ENDPOINT` | S3 endpoint for storing cached results | | |
-| `S3_BUCKET` | Name of the S3 bucket for storing files | | |
-| `S3_REGION` | Region where the S3 bucket is located. | | |
-| `S3_ACCESS_KEY` | Access key for authenticating with the S3 bucket. | | |
-| `S3_SECRET_KEY` | Secret key for authenticating with the S3 bucket. | | |
-| `S3_EXPIRATION_TIME` | Expiration time for scheduled deliveries files | | 259200 (3d) |
+| Variable | Description | Required? | Default |
+| :------------------- | :----------------------------------------------- | :-------------------------------------------: | :---------: |
+| `S3_ENDPOINT` | S3 endpoint for storing cached results | | |
+| `S3_BUCKET` | Name of the S3 bucket for storing files | | |
+| `S3_REGION` | Region where the S3 bucket is located | | |
+| `S3_ACCESS_KEY` | Access key for authenticating with the S3 bucket | | |
+| `S3_SECRET_KEY` | Secret key for authenticating with the S3 bucket | | |
+| `S3_EXPIRATION_TIME` | Expiration time for scheduled deliveries files | | 259200 (3d) |
## Cache
-| Variable | Description | Required? | Default |
-| :---------------------------- | :-------------------------------------------------------------------------- | :-------: | :-------------: |
-| `RESULTS_CACHE_ENABLED` | Enables caching for chart results | | `false` |
-| `AUTOCOMPLETE_CACHE_ENABLED` | Enables caching for filter autocomplete results | | `false` |
-| `RESULTS_CACHE_S3_BUCKET` | Name of the S3 bucket used for caching query results. | | `S3_BUCKET` |
-| `RESULTS_CACHE_S3_REGION` | Region where the S3 bucket is located. | | `S3_REGION` |
-| `RESULTS_CACHE_S3_ACCESS_KEY` | Access key for authenticating with the S3 bucket. | | `S3_ACCESS_KEY` |
-| `RESULTS_CACHE_S3_SECRET_KEY` | Secret key for authenticating with the S3 bucket. | | `S3_SECRET_KEY` |
-| `CACHE_STALE_TIME_SECONDS` | Defines how long cached results remain valid before being considered stale. | | 86400 (24h) |
+| Variable | Description | Required? | Default |
+| :---------------------------- | :------------------------------------------------------------------------- | :-------: | :-------------: |
+| `RESULTS_CACHE_ENABLED` | Enables caching for chart results | | `false` |
+| `AUTOCOMPLETE_CACHE_ENABLED` | Enables caching for filter autocomplete results | | `false` |
+| `RESULTS_CACHE_S3_BUCKET` | Name of the S3 bucket used for caching query results | | `S3_BUCKET` |
+| `RESULTS_CACHE_S3_REGION` | Region where the S3 bucket is located | | `S3_REGION` |
+| `RESULTS_CACHE_S3_ACCESS_KEY` | Access key for authenticating with the S3 bucket | | `S3_ACCESS_KEY` |
+| `RESULTS_CACHE_S3_SECRET_KEY` | Secret key for authenticating with the S3 bucket | | `S3_SECRET_KEY` |
+| `CACHE_STALE_TIME_SECONDS` | Defines how long cached results remain valid before being considered stale | | 86400 (24h) |
Note that you will need an Enterprise License Key for this functionality.
From 603b3ed29a9899d67e62fb24df4b7e03ad89588e Mon Sep 17 00:00:00 2001
From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com>
Date: Fri, 9 May 2025 15:55:10 +0000
Subject: [PATCH 07/37] Documentation edits made through Mintlify web editor
---
...ghtdash-to-use-external-object-storage.mdx | 46 +++++++++----------
1 file changed, 21 insertions(+), 25 deletions(-)
diff --git a/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx b/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx
index 4b81154..e09476e 100644
--- a/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx
+++ b/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx
@@ -1,19 +1,15 @@
---
title: "Configure Lightdash to use external storage"
-sidebarTitle: External storage
+sidebarTitle: "External storage"
---
On Lightdash, we generate some files like:
-* Images for Slack unfurl
-* Images on scheduled deliveries
-* Results on CSV format.
+- Images for Slack unfurl
+- Images on scheduled deliveries
+- Results on CSV format.
-These files can be stored locally and can be served through Lightdash, however, if you run Lightdash on multiple containers, these files might not be available when you requested, because the file might be generated in another container, as these files are not shared across containers. Also these files might not persist across different deployments.
-
-To solve this, we suggest you enable Cloud storage, so Lightdash can store the files in a cloud (GCP buckets, S3 storage...)
-
-For this, all you need is to configure the cloud storage and export S3 credentials (most cloud storages are compatible with S3 library)
+These files need to be stored in a S3 Compatible Cloud storage. Some options are GCP Buckets, S3 Storage and MinIO.
## Configure cloud storage on Google Cloud Platform
@@ -21,31 +17,31 @@ Go into GCP: Cloud storage
Create a new bucket with the following details:
-* give it an unique `Bucket name` like - `lightdash-cloud-file-storage-eu`
-* Select region (like multi US or multi EU or single region EU-west-1)
-* select storage class: default standard
-* disable `enforce public access` and select `fine-grained`
-* Protection: `none`
+- give it an unique `Bucket name` like - `lightdash-cloud-file-storage-eu`
+- Select region (like multi US or multi EU or single region EU-west-1)
+- select storage class: default standard
+- disable `enforce public access` and select `fine-grained`
+- Protection: `none`
-Go to settings > Interoperability and create a `Access key for service account`
+Go to settings \> Interoperability and create a `Access key for service account`
-* Copy the `access key` and `secret`
+- Copy the `access key` and `secret`
`S3_ENDPOINT` for google is `https://storage.googleapis.com` `S3_REGION` for google is `auto`
## Configure cloud storage on AWS
-* Navigate to the S3 section of the AWS Management Console and click on the Create Bucket button.
-* Give your bucket a name and select the region where you want to store your data.
-* Next, you need to set the permissions for your bucket. Make it private.
+- Navigate to the S3 section of the AWS Management Console and click on the Create Bucket button.
+- Give your bucket a name and select the region where you want to store your data.
+- Next, you need to set the permissions for your bucket. Make it private.
To export your S3 credentials, you need to follow these steps:
-* Navigate to the IAM section and click on the Users tab.
-* Click on the user whose credentials you want to export.
-* Click on the Security Credentials tab and locate the Access Keys section.
-* Click on the Create Access Key button.
-* Download the CSV file that contains your Access Key ID and Secret Access Key.
+- Navigate to the IAM section and click on the Users tab.
+- Click on the user whose credentials you want to export.
+- Click on the Security Credentials tab and locate the Access Keys section.
+- Click on the Create Access Key button.
+- Download the CSV file that contains your Access Key ID and Secret Access Key.
Check [this guide](https://docs.aws.amazon.com/general/latest/gr/s3.html) to see what's the right `S3_ENDPOINT` for your bucket
@@ -66,4 +62,4 @@ We also support IAM roles. If you don't provide `S3_ACCESS_KEY` and `S3_SECRET_K
The expiration time is optional and defaults to 259200 (seconds).
-If you try to customize this expiration time, you should keep in mind that link to your object url will be available for the maximum of 7 days due to signed url limitations if you use IAM role to generate it.
+If you try to customize this expiration time, you should keep in mind that link to your object url will be available for the maximum of 7 days due to signed url limitations if you use IAM role to generate it.
\ No newline at end of file
From 5c3a5c673d6af3779cbb91401e127a6b56347755 Mon Sep 17 00:00:00 2001
From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com>
Date: Fri, 9 May 2025 15:57:30 +0000
Subject: [PATCH 08/37] Documentation edits made through Mintlify web editor
---
.../environment-variables.mdx | 90 ++++++++++---------
1 file changed, 46 insertions(+), 44 deletions(-)
diff --git a/self-host/customize-deployment/environment-variables.mdx b/self-host/customize-deployment/environment-variables.mdx
index 6d82b61..159376c 100644
--- a/self-host/customize-deployment/environment-variables.mdx
+++ b/self-host/customize-deployment/environment-variables.mdx
@@ -4,7 +4,7 @@ title: "Environment variables"
This is a reference to all environment variables that can be used to configure a Lightdash deployment.
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------: | :---------------------: |
| `PGHOST` | Hostname of postgres server to store Lightdash data | | |
| `PGPORT` | Port of postgres server to store Lightdash data | | |
@@ -13,27 +13,27 @@ This is a reference to all environment variables that can be used to configure a
| `PGDATABASE` | Database name inside postgres server to store Lightdash data | | |
| `PGCONNECTIONURI` | Connection URI for postgres server to store Lightdash data in the format postgresql://user:password@host:port/db?params. This is an alternative to providing the previous PG variables. | | |
| `LIGHTDASH_SECRET` | Secret key used to secure various tokens in Lightdash. This **must** be fixed between deployments. If the secret changes, you won't have access to Lightdash data. | | |
-| `SECURE_COOKIES` | Only allows cookies to be stored over a https connection. We use cookies to keep you logged in. This is recommended to be set to true in production. | | `false` |
+| `SECURE_COOKIES` | Only allows cookies to be stored over a https connection. We use cookies to keep you logged in. This is recommended to be set to true in production. | | `false` |
| `COOKIES_MAX_AGE_HOURS` | How many hours a user session exists before the user is automatically signed out. For example if 24, then the user will be automatically after 24 hours of inactivity. | | |
-| `TRUST_PROXY` | This tells the Lightdash server that it can trust the X-Forwarded-Proto header it receives in requests. This is useful if you use `SECURE_COOKIES=true` behind a HTTPS terminated proxy that you can trust. | | `false` |
+| `TRUST_PROXY` | This tells the Lightdash server that it can trust the X-Forwarded-Proto header it receives in requests. This is useful if you use `SECURE_COOKIES=true` behind a HTTPS terminated proxy that you can trust. | | `false` |
| `SITE_URL` | Site url where Lightdash is being hosted. It should include the protocol. E.g https://lightdash.mycompany.com | | `http://localhost:8080` |
-| `INTERNAL_LIGHTDASH_HOST` | Internal Lightdash host for the Headless browser to send requests when your Lightdash instance is not accessible from the Internet. Needs to support `https` if `SECURE_COOKIES=true` | | Same as `SITE_URL` |
+| `INTERNAL_LIGHTDASH_HOST` | Internal Lightdash host for the Headless browser to send requests when your Lightdash instance is not accessible from the Internet. Needs to support `https` if `SECURE_COOKIES=true` | | Same as `SITE_URL` |
| `STATIC_IP` | Server static IP so users can add the IP to their warehouse allow-list. | | `http://localhost:8080` |
-| `LIGHTDASH_QUERY_MAX_LIMIT` | Query max rows limit | | `5000` |
-| `SCHEDULER_ENABLED` | Enables/Disables the scheduler worker that triggers the scheduled deliveries. | | `true` |
-| `SCHEDULER_CONCURRENCY` | How many scheduled delivery jobs can be processed concurrently. | | `3` |
-| `SCHEDULER_JOB_TIMEOUT` | After how many milliseconds the job should be timeout so the scheduler worker can pick other jobs. | | `600000` (10 minutes) |
-| `LIGHTDASH_CSV_CELLS_LIMIT` | Max cells on CSV file exports | | `100000` |
-| `LIGHTDASH_CHART_VERSION_HISTORY_DAYS_LIMIT` | Configure how far back the chart versions history goes in days | | `3` |
-| `LIGHTDASH_PIVOT_TABLE_MAX_COLUMN_LIMIT` | Configure maximum number of columns in pivot table | | `60` |
-| `GROUPS_ENABLED` | Enables/Disables groups functionality | | `false` |
-| `AUTH_ENABLE_OIDC_LINKING` | Enables/Disables linking the new OIDC(aka SSO) identity to an existing user if they already have another OIDC with the same email | | `false` |
-| `CUSTOM_VISUALIZATIONS_ENABLED` | Enables/Disables custom chart functionality | | `false` |
-| `LIGHTDASH_MAX_PAYLOAD` | Maximum HTTP request body size | | `5mb` |
+| `LIGHTDASH_QUERY_MAX_LIMIT` | Query max rows limit | | `5000` |
+| `SCHEDULER_ENABLED` | Enables/Disables the scheduler worker that triggers the scheduled deliveries. | | `true` |
+| `SCHEDULER_CONCURRENCY` | How many scheduled delivery jobs can be processed concurrently. | | `3` |
+| `SCHEDULER_JOB_TIMEOUT` | After how many milliseconds the job should be timeout so the scheduler worker can pick other jobs. | | `600000` (10 minutes) |
+| `LIGHTDASH_CSV_CELLS_LIMIT` | Max cells on CSV file exports | | `100000` |
+| `LIGHTDASH_CHART_VERSION_HISTORY_DAYS_LIMIT` | Configure how far back the chart versions history goes in days | | `3` |
+| `LIGHTDASH_PIVOT_TABLE_MAX_COLUMN_LIMIT` | Configure maximum number of columns in pivot table | | `60` |
+| `GROUPS_ENABLED` | Enables/Disables groups functionality | | `false` |
+| `AUTH_ENABLE_OIDC_LINKING` | Enables/Disables linking the new OIDC(aka SSO) identity to an existing user if they already have another OIDC with the same email | | `false` |
+| `CUSTOM_VISUALIZATIONS_ENABLED` | Enables/Disables custom chart functionality | | `false` |
+| `LIGHTDASH_MAX_PAYLOAD` | Maximum HTTP request body size | | `5mb` |
| `LIGHTDASH_LICENSE_KEY` | License key for Lightdash Enterprise Edition. [Talk to us about Lightdash Enterprise Edition](https://calendly.com/lightdash-cloud/enterprise?utm_source=docs&utm_medium=referral&utm_campaign=enterprise_licensing&utm_content=license_key_cta) | | |
-| `HEADLESS_BROWSER_HOST` | Hostname for the headless browser | | — |
-| `HEADLESS_BROWSER_PORT` | Port for the headless browser | | `3001` |
-| `ALLOW_MULTIPLE_ORGS` | If set to `true`, new users registering on Lightdash will have their own organization, separated from others | | `false` |
+| `HEADLESS_BROWSER_HOST` | Hostname for the headless browser | | — |
+| `HEADLESS_BROWSER_PORT` | Port for the headless browser | | `3001` |
+| `ALLOW_MULTIPLE_ORGS` | If set to `true`, new users registering on Lightdash will have their own organization, separated from others | | `false` |
Lightdash also accepts all [standard postgres environment variables](https://www.postgresql.org/docs/9.3/libpq-envars.html)
@@ -41,15 +41,15 @@ Lightdash also accepts all [standard postgres environment variables](https://www
This is a reference to all the SMTP environment variables that can be used to configure a Lightdash email client.
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :------------------------------ | :------------------------------------------------------------------------- | :-------------------------------------------: | :---------: |
| `EMAIL_SMTP_HOST` | Hostname of email server | | |
-| `EMAIL_SMTP_PORT` | Port of email server | | `587` |
-| `EMAIL_SMTP_SECURE` | Secure connection | | `true` |
+| `EMAIL_SMTP_PORT` | Port of email server | | `587` |
+| `EMAIL_SMTP_SECURE` | Secure connection | | `true` |
| `EMAIL_SMTP_USER` | Auth user | | |
-| `EMAIL_SMTP_PASSWORD` | Auth password | `[1]` | |
-| `EMAIL_SMTP_ACCESS_TOKEN` | Auth access token for Oauth2 authentication | `[1]` | |
-| `EMAIL_SMTP_ALLOW_INVALID_CERT` | Allow connection to TLS server with self-signed or invalid TLS certificate | | `false` |
+| `EMAIL_SMTP_PASSWORD` | Auth password | `[1]` | |
+| `EMAIL_SMTP_ACCESS_TOKEN` | Auth access token for Oauth2 authentication | `[1]` | |
+| `EMAIL_SMTP_ALLOW_INVALID_CERT` | Allow connection to TLS server with self-signed or invalid TLS certificate | | `false` |
| `EMAIL_SMTP_SENDER_EMAIL` | The email address that sends emails | | |
| `EMAIL_SMTP_SENDER_NAME` | The name of the email address that sends emails | | `Lightdash` |
@@ -85,7 +85,9 @@ These variables enable you to control Single Sign On (SSO) functionality.
## S3
-| Variable | Description | Required? | Default |
+These variables allow you to configure [S3 Object Storage](/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage).
+
+| Variable | Description | Required? | Default |
| :------------------- | :----------------------------------------------- | :-------------------------------------------: | :---------: |
| `S3_ENDPOINT` | S3 endpoint for storing cached results | | |
| `S3_BUCKET` | Name of the S3 bucket for storing files | | |
@@ -96,43 +98,43 @@ These variables enable you to control Single Sign On (SSO) functionality.
## Cache
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :---------------------------- | :------------------------------------------------------------------------- | :-------: | :-------------: |
-| `RESULTS_CACHE_ENABLED` | Enables caching for chart results | | `false` |
-| `AUTOCOMPLETE_CACHE_ENABLED` | Enables caching for filter autocomplete results | | `false` |
-| `RESULTS_CACHE_S3_BUCKET` | Name of the S3 bucket used for caching query results | | `S3_BUCKET` |
-| `RESULTS_CACHE_S3_REGION` | Region where the S3 bucket is located | | `S3_REGION` |
+| `RESULTS_CACHE_ENABLED` | Enables caching for chart results | | `false` |
+| `AUTOCOMPLETE_CACHE_ENABLED` | Enables caching for filter autocomplete results | | `false` |
+| `RESULTS_CACHE_S3_BUCKET` | Name of the S3 bucket used for caching query results | | `S3_BUCKET` |
+| `RESULTS_CACHE_S3_REGION` | Region where the S3 bucket is located | | `S3_REGION` |
| `RESULTS_CACHE_S3_ACCESS_KEY` | Access key for authenticating with the S3 bucket | | `S3_ACCESS_KEY` |
| `RESULTS_CACHE_S3_SECRET_KEY` | Secret key for authenticating with the S3 bucket | | `S3_SECRET_KEY` |
-| `CACHE_STALE_TIME_SECONDS` | Defines how long cached results remain valid before being considered stale | | 86400 (24h) |
+| `CACHE_STALE_TIME_SECONDS` | Defines how long cached results remain valid before being considered stale | | 86400 (24h) |
- Note that you will need an Enterprise License Key for this functionality.
+ Note that you will need an Enterprise License Key for this functionality.
## Logging
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :----------------------------- | :---------------------------------------------------------- | :-------: | :--------------------: |
-| `LIGHTDASH_LOG_LEVEL` | The minimum level of log messages to display | | `INFO` |
-| `LIGHTDASH_LOG_FORMAT` | The format of log messages | | `pretty` |
-| LIGHTDASH_LOG_OUTPUTS | The outputs to send log messages to | | `console` |
+| `LIGHTDASH_LOG_LEVEL` | The minimum level of log messages to display | | `INFO` |
+| `LIGHTDASH_LOG_FORMAT` | The format of log messages | | `pretty` |
+| LIGHTDASH_LOG_OUTPUTS | The outputs to send log messages to | | `console` |
| `LIGHTDASH_LOG_CONSOLE_LEVEL` | The minimum level of log messages to display on the console | | `LIGHTDASH_LOG_LEVEL` |
| `LIGHTDASH_LOG_CONSOLE_FORMAT` | The format of log messages on the console | | `LIGHTDASH_LOG_FORMAT` |
| `LIGHTDASH_LOG_FILE_LEVEL` | The minimum level of log messages to write to the log file | | `LIGHTDASH_LOG_LEVEL` |
| `LIGHTDASH_LOG_FILE_FORMAT` | The format of log messages in the log file | | `LIGHTDASH_LOG_FORMAT` |
-| `LIGHTDASH_LOG_FILE_PATH` | The path to the log file | | `./logs/all.log` |
+| `LIGHTDASH_LOG_FILE_PATH` | The path to the log file | | `./logs/all.log` |
## Prometheus
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :------------------------------------------ | :------------------------------------------------------------------------------ | :-------: | :-------------------------: |
-| `LIGHTDASH_PROMETHEUS_ENABLED` | Enables/Disables Prometheus metrics endpoint | | `false` |
-| `LIGHTDASH_PROMETHEUS_PORT` | Port for Prometheus metrics endpoint | | `9090` |
-| `LIGHTDASH_PROMETHEUS_PATH` | Path for Prometheus metrics endpoint | | `/metrics` |
+| `LIGHTDASH_PROMETHEUS_ENABLED` | Enables/Disables Prometheus metrics endpoint | | `false` |
+| `LIGHTDASH_PROMETHEUS_PORT` | Port for Prometheus metrics endpoint | | `9090` |
+| `LIGHTDASH_PROMETHEUS_PATH` | Path for Prometheus metrics endpoint | | `/metrics` |
| `LIGHTDASH_PROMETHEUS_PREFIX` | Prefix for metric names. | | |
| `LIGHTDASH_GC_DURATION_BUCKETS` | Buckets for duration histogram in seconds. | | `0.001, 0.01, 0.1, 1, 2, 5` |
-| `LIGHTDASH_EVENT_LOOP_MONITORING_PRECISION` | Precision for event loop monitoring in milliseconds. Must be greater than zero. | | `10` |
+| `LIGHTDASH_EVENT_LOOP_MONITORING_PRECISION` | Precision for event loop monitoring in milliseconds. Must be greater than zero. | | `10` |
| `LIGHTDASH_PROMETHEUS_LABELS` | Labels to add to all metrics. Must be valid JSON | | |
## Security
@@ -185,7 +187,7 @@ These variables enable you to configure the [Slack integration](/guides/using-sl
These variables enable you to configure [Github integrations](/self-host/customize-deployment/configure-github-for-lightdash)
-| Variable | Description | Required? | Default |
+| Variable | Description | Required? | Default |
| :----------------------- | :----------------------------------------------- | :-------------------------------------------: | :-----: |
| `GITHUB_PRIVATE_KEY` | GitHub private key for GitHub App authentication | | |
| `GITHUB_APP_ID` | GitHub Application ID | | |
@@ -201,4 +203,4 @@ These variables allow you to customize the default appearance settings for your
| Variable | Description | Required? | Default |
| :------------------------------ | :---------------------------------------------------------------------------------------- | :-------: | :-----: |
| `OVERRIDE_COLOR_PALETTE_NAME` | Name of the default color palette | | |
-| `OVERRIDE_COLOR_PALETTE_COLORS` | Comma-separated list of hex color codes for the default color palette (must be 20 colors) | | |
+| `OVERRIDE_COLOR_PALETTE_COLORS` | Comma-separated list of hex color codes for the default color palette (must be 20 colors) | | |
\ No newline at end of file
From eb0748eecdfa71493111692d1595feb5a52b95cc Mon Sep 17 00:00:00 2001
From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com>
Date: Mon, 12 May 2025 12:31:16 +0000
Subject: [PATCH 09/37] Documentation edits made through Mintlify web editor
---
...ghtdash-to-use-external-object-storage.mdx | 17 +++++++++++++++
.../environment-variables.mdx | 21 ++++++++++---------
2 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx b/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx
index e09476e..76093fd 100644
--- a/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx
+++ b/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage.mdx
@@ -45,6 +45,23 @@ To export your S3 credentials, you need to follow these steps:
Check [this guide](https://docs.aws.amazon.com/general/latest/gr/s3.html) to see what's the right `S3_ENDPOINT` for your bucket
+## Configure cloud storage using MinIO
+
+Creating a bucket in MinIO
+
+- Login to the MinIO console and click on "Buckets" in the side bar
+- Click on "Create Bucket"
+- Give your bucket a name and click "Create Bucket"
+
+Creating access credentials in MinIO
+
+- Click on "Access Keys" in the side bar
+- Click "Create access key"
+- Give a name to your new access key and click "Create"
+- Download the JSON file containing both your Access Key ID and Secret Access Key
+
+MinIO needs path style bucket URLs, for this you will need to set `S3_FORCE_PATH_STYLE: true` in your environment variables.
+
## Configure Lightdash to use S3 credentials
Now you have the bucket and the S3 credentials for your cloud storage, you can provide the following ENV variables to Lightdash so it can use the cloud storage using S3 library
diff --git a/self-host/customize-deployment/environment-variables.mdx b/self-host/customize-deployment/environment-variables.mdx
index 159376c..cd389b0 100644
--- a/self-host/customize-deployment/environment-variables.mdx
+++ b/self-host/customize-deployment/environment-variables.mdx
@@ -85,16 +85,17 @@ These variables enable you to control Single Sign On (SSO) functionality.
## S3
-These variables allow you to configure [S3 Object Storage](/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage).
-
-| Variable | Description | Required? | Default |
-| :------------------- | :----------------------------------------------- | :-------------------------------------------: | :---------: |
-| `S3_ENDPOINT` | S3 endpoint for storing cached results | | |
-| `S3_BUCKET` | Name of the S3 bucket for storing files | | |
-| `S3_REGION` | Region where the S3 bucket is located | | |
-| `S3_ACCESS_KEY` | Access key for authenticating with the S3 bucket | | |
-| `S3_SECRET_KEY` | Secret key for authenticating with the S3 bucket | | |
-| `S3_EXPIRATION_TIME` | Expiration time for scheduled deliveries files | | 259200 (3d) |
+These variables allow you to configure [S3 Object Storage](/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage).
+
+| Variable | Description | Required? | Default |
+| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------: | :---------: |
+| `S3_ENDPOINT` | S3 endpoint for storing cached results | | |
+| `S3_BUCKET` | Name of the S3 bucket for storing files | | |
+| `S3_REGION` | Region where the S3 bucket is located | | |
+| `S3_ACCESS_KEY` | Access key for authenticating with the S3 bucket | | |
+| `S3_SECRET_KEY` | Secret key for authenticating with the S3 bucket | | |
+| `S3_EXPIRATION_TIME` | Expiration time for scheduled deliveries files | | 259200 (3d) |
+| `S3_FORCE_PATH_STYLE` | Force path style addressing, needed for MinIO setup e.g. `http://your.s3.domain/BUCKET/KEY` instead of `http://BUCKET.your.s3.domain/KEY` | | `false` |
## Cache
From a4b6c3535aabca323ca7d3967e542e5d3a7afce7 Mon Sep 17 00:00:00 2001
From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com>
Date: Tue, 13 May 2025 13:47:09 +0000
Subject: [PATCH 10/37] Documentation edits made through Mintlify web editor
---
guides/renaming-models-and-fields.mdx | 72 +++++++++++++++++++++++++++
1 file changed, 72 insertions(+)
create mode 100644 guides/renaming-models-and-fields.mdx
diff --git a/guides/renaming-models-and-fields.mdx b/guides/renaming-models-and-fields.mdx
new file mode 100644
index 0000000..c7c4f0c
--- /dev/null
+++ b/guides/renaming-models-and-fields.mdx
@@ -0,0 +1,72 @@
+---
+title: "Renaming models, metrics and dimensions"
+description: "Description of your new file."
+---
+
+Lightdash provides powerful renaming capabilities that allow you to update metrics, dimensions or models across your entire project, where those fields or models are used. This feature is particularly useful when you need to standardize naming conventions, fix typos, or make your metrics more user-friendly.
+
+Renaming updates all the IDs and references from your fields in all charts, dashboards and even scheduled deliveries. New chart versions will be created with this change, if you are not happy with the changes, you can still revert to a previous version on the UI.
+
+## **Use Case: Standardizing Field Names**
+
+Imagine you have a field called **user_id** in one model and **customer_id** in another, but they represent the same concept. To maintain consistency, you might want to rename all instances of **user_id** to **customer_id** across your entire project.
+
+## **Renaming via UI**
+
+On the validation page, you can rename failing charts
+
+1. Navigate to your project settings
+
+- Go to the "Validation" tab
+- Find the "Rename" section
+- Select the type (field, metric, or dimension)
+- Enter the current name in the "From" field
+- Enter the new name in the "To" field
+
+7. Click "Rename" to execute the change
+
+The UI will display a summary of affected resources before you confirm the change, similar to the CLI's dry run functionality.
+
+## **Important Notes**
+
+- Renaming only affects the display names in Lightdash - it doesn't change your underlying dbt models
+- Only lowercase letters (a-z) and underscores (_) are allowed in names_
+- Renaming is project-wide by default, but can be scoped to a specific model
+- Always consider running a --dry-run first to understand the impact of your changes
+- After renaming, consider running validation to ensure everything works as expected
+
+By leveraging Lightdash's renaming capabilities, you can maintain a clean, consistent naming convention throughout your analytics project, improving usability for all team members.
+
+## **Renaming via CLI**
+
+The Lightdash CLI provides a flexible way to rename models, metrics, or dimensions across your project. This is more advanced and affects all the content in the project.
+
+### **Basic Usage**
+
+`lightdash rename --type field --from user_id --to customer_id`
+
+### **Basic options**
+
+- --type: Specify what you're renaming (field or model)
+- --from: The current name you want to change
+- --to: The new name you want to use
+- --project: (Optional) Project UUID to target a specific project
+- --dry-run: Test the rename action, no changes will be made.
+
+Use `lightdash rename --help` to see all available options.
+
+### **Example Workflow**
+
+This is a sample of how you can take the most from this feature, when renaminig content on your dbt project.
+
+- Rename a field in your dbt project YML file: user_id becomes customer_id
+- Create a preview environment to test those changes
+- Existing charts will fail, you can go into validation to confirm which ones are affected
+- Run `lightdash rename --type field --from user_id --to customer_id -p --dry-run` to list the affected charts.
+- If you are happy with the changes, run rename without `--dry-run`
+- Confirm all charts are referencing new fields (they might still error if you haven't updated your warehouses using dbt run)
+- Merge the code and run rename on your main project.
+
+The CLI will show you which charts, dashboards, alerts, and dashboard schedulers will be updated. , and also, we will generate a JSON log that contains the affected chart/dashboard names and UUIDs, you can use those UUIDs to manually revert some of the charts to a previous version.
+
+##
\ No newline at end of file
From e19d328c8d9a5017fdb5d882685feaaf08faf08a Mon Sep 17 00:00:00 2001
From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com>
Date: Tue, 13 May 2025 14:06:04 +0000
Subject: [PATCH 11/37] Documentation edits made through Mintlify web editor
---
guides/renaming-models-and-fields.mdx | 79 +++++++++++++-------
images/Screenshotfrom2025-05-0812-26-05.png | Bin 0 -> 47622 bytes
images/Screenshotfrom2025-05-1309-11-51.png | Bin 0 -> 51334 bytes
images/Screenshotfrom2025-05-1315-48-15.png | Bin 0 -> 11863 bytes
images/Screenshotfrom2025-05-1315-49-35.png | Bin 0 -> 31922 bytes
images/Screenshotfrom2025-05-1315-51-19.png | Bin 0 -> 36573 bytes
images/image.png | Bin 0 -> 36573 bytes
7 files changed, 54 insertions(+), 25 deletions(-)
create mode 100644 images/Screenshotfrom2025-05-0812-26-05.png
create mode 100644 images/Screenshotfrom2025-05-1309-11-51.png
create mode 100644 images/Screenshotfrom2025-05-1315-48-15.png
create mode 100644 images/Screenshotfrom2025-05-1315-49-35.png
create mode 100644 images/Screenshotfrom2025-05-1315-51-19.png
create mode 100644 images/image.png
diff --git a/guides/renaming-models-and-fields.mdx b/guides/renaming-models-and-fields.mdx
index c7c4f0c..1e172fe 100644
--- a/guides/renaming-models-and-fields.mdx
+++ b/guides/renaming-models-and-fields.mdx
@@ -1,45 +1,62 @@
---
title: "Renaming models, metrics and dimensions"
-description: "Description of your new file."
---
Lightdash provides powerful renaming capabilities that allow you to update metrics, dimensions or models across your entire project, where those fields or models are used. This feature is particularly useful when you need to standardize naming conventions, fix typos, or make your metrics more user-friendly.
Renaming updates all the IDs and references from your fields in all charts, dashboards and even scheduled deliveries. New chart versions will be created with this change, if you are not happy with the changes, you can still revert to a previous version on the UI.
+
+ Most of the content can also be renamed using [Dashboards as code](https://docs.lightdash.com/references/dashboards-as-code#dashboards-as-code), however, this method will respect the right syntax for different field types . And more importantly, it will update content that is not exposed on Dashboards as code, like scheduled deliveries.
+
+
## **Use Case: Standardizing Field Names**
-Imagine you have a field called **user_id** in one model and **customer_id** in another, but they represent the same concept. To maintain consistency, you might want to rename all instances of **user_id** to **customer_id** across your entire project.
+Imagine you have a field called **user_id** in one model and you want to rename it **customer_id**. If you change this field in dbt, all existing lightdash content will fail, so you might want to rename all the references to that new field in your charts and dashboards.
## **Renaming via UI**
-On the validation page, you can rename failing charts
+On the validation page, you can rename failing charts. You can easily access to the validation page by clicking on the bell on the navigation bar.
-1. Navigate to your project settings
+
-- Go to the "Validation" tab
-- Find the "Rename" section
-- Select the type (field, metric, or dimension)
-- Enter the current name in the "From" field
-- Enter the new name in the "To" field
+On the navigation page, over on the chart you want to fix, and click on the **fix** button
-7. Click "Rename" to execute the change
+
-The UI will display a summary of affected resources before you confirm the change, similar to the CLI's dry run functionality.
+A menu will appear, in there you can select to rename a field or a table with an **existing** field or table
-## **Important Notes**
+
-- Renaming only affects the display names in Lightdash - it doesn't change your underlying dbt models
-- Only lowercase letters (a-z) and underscores (_) are allowed in names_
-- Renaming is project-wide by default, but can be scoped to a specific model
-- Always consider running a --dry-run first to understand the impact of your changes
-- After renaming, consider running validation to ensure everything works as expected
+
-By leveraging Lightdash's renaming capabilities, you can maintain a clean, consistent naming convention throughout your analytics project, improving usability for all team members.
+Optional, you can click **Fix all ocurrences** to rename the same field / table on all content, including other charts, dashboards and scheduled deliveries.
+
+Click "Rename" to execute the change
+
+If you have made mulitple field / table changes to the same chart (eg: you changed 2 metrics), you will have to perform multiple rename actions.
## **Renaming via CLI**
-The Lightdash CLI provides a flexible way to rename models, metrics, or dimensions across your project. This is more advanced and affects all the content in the project.
+The Lightdash CLI provides a flexible way to rename models, metrics, or dimensions across your project. This is more advanced option to the UI and affects all the content in the project. The CLI will also allow you to rename content before changes happen to dbt.
### **Basic Usage**
@@ -47,11 +64,11 @@ The Lightdash CLI provides a flexible way to rename models, metrics, or dimensio
### **Basic options**
-- --type: Specify what you're renaming (field or model)
-- --from: The current name you want to change
-- --to: The new name you want to use
-- --project: (Optional) Project UUID to target a specific project
-- --dry-run: Test the rename action, no changes will be made.
+- **--type**: Specify what you're renaming (field or model)
+- **--from**: The current name you want to change
+- **--to**: The new name you want to use
+- **--project**: (Optional) Project UUID to target a specific project, if not set, it will used your current project
+- **--dry-run**: Test the rename action, no changes will be made.
Use `lightdash rename --help` to see all available options.
@@ -69,4 +86,16 @@ This is a sample of how you can take the most from this feature, when renaminig
The CLI will show you which charts, dashboards, alerts, and dashboard schedulers will be updated. , and also, we will generate a JSON log that contains the affected chart/dashboard names and UUIDs, you can use those UUIDs to manually revert some of the charts to a previous version.
-##
\ No newline at end of file
+
+
+## **Important Notes**
+
+- Only field ids and references are updated, chart names or descriptions will remain the same. If you want to update that content, we recommend using [Dashboards as code](https://docs.lightdash.com/references/dashboards-as-code#dashboards-as-code).
+- Only lowercase letters (a-z) and underscores `_` are allowed in names
+- On the CLI, renaming is project-wide by default, but can be scoped to a specific model
+- On the CLI, always consider running a **--dry-run** first to understand the impact of your changes
+- After renaming, consider running validation to ensure everything works as expected
+
+## Reverting changes
+
+If you made a mistake renaming, you could run rename again, or you could restore individual charts using [version history](https://docs.lightdash.com/guides/version-history#chart-version-history)
\ No newline at end of file
diff --git a/images/Screenshotfrom2025-05-0812-26-05.png b/images/Screenshotfrom2025-05-0812-26-05.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6d862530bf8e0edcb244e0fc88f6d8929189649
GIT binary patch
literal 47622
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
z
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