Connect your app to Databricks to query warehouse data, build live dashboards, and power data-driven tools using your existing tables and views. Connect with a service principal or sign in with your own Databricks account.
Databricks is a data intelligence platform that lets your Lovable app work with warehouse data, SQL queries, and cluster resources. The Databricks connector lets you build apps and dashboards on top of your existing Databricks data without exporting CSVs or waiting for engineering tickets.
Use
If you want to
App + chat connector (this page)
Work with a shared Databricks connection in the project chat and in your published apps
Let each user of your published app connect their own Databricks account and work with their own data
With Databricks, your app can:
Run SQL queries against your warehouse data
List and manage SQL warehouses
List clusters in your Databricks workspace
Build live dashboards that query data in real time
Authentication uses either a Databricks service principal or your own Databricks account (User OAuth). With either method, credentials and tokens are stored in Lovable’s gateway and do not reach the browser or your app’s frontend code.
Build a dashboard that queries our Databricks warehouse and shows MRR, DAU, and churn rate. Auto-refresh every 5 minutes.
Replace static slides with a live dashboard on your warehouse data. The app queries Databricks directly and displays key metrics that stay up to date without manual exports.
Revenue pipeline tracker
Build a pipeline tracker that pulls revenue and deal data from our Databricks tables and shows a funnel view with filters by region and quarter.
Give RevOps a self-serve view of pipeline data that lives in the warehouse. The app queries Databricks tables where your CRM data lands and presents it in a structured, filterable view.
Team metrics explorer
Build a metrics explorer where users pick a team and date range, then see charts for their key metrics pulled from Databricks.
Let teams explore their own metrics without filing data requests. The app runs parameterized SQL queries and renders results as charts, scoped to each team’s data.
Data quality monitor
Build an internal tool that runs data quality checks against our warehouse tables and flags anomalies.
Catch data issues before they reach downstream consumers. The app runs validation queries on a schedule and surfaces failures in a clean internal view.
Executive summary bot
Build a Slack bot that answers natural language data questions by querying our Databricks warehouse.
Turn your warehouse into a conversational interface for leadership. The app translates questions into SQL, queries Databricks, and posts formatted answers to Slack.
A Databricks connection authenticates in one of two ways. You pick the method when you create the connection.
Method
Option in the connection form
Queries run as
Best for
Service principal (machine-to-machine OAuth, the default)
Use your own credentials
A service principal your Databricks admin creates
Team-shared connections and production apps, where access should not depend on any one person
User OAuth (user-to-machine OAuth)
User OAuth
The Databricks user who signed in to authorize the connection
Individuals and prototypes, and teams that want Unity Catalog to enforce a person’s own permissions and Databricks audit logs to show who ran each query
Lovable does not filter results based on the individual Lovable user’s Databricks permissions. The identity the connection authenticates as decides what data is available to everyone who uses that connection.
With a service principal, the service principal’s Unity Catalog grants apply. If you create a service principal with access to HR tables, everyone with access to that connection in Lovable can query HR data.
With User OAuth, your own Unity Catalog grants apply, and Databricks audit logs attribute every query to you. If you share the connection, everyone you share it with queries as you and sees everything you can see.
Recommended approach for shared connections: one service principal per access role. Create separate service principals scoped to different data:
databricks-engineering: full warehouse access, only engineers get this connection in Lovable
databricks-sales: pipeline and revenue tables only, sales team gets this connection
databricks-company: company-wide safe metrics, everyone gets this connection
Lovable controls who can use each connection. Databricks controls what each identity can query. Together, they provide role-based data access without requiring per-user OAuth.
You can create multiple Databricks connections in a workspace, each with a different service principal or user and different access settings.
The connector does not enforce read-only access. It applies no method or path allowlist, so every Databricks REST path and verb is forwarded, and a connection runs whatever SQL its identity, the service principal or the user who authorized it, is allowed to run. Unity Catalog grants are the way to control access. See Restrict a connection to read-only.
Databricks uses Lovable’s gateway architecture for secure OAuth handling and automatic token refresh. A service principal connection exchanges the client ID and secret for short-lived access tokens. A User OAuth connection requests the all-apis and offline_access scopes, so the gateway holds a refresh token and renews the one-hour access token in the background without asking you to sign in again. See Gateway-based connectors for details on authentication and usage limits.
Databricks compute and storage costs are billed by Databricks, not by Lovable.
Who can create Databricks connections depends on your plan and workspace settings. App + chat connectors are available by default. On Business and Enterprise plans, Who can create connections and clients starts at Admins. Some Enterprise workspaces start at No one, which disables the connector. An admin or owner changes it in Connectors → Admin settings → App + chat connectors.
Lovable’s gateway needs network access to your Databricks workspace, whichever method you use. If the workspace restricts inbound traffic, resolve this before you start.
Databricks IP access lists apply to the workspace REST API, not just the web UI, so an unlisted source IP is rejected before authentication and the connection never verifies. Add Lovable’s gateway egress ranges to an ALLOW list, from IP allowlisting. Workspace IP access lists are configured through the Databricks REST API rather than the admin UI, and account-level context-based ingress controls are enforced alongside them, so a request has to pass both.If the workspace uses front-end Private Link with public network access disabled, the connector cannot reach it at all, and allowlisting is not a workaround: Databricks does not support IP access lists on a workspace with public access disabled. On AWS, public_access_enabled defaults to False in a private access settings object, so confirm this before you start.
Both methods create the same kind of connection. The difference is whose identity the connection carries, which decides what data it can reach and who is responsible for keeping it working.
Use your own credentials connects with a service principal, a shared identity your Databricks admin creates. It is selected by default. Everyone who uses the connection queries as the service principal, so the connection keeps working when people leave the team, and you scope data by giving each access role its own service principal. Choose it for shared connections and production apps.
User OAuth signs in with your own Databricks account. Queries run on your behalf, Unity Catalog enforces your permissions, and Databricks audit logs show you rather than a shared service principal. It needs a custom OAuth application in your Databricks account console, and the connection depends on your account staying active (see Limitations). Choose it when you want to build on your own access without asking an admin for a service principal, or when per-person attribution matters.
Follow the setup steps below for the method you chose.
Use your own credentials
Connect with your Databricks account
Connect with a service principal that your Databricks admin creates. In the connection form, this option is labeled Use your own credentials and is selected by default.PrerequisitesBefore connecting, make sure you have:
A Databricks workspace with at least one SQL warehouse
Step 1: Configure a service principal in DatabricksIf you haven’t already set up a service principal with an OAuth secret, follow these steps in Databricks. For the full reference, see Databricks M2M OAuth setup.
You need to be a Databricks account admin or workspace admin to create a service principal and generate OAuth secrets. If you don’t have this role, ask your Databricks administrator to complete this step.
1
Create a service principal
In the Databricks account console, go to User management → Service principals and create a new service principal. The account console host depends on which cloud hosts your workspace:
Azure works differently. Its account console covers users, groups, and Unity Catalog metastores, but you create workspaces in the Azure portal, and nobody can open the account console until your organization establishes its first account admin. Azure also offers two kinds of service principal, Azure Databricks managed and Microsoft Entra ID managed. Databricks recommends the Azure Databricks managed kind for automations like this connector. Azure Databricks documentation lives on Microsoft Learn rather than on docs.databricks.com, so translate the links on this page when you are on Azure.
2
Assign it to your workspace
Still in the account console, go to Workspaces, select your target workspace, open its Permissions tab, and click Add permissions. Select the service principal and give it the Workspace access and Databricks SQL access entitlements. You can review and change entitlements later on the service principal’s Configuration tab.
The service principal’s own Permissions tab does something different. It assigns the Service principal: Manager and Service principal: User roles to other people, deciding who may manage the service principal. It grants no data access at all. Data access comes from the next two steps.
3
Grant it access to a SQL warehouse
In your Databricks workspace, click SQL Warehouses in the sidebar, open the kebab menu on the row for the warehouse your app will query, click Permissions, then add the service principal with Can use. Can use lets it start the warehouse and run queries.
4
Generate an OAuth secret
In your Databricks workspace, select your username in the top-right corner and choose Settings.
Go to Identity and access, then find Service principals and click Manage.
Select your service principal and open the Secrets tab.
Click Generate secret, choose an expiry period (maximum 730 days), and click Generate.
Copy both the Client ID and Client secret immediately. The secret is only shown once. It cannot be retrieved after you close this dialog.
Store your client ID and client secret somewhere secure (for example, in a password manager) before continuing. You will need both values in Step 2, and the client secret cannot be retrieved from Databricks again.
5
Grant it access to your data
Grant Unity Catalog privileges on the data your app reads. Name the principal with its Application ID (the same value as the OAuth client ID from the previous step), in backticks, not its display name:
GRANT USE CATALOG ON CATALOG main TO `<application-id>`;GRANT USE SCHEMA ON SCHEMA main.analytics TO `<application-id>`;GRANT SELECT ON TABLE main.analytics.orders TO `<application-id>`;
All three grants are required. SELECT on a table does nothing without USE CATALOG on its catalog and USE SCHEMA on its schema. Only a catalog owner, or someone with MANAGE on the catalog, can grant USE CATALOG, so you may need to ask them. For the full least-privilege setup, see Restrict a connection to read-only.
6
Find your Workspace URL
Your Workspace URL appears in the browser address bar when you are signed in to Databricks. Databricks calls its host the instance name, and the format depends on your cloud:
In Display name, name the connection (for example, Databricks Engineering or Databricks Sales). Use a name that reflects the access level of the service principal.
4
Keep Use your own credentials selected
Under Configure connection, leave Use your own credentials selected. It is the default.
5
Enter your credentials
Use the values from Step 1: Configure a service principal in Databricks:
Workspace URL: your Databricks workspace URL (for example, https://dbc-abc123.cloud.databricks.com)
Client ID: the service principal’s OAuth client ID
Client Secret: the service principal’s OAuth client secret
6
Choose who can use this connection
Under Sharing, the connection is private to you by default and shows a Private label. To share it, click Share with others. Then add workspace members by email, or click Invite entire workspace to make the connection available to everyone in your Lovable workspace.This matters more on Databricks than on most connectors, because the service principal’s grants decide what data is visible. Anyone you add here can query everything the service principal can reach. See Who can use connections and clients for more information.
7
Connect
Click Connect at the bottom of the form. Lovable verifies the credentials against your Databricks workspace.
Sign in with your own Databricks account. Queries run as you, so what the connection can read is exactly what you can read. In the connection form, this option is labeled User OAuth.PrerequisitesBefore connecting, make sure you have:
A Databricks workspace with at least one SQL warehouse, and Can use on the warehouse your app will query
Unity Catalog access to the data your app reads, since the connection has the same access as your account
A custom OAuth application registered in your Databricks account console with Lovable’s redirect URI, and its client ID and client secret (see Enable custom OAuth applications). Step 1 below covers this
Your Databricks workspace URL (for example, https://dbc-abc123.cloud.databricks.com)
Step 1: Register a custom OAuth application in DatabricksLovable signs you in through an OAuth application that lives in your own Databricks account, so Databricks has to know Lovable’s redirect URI before the sign-in can complete. Creating the application requires a Databricks account admin, so ask your administrator if you don’t have that role. One application can serve every User OAuth connection in your Lovable workspace.
1
Open App connections in the account console
Sign in to the Databricks account console as an account admin, click Settings in the sidebar, open the App connections tab, and click Add connection. The account console host depends on which cloud hosts your workspace:
The Lovable connection form shows the same value under Redirect URI with a copy button once you select User OAuth, so you can copy it from there. It must match exactly.
3
Select the All APIs scope
Under Access scopes, select All APIs, not SQL. Lovable requests the all-apis scope when you sign in, because the connector lists warehouses and clusters as well as running SQL. Lovable also requests offline_access, which is what lets it refresh your token in the background.
4
Review the token lifetimes
Access token TTL defaults to 60 minutes and Refresh token TTL to 10080 minutes (7 days). Lovable renews the access token automatically for as long as the refresh token is valid. When the refresh token expires, the connection stops working until you reconnect it in Lovable, so raise the refresh token TTL if your security policy allows it and you want fewer reconnects.
5
Generate a client secret and save the values
Check Generate a client secret and create the connection. Databricks shows the Client ID and Client secret in a Connection created dialog. Copy both immediately. The secret is only shown once and cannot be retrieved later.You can leave the checkbox unchecked to create an application without a secret (Databricks calls this a public client). Then leave Client Secret empty in Lovable as well. An application with a secret is the stronger setup, so use one unless you have a reason not to.
6
Check your own Databricks access
Make sure your account has Can use on the SQL warehouse your app will query (SQL Warehouses → (your warehouse) → kebab menu → Permissions) and the Unity Catalog privileges on the data: USE CATALOG on the catalog, USE SCHEMA on the schema, and SELECT on the tables or schema. All three are required, and the connection inherits exactly these grants.
7
Find your Workspace URL
Your Workspace URL appears in the browser address bar when you are signed in to Databricks, for example https://dbc-a1b2345c-d6e7.cloud.databricks.com on AWS, https://adb-5555555555555555.19.azuredatabricks.net on Azure, or https://8757561887652360.0.gcp.databricks.com on GCP. See Get identifiers for workspace objects.
Step 2: Set up the Databricks connection in Lovable
In Display name, name the connection. Because the connection acts as you, a name that includes your own name (for example, Databricks (Jane)) makes it clear to teammates whose access it carries.
4
Select User OAuth
Under Configure connection, select User OAuth. The form shows the Redirect URI to add to your Databricks OAuth app. If you skipped that in Step 1, copy it and add it to the app now.
5
Enter your OAuth app details
Use the values from Step 1: Register a custom OAuth application in Databricks:
Workspace URL: your Databricks workspace URL (for example, https://dbc-abc123.cloud.databricks.com)
Client ID: the OAuth client ID of your custom OAuth application
Client Secret: the application’s client secret. Leave it empty only if you created a public client without a secret
6
Choose who can use this connection
Under Sharing, the connection is private to you by default and shows a Private label. To share it, click Share with others. Then add workspace members by email, or click Invite entire workspace to make the connection available to everyone in your Lovable workspace.
Anyone you share a User OAuth connection with queries Databricks as you, with your Unity Catalog grants, and Databricks audit logs attribute their queries to you. Keep the connection private, or share it only with people who may see everything you can see. For a connection a whole team uses, create a service principal connection instead.
Click Connect at the bottom of the form. A new window opens for the Databricks sign-in. If your browser blocks it, Lovable redirects you instead. Sign in with your Databricks account and approve the requested access.
That approval only means Databricks issued tokens to your OAuth application. Lovable does not test the connection at this point. A connection still reports success when your account lacks Can use on the warehouse or the Unity Catalog grants. Confirm the connection with a real query after you link it to a project.
When connected, you can link the connection to the projects where you want to use it, and start building apps that query your Databricks data.
The connector forwards whatever your app sends. It applies no method or path allowlist, so any Databricks REST path and any HTTP verb reaches your workspace, including a POST to /api/2.0/sql/statements carrying DROP TABLE. Unity Catalog privileges are the control that works: grant the connection’s identity SELECT and nothing more.
These steps are written for a service principal connection. A User OAuth connection runs with your own grants, so there is nothing separate to lock down: the connection has exactly your grants. If you want an app built on it to stay read-only, either narrow your own grants or, better, give the app a service principal connection with the grants below.
1
Grant read-only privileges in Unity Catalog
Run these as a catalog owner, or as someone with MANAGE on the catalog. Name the principal with its Application ID in backticks, not its display name:
GRANT USE CATALOG ON CATALOG main TO `<application-id>`;GRANT USE SCHEMA ON SCHEMA main.analytics TO `<application-id>`;GRANT SELECT ON SCHEMA main.analytics TO `<application-id>`;
GRANT SELECT ON SCHEMA covers every current and future table and view in the schema. Grant SELECT ON TABLE main.analytics.orders instead when you want to name individual tables. Repeat the statements for each schema your app reads.
Never grant MODIFY, CREATE TABLE, or ALL PRIVILEGES to a service principal you want to stay read-only, and check what it already inherits from a group or a parent catalog with SHOW GRANTS `<application-id>` ON CATALOG main;. Privileges granted higher up cascade down, so a MODIFY on the catalog defeats a careful set of table grants.
2
Give it a dedicated warehouse
Grant Can use on one warehouse reserved for this connection rather than your shared analytics warehouse. Query volume comes from your app’s end users, so it is unpredictable and outside your control: a dedicated warehouse isolates that load, makes the app’s spend its own line item, and lets you size and time-limit it independently. Set a small Cluster Size and a short Auto stop.Leave Can manage off. Can use is enough to start the warehouse and run queries, and it does not allow resizing or deleting it.
3
Keep one service principal per access role
Grants attach to the service principal, so a connection can only ever be as narrow as its principal. If one team needs write access, give that team a second service principal and a second Lovable connection instead of widening the read-only one.
Every Databricks use case benefits from a semantic layer: a shared definition of what your key metrics mean, which tables to use, and what assumptions they carry. What counts as a “daily active user”? How is MRR calculated? Which view should be used for churn, and does it exclude trials?Without this shared context, each app or dashboard risks computing the same metric differently.
If your Databricks workspace already has a semantic layer (for example, dbt metrics, Unity Catalog tags, or a YAML definitions file), point Lovable to it:
Use our semantic layer at catalog.schema.metrics_definitions when computing any KPIs. MRR is defined there as monthly_recurring_revenue.
You can build a semantic layer quickly in Lovable using a dedicated project. Create a new project, connect it to Databricks, and ask the agent to explore your warehouse and draft definitions:
Let's build a full semantic layer for our Databricks warehouse. Please start by exploring the tables and forming your own understanding of the data. Create a sample dashboard that showcases your analysis of the key metrics, the tables they use, and the assumptions behind each query. We will walk through them together and correct anything that is wrong. Use these tables as the main starting point: [table names]
Drop in any existing context you have (prior dashboards, a data dictionary, a dbt schema file) and Lovable will incorporate it. Ask the agent to save the output as Markdown or YAML files in its project directory:
Save the finalized metric definitions as YAML files in this project. Other projects will reference them.
Once saved, other Lovable projects in the same Lovable workspace can reference those files to get consistent metric definitions out of the box.
No per-user data scoping within a connection. Everyone who uses a service principal connection sees the same data, the service principal’s data, and everyone who builds with a User OAuth connection queries as the person who authorized it. Create separate service principals per access role, or use the Databricks app user connector so each end user of your published app queries under their own Databricks login and permissions.
No enforced read-only access. The connector applies no method or path allowlist, so a connection runs whatever SQL its service principal, or the user who authorized it, is allowed to run. Scope it with Unity Catalog grants. See Restrict a connection to read-only.
No automatic caching. Query results are not cached by default. You can ask Lovable to add caching logic to your app at your chosen interval.
Connection access is not enforced after publishing. Connection-level access decides who can build with the connection, not who can visit the published app. Who can visit is a separate, publish-time control: set the site’s visibility to Invite only (Free and Pro plans) or to Workspace or Custom (Business and Enterprise plans) so visitors have to log in. On Business and Enterprise plans, admins can also set a workspace-wide default in Workspace settings → Privacy & security → Default published app access. See website access control.
Customer-managed cost controls. Lovable does not impose query cost caps, and neither do Databricks budgets: they scope to your account, workspaces, or resource tags, and they only send email alerts, with up to a 24 hour delay. The controls that actually limit a warehouse are Auto stop, a small Cluster Size, and a STATEMENT_TIMEOUT. Set the timeout for the whole workspace in Settings → Compute → SQL warehouses → SQL Configuration Parameters, since the system default is 172800 seconds (2 days). Per-warehouse timeouts exist but are in Beta and settable only through the SQL warehouses API.
Connections are managed from Connectors: select Databricks, then open the connection.
Unlink projects to remove Databricks access from specific projects while keeping the connection available for others. See Unlink projects from a connection for the steps.
Delete the connection to remove it from the workspace entirely. Deleting is permanent. It removes the credentials from all linked projects, and app features that use Databricks stop working until a new connection is added. See Delete a connection for the steps and who can delete.
No. Lovable enforces who on your team can use a connection. The connection’s identity determines what data is queryable. With a service principal connection, everyone with access to the connection can query whatever the service principal can see. With a User OAuth connection, everyone with access queries as the person who authorized it and sees whatever they can see. Create separate service principals per access role to scope data.
What if someone runs an expensive query?
Lovable does not impose query cost caps, so use Databricks-side controls. Start with a small warehouse and scale up as needed, keep Auto stop short (the default is 45 minutes on pro and classic warehouses, 10 minutes on serverless), and set a workspace-level STATEMENT_TIMEOUT so a runaway query is halted well before the 172800 second (2 day) system default. Databricks budgets help you notice overspend but do not stop it: they send email alerts and cannot cap a SQL warehouse.
Is my data cached or stored in Lovable?
Not by default. Lovable queries Databricks at runtime with no automatic data replication or caching. Caching is opt-in: you can ask Lovable to add caching logic to your app at an interval you choose.
What happens when I publish an app that queries Databricks?
For a service principal connection, the published app queries Databricks as the service principal, so every visitor sees the same data. Connection-level access is not enforced after publishing: it decides who can build with the connection, not who can visit the app. Control the audience at publish time instead: set the site’s visibility to Invite only (Free and Pro plans) or to Workspace or Custom (Business and Enterprise plans) so visitors have to log in. See website access control. Publishing a project that uses a User OAuth connection works differently and is not covered on this page yet.
Can someone leak the Databricks credentials?
No. The service principal credentials, and the OAuth tokens of a User OAuth connection, are stored server-side in Lovable’s gateway and do not reach the browser or your app’s frontend code.
The connection verifies, but every query fails with HTTP 403
This is the most common Databricks setup failure. For a service principal connection, Lovable verifies the credentials with a single GET 2.0/preview/scim/v2/Me request when you click Connect. That call proves the OAuth secret works and nothing more. It succeeds even when the principal holds no warehouse permission and no table grants, so a connection can report success and then return 403 on its first real query. A User OAuth connection is not tested at all at that point.For a service principal connection, work back through the grants in the service principal steps under How to connect Databricks:
The principal has no Can use on the warehouse. Grant it under SQL Warehouses → (your warehouse) → kebab menu → Permissions.
The principal is missing Unity Catalog privileges. It needs USE CATALOG, USE SCHEMA, and SELECT, and all three are required. Check what it already holds with SHOW GRANTS `<application-id>` ON CATALOG main;.
The principal was never assigned to the workspace, or lacks the Databricks SQL access entitlement.
For a User OAuth connection, the same 403 means your own account lacks Can use on the warehouse or the Unity Catalog privileges, because the connection has exactly your grants.
The connection fails immediately with an authentication error
On a service principal connection, either the OAuth secret expired (the maximum lifetime is 730 days) or the Workspace URL is wrong. Generate a fresh secret in Databricks and reconnect.On a User OAuth connection, the refresh token has expired (7 days by default, set by the Refresh token TTL on the custom OAuth application), the OAuth application was disabled or deleted, or the person who authorized the connection was removed from the workspace. Reconnect the connection in Lovable and sign in again.In both cases, make sure the workspace URL is the host you see in the browser when signed in to Databricks, with no trailing path.
The connection cannot reach Databricks at all
Lovable’s gateway is blocked at the network layer. See Network access: an IP access list or an account-level ingress policy needs Lovable’s egress ranges allowlisted, and a workspace with public network access disabled cannot be reached from Lovable at all.
The User OAuth sign-in fails before you reach Databricks or comes back with an error
Databricks rejects the sign-in when the custom OAuth application and the Lovable form disagree. Check, in order:
Redirect URI: the application’s Redirect URLs must include https://api.lovable.dev/workspaces/connectors/standard/oauth/callback exactly, as shown under Redirect URI in the connection form.
Scope: the application must have the All APIs access scope. Lovable requests all-apis, and an application limited to the SQL scope refuses it.
Client ID and secret: the Client ID must be the one of that application, and Client Secret must match how it was created. A confidential application needs its secret entered in Lovable, and a public application needs the field left empty.
Account console: the application must be enabled in Settings → App connections.
Queries time out or a warehouse never wakes up
The connection’s identity, the service principal or your own account, needs Can use on the warehouse to start it. Can view and Can monitor are not enough. If long queries are cut off, check the workspace STATEMENT_TIMEOUT in Settings → Compute → SQL warehouses → SQL Configuration Parameters.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Lovable Documentation","description":"Lovable Documentation — Build full-stack websites with AI using natural language. Explore Lovable features, integrations, tutorials, and best practices.","colors":{"primary":"#0095FF","light":"#1AA3FF","dark":"#0084E6"},"logo":{"light":"https://mintcdn.com/lovable-f9060f1e/lZT1ihBcprll2Agr/assets/logo/logoblack.svg?fit=max\u0026auto=format\u0026n=lZT1ihBcprll2Agr\u0026q=85\u0026s=8d9eafaf19f94e27f0d13ac160d54f54","dark":"https://mintcdn.com/lovable-f9060f1e/lZT1ihBcprll2Agr/assets/logo/logowhite.svg?fit=max\u0026auto=format\u0026n=lZT1ihBcprll2Agr\u0026q=85\u0026s=fed1a7a9be6502f49d06a55cec77288c","href":"https://lovable.dev/"},"favicon":"https://mintcdn.com/lovable-f9060f1e/b_1_IEcMDh-0NUDG/assets/logo/favicon.svg?fit=max\u0026auto=format\u0026n=b_1_IEcMDh-0NUDG\u0026q=85\u0026s=a439abba3defb47beabd3f6e7d318cb5","api":{"playground":{"display":"interactive"},"examples":{"defaults":"required","languages":["curl"],"prefill":true,"autogenerate":true},"url":"full"},"navbar":{"links":[{"icon":"message","href":"https://lovable.dev/support","label":"Support"},{"icon":"blog","href":"https://lovable.dev/blog","label":"Blog"}],"primary":{"type":"button","label":"Start building for free","href":"https://lovable.dev/signup?utm_source=lovable_docs\u0026utm_medium=navigation"}},"footer":{"socials":{"x":"https://x.com/Lovable","github":"https://github.com/lovablelabs","linkedin":"https://linkedin.com/company/lovable-dev","youtube":"https://youtube.com/@lovable","discord":"https://discord.gg/lovable-dev","reddit":"https://www.reddit.com/r/lovable"}},"seo":{"metatags":{"og:image":"/assets/logo/opengraph-image.png","canonical":"https://docs.lovable.dev"},"indexing":"all"},"contextual":{"options":["copy","assistant","download-pdf","download-spec"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"lovable-f9060f1e","hasAudioNarration":false,"actualSubdomain":"lovable-f9060f1e","customDomains":["docs.lovable.dev"],"gitSource":{"type":"github","owner":"lovablelabs","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae4ba7e39bc6f1b8c5083c4","collectionId":"be62575e-7d4d-4f47-8039-e68eba8e6629","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae4ba7e39bc6f1b8c5083c4"},"feedback":{"thumbs":true,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae4ba7e39bc6f1b8c5083c4","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Documentation","count":273},{"language":"default","tag":"Connect","count":125},{"language":"default","tag":"Connector catalog","count":113},{"language":"default","tag":"Build","count":69},{"language":"default","tag":"API Reference","count":33},{"language":"default","tag":"Workspace \u0026 account","count":29},{"language":"default","tag":"Lovable API","count":27},{"language":"default","tag":"Endpoints","count":25},{"language":"default","tag":"Data \u0026 databases","count":21},{"language":"default","tag":"Backend","count":19}]},"assistantConfig":{"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"deflection":{"enabled":true,"type":"link","email":"support@lovable.dev","url":"https://lovable.dev/support"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instinct-self-updating-docs","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"assets/css/styles.css","content":".supabase{color:#59cf8c}"}],"page":{"pagePath":"integrations/databricks","slug":"/integrations/databricks","pageMetadata":{"title":"Connect your app to Databricks","sidebarTitle":"Databricks","description":"Connect your app to Databricks to query warehouse data, build live dashboards, and power data-driven tools using your existing tables and views. Connect with a service principal or sign in with your own Databricks account.","keywords":["Databricks integration","Databricks connector","Databricks SQL","Databricks warehouse","Databricks dashboard","Lovable Databricks","data warehouse integration","lakehouse","service principal","Unity Catalog","OAuth","user OAuth","U2M","M2M","custom OAuth application"],"href":"/integrations/databricks"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Connect your app to Databricks to query warehouse data, build live dashboards, and power data-driven tools using your existing tables and views. Connect with a service principal or sign in with your own Databricks account.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const connector_0=`Databricks`;function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,CodeBlock,Heading,Note,Step,Steps,Tab,Table,Tabs,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.a,{href:`https://www.databricks.com/`,children:`Databricks`}),` is a data intelligence platform that lets your Lovable app work with warehouse data, SQL queries, and cluster resources. The Databricks connector lets you build apps and dashboards on top of your existing Databricks data without exporting CSVs or waiting for engineering tickets.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Use`}),_jsx(_components.th,{children:`If you want to`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`App + chat connector`}),` (this page)`]}),_jsx(_components.td,{children:`Work with a shared Databricks connection in the project chat and in your published apps`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/integrations/app-user-connectors`,children:`App user connector`})}),_jsx(_components.td,{children:`Let each user of your published app connect their own Databricks account and work with their own data`})]})]})]}),`\n`,_jsx(_components.p,{children:`With Databricks, your app can:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Run SQL queries against your warehouse data`}),`\n`,_jsx(_components.li,{children:`List and manage SQL warehouses`}),`\n`,_jsx(_components.li,{children:`List clusters in your Databricks workspace`}),`\n`,_jsx(_components.li,{children:`Build live dashboards that query data in real time`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Authentication uses either a Databricks service principal or your own Databricks account (`,_jsx(_components.strong,{children:`User OAuth`}),`). With either method, credentials and tokens are stored in Lovable’s gateway and do not reach the browser or your app’s frontend code.`]}),`\n`,_jsx(Heading,{level:`2`,id:`common-use-cases-and-example-apps`,children:`Common use cases and example apps`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Example app`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Example prompt`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Live KPI dashboard`})}),_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.em,{children:`Build a dashboard that queries our Databricks warehouse and shows MRR, DAU, and churn rate. Auto-refresh every 5 minutes.`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[_jsx(_components.strong,{children:`Replace static slides with a live dashboard on your warehouse data.`}),` The app queries Databricks directly and displays key metrics that stay up to date without manual exports.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Revenue pipeline tracker`})}),_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.em,{children:`Build a pipeline tracker that pulls revenue and deal data from our Databricks tables and shows a funnel view with filters by region and quarter.`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[_jsx(_components.strong,{children:`Give RevOps a self-serve view of pipeline data that lives in the warehouse.`}),` The app queries Databricks tables where your CRM data lands and presents it in a structured, filterable view.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Team metrics explorer`})}),_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.em,{children:`Build a metrics explorer where users pick a team and date range, then see charts for their key metrics pulled from Databricks.`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[_jsx(_components.strong,{children:`Let teams explore their own metrics without filing data requests.`}),` The app runs parameterized SQL queries and renders results as charts, scoped to each team’s data.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Data quality monitor`})}),_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.em,{children:`Build an internal tool that runs data quality checks against our warehouse tables and flags anomalies.`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[_jsx(_components.strong,{children:`Catch data issues before they reach downstream consumers.`}),` The app runs validation queries on a schedule and surfaces failures in a clean internal view.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Executive summary bot`})}),_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.em,{children:`Build a Slack bot that answers natural language data questions by querying our Databricks warehouse.`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[_jsx(_components.strong,{children:`Turn your warehouse into a conversational interface for leadership.`}),` The app translates questions into SQL, queries Databricks, and posts formatted answers to Slack.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`how-databricks-connections-work`,children:`How Databricks connections work`}),`\n`,_jsx(_components.p,{children:`A Databricks connection authenticates in one of two ways. You pick the method when you create the connection.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`Option in the connection form`}),_jsx(_components.th,{children:`Queries run as`}),_jsx(_components.th,{children:`Best for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Service principal`}),` (machine-to-machine OAuth, the default)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Use your own credentials`})}),_jsx(_components.td,{children:`A service principal your Databricks admin creates`}),_jsx(_components.td,{children:`Team-shared connections and production apps, where access should not depend on any one person`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`User OAuth`}),` (user-to-machine OAuth)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`User OAuth`})}),_jsx(_components.td,{children:`The Databricks user who signed in to authorize the connection`}),_jsx(_components.td,{children:`Individuals and prototypes, and teams that want Unity Catalog to enforce a person’s own permissions and Databricks audit logs to show who ran each query`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`what-this-means-for-data-access`,children:`What this means for data access`}),`\n`,_jsx(_components.p,{children:`Lovable does not filter results based on the individual Lovable user’s Databricks permissions. The identity the connection authenticates as decides what data is available to everyone who uses that connection.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`With a `,_jsx(_components.strong,{children:`service principal`}),`, the service principal’s Unity Catalog grants apply. If you create a service principal with access to HR tables, everyone with access to that connection in Lovable can query HR data.`]}),`\n`,_jsxs(_components.li,{children:[`With `,_jsx(_components.strong,{children:`User OAuth`}),`, your own Unity Catalog grants apply, and Databricks audit logs attribute every query to you. If you share the connection, everyone you share it with queries as you and sees everything you can see.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Recommended approach for shared connections: one service principal per access role.`}),` Create separate service principals scoped to different data:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`databricks-engineering`}),`: full warehouse access, only engineers get this connection in Lovable`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`databricks-sales`}),`: pipeline and revenue tables only, sales team gets this connection`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`databricks-company`}),`: company-wide safe metrics, everyone gets this connection`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Lovable controls who can use each connection. Databricks controls what each identity can query. Together, they provide role-based data access without requiring per-user OAuth.`}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`You can create multiple Databricks connections in a workspace, each with a different service principal or user and different access settings.`})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The connector does not enforce read-only access. It applies no method or path allowlist, so every Databricks REST path and verb is forwarded, and a connection runs whatever SQL its identity, the service principal or the user who authorized it, is allowed to run. Unity Catalog grants are the way to control access. See `,_jsx(_components.a,{href:`#restrict-a-connection-to-read-only`,children:`Restrict a connection to read-only`}),`.`]})}),`\n`,_jsxs(_components.p,{children:[`Databricks uses Lovable’s gateway architecture for secure OAuth handling and automatic token refresh. A service principal connection exchanges the client ID and secret for short-lived access tokens. A User OAuth connection requests the `,_jsx(_components.code,{children:`all-apis`}),` and `,_jsx(_components.code,{children:`offline_access`}),` scopes, so the gateway holds a refresh token and renews the one-hour access token in the background without asking you to sign in again. See `,_jsx(_components.a,{href:`/integrations/app-connectors#gateway-based-connectors`,children:`Gateway-based connectors`}),` for details on authentication and usage limits.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Databricks `,_jsx(_components.strong,{children:`compute and storage`}),` costs are billed by `,_jsx(_components.strong,{children:`Databricks`}),`, not by Lovable.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`how-to-connect-databricks`,children:`How to connect Databricks`}),`\n`,_jsxs(_components.p,{children:[`Who can create Databricks connections depends on your plan and workspace settings. App + chat connectors are available by default. On Business and Enterprise plans, `,_jsx(_components.a,{href:`/integrations/admin-controls#who-can-create-connections-and-clients`,children:`Who can create connections and clients`}),` starts at `,_jsx(_components.strong,{children:`Admins`}),`. Some Enterprise workspaces start at `,_jsx(_components.strong,{children:`No one`}),`, which disables the connector. An admin or owner changes it in `,_jsx(_components.strong,{children:`Connectors → Admin settings → App + chat connectors`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`network-access`,children:`Network access`}),`\n`,_jsx(_components.p,{children:`Lovable’s gateway needs network access to your Databricks workspace, whichever method you use. If the workspace restricts inbound traffic, resolve this before you start.`}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[`Databricks `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/security/network/front-end/ip-access-list`,children:`IP access lists`}),` apply to the workspace REST API, not just the web UI, so an unlisted source IP is rejected before authentication and the connection never verifies. Add Lovable’s gateway egress ranges to an `,_jsx(_components.code,{children:`ALLOW`}),` list, from `,_jsx(_components.a,{href:`/integrations/security#ip-allowlisting`,children:`IP allowlisting`}),`. Workspace IP access lists are configured through the Databricks REST API rather than the admin UI, and account-level `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/security/network/front-end/context-based-ingress`,children:`context-based ingress controls`}),` are enforced alongside them, so a request has to pass both.`]}),_jsxs(_components.p,{children:[`If the workspace uses front-end `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/security/network/front-end/front-end-private-connect`,children:`Private Link`}),` with public network access disabled, the connector cannot reach it at all, and allowlisting is not a workaround: Databricks does not support IP access lists on a workspace with public access disabled. On AWS, `,_jsx(_components.code,{children:`public_access_enabled`}),` defaults to `,_jsx(_components.code,{children:`False`}),` in a private access settings object, so confirm this before you start.`]})]}),`\n`,_jsx(Heading,{level:`3`,id:`choose-how-to-connect`,children:`Choose how to connect`}),`\n`,_jsx(_components.p,{children:`Both methods create the same kind of connection. The difference is whose identity the connection carries, which decides what data it can reach and who is responsible for keeping it working.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Use your own credentials`}),` connects with a service principal, a shared identity your Databricks admin creates. It is selected by default. Everyone who uses the connection queries as the service principal, so the connection keeps working when people leave the team, and you scope data by giving each access role its own service principal. Choose it for shared connections and production apps.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`User OAuth`}),` signs in with your own Databricks account. Queries run on your behalf, Unity Catalog enforces your permissions, and Databricks audit logs show you rather than a shared service principal. It needs a custom OAuth application in your Databricks account console, and the connection depends on your account staying active (see `,_jsx(_components.a,{href:`#limitations`,children:`Limitations`}),`). Choose it when you want to build on your own access without asking an admin for a service principal, or when per-person attribution matters.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Follow the setup steps below for the method you chose.`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Use your own credentials`,id:`use-your-own-credentials`,children:[_jsxs(_components.p,{children:[`Connect with a service principal that your Databricks admin creates. In the connection form, this option is labeled `,_jsx(_components.strong,{children:`Use your own credentials`}),` and is selected by default.`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Prerequisites`})}),_jsx(_components.p,{children:`Before connecting, make sure you have:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A Databricks workspace with at least one SQL warehouse`}),`\n`,_jsxs(_components.li,{children:[`A service principal configured in Databricks with an OAuth secret (see `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/dev-tools/auth/oauth-m2m`,children:`Databricks M2M OAuth setup`}),`)`]}),`\n`,_jsx(_components.li,{children:`The service principal’s client ID and client secret`}),`\n`,_jsxs(_components.li,{children:[`Your Databricks workspace URL (for example, `,_jsx(_components.code,{children:`https://dbc-abc123.cloud.databricks.com`}),`)`]}),`\n`,_jsxs(_components.li,{children:[`Permission to `,_jsx(_components.strong,{children:`create connections`}),` in your Lovable workspace (see `,_jsx(_components.a,{href:`/integrations/admin-controls#who-can-create-connections-and-clients`,children:`Who can create connections and clients`}),`)`]}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Step 1: Configure a service principal in Databricks`})}),_jsxs(_components.p,{children:[`If you haven’t already set up a service principal with an OAuth secret, follow these steps in Databricks. For the full reference, see `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/dev-tools/auth/oauth-m2m`,children:`Databricks M2M OAuth setup`}),`.`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[`You need to be a `,_jsx(_components.strong,{children:`Databricks account admin or workspace admin`}),` to create a service principal and generate OAuth secrets. If you don’t have this role, ask your Databricks administrator to complete this step.`]})}),_jsxs(Steps,{children:[_jsxs(Step,{title:`Create a service principal`,children:[_jsxs(_components.p,{children:[`In the Databricks account console, go to `,_jsx(_components.strong,{children:`User management`}),` → `,_jsx(_components.strong,{children:`Service principals`}),` and create a new service principal. The account console host depends on which cloud hosts your workspace:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`AWS: `,_jsx(_components.a,{href:`https://accounts.cloud.databricks.com`,children:`accounts.cloud.databricks.com`})]}),`\n`,_jsxs(_components.li,{children:[`Azure: `,_jsx(_components.a,{href:`https://accounts.azuredatabricks.net`,children:`accounts.azuredatabricks.net`})]}),`\n`,_jsxs(_components.li,{children:[`GCP: `,_jsx(_components.a,{href:`https://accounts.gcp.databricks.com`,children:`accounts.gcp.databricks.com`})]}),`\n`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[`Azure works differently. Its account console covers users, groups, and Unity Catalog metastores, but you create workspaces in the Azure portal, and nobody can open the account console until your organization establishes its first account admin. Azure also offers two kinds of service principal, Azure Databricks managed and Microsoft Entra ID managed. Databricks recommends the Azure Databricks managed kind for automations like this connector. Azure Databricks documentation lives on `,_jsx(_components.a,{href:`https://learn.microsoft.com/en-us/azure/databricks/`,children:`Microsoft Learn`}),` rather than on `,_jsx(_components.code,{children:`docs.databricks.com`}),`, so translate the links on this page when you are on Azure.`]})})]}),_jsxs(Step,{title:`Assign it to your workspace`,children:[_jsxs(_components.p,{children:[`Still in the account console, go to `,_jsx(_components.strong,{children:`Workspaces`}),`, select your target workspace, open its `,_jsx(_components.strong,{children:`Permissions`}),` tab, and click `,_jsx(_components.strong,{children:`Add permissions`}),`. Select the service principal and give it the `,_jsx(_components.strong,{children:`Workspace access`}),` and `,_jsx(_components.strong,{children:`Databricks SQL access`}),` entitlements. You can review and change entitlements later on the service principal’s `,_jsx(_components.strong,{children:`Configuration`}),` tab.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`The service principal’s own `,_jsx(_components.strong,{children:`Permissions`}),` tab does something different. It assigns the `,_jsx(_components.strong,{children:`Service principal: Manager`}),` and `,_jsx(_components.strong,{children:`Service principal: User`}),` roles to other people, deciding who may manage the service principal. It grants no data access at all. Data access comes from the next two steps.`]})})]}),_jsx(Step,{title:`Grant it access to a SQL warehouse`,children:_jsxs(_components.p,{children:[`In your Databricks workspace, click `,_jsx(_components.strong,{children:`SQL Warehouses`}),` in the sidebar, open the kebab menu on the row for the warehouse your app will query, click `,_jsx(_components.strong,{children:`Permissions`}),`, then add the service principal with `,_jsx(_components.strong,{children:`Can use`}),`. `,_jsx(_components.strong,{children:`Can use`}),` lets it start the warehouse and run queries.`]})}),_jsxs(Step,{title:`Generate an OAuth secret`,children:[_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`In your Databricks workspace, select your username in the top-right corner and choose `,_jsx(_components.strong,{children:`Settings`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Go to `,_jsx(_components.strong,{children:`Identity and access`}),`, then find `,_jsx(_components.strong,{children:`Service principals`}),` and click `,_jsx(_components.strong,{children:`Manage`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Select your service principal and open the `,_jsx(_components.strong,{children:`Secrets`}),` tab.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Generate secret`}),`, choose an expiry period (maximum 730 days), and click `,_jsx(_components.strong,{children:`Generate`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Copy both the Client ID and Client secret immediately.`}),` The secret is only shown once. It cannot be retrieved after you close this dialog.`]}),`\n`]}),_jsx(Warning,{children:_jsx(_components.p,{children:`Store your client ID and client secret somewhere secure (for example, in a password manager) before continuing. You will need both values in Step 2, and the client secret cannot be retrieved from Databricks again.`})})]}),_jsxs(Step,{title:`Grant it access to your data`,children:[_jsxs(_components.p,{children:[`Grant Unity Catalog privileges on the data your app reads. Name the principal with its `,_jsx(_components.strong,{children:`Application ID`}),` (the same value as the OAuth client ID from the previous step), in backticks, not its display name:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` USE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` CATALOG`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` CATALOG`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` main `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`TO`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" `\u003capplication-id>`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` USE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` SCHEMA`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` SCHEMA`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` main`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`analytics`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` TO`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" `\u003capplication-id>`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` SELECT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` TABLE`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` main`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`analytics`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.orders `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`TO`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" `\u003capplication-id>`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`All three grants are required. `,_jsx(_components.code,{children:`SELECT`}),` on a table does nothing without `,_jsx(_components.code,{children:`USE CATALOG`}),` on its catalog and `,_jsx(_components.code,{children:`USE SCHEMA`}),` on its schema. Only a catalog owner, or someone with `,_jsx(_components.code,{children:`MANAGE`}),` on the catalog, can grant `,_jsx(_components.code,{children:`USE CATALOG`}),`, so you may need to ask them. For the full least-privilege setup, see `,_jsx(_components.a,{href:`#restrict-a-connection-to-read-only`,children:`Restrict a connection to read-only`}),`.`]})]}),_jsxs(Step,{title:`Find your Workspace URL`,children:[_jsx(_components.p,{children:`Your Workspace URL appears in the browser address bar when you are signed in to Databricks. Databricks calls its host the instance name, and the format depends on your cloud:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`AWS: `,_jsx(_components.code,{children:`https://dbc-a1b2345c-d6e7.cloud.databricks.com`})]}),`\n`,_jsxs(_components.li,{children:[`Azure: `,_jsx(_components.code,{children:`https://adb-5555555555555555.19.azuredatabricks.net`}),`. You can also select the workspace resource in the Azure portal and read its `,_jsx(_components.strong,{children:`URL`}),` field.`]}),`\n`,_jsxs(_components.li,{children:[`GCP: `,_jsx(_components.code,{children:`https://8757561887652360.0.gcp.databricks.com`})]}),`\n`]}),_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/workspace/workspace-details`,children:`Get identifiers for workspace objects`}),`.`]})]})]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Step 2: Set up the Databricks connection in Lovable`})}),_jsx(_components.p,{children:`Set up the Databricks connection in Lovable.`}),_jsxs(Steps,{children:[_jsx(Step,{title:`Navigate to Databricks connector`,children:_jsxs(_components.p,{children:[`Open `,_jsx(_components.a,{href:`https://lovable.dev/dashboard?connectors`,children:_jsx(_components.strong,{children:`Connectors`})}),` and select `,_jsx(_components.strong,{children:`Databricks`}),`.`]})}),_jsx(Step,{title:`Add a new connection`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Connect`}),` on the connector page.`]})}),_jsx(Step,{title:`Name the connection`,children:_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Display name`}),`, name the connection (for example, `,_jsx(_components.code,{children:`Databricks Engineering`}),` or `,_jsx(_components.code,{children:`Databricks Sales`}),`). Use a name that reflects the access level of the service principal.`]})}),_jsx(Step,{title:`Keep Use your own credentials selected`,children:_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`Configure connection`}),`, leave `,_jsx(_components.strong,{children:`Use your own credentials`}),` selected. It is the default.`]})}),_jsxs(Step,{title:`Enter your credentials`,children:[_jsxs(_components.p,{children:[`Use the values from `,_jsx(_components.strong,{children:`Step 1: Configure a service principal in Databricks`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Workspace URL`}),`: your Databricks workspace URL (for example, `,_jsx(_components.code,{children:`https://dbc-abc123.cloud.databricks.com`}),`)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Client ID`}),`: the service principal’s OAuth client ID`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Client Secret`}),`: the service principal’s OAuth client secret`]}),`\n`]})]}),_jsxs(Step,{title:`Choose who can use this connection`,children:[_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`Sharing`}),`, the connection is private to you by default and shows a `,_jsx(_components.strong,{children:`Private`}),` label. To share it, click `,_jsx(_components.strong,{children:`Share with others`}),`. Then add workspace members by email, or click `,_jsx(_components.strong,{children:`Invite entire workspace`}),` to make the connection available to everyone in your Lovable workspace.`]}),_jsxs(_components.p,{children:[`This matters more on Databricks than on most connectors, because the service principal’s grants decide what data is visible. Anyone you add here can query everything the service principal can reach. See `,_jsx(_components.a,{href:`/integrations/admin-controls#who-can-use-connections-and-clients`,children:`Who can use connections and clients`}),` for more information.`]})]}),_jsx(Step,{title:`Connect`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Connect`}),` at the bottom of the form. Lovable verifies the credentials against your Databricks workspace.`]})})]})]}),_jsxs(Tab,{title:`Connect with your Databricks account`,id:`connect-with-your-databricks-account`,children:[_jsxs(_components.p,{children:[`Sign in with your own Databricks account. Queries run as you, so what the connection can read is exactly what you can read. In the connection form, this option is labeled `,_jsx(_components.strong,{children:`User OAuth`}),`.`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Prerequisites`})}),_jsx(_components.p,{children:`Before connecting, make sure you have:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A Databricks workspace with at least one SQL warehouse, and `,_jsx(_components.strong,{children:`Can use`}),` on the warehouse your app will query`]}),`\n`,_jsx(_components.li,{children:`Unity Catalog access to the data your app reads, since the connection has the same access as your account`}),`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.strong,{children:`custom OAuth application`}),` registered in your Databricks account console with Lovable’s redirect URI, and its client ID and client secret (see `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/integrations/enable-disable-oauth`,children:`Enable custom OAuth applications`}),`). Step 1 below covers this`]}),`\n`,_jsxs(_components.li,{children:[`Your Databricks workspace URL (for example, `,_jsx(_components.code,{children:`https://dbc-abc123.cloud.databricks.com`}),`)`]}),`\n`,_jsxs(_components.li,{children:[`Permission to `,_jsx(_components.strong,{children:`create connections`}),` in your Lovable workspace (see `,_jsx(_components.a,{href:`/integrations/admin-controls#who-can-create-connections-and-clients`,children:`Who can create connections and clients`}),`)`]}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Step 1: Register a custom OAuth application in Databricks`})}),_jsxs(_components.p,{children:[`Lovable signs you in through an OAuth application that lives in your own Databricks account, so Databricks has to know Lovable’s redirect URI before the sign-in can complete. Creating the application requires a `,_jsx(_components.strong,{children:`Databricks account admin`}),`, so ask your administrator if you don’t have that role. One application can serve every User OAuth connection in your Lovable workspace.`]}),_jsxs(Steps,{children:[_jsxs(Step,{title:`Open App connections in the account console`,children:[_jsxs(_components.p,{children:[`Sign in to the Databricks account console as an account admin, click `,_jsx(_components.strong,{children:`Settings`}),` in the sidebar, open the `,_jsx(_components.strong,{children:`App connections`}),` tab, and click `,_jsx(_components.strong,{children:`Add connection`}),`. The account console host depends on which cloud hosts your workspace:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`AWS: `,_jsx(_components.a,{href:`https://accounts.cloud.databricks.com`,children:`accounts.cloud.databricks.com`})]}),`\n`,_jsxs(_components.li,{children:[`Azure: `,_jsx(_components.a,{href:`https://accounts.azuredatabricks.net`,children:`accounts.azuredatabricks.net`})]}),`\n`,_jsxs(_components.li,{children:[`GCP: `,_jsx(_components.a,{href:`https://accounts.gcp.databricks.com`,children:`accounts.gcp.databricks.com`})]}),`\n`]})]}),_jsxs(Step,{title:`Name the application and add Lovable's redirect URI`,children:[_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Application name`}),`, enter a name that identifies Lovable (for example, `,_jsx(_components.code,{children:`Lovable`}),`). Under `,_jsx(_components.strong,{children:`Redirect URLs`}),`, add:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`https://api.lovable.dev/workspaces/connectors/standard/oauth/callback`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`The Lovable connection form shows the same value under `,_jsx(_components.strong,{children:`Redirect URI`}),` with a copy button once you select `,_jsx(_components.strong,{children:`User OAuth`}),`, so you can copy it from there. It must match exactly.`]})]}),_jsx(Step,{title:`Select the All APIs scope`,children:_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`Access scopes`}),`, select `,_jsx(_components.strong,{children:`All APIs`}),`, not `,_jsx(_components.strong,{children:`SQL`}),`. Lovable requests the `,_jsx(_components.code,{children:`all-apis`}),` scope when you sign in, because the connector lists warehouses and clusters as well as running SQL. Lovable also requests `,_jsx(_components.code,{children:`offline_access`}),`, which is what lets it refresh your token in the background.`]})}),_jsx(Step,{title:`Review the token lifetimes`,children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Access token TTL`}),` defaults to 60 minutes and `,_jsx(_components.strong,{children:`Refresh token TTL`}),` to 10080 minutes (7 days). Lovable renews the access token automatically for as long as the refresh token is valid. When the refresh token expires, the connection stops working until you reconnect it in Lovable, so raise the refresh token TTL if your security policy allows it and you want fewer reconnects.`]})}),_jsxs(Step,{title:`Generate a client secret and save the values`,children:[_jsxs(_components.p,{children:[`Check `,_jsx(_components.strong,{children:`Generate a client secret`}),` and create the connection. Databricks shows the `,_jsx(_components.strong,{children:`Client ID`}),` and `,_jsx(_components.strong,{children:`Client secret`}),` in a `,_jsx(_components.strong,{children:`Connection created`}),` dialog. `,_jsx(_components.strong,{children:`Copy both immediately.`}),` The secret is only shown once and cannot be retrieved later.`]}),_jsxs(_components.p,{children:[`You can leave the checkbox unchecked to create an application without a secret (Databricks calls this a public client). Then leave `,_jsx(_components.strong,{children:`Client Secret`}),` empty in Lovable as well. An application with a secret is the stronger setup, so use one unless you have a reason not to.`]})]}),_jsx(Step,{title:`Check your own Databricks access`,children:_jsxs(_components.p,{children:[`Make sure your account has `,_jsx(_components.strong,{children:`Can use`}),` on the SQL warehouse your app will query (`,_jsx(_components.strong,{children:`SQL Warehouses → (your warehouse) → kebab menu → Permissions`}),`) and the Unity Catalog privileges on the data: `,_jsx(_components.code,{children:`USE CATALOG`}),` on the catalog, `,_jsx(_components.code,{children:`USE SCHEMA`}),` on the schema, and `,_jsx(_components.code,{children:`SELECT`}),` on the tables or schema. All three are required, and the connection inherits exactly these grants.`]})}),_jsx(Step,{title:`Find your Workspace URL`,children:_jsxs(_components.p,{children:[`Your Workspace URL appears in the browser address bar when you are signed in to Databricks, for example `,_jsx(_components.code,{children:`https://dbc-a1b2345c-d6e7.cloud.databricks.com`}),` on AWS, `,_jsx(_components.code,{children:`https://adb-5555555555555555.19.azuredatabricks.net`}),` on Azure, or `,_jsx(_components.code,{children:`https://8757561887652360.0.gcp.databricks.com`}),` on GCP. See `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/workspace/workspace-details`,children:`Get identifiers for workspace objects`}),`.`]})})]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Step 2: Set up the Databricks connection in Lovable`})}),_jsxs(Steps,{children:[_jsx(Step,{title:`Navigate to Databricks connector`,children:_jsxs(_components.p,{children:[`Open `,_jsx(_components.a,{href:`https://lovable.dev/dashboard?connectors`,children:_jsx(_components.strong,{children:`Connectors`})}),` and select `,_jsx(_components.strong,{children:`Databricks`}),`.`]})}),_jsx(Step,{title:`Add a new connection`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Connect`}),` on the connector page.`]})}),_jsx(Step,{title:`Name the connection`,children:_jsxs(_components.p,{children:[`In `,_jsx(_components.strong,{children:`Display name`}),`, name the connection. Because the connection acts as you, a name that includes your own name (for example, `,_jsx(_components.code,{children:`Databricks (Jane)`}),`) makes it clear to teammates whose access it carries.`]})}),_jsx(Step,{title:`Select User OAuth`,children:_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`Configure connection`}),`, select `,_jsx(_components.strong,{children:`User OAuth`}),`. The form shows the `,_jsx(_components.strong,{children:`Redirect URI`}),` to add to your Databricks OAuth app. If you skipped that in Step 1, copy it and add it to the app now.`]})}),_jsxs(Step,{title:`Enter your OAuth app details`,children:[_jsxs(_components.p,{children:[`Use the values from `,_jsx(_components.strong,{children:`Step 1: Register a custom OAuth application in Databricks`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Workspace URL`}),`: your Databricks workspace URL (for example, `,_jsx(_components.code,{children:`https://dbc-abc123.cloud.databricks.com`}),`)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Client ID`}),`: the OAuth client ID of your custom OAuth application`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Client Secret`}),`: the application’s client secret. Leave it empty only if you created a public client without a secret`]}),`\n`]})]}),_jsxs(Step,{title:`Choose who can use this connection`,children:[_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`Sharing`}),`, the connection is private to you by default and shows a `,_jsx(_components.strong,{children:`Private`}),` label. To share it, click `,_jsx(_components.strong,{children:`Share with others`}),`. Then add workspace members by email, or click `,_jsx(_components.strong,{children:`Invite entire workspace`}),` to make the connection available to everyone in your Lovable workspace.`]}),_jsx(Warning,{children:_jsx(_components.p,{children:`Anyone you share a User OAuth connection with queries Databricks as you, with your Unity Catalog grants, and Databricks audit logs attribute their queries to you. Keep the connection private, or share it only with people who may see everything you can see. For a connection a whole team uses, create a service principal connection instead.`})}),_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/integrations/admin-controls#who-can-use-connections-and-clients`,children:`Who can use connections and clients`}),` for more information.`]})]}),_jsxs(Step,{title:`Connect and sign in`,children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Connect`}),` at the bottom of the form. A new window opens for the Databricks sign-in. If your browser blocks it, Lovable redirects you instead. Sign in with your Databricks account and approve the requested access.`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[`That approval only means Databricks issued tokens to your OAuth application. Lovable does not test the connection at this point. A connection still reports success when your account lacks `,_jsx(_components.strong,{children:`Can use`}),` on the warehouse or the Unity Catalog grants. Confirm the connection with a real query after you `,_jsx(_components.a,{href:`/integrations/app-connectors#link-a-connection-to-a-project`,children:`link it to a project`}),`.`]})})]})]})]})]}),`\n`,_jsx(_components.p,{children:`When connected, you can link the connection to the projects where you want to use it, and start building apps that query your Databricks data.`}),`\n`,_jsx(Heading,{level:`2`,id:`restrict-a-connection-to-read-only`,children:`Restrict a connection to read-only`}),`\n`,_jsxs(_components.p,{children:[`The connector forwards whatever your app sends. It applies no method or path allowlist, so any Databricks REST path and any HTTP verb reaches your workspace, including a `,_jsx(_components.code,{children:`POST`}),` to `,_jsx(_components.code,{children:`/api/2.0/sql/statements`}),` carrying `,_jsx(_components.code,{children:`DROP TABLE`}),`. Unity Catalog privileges are the control that works: grant the connection’s identity `,_jsx(_components.code,{children:`SELECT`}),` and nothing more.`]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`These steps are written for a service principal connection. A User OAuth connection runs with your own grants, so there is nothing separate to lock down: the connection has exactly your grants. If you want an app built on it to stay read-only, either narrow your own grants or, better, give the app a service principal connection with the grants below.`})}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Grant read-only privileges in Unity Catalog`,children:[_jsxs(_components.p,{children:[`Run these as a catalog owner, or as someone with `,_jsx(_components.code,{children:`MANAGE`}),` on the catalog. Name the principal with its `,_jsx(_components.strong,{children:`Application ID`}),` in backticks, not its display name:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` USE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` CATALOG`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` CATALOG`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` main `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`TO`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" `\u003capplication-id>`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` USE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` SCHEMA`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` SCHEMA`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` main`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`analytics`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` TO`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" `\u003capplication-id>`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GRANT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` SELECT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ON`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` SCHEMA`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` main`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`analytics`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` TO`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" `\u003capplication-id>`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GRANT SELECT ON SCHEMA`}),` covers every current and future table and view in the schema. Grant `,_jsx(_components.code,{children:`SELECT ON TABLE main.analytics.orders`}),` instead when you want to name individual tables. Repeat the statements for each schema your app reads.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`Never grant `,_jsx(_components.code,{children:`MODIFY`}),`, `,_jsx(_components.code,{children:`CREATE TABLE`}),`, or `,_jsx(_components.code,{children:`ALL PRIVILEGES`}),` to a service principal you want to stay read-only, and check what it already inherits from a group or a parent catalog with `,_jsx(_components.code,{children:\"SHOW GRANTS `\u003capplication-id>` ON CATALOG main;\"}),`. Privileges granted higher up cascade down, so a `,_jsx(_components.code,{children:`MODIFY`}),` on the catalog defeats a careful set of table grants.`]})})]}),_jsxs(Step,{title:`Give it a dedicated warehouse`,children:[_jsxs(_components.p,{children:[`Grant `,_jsx(_components.strong,{children:`Can use`}),` on one warehouse reserved for this connection rather than your shared analytics warehouse. Query volume comes from your app’s end users, so it is unpredictable and outside your control: a dedicated warehouse isolates that load, makes the app’s spend its own line item, and lets you size and time-limit it independently. Set a small `,_jsx(_components.strong,{children:`Cluster Size`}),` and a short `,_jsx(_components.strong,{children:`Auto stop`}),`.`]}),_jsxs(_components.p,{children:[`Leave `,_jsx(_components.strong,{children:`Can manage`}),` off. `,_jsx(_components.strong,{children:`Can use`}),` is enough to start the warehouse and run queries, and it does not allow resizing or deleting it.`]})]}),_jsx(Step,{title:`Keep one service principal per access role`,children:_jsx(_components.p,{children:`Grants attach to the service principal, so a connection can only ever be as narrow as its principal. If one team needs write access, give that team a second service principal and a second Lovable connection instead of widening the read-only one.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`building-a-semantic-layer`,children:`Building a semantic layer`}),`\n`,_jsx(_components.p,{children:`Every Databricks use case benefits from a semantic layer: a shared definition of what your key metrics mean, which tables to use, and what assumptions they carry. What counts as a “daily active user”? How is MRR calculated? Which view should be used for churn, and does it exclude trials?`}),`\n`,_jsx(_components.p,{children:`Without this shared context, each app or dashboard risks computing the same metric differently.`}),`\n`,_jsx(Heading,{level:`3`,id:`if-you-already-have-a-semantic-layer`,children:`If you already have a semantic layer`}),`\n`,_jsx(_components.p,{children:`If your Databricks workspace already has a semantic layer (for example, dbt metrics, Unity Catalog tags, or a YAML definitions file), point Lovable to it:`}),`\n`,_jsx(CodeBlock,{filename:``,wrap:`true`,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Use our semantic layer at catalog.schema.metrics_definitions when computing any KPIs. MRR is defined there as monthly_recurring_revenue.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`if-you-don’t-have-one-yet`,children:`If you don’t have one yet`}),`\n`,_jsx(_components.p,{children:`You can build a semantic layer quickly in Lovable using a dedicated project. Create a new project, connect it to Databricks, and ask the agent to explore your warehouse and draft definitions:`}),`\n`,_jsx(CodeBlock,{filename:``,wrap:`true`,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Let's build a full semantic layer for our Databricks warehouse. Please start by exploring the tables and forming your own understanding of the data. Create a sample dashboard that showcases your analysis of the key metrics, the tables they use, and the assumptions behind each query. We will walk through them together and correct anything that is wrong. Use these tables as the main starting point: [table names]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Drop in any existing context you have (prior dashboards, a data dictionary, a dbt schema file) and Lovable will incorporate it. Ask the agent to save the output as Markdown or YAML files in its project directory:`}),`\n`,_jsx(CodeBlock,{filename:``,wrap:`true`,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Save the finalized metric definitions as YAML files in this project. Other projects will reference them.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Once saved, other Lovable projects in the same Lovable workspace can reference those files to get consistent metric definitions out of the box.`}),`\n`,_jsx(Heading,{level:`2`,id:`limitations`,children:`Limitations`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No per-user data scoping within a connection.`}),` Everyone who uses a service principal connection sees the same data, the service principal’s data, and everyone who builds with a User OAuth connection queries as the person who authorized it. Create separate service principals per access role, or use the Databricks `,_jsx(_components.strong,{children:_jsx(_components.a,{href:`/integrations/app-user-connectors`,children:`app user connector`})}),` so each end user of your published app queries under their own Databricks login and permissions.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No enforced read-only access.`}),` The connector applies no method or path allowlist, so a connection runs whatever SQL its service principal, or the user who authorized it, is allowed to run. Scope it with Unity Catalog grants. See `,_jsx(_components.a,{href:`#restrict-a-connection-to-read-only`,children:`Restrict a connection to read-only`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No automatic caching.`}),` Query results are not cached by default. You can ask Lovable to add caching logic to your app at your chosen interval.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Connection access is not enforced after publishing.`}),` Connection-level access decides who can build with the connection, `,_jsx(_components.a,{href:`/integrations/admin-controls#who-can-use-connections-and-clients`,children:`not who can visit the published app`}),`. Who can visit is a separate, publish-time control: set the site’s visibility to `,_jsx(_components.strong,{children:`Invite only`}),` (Free and Pro plans) or to `,_jsx(_components.strong,{children:`Workspace`}),` or `,_jsx(_components.strong,{children:`Custom`}),` (Business and Enterprise plans) so visitors have to log in. On Business and Enterprise plans, admins can also set a workspace-wide default in `,_jsx(_components.strong,{children:`Workspace settings → Privacy \u0026 security → Default published app access`}),`. See `,_jsx(_components.a,{href:`/features/publish#who-can-see-your-published-app`,children:`website access control`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Customer-managed cost controls.`}),` Lovable does not impose query cost caps, and neither do Databricks `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/admin/account-settings/budgets`,children:`budgets`}),`: they scope to your account, workspaces, or resource tags, and they only send email alerts, with up to a 24 hour delay. The controls that actually limit a warehouse are `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/compute/sql-warehouse/create`,children:_jsx(_components.strong,{children:`Auto stop`})}),`, a small `,_jsx(_components.strong,{children:`Cluster Size`}),`, and a `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/sql/language-manual/parameters/statement_timeout`,children:_jsx(_components.code,{children:`STATEMENT_TIMEOUT`})}),`. Set the timeout for the whole workspace in `,_jsx(_components.strong,{children:`Settings → Compute → SQL warehouses → SQL Configuration Parameters`}),`, since the system default is 172800 seconds (2 days). Per-warehouse timeouts exist but are in Beta and settable only through the SQL warehouses API.`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`2`,id:`manage-your-connection`,children:[`Manage your `,connector_0,` connection`]}),`\n`,_jsxs(_components.p,{children:[`Connections are managed from `,_jsx(_components.a,{href:`https://lovable.dev/dashboard?connectors`,children:_jsx(_components.strong,{children:`Connectors`})}),`: select `,_jsx(_components.strong,{children:connector_0}),`, then open the connection.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Unlink projects`}),` to remove `,connector_0,` access from specific projects while keeping the connection available for others. See `,_jsx(_components.a,{href:`/integrations/app-connectors#unlink-projects-from-a-connection`,children:`Unlink projects from a connection`}),` for the steps.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Delete the connection`}),` to remove it from the workspace entirely. Deleting is permanent. It removes the credentials from all linked projects, and app features that use `,connector_0,` stop working until a new connection is added. See `,_jsx(_components.a,{href:`/integrations/app-connectors#delete-a-connection`,children:`Delete a connection`}),` for the steps and who can delete.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`faq`,children:`FAQ`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Does Lovable enforce my Databricks permissions?`,id:`does-lovable-enforce-my-databricks-permissions`,children:_jsxs(_components.p,{children:[`No. Lovable enforces who on your team can `,_jsx(_components.strong,{children:`use`}),` a connection. The connection’s identity determines what data is queryable. With a service principal connection, everyone with access to the connection can query whatever the service principal can see. With a User OAuth connection, everyone with access queries as the person who authorized it and sees whatever they can see. Create separate service principals per access role to scope data.`]})}),_jsx(Accordion,{title:`What if someone runs an expensive query?`,id:`what-if-someone-runs-an-expensive-query`,children:_jsxs(_components.p,{children:[`Lovable does not impose query cost caps, so use Databricks-side controls. Start with a small warehouse and scale up as needed, keep `,_jsx(_components.strong,{children:`Auto stop`}),` short (the default is 45 minutes on pro and classic warehouses, 10 minutes on serverless), and set a workspace-level `,_jsx(_components.code,{children:`STATEMENT_TIMEOUT`}),` so a runaway query is halted well before the 172800 second (2 day) system default. Databricks `,_jsx(_components.a,{href:`https://docs.databricks.com/aws/en/admin/account-settings/budgets`,children:`budgets`}),` help you notice overspend but do not stop it: they send email alerts and cannot cap a SQL warehouse.`]})}),_jsx(Accordion,{title:`Is my data cached or stored in Lovable?`,id:`is-my-data-cached-or-stored-in-lovable`,children:_jsx(_components.p,{children:`Not by default. Lovable queries Databricks at runtime with no automatic data replication or caching. Caching is opt-in: you can ask Lovable to add caching logic to your app at an interval you choose.`})}),_jsx(Accordion,{title:`What happens when I publish an app that queries Databricks?`,id:`what-happens-when-i-publish-an-app-that-queries-databricks`,children:_jsxs(_components.p,{children:[`For a service principal connection, the published app queries Databricks as the service principal, so every visitor sees the same data. Connection-level access is `,_jsx(_components.a,{href:`/integrations/admin-controls#who-can-use-connections-and-clients`,children:`not enforced after publishing`}),`: it decides who can build with the connection, not who can visit the app. Control the audience at publish time instead: set the site’s visibility to `,_jsx(_components.strong,{children:`Invite only`}),` (Free and Pro plans) or to `,_jsx(_components.strong,{children:`Workspace`}),` or `,_jsx(_components.strong,{children:`Custom`}),` (Business and Enterprise plans) so visitors have to log in. See `,_jsx(_components.a,{href:`/features/publish#who-can-see-your-published-app`,children:`website access control`}),`. Publishing a project that uses a User OAuth connection works differently and is not covered on this page yet.`]})}),_jsx(Accordion,{title:`Can someone leak the Databricks credentials?`,id:`can-someone-leak-the-databricks-credentials`,children:_jsx(_components.p,{children:`No. The service principal credentials, and the OAuth tokens of a User OAuth connection, are stored server-side in Lovable’s gateway and do not reach the browser or your app’s frontend code.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`The connection verifies, but every query fails with HTTP 403`,id:`the-connection-verifies-but-every-query-fails-with-http-403`,children:[_jsxs(_components.p,{children:[`This is the most common Databricks setup failure. For a service principal connection, Lovable verifies the credentials with a single `,_jsx(_components.code,{children:`GET 2.0/preview/scim/v2/Me`}),` request when you click `,_jsx(_components.strong,{children:`Connect`}),`. That call proves the OAuth secret works and nothing more. It succeeds even when the principal holds no warehouse permission and no table grants, so a connection can report success and then return 403 on its first real query. A User OAuth connection is not tested at all at that point.`]}),_jsxs(_components.p,{children:[`For a service principal connection, work back through the grants in the service principal steps under `,_jsx(_components.a,{href:`#how-to-connect-databricks`,children:`How to connect Databricks`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The principal has no `,_jsx(_components.strong,{children:`Can use`}),` on the warehouse. Grant it under `,_jsx(_components.strong,{children:`SQL Warehouses → (your warehouse) → kebab menu → Permissions`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The principal is missing Unity Catalog privileges. It needs `,_jsx(_components.code,{children:`USE CATALOG`}),`, `,_jsx(_components.code,{children:`USE SCHEMA`}),`, and `,_jsx(_components.code,{children:`SELECT`}),`, and all three are required. Check what it already holds with `,_jsx(_components.code,{children:\"SHOW GRANTS `\u003capplication-id>` ON CATALOG main;\"}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The principal was never assigned to the workspace, or lacks the `,_jsx(_components.strong,{children:`Databricks SQL access`}),` entitlement.`]}),`\n`]}),_jsxs(_components.p,{children:[`For a User OAuth connection, the same 403 means your own account lacks `,_jsx(_components.strong,{children:`Can use`}),` on the warehouse or the Unity Catalog privileges, because the connection has exactly your grants.`]})]}),_jsxs(Accordion,{title:`The connection fails immediately with an authentication error`,id:`the-connection-fails-immediately-with-an-authentication-error`,children:[_jsxs(_components.p,{children:[`On a service principal connection, either the OAuth secret expired (the maximum lifetime is 730 days) or the `,_jsx(_components.strong,{children:`Workspace URL`}),` is wrong. Generate a fresh secret in Databricks and reconnect.`]}),_jsxs(_components.p,{children:[`On a User OAuth connection, the refresh token has expired (7 days by default, set by the `,_jsx(_components.strong,{children:`Refresh token TTL`}),` on the custom OAuth application), the OAuth application was disabled or deleted, or the person who authorized the connection was removed from the workspace. Reconnect the connection in Lovable and sign in again.`]}),_jsx(_components.p,{children:`In both cases, make sure the workspace URL is the host you see in the browser when signed in to Databricks, with no trailing path.`})]}),_jsx(Accordion,{title:`The connection cannot reach Databricks at all`,id:`the-connection-cannot-reach-databricks-at-all`,children:_jsxs(_components.p,{children:[`Lovable’s gateway is blocked at the network layer. See `,_jsx(_components.a,{href:`#network-access`,children:`Network access`}),`: an IP access list or an account-level ingress policy needs Lovable’s egress ranges allowlisted, and a workspace with public network access disabled cannot be reached from Lovable at all.`]})}),_jsxs(Accordion,{title:`The User OAuth sign-in fails before you reach Databricks or comes back with an error`,id:`the-user-oauth-sign-in-fails-before-you-reach-databricks-or-comes-back-with-an-error`,children:[_jsx(_components.p,{children:`Databricks rejects the sign-in when the custom OAuth application and the Lovable form disagree. Check, in order:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Redirect URI`}),`: the application’s `,_jsx(_components.strong,{children:`Redirect URLs`}),` must include `,_jsx(_components.code,{children:`https://api.lovable.dev/workspaces/connectors/standard/oauth/callback`}),` exactly, as shown under `,_jsx(_components.strong,{children:`Redirect URI`}),` in the connection form.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Scope`}),`: the application must have the `,_jsx(_components.strong,{children:`All APIs`}),` access scope. Lovable requests `,_jsx(_components.code,{children:`all-apis`}),`, and an application limited to the `,_jsx(_components.strong,{children:`SQL`}),` scope refuses it.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Client ID and secret`}),`: the `,_jsx(_components.strong,{children:`Client ID`}),` must be the one of that application, and `,_jsx(_components.strong,{children:`Client Secret`}),` must match how it was created. A confidential application needs its secret entered in Lovable, and a public application needs the field left empty.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Account console`}),`: the application must be enabled in `,_jsx(_components.strong,{children:`Settings → App connections`}),`.`]}),`\n`]})]}),_jsx(Accordion,{title:`Queries time out or a warehouse never wakes up`,id:`queries-time-out-or-a-warehouse-never-wakes-up`,children:_jsxs(_components.p,{children:[`The connection’s identity, the service principal or your own account, needs `,_jsx(_components.strong,{children:`Can use`}),` on the warehouse to start it. `,_jsx(_components.strong,{children:`Can view`}),` and `,_jsx(_components.strong,{children:`Can monitor`}),` are not enough. If long queries are cut off, check the workspace `,_jsx(_components.code,{children:`STATEMENT_TIMEOUT`}),` in `,_jsx(_components.strong,{children:`Settings → Compute → SQL warehouses → SQL Configuration Parameters`}),`.`]})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{connector_0,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Connect your app to Databricks","sidebarTitle":"Databricks","description":"Connect your app to Databricks to query warehouse data, build live dashboards, and power data-driven tools using your existing tables and views. Connect with a service principal or sign in with your own Databricks account.","keywords":["Databricks integration","Databricks connector","Databricks SQL","Databricks warehouse","Databricks dashboard","Lovable Databricks","data warehouse integration","lakehouse","service principal","Unity Catalog","OAuth","user OAuth","U2M","M2M","custom OAuth application"],"href":"/integrations/databricks"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[58012,58031,"`Databricks`,` conne"],[58282,58301,"`Databricks`}),`, th"],[58469,58488,"`Databricks`,` acces"],[58972,58991,"`Databricks`,` stop "]]},"mdxExtracts":{"tableOfContents":[{"title":"Common use cases and example apps","slug":"common-use-cases-and-example-apps","depth":2,"children":[]},{"title":"How Databricks connections work","slug":"how-databricks-connections-work","depth":2,"children":[{"title":"What this means for data access","slug":"what-this-means-for-data-access","depth":3,"children":[]}]},{"title":"How to connect Databricks","slug":"how-to-connect-databricks","depth":2,"children":[{"title":"Network access","slug":"network-access","depth":3,"children":[]},{"title":"Choose how to connect","slug":"choose-how-to-connect","depth":3,"children":[]}]},{"title":"Restrict a connection to read-only","slug":"restrict-a-connection-to-read-only","depth":2,"children":[]},{"title":"Building a semantic layer","slug":"building-a-semantic-layer","depth":2,"children":[{"title":"If you already have a semantic layer","slug":"if-you-already-have-a-semantic-layer","depth":3,"children":[]},{"title":"If you don’t have one yet","slug":"if-you-don’t-have-one-yet","depth":3,"children":[]}]},{"title":"Limitations","slug":"limitations","depth":2,"children":[]},{"title":"Manage your connection","slug":"manage-your-connection","depth":2,"children":[]},{"title":"FAQ","slug":"faq","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/lovable-f9060f1e/84f62c0d01f1469d/sign-in-with-lovable-demo.js"],"subdomain":"lovable-f9060f1e","siteName":"Lovable Documentation","title":"Connect your app to Databricks - Lovable Documentation","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"contextualStarterQuestions":[{"_id":"6ae2228618b560d71da8d1d4","deploymentId":"672cd6fd3133ca8082eceab1","questionText":"How do I connect to Databricks?","status":"active","generatedBy":"contextual","path":"integrations/databricks","createdAt":"2026-10-28T16:27:50.140Z","updatedAt":"2026-10-28T16:27:50.140Z","__v":0},{"_id":"6ae2228618b560d71da8d1d6","deploymentId":"672cd6fd3133ca8082eceab1","questionText":"Which auth method should I use?","status":"active","generatedBy":"contextual","path":"integrations/databricks","createdAt":"2026-10-28T16:27:50.140Z","updatedAt":"2026-10-28T16:27:50.140Z","__v":0},{"_id":"6ae2228618b560d71da8d1d5","deploymentId":"672cd6fd3133ca8082eceab1","questionText":"What can I build with this connector?","status":"active","generatedBy":"contextual","path":"integrations/databricks","createdAt":"2026-10-28T16:27:50.140Z","updatedAt":"2026-10-28T16:27:50.140Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T16:27:41.847Z","originalFileLocation":"integrations/databricks.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Connect your app to Databricks to query warehouse data, build live dashboards, and power data-driven tools using your existing tables and views. Connect with a service principal or sign in with your own Databricks account.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Lovable Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Connect your app to Databricks - Lovable Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect your app to Databricks to query warehouse data, build live dashboards, and power data-driven tools using your existing tables and views. Connect with a service principal or sign in with your own Databricks account.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Lovable Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.lovable.dev/integrations/databricks\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://lovable-f9060f1e.mintlify.app/assets/logo/opengraph-image.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Connect your app to Databricks - Lovable Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect your app to Databricks to query warehouse data, build live dashboards, and power data-driven tools using your existing tables and views. Connect with a service principal or sign in with your own Databricks account.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://lovable-f9060f1e.mintlify.app/assets/logo/opengraph-image.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/lovable-f9060f1e/AU_uVgnksniw8mje/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Lovable Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0095FF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.lovable.dev/integrations/databricks\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/integrations/databricks.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.lovable.dev/#organization\",\"name\":\"Lovable Documentation\",\"url\":\"https://docs.lovable.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/lovable-f9060f1e/lZT1ihBcprll2Agr/assets/logo/logoblack.svg?fit=max\u0026auto=format\u0026n=lZT1ihBcprll2Agr\u0026q=85\u0026s=8d9eafaf19f94e27f0d13ac160d54f54\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.lovable.dev#website\",\"name\":\"Lovable Documentation\",\"url\":\"https://docs.lovable.dev\",\"publisher\":{\"@id\":\"https://docs.lovable.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.lovable.dev/integrations/databricks#webpage\",\"url\":\"https://docs.lovable.dev/integrations/databricks\",\"name\":\"Connect your app to Databricks\",\"description\":\"Connect your app to Databricks to query warehouse data, build live dashboards, and power data-driven tools using your existing tables and views. Connect with a service principal or sign in with your own Databricks account.\",\"dateModified\":\"2026-10-28T16:27:41.847Z\",\"isPartOf\":{\"@id\":\"https://docs.lovable.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.lovable.dev/integrations/databricks#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.lovable.dev/integrations/databricks#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Connect\",\"item\":\"https://docs.lovable.dev/integrations/app-connectors\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Connector catalog\",\"item\":\"https://docs.lovable.dev/integrations/algolia\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Data \u0026 databases\",\"item\":\"https://docs.lovable.dev/integrations/supabase\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Connect your app to Databricks\",\"item\":\"https://docs.lovable.dev/integrations/databricks\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.lovable.dev/integrations/databricks#article\",\"headline\":\"Connect your app to Databricks\",\"name\":\"Connect your app to Databricks\",\"description\":\"Connect your app to Databricks to query warehouse data, build live dashboards, and power data-driven tools using your existing tables and views. Connect with a service principal or sign in with your own Databricks account.\",\"url\":\"https://docs.lovable.dev/integrations/databricks\",\"mainEntityOfPage\":{\"@id\":\"https://docs.lovable.dev/integrations/databricks#webpage\"},\"image\":\"https://docs.lovable.dev/assets/logo/opengraph-image.png\",\"dateModified\":\"2026-10-28T16:27:41.847Z\",\"keywords\":\"Databricks integration, Databricks connector, Databricks SQL, Databricks warehouse, Databricks dashboard, Lovable Databricks, data warehouse integration, lakehouse, service principal, Unity Catalog, OAuth, user OAuth, U2M, M2M, custom OAuth application\",\"publisher\":{\"@id\":\"https://docs.lovable.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.lovable.dev#website\"}}]}\u003c/script>","siteName":"Lovable Documentation","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Getting started","icon":"rocket","pages":[{"title":"Welcome to Lovable","href":"/introduction/welcome"},{"title":"Create an account","href":"/introduction/create-an-account"},{"title":"Quick start","href":"/introduction/getting-started"},{"title":"Dashboard overview","href":"/introduction/dashboard-overview"},{"title":"Lovable for Enterprise","sidebarTitle":"Enterprise","href":"/introduction/lovable-for-enterprise"},{"group":"Lovable platforms","pages":[{"title":"Lovable desktop app","sidebarTitle":"Lovable desktop app","href":"/integrations/desktop-app"},{"title":"Lovable mobile app","sidebarTitle":"Lovable mobile app","href":"/integrations/lovable-mobile-app"}]},{"group":"Use Lovable from other tools","pages":[{"title":"Lovable API","sidebarTitle":"Lovable API","href":"/integrations/lovable-api"},{"title":"Lovable MCP server","sidebarTitle":"Lovable MCP server","href":"/integrations/lovable-mcp-server"},{"title":"Lovable ChatGPT app","sidebarTitle":"Lovable ChatGPT app","href":"/tips-tricks/chatgpt-app"},{"title":"Chat with Lovable in Slack","sidebarTitle":"Lovable in Slack","href":"/integrations/lovable-for-slack"},{"title":"Chat with Lovable in Telegram","sidebarTitle":"Lovable in Telegram","href":"/tips-tricks/lovable-telegram-bot"},{"title":"Build with URL","href":"/integrations/build-with-url"},{"title":"Sign in with Lovable","sidebarTitle":"Sign in with Lovable","href":"/integrations/sign-in-with-lovable"}]}]},{"group":"Build","icon":"hammer","pages":[{"group":"Projects","root":{"title":"Projects in Lovable","sidebarTitle":"Overview","href":"/features/projects/overview"},"pages":[{"title":"Find your way around the Lovable editor","sidebarTitle":"Editor","href":"/features/projects/editor"},{"title":"Work with Lovable in the project chat","sidebarTitle":"Project chat","href":"/features/projects/chat"},{"title":"Preview and test your app in Lovable","sidebarTitle":"Preview","href":"/features/projects/preview"},{"title":"Explore changes with drafts","sidebarTitle":"Drafts","href":"/features/drafts"},{"title":"View and edit your project's code","sidebarTitle":"Code editor","href":"/features/code-mode"},{"title":"Revert and restore your project with version history","sidebarTitle":"Version history","href":"/features/projects/history"},{"title":"Project settings","sidebarTitle":"Settings","href":"/features/projects/settings"},{"title":"Delete a project","href":"/features/projects/delete-project"},{"title":"Remix a project","sidebarTitle":"Remix","href":"/features/projects/remix"},{"title":"Import a project from Replit, Bolt, v0, or another tool","sidebarTitle":"Import a project","href":"/features/projects/import-project"},{"title":"Import a website into Lovable from its URL","sidebarTitle":"Import a website","href":"/features/projects/import-website"},{"title":"Upgrade a project to TanStack Start","sidebarTitle":"Upgrade to TanStack Start","href":"/features/upgrade-to-tanstack-start"},{"title":"Find and search projects","sidebarTitle":"Find a project","href":"/introduction/project-search-and-find"},{"title":"Organize projects in folders","sidebarTitle":"Folders","href":"/introduction/project-folders"}]},{"title":"Chat with Lovable across your workspace","sidebarTitle":"Chats","href":"/features/chats"},{"group":"The agent","pages":[{"title":"Discuss your app in Chat mode","sidebarTitle":"Chat mode","href":"/features/chat-mode"},{"title":"Plan a change in Plan mode","sidebarTitle":"Plan mode","href":"/features/plan-mode"},{"title":"Implement changes in Build mode","sidebarTitle":"Build mode","href":"/features/agent-mode"},{"title":"Set a goal for Lovable","sidebarTitle":"Goals","href":"/features/goal-runs"},{"title":"Subagents","sidebarTitle":"Subagents","href":"/features/subagents"}]},{"group":"Context \u0026 instructions","pages":[{"title":"Instructions","sidebarTitle":"Instructions","href":"/features/knowledge"},{"title":"Memory: what Lovable remembers as you build","sidebarTitle":"Memory","href":"/features/memory"},{"title":"Define reusable instructions with skills","sidebarTitle":"Skills","href":"/features/skills"},{"title":"Cross-project referencing","href":"/features/cross-project-referencing"}]},{"title":"Generate files and analyze data","sidebarTitle":"File generation","href":"/features/generate-files"},{"group":"Design","pages":[{"title":"Edit from the preview","sidebarTitle":"Preview toolbar","href":"/features/preview-toolbar"},{"title":"Design guidance","href":"/features/design-guidance"},{"title":"Design templates","href":"/features/business/design-templates"},{"title":"Design systems","href":"/features/design-systems"},{"title":"Use custom fonts","sidebarTitle":"Custom fonts","href":"/tips-tricks/custom-fonts"},{"title":"Use 21st.dev components in Lovable","sidebarTitle":"21st.dev","href":"/tips-tricks/21stdev"},{"title":"Bring Figma designs into Lovable","sidebarTitle":"Figma","href":"/integrations/figma"}]},{"group":"Backend","root":{"title":"Built-in backend","sidebarTitle":"Overview","href":"/features/cloud"},"pages":[{"group":"Database","root":{"title":"Database","href":"/features/database"},"pages":[{"title":"Control who can access your app's data","sidebarTitle":"Access and security","href":"/features/database-access"},{"title":"Fix a slow database and choose the right capacity","sidebarTitle":"Performance and capacity","href":"/features/database-performance"},{"title":"Back up, restore, and export your project's database","sidebarTitle":"Backups and export","href":"/features/database-backups"},{"title":"Pause, resume, or remove your project's database","sidebarTitle":"Pause, resume, and remove","href":"/features/database-pause-remove"}]},{"group":"Users \u0026 authentication","root":{"title":"Users and authentication","sidebarTitle":"Users \u0026 authentication","href":"/features/authentication"},"pages":[{"title":"Email authentication for your app","sidebarTitle":"Email auth","href":"/features/email-auth"},{"title":"Phone authentication for your app","sidebarTitle":"Phone auth","href":"/features/phone-auth"},{"title":"Add Google authentication to your app","sidebarTitle":"Google auth","href":"/features/google-auth"},{"title":"Add Apple authentication to your app","sidebarTitle":"Apple auth","href":"/features/apple-auth"},{"title":"Add Microsoft authentication to your app","sidebarTitle":"Microsoft auth","href":"/features/microsoft-auth"},{"title":"Add Sign in with Lovable to your app","sidebarTitle":"Lovable auth","href":"/features/lovable-auth"},{"title":"Add SAML single sign-on to your app","sidebarTitle":"SAML SSO (apps)","href":"/features/saml-sso"},{"title":"Add OpenID Connect (OIDC) sign-in to your app","sidebarTitle":"OIDC sign-in (apps)","href":"/features/oidc-auth"},{"title":"Reuse Lovable workspace identity in your app","sidebarTitle":"Workspace identity (apps)","href":"/features/lovable-workspace-identity-reuse"}]},{"title":"Storage","href":"/features/storage"},{"title":"Secrets","href":"/features/secrets"},{"title":"Jobs","href":"/features/jobs"},{"title":"Edge functions","href":"/features/edge-functions"},{"title":"Logs","href":"/features/logs"},{"title":"Project usage and costs","sidebarTitle":"Usage","href":"/features/project-usage"}]},{"group":"AI for your app","root":{"title":"AI features for your app","sidebarTitle":"AI for your app","href":"/features/ai"},"pages":[{"title":"Add chatbots and text generation to your app","sidebarTitle":"Chat and text","href":"/features/ai-chat"},{"title":"Let users generate and edit images in your app","sidebarTitle":"Images","href":"/features/ai-images"},{"title":"Let users generate and edit videos in your app","sidebarTitle":"Video","href":"/features/ai-video"},{"title":"Let users create music in your app","sidebarTitle":"Music","href":"/features/ai-music"},{"title":"Help users find relevant content in your app","sidebarTitle":"Search by meaning","href":"/features/ai-search"},{"title":"Automate classification, routing, and scoring in your app","sidebarTitle":"Classify and score","href":"/features/ai-decisions"},{"title":"Let users listen to your app's content","sidebarTitle":"Text to speech","href":"/features/ai-text-to-speech"},{"title":"Add transcription and voice input to your app","sidebarTitle":"Speech to text","href":"/features/ai-speech-to-text"},{"title":"Build voice assistants your users can talk to","sidebarTitle":"Live voice","href":"/features/ai-live-voice"},{"title":"Replace deprecated AI models in your app","sidebarTitle":"Deprecated models","href":"/features/ai-deprecated-models"}]},{"group":"Test your app","pages":[{"title":"Test and verify your app","sidebarTitle":"Testing tools","href":"/features/testing"},{"title":"Test your app in a browser","sidebarTitle":"Browser testing","href":"/features/browser-testing"}]},{"group":"Secure your app","root":{"title":"Security overview","href":"/features/security"},"pages":[{"title":"Project security view","sidebarTitle":"Project security view","href":"/features/security-view"},{"title":"Trust center","href":"/features/trust-center"},{"title":"Security best practices for Lovable apps","sidebarTitle":"Security best practices","href":"/tips-tricks/security-best-practices"}]},{"title":"Using npm packages","sidebarTitle":"npm packages","href":"/tips-tricks/npm-packages"},{"title":"Build secrets","tag":"ENT","href":"/features/build-secrets"},{"title":"Managed registry","tag":"ENT","href":"/features/managed-registry"}]},{"group":"Connect","icon":"plug","pages":[{"group":"Connectors","root":{"title":"Lovable connectors: Connect tools, services, and APIs","sidebarTitle":"Overview","href":"/integrations/introduction"},"pages":[{"title":"App + chat connectors: Add capabilities to your published app and your chat","sidebarTitle":"App + chat connectors","href":"/integrations/app-connectors"},{"title":"App user connectors: let your users connect their own accounts","sidebarTitle":"App user connectors","href":"/integrations/app-user-connectors"},{"title":"Create a custom connector","sidebarTitle":"Custom connectors","href":"/integrations/create-connector"},{"title":"Chat connectors: Connect your tools to Lovable using MCP servers","sidebarTitle":"Chat connectors","href":"/integrations/chat-connectors"},{"title":"Connect a custom MCP server as a chat connector","sidebarTitle":"Custom MCP servers","href":"/integrations/custom-mcp"},{"title":"MCP registries","href":"/integrations/mcp-registries"},{"title":"Manage connectors in your workspace","sidebarTitle":"Admin controls","href":"/integrations/admin-controls"},{"title":"Integration security","href":"/integrations/security"}]},{"group":"Connector catalog","pages":[{"group":"AI \u0026 search","pages":[{"title":"Connect your app to Algolia","sidebarTitle":"Algolia","href":"/integrations/algolia"},{"title":"Connect your app to Apify","sidebarTitle":"Apify","href":"/integrations/apify"},{"title":"Connect ElevenLabs to enable voice AI in your app","sidebarTitle":"ElevenLabs","href":"/integrations/eleven-labs"},{"title":"Connect Firecrawl to scrape web data for your app","sidebarTitle":"Firecrawl","href":"/integrations/firecrawl"},{"title":"Connect your app to Fireworks AI","sidebarTitle":"Fireworks AI","href":"/integrations/fireworks"},{"title":"Connect your app to Gemini Enterprise","sidebarTitle":"Gemini Enterprise","href":"/integrations/gemini-enterprise"},{"title":"Connect your app to LlamaParse Platform","sidebarTitle":"LlamaParse Platform","href":"/integrations/llamaparse"},{"title":"Connect your app to Parallel","sidebarTitle":"Parallel","href":"/integrations/parallel"},{"title":"Connect your app to Perplexity","sidebarTitle":"Perplexity","href":"/integrations/perplexity"},{"title":"Connect your app to Replicate","sidebarTitle":"Replicate","href":"/integrations/replicate"}]},{"group":"Data \u0026 databases","pages":[{"title":"Connect to Supabase","sidebarTitle":"Supabase","href":"/integrations/supabase"},{"title":"Connect your app to Amazon Redshift","sidebarTitle":"Amazon Redshift","href":"/integrations/amazon-redshift"},{"title":"Connect your app to AWS Athena","sidebarTitle":"AWS Athena","href":"/integrations/aws-athena"},{"title":"Connect your app to AWS S3","sidebarTitle":"AWS S3","href":"/integrations/aws-s3"},{"title":"Connect your app to BigQuery","sidebarTitle":"BigQuery","href":"/integrations/bigquery"},{"title":"Connect your app to ClickHouse","sidebarTitle":"ClickHouse","href":"/integrations/clickhouse"},{"title":"Connect your app to Cube","sidebarTitle":"Cube","description":"Connect your app to Cube to build dashboards and reports on the business metrics that your data team already defines.","href":"/integrations/cube"},{"title":"Connect your app to Databricks","sidebarTitle":"Databricks","href":"/integrations/databricks"},{"title":"Connect your app to the dbt Semantic Layer","sidebarTitle":"dbt Semantic Layer","description":"Connect your app to the dbt Semantic Layer to query governed metrics defined in dbt, sliced by dimensions and time, without writing warehouse SQL.","href":"/integrations/dbt-semantic-layer"},{"title":"Connect your app to GoodData","sidebarTitle":"GoodData","href":"/integrations/gooddata"},{"title":"Connect your app to IBM Db2","sidebarTitle":"IBM Db2","href":"/integrations/ibm-db2"},{"title":"Connect your app to Looker","sidebarTitle":"Looker","href":"/integrations/looker"},{"title":"Connect your app to Metabase","sidebarTitle":"Metabase","href":"/integrations/metabase"},{"title":"Connect your app to Microsoft Fabric","sidebarTitle":"Microsoft Fabric","href":"/integrations/microsoft-fabric"},{"title":"Connect your app to MotherDuck","sidebarTitle":"MotherDuck","href":"/integrations/motherduck"},{"title":"Connect your app to Neon","sidebarTitle":"Neon","href":"/integrations/neon"},{"title":"Connect your app to Omni","sidebarTitle":"Omni","href":"/integrations/omni"},{"title":"Connect your app to Oracle Autonomous AI Database","sidebarTitle":"Oracle Autonomous AI Database","href":"/integrations/oracle-autonomous"},{"title":"Connect your app to Power BI","sidebarTitle":"Power BI","href":"/integrations/power-bi"},{"title":"Connect your app to Qlik Cloud","sidebarTitle":"Qlik Cloud","href":"/integrations/qlik-cloud"},{"title":"Connect your app to Snowflake","sidebarTitle":"Snowflake","href":"/integrations/snowflake"}]},{"group":"Communication \u0026 messaging","pages":[{"title":"Connect your app to Brevo","sidebarTitle":"Brevo","href":"/integrations/brevo"},{"title":"Connect your app to Discord","sidebarTitle":"Discord","href":"/integrations/discord"},{"title":"Connect your app to Firebase Cloud Messaging","sidebarTitle":"Firebase Cloud Messaging","href":"/integrations/firebase-cloud-messaging"},{"title":"Connect your app to GatewayAPI","sidebarTitle":"GatewayAPI","href":"/integrations/gatewayapi"},{"title":"Connect your app to Mailgun","sidebarTitle":"Mailgun","href":"/integrations/mailgun"},{"title":"Connect your app to Resend","sidebarTitle":"Resend","href":"/integrations/resend"},{"title":"Connect your app to Slack","sidebarTitle":"Slack","href":"/integrations/slack"},{"title":"Connect your app to Telegram","sidebarTitle":"Telegram","href":"/integrations/telegram"},{"title":"Connect your app to Twilio","sidebarTitle":"Twilio","href":"/integrations/twilio"},{"title":"Connect your app to WhatsApp Business","sidebarTitle":"WhatsApp Business","href":"/integrations/whatsapp"}]},{"group":"CRM \u0026 sales","pages":[{"title":"Connect your app to Apollo.io","sidebarTitle":"Apollo.io","href":"/integrations/apollo"},{"title":"Connect your app to Attention","sidebarTitle":"Attention","href":"/integrations/attention"},{"title":"Connect your app to Clay","sidebarTitle":"Clay","href":"/integrations/clay"},{"title":"Connect your app to Gong","sidebarTitle":"Gong","href":"/integrations/gong"},{"title":"Connect your app to HubSpot","sidebarTitle":"HubSpot","href":"/integrations/hubspot"},{"title":"Connect your app to KLIPY","sidebarTitle":"KLIPY","href":"/integrations/klipy"},{"title":"Connect your app to Pipedrive","sidebarTitle":"Pipedrive","href":"/integrations/pipedrive"},{"title":"Connect your app to Salesforce","sidebarTitle":"Salesforce","href":"/integrations/salesforce"},{"title":"Connect your app to Zendesk","sidebarTitle":"Zendesk","href":"/integrations/zendesk"},{"title":"Connect your app to Zoho CRM","sidebarTitle":"Zoho CRM","href":"/integrations/zoho-crm"}]},{"group":"Developer tools","pages":[{"title":"Connect your app to AWS API","sidebarTitle":"AWS API","href":"/integrations/aws"},{"title":"Connect your app to Azure Cloud API","sidebarTitle":"Azure Cloud API","href":"/integrations/azure"},{"title":"Connect your app to Azure Graph \u0026 Entra API","sidebarTitle":"Azure Graph \u0026 Entra API","href":"/integrations/azure-graph"},{"title":"Connect your app to Cloudflare API","sidebarTitle":"Cloudflare API","href":"/integrations/cloudflare-api"},{"title":"Connect your app to GitHub API","sidebarTitle":"GitHub API","href":"/integrations/github-api"},{"title":"Connect your app to GitLab API","sidebarTitle":"GitLab API","href":"/integrations/gitlab-api"},{"title":"Connect your app to Google Cloud API","sidebarTitle":"Google Cloud API","href":"/integrations/gcp"},{"title":"Connect your app to Inngest","sidebarTitle":"Inngest","href":"/integrations/inngest"},{"title":"Connect your app to Linear","sidebarTitle":"Linear","href":"/integrations/linear"},{"title":"Connect your app to Logo.dev","sidebarTitle":"Logo.dev","href":"/integrations/logo-dev"},{"title":"Connect your app to the Lovable API","sidebarTitle":"Lovable API connector","href":"/integrations/lovable-api-connector"},{"title":"Connect your app to n8n","sidebarTitle":"n8n","href":"/integrations/n8n"}]},{"group":"E-commerce","pages":[{"title":"Connect your app to Lightspeed","sidebarTitle":"Lightspeed","href":"/integrations/lightspeed"},{"title":"Connect your app to PrestaShop","sidebarTitle":"PrestaShop","href":"/integrations/prestashop"},{"title":"Build a Shopify store with AI","sidebarTitle":"Shopify","href":"/integrations/shopify"},{"title":"Connect your app to WooCommerce","sidebarTitle":"WooCommerce","href":"/integrations/woocommerce"}]},{"group":"Finance \u0026 accounting","pages":[{"title":"Connect your app to Lexware","sidebarTitle":"Lexware","href":"/integrations/lexware"},{"title":"Connect your app to Sevdesk","sidebarTitle":"Sevdesk","href":"/integrations/sevdesk"},{"title":"Connect your app to Wave","sidebarTitle":"Wave","href":"/integrations/wave"},{"title":"Connect your app to Xero","sidebarTitle":"Xero","href":"/integrations/xero"},{"title":"Connect your app to Zoho Books","sidebarTitle":"Zoho Books","href":"/integrations/zoho-books"}]},{"group":"Maps \u0026 location","pages":[{"title":"Connect your app to Google Maps Platform","sidebarTitle":"Google Maps Platform","href":"/integrations/google-maps"},{"title":"Connect your app to Mapbox","sidebarTitle":"Mapbox","href":"/integrations/mapbox"}]},{"group":"Marketing \u0026 social","pages":[{"title":"Connect your app to beehiiv","sidebarTitle":"beehiiv","href":"/integrations/beehiiv"},{"title":"Connect your app to Bing Webmaster Tools","sidebarTitle":"Bing Webmaster Tools","href":"/integrations/bing-webmaster-tools"},{"title":"Connect your app to Google Analytics","sidebarTitle":"Google Analytics","href":"/integrations/google-analytics"},{"title":"Connect Google Business Profile to Lovable","sidebarTitle":"Google Business Profile","href":"/integrations/google-business-profile"},{"title":"Connect your app to Google Search Console (GSC)","sidebarTitle":"Google Search Console","href":"/integrations/google-search-console"},{"title":"Connect your app to Klaviyo","sidebarTitle":"Klaviyo","href":"/integrations/klaviyo"},{"title":"Connect your app to LinkedIn","sidebarTitle":"LinkedIn","href":"/integrations/linkedin"},{"title":"Connect your app to Loops","sidebarTitle":"Loops","href":"/integrations/loops"},{"title":"Connect your app to PostHog","sidebarTitle":"PostHog","href":"/integrations/posthog"},{"title":"Connect your app to Semrush","sidebarTitle":"Semrush","href":"/integrations/semrush"},{"title":"Connect your app to TikTok","sidebarTitle":"TikTok","href":"/integrations/tiktok"},{"title":"Connect your app to Twitch","sidebarTitle":"Twitch","href":"/integrations/twitch"},{"title":"Connect your app to X (Twitter)","sidebarTitle":"X (Twitter)","href":"/integrations/x"}]},{"group":"Payments \u0026 billing","pages":[{"title":"Connect your app to Chargebee","sidebarTitle":"Chargebee","href":"/integrations/chargebee"},{"title":"Connect your app to Pledge","sidebarTitle":"Pledge","href":"/integrations/pledge"},{"title":"Connect your app to Ramp","sidebarTitle":"Ramp","href":"/integrations/ramp"},{"title":"Connect your own Stripe account","sidebarTitle":"Stripe","href":"/integrations/stripe"}]},{"group":"Productivity","pages":[{"title":"Connect your app to Airtable","sidebarTitle":"Airtable","href":"/integrations/airtable"},{"title":"Connect your app to Asana","sidebarTitle":"Asana","href":"/integrations/asana"},{"title":"Connect your app to Ashby","sidebarTitle":"Ashby","href":"/integrations/ashby"},{"title":"Connect your app to Calendly","sidebarTitle":"Calendly","href":"/integrations/calendly"},{"title":"Connect your app to Fireflies","sidebarTitle":"Fireflies","href":"/integrations/fireflies"},{"title":"Connect your app to Google Workspace","sidebarTitle":"Google Workspace","href":"/integrations/google-workspace"},{"title":"Connect your app to Granola","sidebarTitle":"Granola","href":"/integrations/granola"},{"title":"Connect your app to incident.io","sidebarTitle":"incident.io","href":"/integrations/incidentio"},{"title":"Connect your app to Microsoft 365","sidebarTitle":"Microsoft","href":"/integrations/microsoft"},{"title":"Build and publish apps to Microsoft Copilot Managed Runtime","sidebarTitle":"Copilot Managed Runtime","href":"/integrations/microsoft-copilot-managed-runtime"},{"title":"Set up your Microsoft tenant for Copilot Managed Runtime","sidebarTitle":"Copilot Managed Runtime tenant setup","href":"/integrations/microsoft-copilot-managed-runtime-tenant-setup"},{"title":"Connect your app to Notion","sidebarTitle":"Notion","href":"/integrations/notion"},{"title":"Connect your app to Scrive for e-signatures and eID","sidebarTitle":"Scrive","href":"/integrations/scrive"},{"title":"Connect your app to Tally","sidebarTitle":"Tally","href":"/integrations/tally"},{"title":"Connect your app to Workday","sidebarTitle":"Workday","href":"/integrations/workday"}]},{"group":"Security \u0026 compliance","pages":[{"title":"Run AI-powered penetration tests with Aikido","sidebarTitle":"Aikido","href":"/integrations/aikido"},{"title":"Scan your projects for vulnerabilities with Wiz","sidebarTitle":"Wiz","href":"/integrations/wiz"}]},{"group":"Websites \u0026 CMS","pages":[{"title":"Connect your app to Contentful","sidebarTitle":"Contentful","href":"/integrations/contentful"},{"title":"Connect your app to Storyblok","sidebarTitle":"Storyblok","href":"/integrations/storyblok"},{"title":"Connect your app to Wix","sidebarTitle":"Wix","href":"/integrations/wix"},{"title":"Connect your app to WordPress (self-hosted)","sidebarTitle":"WordPress (self-hosted)","href":"/integrations/wordpress"},{"title":"Connect your app to WordPress.com","sidebarTitle":"WordPress.com","href":"/integrations/wordpress-com"}]}]},{"title":"Integrate any API with Lovable","sidebarTitle":"Connect any API","href":"/integrations/any-api"},{"group":"Git sync","root":{"title":"Sync your Lovable project code with GitHub, GitLab, or Bitbucket","sidebarTitle":"Git sync overview","href":"/integrations/git-sync-overview"},"pages":[{"title":"Sync your Lovable project with GitHub","sidebarTitle":"GitHub","href":"/integrations/github"},{"title":"Sync your Lovable project with GitLab","sidebarTitle":"GitLab","href":"/integrations/gitlab"},{"title":"Sync your Lovable project with Bitbucket","sidebarTitle":"Bitbucket","href":"/integrations/bitbucket"}]}]},{"group":"Collaborate","icon":"users","pages":[{"title":"Collaboration","href":"/features/collaboration"},{"title":"Share a project with internal or external collaborators","sidebarTitle":"Share a project","href":"/features/share-project"},{"title":"Project comments","sidebarTitle":"Project comments","href":"/features/project-comments"},{"title":"Control project access","sidebarTitle":"Project access","href":"/features/project-visibility"}]},{"group":"Deploy \u0026 host","icon":"globe","pages":[{"title":"How Lovable hosts your app","sidebarTitle":"Hosting","href":"/features/hosting"},{"title":"Publish your Lovable project","sidebarTitle":"Publish","href":"/features/publish"},{"title":"Set up a custom domain","sidebarTitle":"Custom domains","href":"/features/custom-domain"},{"title":"Transfer a domain to Lovable","sidebarTitle":"Transfer a domain","href":"/features/transfer-domain"},{"title":"Publish every app in your workspace under your own domain","sidebarTitle":"Publishing domain","tag":"ENT","href":"/features/publishing-domain"},{"title":"Publish apps with branded URLs","sidebarTitle":"Branded app URLs","href":"/features/branded-workspace-urls"},{"group":"Ownership \u0026 portability","root":{"title":"Deployment, hosting, and ownership options with Lovable","sidebarTitle":"Ownership \u0026 portability","href":"/tips-tricks/deployment-hosting-ownership"},"pages":[{"title":"Deploying and hosting outside Lovable","sidebarTitle":"Host outside Lovable","href":"/tips-tricks/external-deployment-hosting"}]}]},{"group":"Grow \u0026 optimize","icon":"chart-line","pages":[{"title":"Growth tools","sidebarTitle":"Growth tools","href":"/features/growth-tools"},{"title":"Optimize your app for SEO and AI search","sidebarTitle":"SEO and AEO","href":"/features/seo-aeo"},{"title":"Analytics","sidebarTitle":"Analytics","href":"/features/analytics"},{"title":"Advertise your app","sidebarTitle":"Ads","href":"/features/ads"},{"title":"Add payments to your app","sidebarTitle":"Payments","href":"/features/payments"},{"title":"Send branded emails from your own domain","sidebarTitle":"Emails","href":"/features/custom-emails"},{"title":"Publish your app as an MCP server","sidebarTitle":"Agent integrations","href":"/features/agent-integrations"},{"title":"Project monitoring","href":"/features/project-monitoring"}]},{"group":"Workspace \u0026 account","icon":"gear","pages":[{"group":"Workspace","root":{"title":"Lovable workspace","sidebarTitle":"Workspace","href":"/features/workspace"},"pages":[{"title":"Workspace admin settings","sidebarTitle":"Admin settings","href":"/features/workspace-admin-settings"},{"title":"Show an announcement banner to your workspace","sidebarTitle":"Announcements","href":"/features/workspace-announcements"},{"title":"Insights","sidebarTitle":"Insights","href":"/features/insights"},{"title":"Delete a workspace","href":"/introduction/delete-workspace"}]},{"group":"Organizations","root":{"title":"Organizations: run several workspaces as one company","sidebarTitle":"Organizations","tag":"ENT","href":"/features/organizations"},"pages":[{"title":"Set up organization identity: domains, SSO, and SCIM","sidebarTitle":"Organization identity","tag":"ENT","href":"/features/organization-identity"},{"title":"Manage people across the workspaces in your organization","sidebarTitle":"Organization people","tag":"ENT","href":"/features/organization-people"}]},{"group":"Access","pages":[{"title":"Manage workspace members from the People tab","sidebarTitle":"People","href":"/features/people"},{"title":"Groups","href":"/features/groups"},{"group":"Identity","root":{"title":"Manage workspace identity and user provisioning","sidebarTitle":"Workspace identity","href":"/features/workspace-identity"},"pages":[{"title":"Verify a domain for your workspace","sidebarTitle":"Verified domains","href":"/features/verified-domains"},{"title":"Set up workspace single sign-on (SSO)","sidebarTitle":"Workspace SSO","href":"/features/business/sso"},{"title":"Set up enterprise-managed authentication","sidebarTitle":"Enterprise-managed authentication","href":"/features/enterprise-managed-auth"},{"title":"Set up SCIM user provisioning","sidebarTitle":"SCIM provisioning","tag":"ENT","href":"/features/business/scim"}]},{"title":"Create and manage API keys","sidebarTitle":"API keys","href":"/features/api-keys"},{"title":"Connect apps to Lovable with OAuth","sidebarTitle":"OAuth clients","href":"/features/oauth-clients"}]},{"group":"Security","pages":[{"title":"Privacy \u0026 security settings","sidebarTitle":"Privacy \u0026 security","href":"/features/privacy-and-security-settings"},{"title":"Workspace policies","href":"/features/workspace-policies"},{"title":"Action center","href":"/features/action-center"},{"title":"EU inference","sidebarTitle":"EU inference","tag":"ENT","href":"/features/eu-inference"},{"group":"Security center","root":{"title":"Workspace security center","sidebarTitle":"Workspace security center","href":"/features/security-center"},"pages":[{"title":"Security insights","sidebarTitle":"Security insights","href":"/features/security-insights"}]},{"title":"Audit logs","tag":"ENT","href":"/features/audit-logs"},{"group":"Data exports","root":{"title":"Export audit logs to your SIEM or cloud storage","sidebarTitle":"Data exports","tag":"ENT","href":"/features/data-exports"},"pages":[{"title":"Export Lovable logs to Amazon S3","sidebarTitle":"Amazon S3","tag":"ENT","href":"/features/data-exports-amazon-s3"},{"title":"Export Lovable logs to Azure Blob Storage","sidebarTitle":"Azure Blob Storage","tag":"ENT","href":"/features/data-exports-azure-blob-storage"},{"title":"Export Lovable logs to Azure Log Analytics","sidebarTitle":"Azure Log Analytics","tag":"ENT","href":"/features/data-exports-azure-log-analytics"},{"title":"Export Lovable logs to Google Cloud Storage","sidebarTitle":"Google Cloud Storage","tag":"ENT","href":"/features/data-exports-google-cloud-storage"},{"title":"Export Lovable logs to Splunk","sidebarTitle":"Splunk","tag":"ENT","href":"/features/data-exports-splunk"}]},{"title":"Sensitive data scanning","tag":"ENT","href":"/features/sensitive-data-scanning"},{"title":"Manage training data and privacy","sidebarTitle":"Training data and privacy","href":"/features/business/data-opt-out"}]},{"group":"Your account","root":{"title":"Account settings","href":"/introduction/lovable-account-settings"},"pages":[{"title":"Two-factor authentication (2FA)","href":"/introduction/two-factor-authentication-2-fa"},{"title":"Delete account","href":"/introduction/delete-account"}]}]},{"group":"Plans \u0026 billing","icon":"credit-card","pages":[{"title":"Subscription plans","href":"/introduction/subscription-plans"},{"title":"Change or cancel your subscription","href":"/introduction/manage-subscription"},{"title":"Invoices, payments, and billing details","sidebarTitle":"Invoices and billing","href":"/introduction/invoices-and-billing"},{"title":"Credits and usage","href":"/introduction/credits-and-usage"},{"title":"Credit top-ups","href":"/introduction/credit-top-ups"},{"title":"Usage limits and alerts","sidebarTitle":"Usage limits \u0026 alerts","href":"/features/usage-limits-and-alerts"},{"title":"Low credit balance and out-of-credits recovery","sidebarTitle":"Low balance and recovery","href":"/introduction/out-of-credits"}]},{"group":"Guides \u0026 reference","icon":"life-ring","pages":[{"group":"Guides","pages":[{"title":"How to build a real product with Lovable","sidebarTitle":"Idea to product","href":"/tips-tricks/from-idea-to-app"},{"title":"Launch your site on a custom domain","sidebarTitle":"Launch on a custom domain","href":"/tips-tricks/launch-on-a-custom-domain"},{"title":"Prompting best practices","href":"/prompting/prompting-one"},{"title":"Prompt library","href":"/prompting/prompting-library"},{"title":"Debug and improve your app","sidebarTitle":"Debug \u0026 improve","href":"/prompting/prompting-debugging"},{"title":"Edit Google Docs, Sheets, and Slides in Lovable","sidebarTitle":"Edit Google files","href":"/tips-tricks/google-workspace-editing"}]},{"title":"FAQ","href":"/introduction/faq"},{"title":"Glossary","href":"/glossary"},{"title":"Video tutorials and courses","sidebarTitle":"Videos and courses","href":"/introduction/video-tutorials"},{"title":"Support policy","href":"/introduction/support-policy"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Connect your app to Databricks - Lovable Documentation","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}