[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-databricks-databricks-apps":3,"mdc--h2e1q6-key":33,"related-repo-databricks-databricks-apps":3592,"related-org-databricks-databricks-apps":3702},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":31,"mdContent":32},"databricks-apps","build applications on Databricks Apps","Build apps on Databricks Apps platform. Use when asked to create data apps, analytics tools, or custom interactive visualizations. A plain \"create a dashboard\" request means a managed AI\u002FBI (Lakeview) dashboard → use databricks-aibi-dashboards, not this skill. Evaluates data access patterns (analytics vs Lakebase synced tables) before scaffolding. Invoke BEFORE starting implementation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"databricks","Databricks","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdatabricks.png",[12,16,19,20],{"name":13,"slug":14,"type":15},"Dashboards","dashboards","tag",{"name":17,"slug":18,"type":15},"Data Analysis","data-analysis",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Analytics","analytics",204,"https:\u002F\u002Fgithub.com\u002Fdatabricks\u002Fdatabricks-agent-skills","2026-07-12T08:03:59.061458",null,60,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fdatabricks\u002Fdatabricks-agent-skills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdatabricks\u002Fcopilot\u002Fskills\u002Fdatabricks-apps","---\nname: databricks-apps\ndescription: \"Build apps on Databricks Apps platform. Use when asked to create data apps, analytics tools, or custom interactive visualizations. A plain \\\"create a dashboard\\\" request means a managed AI\u002FBI (Lakeview) dashboard → use databricks-aibi-dashboards, not this skill. Evaluates data access patterns (analytics vs Lakebase synced tables) before scaffolding. Invoke BEFORE starting implementation.\"\ncompatibility: Requires databricks CLI (>= v0.294.0)\nmetadata:\n  version: \"0.1.2\"\nparent: databricks-core\n---\n\n# Databricks Apps Development\n\n**FIRST**: Use the parent `databricks-core` skill for CLI basics, authentication, and profile selection.\n\n**Is this even a Databricks App?** Don't assume an app is the only way to show data. For a simple \"dashboard with a few charts\" and no app-specific need, the managed **AI\u002FBI (Lakeview) dashboard** is the simpler path → use the `databricks-aibi-dashboards` skill, not this one. Reach for a custom Databricks App only when the user needs something AI\u002FBI can't give them — bespoke interactivity\u002Fcomponents, write-back, embedded or auth-gated workflows, a Genie\u002Fchat surface inside the app — or explicitly asks for an app. If it's genuinely ambiguous, surface both options (managed AI\u002FBI dashboard vs custom app) and let the user choose instead of defaulting to an app. Once an app is the right call, it's fine for this skill to favor an app-based dashboard, and `databricks-app-design` covers building it well.\n\n**For data UI design (required for any data-displaying app)**: once you've confirmed the user wants a custom-code app (not a managed AI\u002FBI dashboard — see above), if the app shows ANY data — a KPI\u002Foverview page, report, chart, table, query results, OR a **conversational \u002F chat \u002F Genie natural-language assistant** — you MUST use the `databricks-app-design` skill (alongside this one) to decide layout, charts, KPIs, semantic color, required states, and AI-result trust, and map them to AppKit components. This includes chat\u002FGenie apps, not just static data views — if in doubt, use it.\n\nBuild apps that deploy to Databricks Apps platform.\n\n## Required Reading by Phase\n\n| Phase | READ BEFORE proceeding |\n|-------|------------------------|\n| Scaffolding | **⚠️ STOP — review the State Storage Guidance and complete the Data Access Decision Gate below before scaffolding.** Parent `databricks-core` skill (auth, warehouse discovery); then run `databricks apps manifest` + `databricks apps init` with `--features` and `--set` (see AppKit section below) |\n| Writing SQL queries | [SQL Queries Guide](references\u002Fappkit\u002Fsql-queries.md) |\n| Writing UI components | [Frontend Guide](references\u002Fappkit\u002Ffrontend.md) |\n| Using `useAnalyticsQuery` | [AppKit SDK](references\u002Fappkit\u002Fappkit-sdk.md) |\n| Adding API endpoints | [Custom Endpoints Guide](references\u002Fappkit\u002Fcustom-endpoints.md) |\n| Using Lakebase (OLTP database) | [Lakebase Guide](references\u002Fappkit\u002Flakebase.md) |\n| Adding Genie chat \u002F Genie-powered apps | [Genie Guide](references\u002Fappkit\u002Fgenie.md) — follow the Genie agent workflow below |\n| Using Model Serving (ML inference) | [Model Serving Guide](references\u002Fappkit\u002Fmodel-serving.md) |\n| Typed data contracts (proto-first design) | [Proto-First Guide](references\u002Fappkit\u002Fproto-first.md) and [Plugin Contracts](references\u002Fappkit\u002Fproto-contracts.md) |\n| Managing files in UC Volumes | [Files Guide](references\u002Fappkit\u002Ffiles.md) |\n| Triggering \u002F monitoring Lakeflow Jobs from the app | [Jobs Guide](references\u002Fappkit\u002Fjobs.md) |\n| Platform rules (permissions, deployment, limits) | [Platform Guide](references\u002Fplatform-guide.md) — READ for ALL apps including AppKit |\n| Non-AppKit app (Streamlit, FastAPI, Flask, Gradio, Next.js, etc.) | [Other Frameworks](references\u002Fother-frameworks.md) |\n\n## Generic Guidelines\n\n- **App name**: ≤26 characters, lowercase letters\u002Fnumbers\u002Fhyphens only (no underscores). dev- prefix adds 4 chars, max 30 total.\n- **Validation**: `databricks apps validate --profile \u003CPROFILE>` before deploying.\n- **Smoke tests** (AppKit only): ALWAYS update `tests\u002Fsmoke.spec.ts` selectors BEFORE running validation. Default template checks for \"Minimal Databricks App\" heading and \"hello world\" text — these WILL fail in your custom app. See [testing guide](references\u002Ftesting.md).\n- **Smoke test selectors**: use only Playwright locator APIs — `getByRole`, `getByText`, `getByPlaceholder`, `getByLabel`. `getByLabelText` does not exist in Playwright (it is a React Testing Library method) and throws `TypeError` at runtime. See [testing guide](references\u002Ftesting.md) or `npx playwright codegen`.\n- **Smoke test data**: keep result sets under the 1 MB analytics-event payload cap. Queries returning thousands of rows cause `INVALID_REQUEST: Event exceeds max size of 1048576 bytes` and `net::ERR_ABORTED`, leaving every asserted UI element absent. Use `LIMIT` or an aggregated query (e.g. `COUNT(*) GROUP BY status`) — never raw row dumps.\n- **AppKit version**: never override the `@databricks\u002Fappkit` or `@databricks\u002Fappkit-ui` version in `package.json` — `databricks apps init` sets the correct version. Do not run `npm install @databricks\u002Fappkit@\u003Cversion>` unless explicitly asked by the user. If you need a different version, re-scaffold with `databricks apps init --version \u003Cversion>`.\n- **Authentication**: covered by parent `databricks-core` skill.\n- **AppKit API surface**: before writing code that calls AppKit APIs (`createApp`, plugin shapes, `useAnalyticsQuery`, etc.), run `npx @databricks\u002Fappkit docs \u003Csection>` and use the actual signature. Training data has stale shapes; a single invented signature fails `tsc --noEmit` during validate. The docs ship with the installed AppKit and are the authoritative source.\n- **TypeScript casts**: never use `as unknown as \u003CT>` double-assertions — `appkit lint` enforces `no-double-type-assertion` and one violation fails the entire validate step. Instead: narrow with Zod (`z.infer\u003Ctypeof schema>`), use a runtime type guard, or write a typed mapper function. If a query result needs reshaping, type the row schema via queryKey types rather than casting.\n\n## Project Structure (after `databricks apps init --features analytics`)\n- `client\u002Fsrc\u002FApp.tsx` — main React component (start here)\n- `config\u002Fqueries\u002F*.sql` — SQL query files (queryKey = filename without .sql)\n- `server\u002Fserver.ts` — backend entry (`onPluginsReady` + Express routes)\n- `tests\u002Fsmoke.spec.ts` — smoke test (⚠️ MUST UPDATE selectors for your app)\n- `client\u002Fsrc\u002FappKitTypes.d.ts` — auto-generated types (`npm run typegen`)\n\n## Project Structure (after `databricks apps init --features lakebase`)\n- `server\u002Fserver.ts` — backend with Lakebase pool + Express routes\n- `client\u002Fsrc\u002FApp.tsx` — React frontend\n- `app.yaml` — manifest with `database` resource declaration\n- `package.json` — includes `@databricks\u002Flakebase` dependency\n- Note: **No `config\u002Fqueries\u002F`** — Lakebase apps use `appkit.lakebase.query()` in Express routes, not SQL files\n\n## Data Discovery\n\nBefore writing any SQL, use the parent `databricks-core` skill for data exploration — search `information_schema` by keyword, then batch `discover-schema` for the tables you need. Do NOT skip this step.\n\n**State Storage Guidance (evaluate BEFORE the Decision Gate):**\n\nIf the user's app description involves storing or persisting data — forms, CRUD operations, user submissions, orders, todos, or other user-generated content — the app likely needs a Lakebase database.\n\n1. **Ask the user** whether the app needs persistent storage (Lakebase) before scaffolding. Do not silently add Lakebase.\n2. If confirmed, **ask whether to reuse an existing Lakebase project or create a new one** (same as the Genie flow below) — never create one silently. Use the **`databricks-lakebase`** skill to obtain the branch and database resource names:\n   - **Reusing:** list with `databricks postgres list-projects`, then `list-branches` \u002F `list-databases`, and let the user pick the project, branch, and database; confirm which schema the app will own (a fresh\u002Fdedicated schema avoids the service-principal ownership conflict).\n   - **Creating:** create a new project (it auto-provisions a `production` branch + `databricks_postgres` database).\n3. Scaffold with `--features lakebase` and pass `--set lakebase.postgres.branch=\u003CBRANCH_NAME> --set lakebase.postgres.database=\u003CDATABASE_NAME>`.\n4. If the app **also** reads from Unity Catalog tables, proceed to the Data Access Decision Gate below to determine whether to add `--features analytics` or use Lakebase synced tables.\n\nDo NOT add Lakebase to analytics, dashboard, or visualization apps unless the user explicitly requests persistent write-back storage. Read-only data display, filters, and preferences do not require a database.\n\n## Development Workflow (FOLLOW THIS ORDER)\n\n**Data Access Decision Gate (REQUIRED before scaffolding):**\n\nIf the app reads from Unity Catalog \u002F lakehouse tables, you MUST show the comparison below to the user and ask them to choose. Do not skip this. Do not choose for them.\n\n| | **(A) Lakebase synced tables** | **(B) Analytics** |\n|--|---|---|\n| Speed | Sub-second responses | Takes a few seconds |\n| Best for | Full-text search, typeahead, autocomplete, real-time lookups, operational apps | Dashboards, charts, aggregations, KPIs, filtered queries, browsing |\n| How it works | Data synced from Delta into Lakebase Postgres | Queries run on SQL warehouse at read time |\n\nAfter showing the table, add a brief recommendation. Default to recommending Analytics (B) for most read-only apps — dashboards, charts, filtered queries, browsing, and aggregations. Recommend Lakebase synced tables (A) only when the app needs sub-second latency for full-text search, typeahead\u002Fautocomplete, real-time lookups by ID, or operational data serving. Note: \"search\" or \"filter\" in a prompt usually means SQL WHERE clauses (Analytics), not full-text search (Lakebase). Always let the user make the final call.\n\nAfter the user chooses:\n- (A) Lakebase synced tables → scaffold with `--features lakebase`. See [Lakebase Guide](references\u002Fappkit\u002Flakebase.md) for full workflow.\n- (B) Analytics → scaffold with `--features analytics`.\n- Both → scaffold with `--features analytics,lakebase` if the app needs both patterns.\n- If the app does NOT read Unity Catalog data (pure CRUD, Genie, Model Serving), skip this gate and scaffold with the appropriate `--features` flag.\n\n**Analytics apps** (`--features analytics`):\n\n1. Create SQL files in `config\u002Fqueries\u002F`\n2. Run `npm run typegen` — verify all queries show ✓\n3. Read `client\u002Fsrc\u002FappKitTypes.d.ts` to see generated types\n4. **THEN** write `App.tsx` using the generated types\n5. Update `tests\u002Fsmoke.spec.ts` selectors\n6. Run `databricks apps validate --profile \u003CPROFILE>`\n\n**DO NOT** write UI code before running typegen — types won't exist and you'll waste time on compilation errors.\n\n**Lakebase apps** (`--features lakebase`): No SQL files or typegen. See [Lakebase Guide](references\u002Fappkit\u002Flakebase.md) for the `onPluginsReady` pattern: initialize schema at startup, register Express routes in `server\u002Fserver.ts`, then build the React frontend.\n\n## When to Use What\n\nAfter completing the decision gate above, use this routing table:\n\n- **Read analytics data → display in chart\u002Ftable**: Use visualization components with `queryKey` prop\n- **Read analytics data → custom display (KPIs, cards)**: Use `useAnalyticsQuery` hook\n- **Read analytics data → need computation before display**: Still use `useAnalyticsQuery`, transform client-side\n- **Read lakehouse data at low latency (lookups, search, catalogs)**: Use Lakebase synced tables — see [Lakebase Guide](references\u002Fappkit\u002Flakebase.md)\n- **Read\u002Fwrite persistent data (users, orders, CRUD state)**: Use Lakebase via Express routes in `onPluginsReady` — see [Lakebase Guide](references\u002Fappkit\u002Flakebase.md)\n- **Natural language query interface over tables (Genie)**: Use `genie()` plugin — see [Genie Guide](references\u002Fappkit\u002Fgenie.md)\n- **Call ML model endpoint**: Use `serving()` plugin — see [Model Serving Guide](references\u002Fappkit\u002Fmodel-serving.md)\n- **Trigger or monitor a Lakeflow Job from the app**: Use the `jobs()` plugin — see [Jobs Guide](references\u002Fappkit\u002Fjobs.md)\n- **⚠️ NEVER add custom endpoints to run SELECT queries against the warehouse** — always use SQL files in `config\u002Fqueries\u002F`\n- **⚠️ NEVER use `useAnalyticsQuery` for Lakebase data** — it queries the SQL warehouse only\n\n## Frameworks\n\n### AppKit (Recommended)\n\nTypeScript\u002FReact framework with type-safe SQL queries and built-in components.\n\n**Official Documentation** — the source of truth for all API details:\n\n```bash\nnpx @databricks\u002Fappkit docs                              # ← ALWAYS start here to see available pages\nnpx @databricks\u002Fappkit docs \u003Cquery>                      # view a section by name or doc path\nnpx @databricks\u002Fappkit docs --full                       # full index with all API entries\nnpx @databricks\u002Fappkit docs \"appkit-ui API reference\"    # example: section by name\nnpx @databricks\u002Fappkit docs .\u002Fdocs\u002Fplugins\u002Fanalytics.md  # example: specific doc file\n```\n\n**DO NOT guess doc paths.** Run without args first, pick from the index. The `\u003Cquery>` argument accepts both section names (from the index) and file paths. Docs are the authority on component props, hook signatures, and server APIs — skill files only cover anti-patterns and gotchas.\n\n**App Manifest and Scaffolding**\n\n**Agent workflow for scaffolding: get the manifest first, then build the init command.**\n\n1. **Get the manifest** (JSON schema describing plugins and their resources):\n   ```bash\n   databricks apps manifest --profile \u003CPROFILE>\n   # See plugins available in a specific AppKit version:\n   databricks apps manifest --version \u003CVERSION> --profile \u003CPROFILE>\n   # Custom template:\n   databricks apps manifest --template \u003CGIT_URL> --profile \u003CPROFILE>\n   ```\n   The output defines:\n   - **Plugins**: each has a key (plugin ID for `--features`), plus `requiredByTemplate`, and `resources`.\n   - **requiredByTemplate**: If **true**, that plugin is **mandatory** for this template — do **not** add it to `--features` (it is included automatically); you must still supply all of its required resources via `--set`. If **false** or absent, the plugin is **optional** — add it to `--features` only when the user's prompt indicates they want that capability (e.g. analytics\u002FSQL), and then supply its required resources via `--set`.\n   - **Resources**: Each plugin has `resources.required` and `resources.optional` (arrays). Each item has `resourceKey` and `fields` (object: field name → description\u002Fenv). Use `--set \u003Cplugin>.\u003CresourceKey>.\u003Cfield>=\u003Cvalue>` for each required resource field of every plugin you include.\n\n2. **Scaffold** (DO NOT use `npx`; use the CLI only):\n   ```bash\n   databricks apps init --name \u003CNAME> --features \u003Cplugin1>,\u003Cplugin2> \\\n     --set \u003Cplugin1>.\u003CresourceKey>.\u003Cfield>=\u003Cvalue> \\\n     --set \u003Cplugin2>.\u003CresourceKey>.\u003Cfield>=\u003Cvalue> \\\n     --description \"\u003CDESC>\" --run none --profile \u003CPROFILE>\n   # --run none: skip auto-run after scaffolding (review code first)\n   # With custom template:\n   databricks apps init --template \u003CGIT_URL> --name \u003CNAME> --features ... --set ... --profile \u003CPROFILE>\n   ```\n   Optionally use `--version \u003CVERSION>` to target a specific AppKit version.\n   - **Required**: `--name`, `--profile`. Name: ≤26 chars, lowercase letters\u002Fnumbers\u002Fhyphens only. Use `--features` only for **optional** plugins the user wants (plugins with `requiredByTemplate: false` or absent); mandatory plugins must not be listed in `--features`.\n   - **Resources**: Pass `--set` for every required resource (each field in `resources.required`) for (1) all plugins with `requiredByTemplate: true`, and (2) any optional plugins you added to `--features`. Add `--set` for `resources.optional` only when the user requests them.\n   - **Discovery**: Use the parent `databricks-core` skill to resolve IDs (e.g. warehouse: `databricks warehouses list --profile \u003CPROFILE>` or `databricks experimental aitools tools get-default-warehouse --profile \u003CPROFILE>`).\n\n**DO NOT guess** plugin names, resource keys, or property names — always derive them from `databricks apps manifest` output. Example: if the manifest shows plugin `analytics` with a required resource `resourceKey: \"sql-warehouse\"` and `fields: { \"id\": ... }`, include `--set analytics.sql-warehouse.id=\u003CID>`.\n\n**Scaffolding Rules Protocol** — `databricks apps manifest` may emit `scaffolding.rules` at the template level (top-level `scaffolding.rules`) and on individual plugins (`plugins[].scaffolding.rules`). Each block has `must` \u002F `should` \u002F `never` arrays of short directive strings. Consume them as follows:\n\n1. **Gather** — for every plugin in your final `--features` list AND every plugin with `requiredByTemplate: true`, read `plugins[].scaffolding.rules`. Union those with the top-level template `scaffolding.rules` into one working set, tagged by source (template vs `\u003Cplugin>`).\n2. **Precedence** — manifest rules override the directives baked into this skill. Where the manifest is silent on a topic, this skill's content is the floor.\n3. **Phase ordering** — rules whose text begins with `Before init` MUST be executed before `databricks apps init`. Rules beginning with `After init` MUST be executed after init completes (e.g. migrations, typegen, connectivity checks). Rules without a phase prefix apply throughout the scaffold\u002Fdevelop loop.\n4. **Conflict detection** — if a plugin `must` rule contradicts a template `never` rule on the same target (or vice versa), STOP and ask the user which to follow before proceeding. Do not silently pick one. Treat `must` vs `never` on the same action as a conflict; `should` is advisory and does not block.\n5. **Reporting** — before running `databricks apps init`, surface the merged working set to the user grouped by phase (Before init \u002F After init \u002F Always) and by severity (must \u002F should \u002F never), so the active guardrails are explicit.\n\n**READ [AppKit Overview](references\u002Fappkit\u002Foverview.md)** for project structure, workflow, and pre-implementation checklist.\n\n**Genie Agent Workflow** — when the user wants a Genie-powered app, do **not** start by asking for a Genie Space ID. Instead:\n\n1. Ask which Unity Catalog tables the app should query (fully qualified: `catalog.schema.table`).\n2. Ask whether to reuse an existing Genie space or create a new one.\n3. If creating: discover the warehouse, then create the space with `databricks genie create-space` (see [Genie Guide](references\u002Fappkit\u002Fgenie.md) for syntax and serialized space format).\n4. If reusing: discover existing spaces with `databricks genie list-spaces --profile \u003CPROFILE>` and let the user pick.\n5. Scaffold or wire the space ID into the app — derive `--set` keys from `databricks apps manifest`.\n\nRead the [Genie Guide](references\u002Fappkit\u002Fgenie.md) for configuration, SSE endpoints, and frontend integration.\n\n### Common Scaffolding Mistakes\n\n```bash\n# ❌ WRONG: name is NOT a positional argument\ndatabricks apps init --features analytics my-app-name\n# → \"unknown command\" error\n\n# ✅ CORRECT: use --name flag\ndatabricks apps init --name my-app-name --features analytics --set \"...\" --profile \u003CPROFILE>\n```\n\n### Directory Naming\n\n`databricks apps init` creates directories in kebab-case matching the app name.\nApp names must be lowercase with hyphens only (≤26 chars).\n\n### Other Frameworks (Streamlit, FastAPI, Flask, Gradio, Dash, Next.js, etc.)\n\nDatabricks Apps supports any framework that runs as an HTTP server. LLMs already know these frameworks — the challenge is Databricks platform integration.\n\n**READ [Other Frameworks Guide](references\u002Fother-frameworks.md) BEFORE building any non-AppKit app.** It covers port\u002Fhost configuration, `app.yaml` and `databricks.yml` setup, dependency management, networking, and framework-specific gotchas.\n\n### Post-Deploy Verification\n\nAfter deploying, verify the app is running:\n\n```bash\ndatabricks apps get \u003Capp-name> --profile \u003CPROFILE> -o json   # Check app_status.state: RUNNING; the `url` field is the app's URL\ndatabricks apps logs \u003Capp-name> --follow --profile \u003CPROFILE>  # Stream live logs (Ctrl+C to stop)\n```\n\n> **Note:** `databricks apps logs` requires OAuth authentication and does not work with PAT. Use `databricks apps get` for status checks if using PAT auth.\n",{"data":34,"body":39},{"name":4,"description":6,"compatibility":35,"metadata":36,"parent":38},"Requires databricks CLI (>= v0.294.0)",{"version":37},"0.1.2","databricks-core",{"type":40,"children":41},"root",[42,51,71,104,128,133,140,447,453,777,791,863,875,961,967,995,1003,1008,1148,1153,1159,1167,1172,1257,1262,1267,1324,1341,1417,1427,1463,1469,1474,1658,1664,1671,1676,1686,1857,1875,1883,1891,2834,2880,2941,3094,3110,3126,3196,3207,3213,3351,3357,3367,3373,3378,3408,3414,3419,3556,3586],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"databricks-apps-development",[48],{"type":49,"value":50},"text","Databricks Apps Development",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55,61,63,69],{"type":43,"tag":56,"props":57,"children":58},"strong",{},[59],{"type":49,"value":60},"FIRST",{"type":49,"value":62},": Use the parent ",{"type":43,"tag":64,"props":65,"children":67},"code",{"className":66},[],[68],{"type":49,"value":38},{"type":49,"value":70}," skill for CLI basics, authentication, and profile selection.",{"type":43,"tag":52,"props":72,"children":73},{},[74,79,81,86,88,94,96,102],{"type":43,"tag":56,"props":75,"children":76},{},[77],{"type":49,"value":78},"Is this even a Databricks App?",{"type":49,"value":80}," Don't assume an app is the only way to show data. For a simple \"dashboard with a few charts\" and no app-specific need, the managed ",{"type":43,"tag":56,"props":82,"children":83},{},[84],{"type":49,"value":85},"AI\u002FBI (Lakeview) dashboard",{"type":49,"value":87}," is the simpler path → use the ",{"type":43,"tag":64,"props":89,"children":91},{"className":90},[],[92],{"type":49,"value":93},"databricks-aibi-dashboards",{"type":49,"value":95}," skill, not this one. Reach for a custom Databricks App only when the user needs something AI\u002FBI can't give them — bespoke interactivity\u002Fcomponents, write-back, embedded or auth-gated workflows, a Genie\u002Fchat surface inside the app — or explicitly asks for an app. If it's genuinely ambiguous, surface both options (managed AI\u002FBI dashboard vs custom app) and let the user choose instead of defaulting to an app. Once an app is the right call, it's fine for this skill to favor an app-based dashboard, and ",{"type":43,"tag":64,"props":97,"children":99},{"className":98},[],[100],{"type":49,"value":101},"databricks-app-design",{"type":49,"value":103}," covers building it well.",{"type":43,"tag":52,"props":105,"children":106},{},[107,112,114,119,121,126],{"type":43,"tag":56,"props":108,"children":109},{},[110],{"type":49,"value":111},"For data UI design (required for any data-displaying app)",{"type":49,"value":113},": once you've confirmed the user wants a custom-code app (not a managed AI\u002FBI dashboard — see above), if the app shows ANY data — a KPI\u002Foverview page, report, chart, table, query results, OR a ",{"type":43,"tag":56,"props":115,"children":116},{},[117],{"type":49,"value":118},"conversational \u002F chat \u002F Genie natural-language assistant",{"type":49,"value":120}," — you MUST use the ",{"type":43,"tag":64,"props":122,"children":124},{"className":123},[],[125],{"type":49,"value":101},{"type":49,"value":127}," skill (alongside this one) to decide layout, charts, KPIs, semantic color, required states, and AI-result trust, and map them to AppKit components. This includes chat\u002FGenie apps, not just static data views — if in doubt, use it.",{"type":43,"tag":52,"props":129,"children":130},{},[131],{"type":49,"value":132},"Build apps that deploy to Databricks Apps platform.",{"type":43,"tag":134,"props":135,"children":137},"h2",{"id":136},"required-reading-by-phase",[138],{"type":49,"value":139},"Required Reading by Phase",{"type":43,"tag":141,"props":142,"children":143},"table",{},[144,163],{"type":43,"tag":145,"props":146,"children":147},"thead",{},[148],{"type":43,"tag":149,"props":150,"children":151},"tr",{},[152,158],{"type":43,"tag":153,"props":154,"children":155},"th",{},[156],{"type":49,"value":157},"Phase",{"type":43,"tag":153,"props":159,"children":160},{},[161],{"type":49,"value":162},"READ BEFORE proceeding",{"type":43,"tag":164,"props":165,"children":166},"tbody",{},[167,225,243,260,283,300,317,336,353,377,394,411,430],{"type":43,"tag":149,"props":168,"children":169},{},[170,176],{"type":43,"tag":171,"props":172,"children":173},"td",{},[174],{"type":49,"value":175},"Scaffolding",{"type":43,"tag":171,"props":177,"children":178},{},[179,184,186,191,193,199,201,207,209,215,217,223],{"type":43,"tag":56,"props":180,"children":181},{},[182],{"type":49,"value":183},"⚠️ STOP — review the State Storage Guidance and complete the Data Access Decision Gate below before scaffolding.",{"type":49,"value":185}," Parent ",{"type":43,"tag":64,"props":187,"children":189},{"className":188},[],[190],{"type":49,"value":38},{"type":49,"value":192}," skill (auth, warehouse discovery); then run ",{"type":43,"tag":64,"props":194,"children":196},{"className":195},[],[197],{"type":49,"value":198},"databricks apps manifest",{"type":49,"value":200}," + ",{"type":43,"tag":64,"props":202,"children":204},{"className":203},[],[205],{"type":49,"value":206},"databricks apps init",{"type":49,"value":208}," with ",{"type":43,"tag":64,"props":210,"children":212},{"className":211},[],[213],{"type":49,"value":214},"--features",{"type":49,"value":216}," and ",{"type":43,"tag":64,"props":218,"children":220},{"className":219},[],[221],{"type":49,"value":222},"--set",{"type":49,"value":224}," (see AppKit section below)",{"type":43,"tag":149,"props":226,"children":227},{},[228,233],{"type":43,"tag":171,"props":229,"children":230},{},[231],{"type":49,"value":232},"Writing SQL queries",{"type":43,"tag":171,"props":234,"children":235},{},[236],{"type":43,"tag":237,"props":238,"children":240},"a",{"href":239},"references\u002Fappkit\u002Fsql-queries.md",[241],{"type":49,"value":242},"SQL Queries Guide",{"type":43,"tag":149,"props":244,"children":245},{},[246,251],{"type":43,"tag":171,"props":247,"children":248},{},[249],{"type":49,"value":250},"Writing UI components",{"type":43,"tag":171,"props":252,"children":253},{},[254],{"type":43,"tag":237,"props":255,"children":257},{"href":256},"references\u002Fappkit\u002Ffrontend.md",[258],{"type":49,"value":259},"Frontend Guide",{"type":43,"tag":149,"props":261,"children":262},{},[263,274],{"type":43,"tag":171,"props":264,"children":265},{},[266,268],{"type":49,"value":267},"Using ",{"type":43,"tag":64,"props":269,"children":271},{"className":270},[],[272],{"type":49,"value":273},"useAnalyticsQuery",{"type":43,"tag":171,"props":275,"children":276},{},[277],{"type":43,"tag":237,"props":278,"children":280},{"href":279},"references\u002Fappkit\u002Fappkit-sdk.md",[281],{"type":49,"value":282},"AppKit SDK",{"type":43,"tag":149,"props":284,"children":285},{},[286,291],{"type":43,"tag":171,"props":287,"children":288},{},[289],{"type":49,"value":290},"Adding API endpoints",{"type":43,"tag":171,"props":292,"children":293},{},[294],{"type":43,"tag":237,"props":295,"children":297},{"href":296},"references\u002Fappkit\u002Fcustom-endpoints.md",[298],{"type":49,"value":299},"Custom Endpoints Guide",{"type":43,"tag":149,"props":301,"children":302},{},[303,308],{"type":43,"tag":171,"props":304,"children":305},{},[306],{"type":49,"value":307},"Using Lakebase (OLTP database)",{"type":43,"tag":171,"props":309,"children":310},{},[311],{"type":43,"tag":237,"props":312,"children":314},{"href":313},"references\u002Fappkit\u002Flakebase.md",[315],{"type":49,"value":316},"Lakebase Guide",{"type":43,"tag":149,"props":318,"children":319},{},[320,325],{"type":43,"tag":171,"props":321,"children":322},{},[323],{"type":49,"value":324},"Adding Genie chat \u002F Genie-powered apps",{"type":43,"tag":171,"props":326,"children":327},{},[328,334],{"type":43,"tag":237,"props":329,"children":331},{"href":330},"references\u002Fappkit\u002Fgenie.md",[332],{"type":49,"value":333},"Genie Guide",{"type":49,"value":335}," — follow the Genie agent workflow below",{"type":43,"tag":149,"props":337,"children":338},{},[339,344],{"type":43,"tag":171,"props":340,"children":341},{},[342],{"type":49,"value":343},"Using Model Serving (ML inference)",{"type":43,"tag":171,"props":345,"children":346},{},[347],{"type":43,"tag":237,"props":348,"children":350},{"href":349},"references\u002Fappkit\u002Fmodel-serving.md",[351],{"type":49,"value":352},"Model Serving Guide",{"type":43,"tag":149,"props":354,"children":355},{},[356,361],{"type":43,"tag":171,"props":357,"children":358},{},[359],{"type":49,"value":360},"Typed data contracts (proto-first design)",{"type":43,"tag":171,"props":362,"children":363},{},[364,370,371],{"type":43,"tag":237,"props":365,"children":367},{"href":366},"references\u002Fappkit\u002Fproto-first.md",[368],{"type":49,"value":369},"Proto-First Guide",{"type":49,"value":216},{"type":43,"tag":237,"props":372,"children":374},{"href":373},"references\u002Fappkit\u002Fproto-contracts.md",[375],{"type":49,"value":376},"Plugin Contracts",{"type":43,"tag":149,"props":378,"children":379},{},[380,385],{"type":43,"tag":171,"props":381,"children":382},{},[383],{"type":49,"value":384},"Managing files in UC Volumes",{"type":43,"tag":171,"props":386,"children":387},{},[388],{"type":43,"tag":237,"props":389,"children":391},{"href":390},"references\u002Fappkit\u002Ffiles.md",[392],{"type":49,"value":393},"Files Guide",{"type":43,"tag":149,"props":395,"children":396},{},[397,402],{"type":43,"tag":171,"props":398,"children":399},{},[400],{"type":49,"value":401},"Triggering \u002F monitoring Lakeflow Jobs from the app",{"type":43,"tag":171,"props":403,"children":404},{},[405],{"type":43,"tag":237,"props":406,"children":408},{"href":407},"references\u002Fappkit\u002Fjobs.md",[409],{"type":49,"value":410},"Jobs Guide",{"type":43,"tag":149,"props":412,"children":413},{},[414,419],{"type":43,"tag":171,"props":415,"children":416},{},[417],{"type":49,"value":418},"Platform rules (permissions, deployment, limits)",{"type":43,"tag":171,"props":420,"children":421},{},[422,428],{"type":43,"tag":237,"props":423,"children":425},{"href":424},"references\u002Fplatform-guide.md",[426],{"type":49,"value":427},"Platform Guide",{"type":49,"value":429}," — READ for ALL apps including AppKit",{"type":43,"tag":149,"props":431,"children":432},{},[433,438],{"type":43,"tag":171,"props":434,"children":435},{},[436],{"type":49,"value":437},"Non-AppKit app (Streamlit, FastAPI, Flask, Gradio, Next.js, etc.)",{"type":43,"tag":171,"props":439,"children":440},{},[441],{"type":43,"tag":237,"props":442,"children":444},{"href":443},"references\u002Fother-frameworks.md",[445],{"type":49,"value":446},"Other Frameworks",{"type":43,"tag":134,"props":448,"children":450},{"id":449},"generic-guidelines",[451],{"type":49,"value":452},"Generic Guidelines",{"type":43,"tag":454,"props":455,"children":456},"ul",{},[457,468,486,512,581,622,677,694,735],{"type":43,"tag":458,"props":459,"children":460},"li",{},[461,466],{"type":43,"tag":56,"props":462,"children":463},{},[464],{"type":49,"value":465},"App name",{"type":49,"value":467},": ≤26 characters, lowercase letters\u002Fnumbers\u002Fhyphens only (no underscores). dev- prefix adds 4 chars, max 30 total.",{"type":43,"tag":458,"props":469,"children":470},{},[471,476,478,484],{"type":43,"tag":56,"props":472,"children":473},{},[474],{"type":49,"value":475},"Validation",{"type":49,"value":477},": ",{"type":43,"tag":64,"props":479,"children":481},{"className":480},[],[482],{"type":49,"value":483},"databricks apps validate --profile \u003CPROFILE>",{"type":49,"value":485}," before deploying.",{"type":43,"tag":458,"props":487,"children":488},{},[489,494,496,502,504,510],{"type":43,"tag":56,"props":490,"children":491},{},[492],{"type":49,"value":493},"Smoke tests",{"type":49,"value":495}," (AppKit only): ALWAYS update ",{"type":43,"tag":64,"props":497,"children":499},{"className":498},[],[500],{"type":49,"value":501},"tests\u002Fsmoke.spec.ts",{"type":49,"value":503}," selectors BEFORE running validation. Default template checks for \"Minimal Databricks App\" heading and \"hello world\" text — these WILL fail in your custom app. See ",{"type":43,"tag":237,"props":505,"children":507},{"href":506},"references\u002Ftesting.md",[508],{"type":49,"value":509},"testing guide",{"type":49,"value":511},".",{"type":43,"tag":458,"props":513,"children":514},{},[515,520,522,528,530,536,537,543,544,550,552,558,560,566,568,572,574,580],{"type":43,"tag":56,"props":516,"children":517},{},[518],{"type":49,"value":519},"Smoke test selectors",{"type":49,"value":521},": use only Playwright locator APIs — ",{"type":43,"tag":64,"props":523,"children":525},{"className":524},[],[526],{"type":49,"value":527},"getByRole",{"type":49,"value":529},", ",{"type":43,"tag":64,"props":531,"children":533},{"className":532},[],[534],{"type":49,"value":535},"getByText",{"type":49,"value":529},{"type":43,"tag":64,"props":538,"children":540},{"className":539},[],[541],{"type":49,"value":542},"getByPlaceholder",{"type":49,"value":529},{"type":43,"tag":64,"props":545,"children":547},{"className":546},[],[548],{"type":49,"value":549},"getByLabel",{"type":49,"value":551},". ",{"type":43,"tag":64,"props":553,"children":555},{"className":554},[],[556],{"type":49,"value":557},"getByLabelText",{"type":49,"value":559}," does not exist in Playwright (it is a React Testing Library method) and throws ",{"type":43,"tag":64,"props":561,"children":563},{"className":562},[],[564],{"type":49,"value":565},"TypeError",{"type":49,"value":567}," at runtime. See ",{"type":43,"tag":237,"props":569,"children":570},{"href":506},[571],{"type":49,"value":509},{"type":49,"value":573}," or ",{"type":43,"tag":64,"props":575,"children":577},{"className":576},[],[578],{"type":49,"value":579},"npx playwright codegen",{"type":49,"value":511},{"type":43,"tag":458,"props":582,"children":583},{},[584,589,591,597,598,604,606,612,614,620],{"type":43,"tag":56,"props":585,"children":586},{},[587],{"type":49,"value":588},"Smoke test data",{"type":49,"value":590},": keep result sets under the 1 MB analytics-event payload cap. Queries returning thousands of rows cause ",{"type":43,"tag":64,"props":592,"children":594},{"className":593},[],[595],{"type":49,"value":596},"INVALID_REQUEST: Event exceeds max size of 1048576 bytes",{"type":49,"value":216},{"type":43,"tag":64,"props":599,"children":601},{"className":600},[],[602],{"type":49,"value":603},"net::ERR_ABORTED",{"type":49,"value":605},", leaving every asserted UI element absent. Use ",{"type":43,"tag":64,"props":607,"children":609},{"className":608},[],[610],{"type":49,"value":611},"LIMIT",{"type":49,"value":613}," or an aggregated query (e.g. ",{"type":43,"tag":64,"props":615,"children":617},{"className":616},[],[618],{"type":49,"value":619},"COUNT(*) GROUP BY status",{"type":49,"value":621},") — never raw row dumps.",{"type":43,"tag":458,"props":623,"children":624},{},[625,630,632,638,639,645,647,653,655,660,662,668,670,676],{"type":43,"tag":56,"props":626,"children":627},{},[628],{"type":49,"value":629},"AppKit version",{"type":49,"value":631},": never override the ",{"type":43,"tag":64,"props":633,"children":635},{"className":634},[],[636],{"type":49,"value":637},"@databricks\u002Fappkit",{"type":49,"value":573},{"type":43,"tag":64,"props":640,"children":642},{"className":641},[],[643],{"type":49,"value":644},"@databricks\u002Fappkit-ui",{"type":49,"value":646}," version in ",{"type":43,"tag":64,"props":648,"children":650},{"className":649},[],[651],{"type":49,"value":652},"package.json",{"type":49,"value":654}," — ",{"type":43,"tag":64,"props":656,"children":658},{"className":657},[],[659],{"type":49,"value":206},{"type":49,"value":661}," sets the correct version. Do not run ",{"type":43,"tag":64,"props":663,"children":665},{"className":664},[],[666],{"type":49,"value":667},"npm install @databricks\u002Fappkit@\u003Cversion>",{"type":49,"value":669}," unless explicitly asked by the user. If you need a different version, re-scaffold with ",{"type":43,"tag":64,"props":671,"children":673},{"className":672},[],[674],{"type":49,"value":675},"databricks apps init --version \u003Cversion>",{"type":49,"value":511},{"type":43,"tag":458,"props":678,"children":679},{},[680,685,687,692],{"type":43,"tag":56,"props":681,"children":682},{},[683],{"type":49,"value":684},"Authentication",{"type":49,"value":686},": covered by parent ",{"type":43,"tag":64,"props":688,"children":690},{"className":689},[],[691],{"type":49,"value":38},{"type":49,"value":693}," skill.",{"type":43,"tag":458,"props":695,"children":696},{},[697,702,704,710,712,717,719,725,727,733],{"type":43,"tag":56,"props":698,"children":699},{},[700],{"type":49,"value":701},"AppKit API surface",{"type":49,"value":703},": before writing code that calls AppKit APIs (",{"type":43,"tag":64,"props":705,"children":707},{"className":706},[],[708],{"type":49,"value":709},"createApp",{"type":49,"value":711},", plugin shapes, ",{"type":43,"tag":64,"props":713,"children":715},{"className":714},[],[716],{"type":49,"value":273},{"type":49,"value":718},", etc.), run ",{"type":43,"tag":64,"props":720,"children":722},{"className":721},[],[723],{"type":49,"value":724},"npx @databricks\u002Fappkit docs \u003Csection>",{"type":49,"value":726}," and use the actual signature. Training data has stale shapes; a single invented signature fails ",{"type":43,"tag":64,"props":728,"children":730},{"className":729},[],[731],{"type":49,"value":732},"tsc --noEmit",{"type":49,"value":734}," during validate. The docs ship with the installed AppKit and are the authoritative source.",{"type":43,"tag":458,"props":736,"children":737},{},[738,743,745,751,753,759,761,767,769,775],{"type":43,"tag":56,"props":739,"children":740},{},[741],{"type":49,"value":742},"TypeScript casts",{"type":49,"value":744},": never use ",{"type":43,"tag":64,"props":746,"children":748},{"className":747},[],[749],{"type":49,"value":750},"as unknown as \u003CT>",{"type":49,"value":752}," double-assertions — ",{"type":43,"tag":64,"props":754,"children":756},{"className":755},[],[757],{"type":49,"value":758},"appkit lint",{"type":49,"value":760}," enforces ",{"type":43,"tag":64,"props":762,"children":764},{"className":763},[],[765],{"type":49,"value":766},"no-double-type-assertion",{"type":49,"value":768}," and one violation fails the entire validate step. Instead: narrow with Zod (",{"type":43,"tag":64,"props":770,"children":772},{"className":771},[],[773],{"type":49,"value":774},"z.infer\u003Ctypeof schema>",{"type":49,"value":776},"), use a runtime type guard, or write a typed mapper function. If a query result needs reshaping, type the row schema via queryKey types rather than casting.",{"type":43,"tag":134,"props":778,"children":780},{"id":779},"project-structure-after-databricks-apps-init-features-analytics",[781,783,789],{"type":49,"value":782},"Project Structure (after ",{"type":43,"tag":64,"props":784,"children":786},{"className":785},[],[787],{"type":49,"value":788},"databricks apps init --features analytics",{"type":49,"value":790},")",{"type":43,"tag":454,"props":792,"children":793},{},[794,805,816,835,845],{"type":43,"tag":458,"props":795,"children":796},{},[797,803],{"type":43,"tag":64,"props":798,"children":800},{"className":799},[],[801],{"type":49,"value":802},"client\u002Fsrc\u002FApp.tsx",{"type":49,"value":804}," — main React component (start here)",{"type":43,"tag":458,"props":806,"children":807},{},[808,814],{"type":43,"tag":64,"props":809,"children":811},{"className":810},[],[812],{"type":49,"value":813},"config\u002Fqueries\u002F*.sql",{"type":49,"value":815}," — SQL query files (queryKey = filename without .sql)",{"type":43,"tag":458,"props":817,"children":818},{},[819,825,827,833],{"type":43,"tag":64,"props":820,"children":822},{"className":821},[],[823],{"type":49,"value":824},"server\u002Fserver.ts",{"type":49,"value":826}," — backend entry (",{"type":43,"tag":64,"props":828,"children":830},{"className":829},[],[831],{"type":49,"value":832},"onPluginsReady",{"type":49,"value":834}," + Express routes)",{"type":43,"tag":458,"props":836,"children":837},{},[838,843],{"type":43,"tag":64,"props":839,"children":841},{"className":840},[],[842],{"type":49,"value":501},{"type":49,"value":844}," — smoke test (⚠️ MUST UPDATE selectors for your app)",{"type":43,"tag":458,"props":846,"children":847},{},[848,854,856,862],{"type":43,"tag":64,"props":849,"children":851},{"className":850},[],[852],{"type":49,"value":853},"client\u002Fsrc\u002FappKitTypes.d.ts",{"type":49,"value":855}," — auto-generated types (",{"type":43,"tag":64,"props":857,"children":859},{"className":858},[],[860],{"type":49,"value":861},"npm run typegen",{"type":49,"value":790},{"type":43,"tag":134,"props":864,"children":866},{"id":865},"project-structure-after-databricks-apps-init-features-lakebase",[867,868,874],{"type":49,"value":782},{"type":43,"tag":64,"props":869,"children":871},{"className":870},[],[872],{"type":49,"value":873},"databricks apps init --features lakebase",{"type":49,"value":790},{"type":43,"tag":454,"props":876,"children":877},{},[878,888,898,917,935],{"type":43,"tag":458,"props":879,"children":880},{},[881,886],{"type":43,"tag":64,"props":882,"children":884},{"className":883},[],[885],{"type":49,"value":824},{"type":49,"value":887}," — backend with Lakebase pool + Express routes",{"type":43,"tag":458,"props":889,"children":890},{},[891,896],{"type":43,"tag":64,"props":892,"children":894},{"className":893},[],[895],{"type":49,"value":802},{"type":49,"value":897}," — React frontend",{"type":43,"tag":458,"props":899,"children":900},{},[901,907,909,915],{"type":43,"tag":64,"props":902,"children":904},{"className":903},[],[905],{"type":49,"value":906},"app.yaml",{"type":49,"value":908}," — manifest with ",{"type":43,"tag":64,"props":910,"children":912},{"className":911},[],[913],{"type":49,"value":914},"database",{"type":49,"value":916}," resource declaration",{"type":43,"tag":458,"props":918,"children":919},{},[920,925,927,933],{"type":43,"tag":64,"props":921,"children":923},{"className":922},[],[924],{"type":49,"value":652},{"type":49,"value":926}," — includes ",{"type":43,"tag":64,"props":928,"children":930},{"className":929},[],[931],{"type":49,"value":932},"@databricks\u002Flakebase",{"type":49,"value":934}," dependency",{"type":43,"tag":458,"props":936,"children":937},{},[938,940,951,953,959],{"type":49,"value":939},"Note: ",{"type":43,"tag":56,"props":941,"children":942},{},[943,945],{"type":49,"value":944},"No ",{"type":43,"tag":64,"props":946,"children":948},{"className":947},[],[949],{"type":49,"value":950},"config\u002Fqueries\u002F",{"type":49,"value":952}," — Lakebase apps use ",{"type":43,"tag":64,"props":954,"children":956},{"className":955},[],[957],{"type":49,"value":958},"appkit.lakebase.query()",{"type":49,"value":960}," in Express routes, not SQL files",{"type":43,"tag":134,"props":962,"children":964},{"id":963},"data-discovery",[965],{"type":49,"value":966},"Data Discovery",{"type":43,"tag":52,"props":968,"children":969},{},[970,972,977,979,985,987,993],{"type":49,"value":971},"Before writing any SQL, use the parent ",{"type":43,"tag":64,"props":973,"children":975},{"className":974},[],[976],{"type":49,"value":38},{"type":49,"value":978}," skill for data exploration — search ",{"type":43,"tag":64,"props":980,"children":982},{"className":981},[],[983],{"type":49,"value":984},"information_schema",{"type":49,"value":986}," by keyword, then batch ",{"type":43,"tag":64,"props":988,"children":990},{"className":989},[],[991],{"type":49,"value":992},"discover-schema",{"type":49,"value":994}," for the tables you need. Do NOT skip this step.",{"type":43,"tag":52,"props":996,"children":997},{},[998],{"type":43,"tag":56,"props":999,"children":1000},{},[1001],{"type":49,"value":1002},"State Storage Guidance (evaluate BEFORE the Decision Gate):",{"type":43,"tag":52,"props":1004,"children":1005},{},[1006],{"type":49,"value":1007},"If the user's app description involves storing or persisting data — forms, CRUD operations, user submissions, orders, todos, or other user-generated content — the app likely needs a Lakebase database.",{"type":43,"tag":1009,"props":1010,"children":1011},"ol",{},[1012,1022,1108,1128],{"type":43,"tag":458,"props":1013,"children":1014},{},[1015,1020],{"type":43,"tag":56,"props":1016,"children":1017},{},[1018],{"type":49,"value":1019},"Ask the user",{"type":49,"value":1021}," whether the app needs persistent storage (Lakebase) before scaffolding. Do not silently add Lakebase.",{"type":43,"tag":458,"props":1023,"children":1024},{},[1025,1027,1032,1034,1043,1045],{"type":49,"value":1026},"If confirmed, ",{"type":43,"tag":56,"props":1028,"children":1029},{},[1030],{"type":49,"value":1031},"ask whether to reuse an existing Lakebase project or create a new one",{"type":49,"value":1033}," (same as the Genie flow below) — never create one silently. Use the ",{"type":43,"tag":56,"props":1035,"children":1036},{},[1037],{"type":43,"tag":64,"props":1038,"children":1040},{"className":1039},[],[1041],{"type":49,"value":1042},"databricks-lakebase",{"type":49,"value":1044}," skill to obtain the branch and database resource names:\n",{"type":43,"tag":454,"props":1046,"children":1047},{},[1048,1082],{"type":43,"tag":458,"props":1049,"children":1050},{},[1051,1056,1058,1064,1066,1072,1074,1080],{"type":43,"tag":56,"props":1052,"children":1053},{},[1054],{"type":49,"value":1055},"Reusing:",{"type":49,"value":1057}," list with ",{"type":43,"tag":64,"props":1059,"children":1061},{"className":1060},[],[1062],{"type":49,"value":1063},"databricks postgres list-projects",{"type":49,"value":1065},", then ",{"type":43,"tag":64,"props":1067,"children":1069},{"className":1068},[],[1070],{"type":49,"value":1071},"list-branches",{"type":49,"value":1073}," \u002F ",{"type":43,"tag":64,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":49,"value":1079},"list-databases",{"type":49,"value":1081},", and let the user pick the project, branch, and database; confirm which schema the app will own (a fresh\u002Fdedicated schema avoids the service-principal ownership conflict).",{"type":43,"tag":458,"props":1083,"children":1084},{},[1085,1090,1092,1098,1100,1106],{"type":43,"tag":56,"props":1086,"children":1087},{},[1088],{"type":49,"value":1089},"Creating:",{"type":49,"value":1091}," create a new project (it auto-provisions a ",{"type":43,"tag":64,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":49,"value":1097},"production",{"type":49,"value":1099}," branch + ",{"type":43,"tag":64,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":49,"value":1105},"databricks_postgres",{"type":49,"value":1107}," database).",{"type":43,"tag":458,"props":1109,"children":1110},{},[1111,1113,1119,1121,1127],{"type":49,"value":1112},"Scaffold with ",{"type":43,"tag":64,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":49,"value":1118},"--features lakebase",{"type":49,"value":1120}," and pass ",{"type":43,"tag":64,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":49,"value":1126},"--set lakebase.postgres.branch=\u003CBRANCH_NAME> --set lakebase.postgres.database=\u003CDATABASE_NAME>",{"type":49,"value":511},{"type":43,"tag":458,"props":1129,"children":1130},{},[1131,1133,1138,1140,1146],{"type":49,"value":1132},"If the app ",{"type":43,"tag":56,"props":1134,"children":1135},{},[1136],{"type":49,"value":1137},"also",{"type":49,"value":1139}," reads from Unity Catalog tables, proceed to the Data Access Decision Gate below to determine whether to add ",{"type":43,"tag":64,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":49,"value":1145},"--features analytics",{"type":49,"value":1147}," or use Lakebase synced tables.",{"type":43,"tag":52,"props":1149,"children":1150},{},[1151],{"type":49,"value":1152},"Do NOT add Lakebase to analytics, dashboard, or visualization apps unless the user explicitly requests persistent write-back storage. Read-only data display, filters, and preferences do not require a database.",{"type":43,"tag":134,"props":1154,"children":1156},{"id":1155},"development-workflow-follow-this-order",[1157],{"type":49,"value":1158},"Development Workflow (FOLLOW THIS ORDER)",{"type":43,"tag":52,"props":1160,"children":1161},{},[1162],{"type":43,"tag":56,"props":1163,"children":1164},{},[1165],{"type":49,"value":1166},"Data Access Decision Gate (REQUIRED before scaffolding):",{"type":43,"tag":52,"props":1168,"children":1169},{},[1170],{"type":49,"value":1171},"If the app reads from Unity Catalog \u002F lakehouse tables, you MUST show the comparison below to the user and ask them to choose. Do not skip this. Do not choose for them.",{"type":43,"tag":141,"props":1173,"children":1174},{},[1175,1200],{"type":43,"tag":145,"props":1176,"children":1177},{},[1178],{"type":43,"tag":149,"props":1179,"children":1180},{},[1181,1184,1192],{"type":43,"tag":153,"props":1182,"children":1183},{},[],{"type":43,"tag":153,"props":1185,"children":1186},{},[1187],{"type":43,"tag":56,"props":1188,"children":1189},{},[1190],{"type":49,"value":1191},"(A) Lakebase synced tables",{"type":43,"tag":153,"props":1193,"children":1194},{},[1195],{"type":43,"tag":56,"props":1196,"children":1197},{},[1198],{"type":49,"value":1199},"(B) Analytics",{"type":43,"tag":164,"props":1201,"children":1202},{},[1203,1221,1239],{"type":43,"tag":149,"props":1204,"children":1205},{},[1206,1211,1216],{"type":43,"tag":171,"props":1207,"children":1208},{},[1209],{"type":49,"value":1210},"Speed",{"type":43,"tag":171,"props":1212,"children":1213},{},[1214],{"type":49,"value":1215},"Sub-second responses",{"type":43,"tag":171,"props":1217,"children":1218},{},[1219],{"type":49,"value":1220},"Takes a few seconds",{"type":43,"tag":149,"props":1222,"children":1223},{},[1224,1229,1234],{"type":43,"tag":171,"props":1225,"children":1226},{},[1227],{"type":49,"value":1228},"Best for",{"type":43,"tag":171,"props":1230,"children":1231},{},[1232],{"type":49,"value":1233},"Full-text search, typeahead, autocomplete, real-time lookups, operational apps",{"type":43,"tag":171,"props":1235,"children":1236},{},[1237],{"type":49,"value":1238},"Dashboards, charts, aggregations, KPIs, filtered queries, browsing",{"type":43,"tag":149,"props":1240,"children":1241},{},[1242,1247,1252],{"type":43,"tag":171,"props":1243,"children":1244},{},[1245],{"type":49,"value":1246},"How it works",{"type":43,"tag":171,"props":1248,"children":1249},{},[1250],{"type":49,"value":1251},"Data synced from Delta into Lakebase Postgres",{"type":43,"tag":171,"props":1253,"children":1254},{},[1255],{"type":49,"value":1256},"Queries run on SQL warehouse at read time",{"type":43,"tag":52,"props":1258,"children":1259},{},[1260],{"type":49,"value":1261},"After showing the table, add a brief recommendation. Default to recommending Analytics (B) for most read-only apps — dashboards, charts, filtered queries, browsing, and aggregations. Recommend Lakebase synced tables (A) only when the app needs sub-second latency for full-text search, typeahead\u002Fautocomplete, real-time lookups by ID, or operational data serving. Note: \"search\" or \"filter\" in a prompt usually means SQL WHERE clauses (Analytics), not full-text search (Lakebase). Always let the user make the final call.",{"type":43,"tag":52,"props":1263,"children":1264},{},[1265],{"type":49,"value":1266},"After the user chooses:",{"type":43,"tag":454,"props":1268,"children":1269},{},[1270,1288,1299,1312],{"type":43,"tag":458,"props":1271,"children":1272},{},[1273,1275,1280,1282,1286],{"type":49,"value":1274},"(A) Lakebase synced tables → scaffold with ",{"type":43,"tag":64,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":49,"value":1118},{"type":49,"value":1281},". See ",{"type":43,"tag":237,"props":1283,"children":1284},{"href":313},[1285],{"type":49,"value":316},{"type":49,"value":1287}," for full workflow.",{"type":43,"tag":458,"props":1289,"children":1290},{},[1291,1293,1298],{"type":49,"value":1292},"(B) Analytics → scaffold with ",{"type":43,"tag":64,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":49,"value":1145},{"type":49,"value":511},{"type":43,"tag":458,"props":1300,"children":1301},{},[1302,1304,1310],{"type":49,"value":1303},"Both → scaffold with ",{"type":43,"tag":64,"props":1305,"children":1307},{"className":1306},[],[1308],{"type":49,"value":1309},"--features analytics,lakebase",{"type":49,"value":1311}," if the app needs both patterns.",{"type":43,"tag":458,"props":1313,"children":1314},{},[1315,1317,1322],{"type":49,"value":1316},"If the app does NOT read Unity Catalog data (pure CRUD, Genie, Model Serving), skip this gate and scaffold with the appropriate ",{"type":43,"tag":64,"props":1318,"children":1320},{"className":1319},[],[1321],{"type":49,"value":214},{"type":49,"value":1323}," flag.",{"type":43,"tag":52,"props":1325,"children":1326},{},[1327,1332,1334,1339],{"type":43,"tag":56,"props":1328,"children":1329},{},[1330],{"type":49,"value":1331},"Analytics apps",{"type":49,"value":1333}," (",{"type":43,"tag":64,"props":1335,"children":1337},{"className":1336},[],[1338],{"type":49,"value":1145},{"type":49,"value":1340},"):",{"type":43,"tag":1009,"props":1342,"children":1343},{},[1344,1354,1366,1378,1396,1408],{"type":43,"tag":458,"props":1345,"children":1346},{},[1347,1349],{"type":49,"value":1348},"Create SQL files in ",{"type":43,"tag":64,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":49,"value":950},{"type":43,"tag":458,"props":1355,"children":1356},{},[1357,1359,1364],{"type":49,"value":1358},"Run ",{"type":43,"tag":64,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":49,"value":861},{"type":49,"value":1365}," — verify all queries show ✓",{"type":43,"tag":458,"props":1367,"children":1368},{},[1369,1371,1376],{"type":49,"value":1370},"Read ",{"type":43,"tag":64,"props":1372,"children":1374},{"className":1373},[],[1375],{"type":49,"value":853},{"type":49,"value":1377}," to see generated types",{"type":43,"tag":458,"props":1379,"children":1380},{},[1381,1386,1388,1394],{"type":43,"tag":56,"props":1382,"children":1383},{},[1384],{"type":49,"value":1385},"THEN",{"type":49,"value":1387}," write ",{"type":43,"tag":64,"props":1389,"children":1391},{"className":1390},[],[1392],{"type":49,"value":1393},"App.tsx",{"type":49,"value":1395}," using the generated types",{"type":43,"tag":458,"props":1397,"children":1398},{},[1399,1401,1406],{"type":49,"value":1400},"Update ",{"type":43,"tag":64,"props":1402,"children":1404},{"className":1403},[],[1405],{"type":49,"value":501},{"type":49,"value":1407}," selectors",{"type":43,"tag":458,"props":1409,"children":1410},{},[1411,1412],{"type":49,"value":1358},{"type":43,"tag":64,"props":1413,"children":1415},{"className":1414},[],[1416],{"type":49,"value":483},{"type":43,"tag":52,"props":1418,"children":1419},{},[1420,1425],{"type":43,"tag":56,"props":1421,"children":1422},{},[1423],{"type":49,"value":1424},"DO NOT",{"type":49,"value":1426}," write UI code before running typegen — types won't exist and you'll waste time on compilation errors.",{"type":43,"tag":52,"props":1428,"children":1429},{},[1430,1435,1436,1441,1443,1447,1449,1454,1456,1461],{"type":43,"tag":56,"props":1431,"children":1432},{},[1433],{"type":49,"value":1434},"Lakebase apps",{"type":49,"value":1333},{"type":43,"tag":64,"props":1437,"children":1439},{"className":1438},[],[1440],{"type":49,"value":1118},{"type":49,"value":1442},"): No SQL files or typegen. See ",{"type":43,"tag":237,"props":1444,"children":1445},{"href":313},[1446],{"type":49,"value":316},{"type":49,"value":1448}," for the ",{"type":43,"tag":64,"props":1450,"children":1452},{"className":1451},[],[1453],{"type":49,"value":832},{"type":49,"value":1455}," pattern: initialize schema at startup, register Express routes in ",{"type":43,"tag":64,"props":1457,"children":1459},{"className":1458},[],[1460],{"type":49,"value":824},{"type":49,"value":1462},", then build the React frontend.",{"type":43,"tag":134,"props":1464,"children":1466},{"id":1465},"when-to-use-what",[1467],{"type":49,"value":1468},"When to Use What",{"type":43,"tag":52,"props":1470,"children":1471},{},[1472],{"type":49,"value":1473},"After completing the decision gate above, use this routing table:",{"type":43,"tag":454,"props":1475,"children":1476},{},[1477,1495,1512,1529,1543,1564,1585,1605,1626,1641],{"type":43,"tag":458,"props":1478,"children":1479},{},[1480,1485,1487,1493],{"type":43,"tag":56,"props":1481,"children":1482},{},[1483],{"type":49,"value":1484},"Read analytics data → display in chart\u002Ftable",{"type":49,"value":1486},": Use visualization components with ",{"type":43,"tag":64,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":49,"value":1492},"queryKey",{"type":49,"value":1494}," prop",{"type":43,"tag":458,"props":1496,"children":1497},{},[1498,1503,1505,1510],{"type":43,"tag":56,"props":1499,"children":1500},{},[1501],{"type":49,"value":1502},"Read analytics data → custom display (KPIs, cards)",{"type":49,"value":1504},": Use ",{"type":43,"tag":64,"props":1506,"children":1508},{"className":1507},[],[1509],{"type":49,"value":273},{"type":49,"value":1511}," hook",{"type":43,"tag":458,"props":1513,"children":1514},{},[1515,1520,1522,1527],{"type":43,"tag":56,"props":1516,"children":1517},{},[1518],{"type":49,"value":1519},"Read analytics data → need computation before display",{"type":49,"value":1521},": Still use ",{"type":43,"tag":64,"props":1523,"children":1525},{"className":1524},[],[1526],{"type":49,"value":273},{"type":49,"value":1528},", transform client-side",{"type":43,"tag":458,"props":1530,"children":1531},{},[1532,1537,1539],{"type":43,"tag":56,"props":1533,"children":1534},{},[1535],{"type":49,"value":1536},"Read lakehouse data at low latency (lookups, search, catalogs)",{"type":49,"value":1538},": Use Lakebase synced tables — see ",{"type":43,"tag":237,"props":1540,"children":1541},{"href":313},[1542],{"type":49,"value":316},{"type":43,"tag":458,"props":1544,"children":1545},{},[1546,1551,1553,1558,1560],{"type":43,"tag":56,"props":1547,"children":1548},{},[1549],{"type":49,"value":1550},"Read\u002Fwrite persistent data (users, orders, CRUD state)",{"type":49,"value":1552},": Use Lakebase via Express routes in ",{"type":43,"tag":64,"props":1554,"children":1556},{"className":1555},[],[1557],{"type":49,"value":832},{"type":49,"value":1559}," — see ",{"type":43,"tag":237,"props":1561,"children":1562},{"href":313},[1563],{"type":49,"value":316},{"type":43,"tag":458,"props":1565,"children":1566},{},[1567,1572,1573,1579,1581],{"type":43,"tag":56,"props":1568,"children":1569},{},[1570],{"type":49,"value":1571},"Natural language query interface over tables (Genie)",{"type":49,"value":1504},{"type":43,"tag":64,"props":1574,"children":1576},{"className":1575},[],[1577],{"type":49,"value":1578},"genie()",{"type":49,"value":1580}," plugin — see ",{"type":43,"tag":237,"props":1582,"children":1583},{"href":330},[1584],{"type":49,"value":333},{"type":43,"tag":458,"props":1586,"children":1587},{},[1588,1593,1594,1600,1601],{"type":43,"tag":56,"props":1589,"children":1590},{},[1591],{"type":49,"value":1592},"Call ML model endpoint",{"type":49,"value":1504},{"type":43,"tag":64,"props":1595,"children":1597},{"className":1596},[],[1598],{"type":49,"value":1599},"serving()",{"type":49,"value":1580},{"type":43,"tag":237,"props":1602,"children":1603},{"href":349},[1604],{"type":49,"value":352},{"type":43,"tag":458,"props":1606,"children":1607},{},[1608,1613,1615,1621,1622],{"type":43,"tag":56,"props":1609,"children":1610},{},[1611],{"type":49,"value":1612},"Trigger or monitor a Lakeflow Job from the app",{"type":49,"value":1614},": Use the ",{"type":43,"tag":64,"props":1616,"children":1618},{"className":1617},[],[1619],{"type":49,"value":1620},"jobs()",{"type":49,"value":1580},{"type":43,"tag":237,"props":1623,"children":1624},{"href":407},[1625],{"type":49,"value":410},{"type":43,"tag":458,"props":1627,"children":1628},{},[1629,1634,1636],{"type":43,"tag":56,"props":1630,"children":1631},{},[1632],{"type":49,"value":1633},"⚠️ NEVER add custom endpoints to run SELECT queries against the warehouse",{"type":49,"value":1635}," — always use SQL files in ",{"type":43,"tag":64,"props":1637,"children":1639},{"className":1638},[],[1640],{"type":49,"value":950},{"type":43,"tag":458,"props":1642,"children":1643},{},[1644,1656],{"type":43,"tag":56,"props":1645,"children":1646},{},[1647,1649,1654],{"type":49,"value":1648},"⚠️ NEVER use ",{"type":43,"tag":64,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":49,"value":273},{"type":49,"value":1655}," for Lakebase data",{"type":49,"value":1657}," — it queries the SQL warehouse only",{"type":43,"tag":134,"props":1659,"children":1661},{"id":1660},"frameworks",[1662],{"type":49,"value":1663},"Frameworks",{"type":43,"tag":1665,"props":1666,"children":1668},"h3",{"id":1667},"appkit-recommended",[1669],{"type":49,"value":1670},"AppKit (Recommended)",{"type":43,"tag":52,"props":1672,"children":1673},{},[1674],{"type":49,"value":1675},"TypeScript\u002FReact framework with type-safe SQL queries and built-in components.",{"type":43,"tag":52,"props":1677,"children":1678},{},[1679,1684],{"type":43,"tag":56,"props":1680,"children":1681},{},[1682],{"type":49,"value":1683},"Official Documentation",{"type":49,"value":1685}," — the source of truth for all API details:",{"type":43,"tag":1687,"props":1688,"children":1693},"pre",{"className":1689,"code":1690,"language":1691,"meta":1692,"style":1692},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx @databricks\u002Fappkit docs                              # ← ALWAYS start here to see available pages\nnpx @databricks\u002Fappkit docs \u003Cquery>                      # view a section by name or doc path\nnpx @databricks\u002Fappkit docs --full                       # full index with all API entries\nnpx @databricks\u002Fappkit docs \"appkit-ui API reference\"    # example: section by name\nnpx @databricks\u002Fappkit docs .\u002Fdocs\u002Fplugins\u002Fanalytics.md  # example: specific doc file\n","bash","",[1694],{"type":43,"tag":64,"props":1695,"children":1696},{"__ignoreMap":1692},[1697,1726,1769,1795,1831],{"type":43,"tag":1698,"props":1699,"children":1702},"span",{"class":1700,"line":1701},"line",1,[1703,1709,1715,1720],{"type":43,"tag":1698,"props":1704,"children":1706},{"style":1705},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1707],{"type":49,"value":1708},"npx",{"type":43,"tag":1698,"props":1710,"children":1712},{"style":1711},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1713],{"type":49,"value":1714}," @databricks\u002Fappkit",{"type":43,"tag":1698,"props":1716,"children":1717},{"style":1711},[1718],{"type":49,"value":1719}," docs",{"type":43,"tag":1698,"props":1721,"children":1723},{"style":1722},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1724],{"type":49,"value":1725},"                              # ← ALWAYS start here to see available pages\n",{"type":43,"tag":1698,"props":1727,"children":1729},{"class":1700,"line":1728},2,[1730,1734,1738,1742,1748,1753,1759,1764],{"type":43,"tag":1698,"props":1731,"children":1732},{"style":1705},[1733],{"type":49,"value":1708},{"type":43,"tag":1698,"props":1735,"children":1736},{"style":1711},[1737],{"type":49,"value":1714},{"type":43,"tag":1698,"props":1739,"children":1740},{"style":1711},[1741],{"type":49,"value":1719},{"type":43,"tag":1698,"props":1743,"children":1745},{"style":1744},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1746],{"type":49,"value":1747}," \u003C",{"type":43,"tag":1698,"props":1749,"children":1750},{"style":1711},[1751],{"type":49,"value":1752},"quer",{"type":43,"tag":1698,"props":1754,"children":1756},{"style":1755},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1757],{"type":49,"value":1758},"y",{"type":43,"tag":1698,"props":1760,"children":1761},{"style":1744},[1762],{"type":49,"value":1763},">",{"type":43,"tag":1698,"props":1765,"children":1766},{"style":1722},[1767],{"type":49,"value":1768},"                      # view a section by name or doc path\n",{"type":43,"tag":1698,"props":1770,"children":1772},{"class":1700,"line":1771},3,[1773,1777,1781,1785,1790],{"type":43,"tag":1698,"props":1774,"children":1775},{"style":1705},[1776],{"type":49,"value":1708},{"type":43,"tag":1698,"props":1778,"children":1779},{"style":1711},[1780],{"type":49,"value":1714},{"type":43,"tag":1698,"props":1782,"children":1783},{"style":1711},[1784],{"type":49,"value":1719},{"type":43,"tag":1698,"props":1786,"children":1787},{"style":1711},[1788],{"type":49,"value":1789}," --full",{"type":43,"tag":1698,"props":1791,"children":1792},{"style":1722},[1793],{"type":49,"value":1794},"                       # full index with all API entries\n",{"type":43,"tag":1698,"props":1796,"children":1798},{"class":1700,"line":1797},4,[1799,1803,1807,1811,1816,1821,1826],{"type":43,"tag":1698,"props":1800,"children":1801},{"style":1705},[1802],{"type":49,"value":1708},{"type":43,"tag":1698,"props":1804,"children":1805},{"style":1711},[1806],{"type":49,"value":1714},{"type":43,"tag":1698,"props":1808,"children":1809},{"style":1711},[1810],{"type":49,"value":1719},{"type":43,"tag":1698,"props":1812,"children":1813},{"style":1744},[1814],{"type":49,"value":1815}," \"",{"type":43,"tag":1698,"props":1817,"children":1818},{"style":1711},[1819],{"type":49,"value":1820},"appkit-ui API reference",{"type":43,"tag":1698,"props":1822,"children":1823},{"style":1744},[1824],{"type":49,"value":1825},"\"",{"type":43,"tag":1698,"props":1827,"children":1828},{"style":1722},[1829],{"type":49,"value":1830},"    # example: section by name\n",{"type":43,"tag":1698,"props":1832,"children":1834},{"class":1700,"line":1833},5,[1835,1839,1843,1847,1852],{"type":43,"tag":1698,"props":1836,"children":1837},{"style":1705},[1838],{"type":49,"value":1708},{"type":43,"tag":1698,"props":1840,"children":1841},{"style":1711},[1842],{"type":49,"value":1714},{"type":43,"tag":1698,"props":1844,"children":1845},{"style":1711},[1846],{"type":49,"value":1719},{"type":43,"tag":1698,"props":1848,"children":1849},{"style":1711},[1850],{"type":49,"value":1851}," .\u002Fdocs\u002Fplugins\u002Fanalytics.md",{"type":43,"tag":1698,"props":1853,"children":1854},{"style":1722},[1855],{"type":49,"value":1856},"  # example: specific doc file\n",{"type":43,"tag":52,"props":1858,"children":1859},{},[1860,1865,1867,1873],{"type":43,"tag":56,"props":1861,"children":1862},{},[1863],{"type":49,"value":1864},"DO NOT guess doc paths.",{"type":49,"value":1866}," Run without args first, pick from the index. The ",{"type":43,"tag":64,"props":1868,"children":1870},{"className":1869},[],[1871],{"type":49,"value":1872},"\u003Cquery>",{"type":49,"value":1874}," argument accepts both section names (from the index) and file paths. Docs are the authority on component props, hook signatures, and server APIs — skill files only cover anti-patterns and gotchas.",{"type":43,"tag":52,"props":1876,"children":1877},{},[1878],{"type":43,"tag":56,"props":1879,"children":1880},{},[1881],{"type":49,"value":1882},"App Manifest and Scaffolding",{"type":43,"tag":52,"props":1884,"children":1885},{},[1886],{"type":43,"tag":56,"props":1887,"children":1888},{},[1889],{"type":49,"value":1890},"Agent workflow for scaffolding: get the manifest first, then build the init command.",{"type":43,"tag":1009,"props":1892,"children":1893},{},[1894,2244],{"type":43,"tag":458,"props":1895,"children":1896},{},[1897,1902,1904,2084,2088,2090],{"type":43,"tag":56,"props":1898,"children":1899},{},[1900],{"type":49,"value":1901},"Get the manifest",{"type":49,"value":1903}," (JSON schema describing plugins and their resources):",{"type":43,"tag":1687,"props":1905,"children":1907},{"className":1689,"code":1906,"language":1691,"meta":1692,"style":1692},"databricks apps manifest --profile \u003CPROFILE>\n# See plugins available in a specific AppKit version:\ndatabricks apps manifest --version \u003CVERSION> --profile \u003CPROFILE>\n# Custom template:\ndatabricks apps manifest --template \u003CGIT_URL> --profile \u003CPROFILE>\n",[1908],{"type":43,"tag":64,"props":1909,"children":1910},{"__ignoreMap":1692},[1911,1952,1960,2018,2026],{"type":43,"tag":1698,"props":1912,"children":1913},{"class":1700,"line":1701},[1914,1918,1923,1928,1933,1937,1942,1947],{"type":43,"tag":1698,"props":1915,"children":1916},{"style":1705},[1917],{"type":49,"value":8},{"type":43,"tag":1698,"props":1919,"children":1920},{"style":1711},[1921],{"type":49,"value":1922}," apps",{"type":43,"tag":1698,"props":1924,"children":1925},{"style":1711},[1926],{"type":49,"value":1927}," manifest",{"type":43,"tag":1698,"props":1929,"children":1930},{"style":1711},[1931],{"type":49,"value":1932}," --profile",{"type":43,"tag":1698,"props":1934,"children":1935},{"style":1744},[1936],{"type":49,"value":1747},{"type":43,"tag":1698,"props":1938,"children":1939},{"style":1711},[1940],{"type":49,"value":1941},"PROFIL",{"type":43,"tag":1698,"props":1943,"children":1944},{"style":1755},[1945],{"type":49,"value":1946},"E",{"type":43,"tag":1698,"props":1948,"children":1949},{"style":1744},[1950],{"type":49,"value":1951},">\n",{"type":43,"tag":1698,"props":1953,"children":1954},{"class":1700,"line":1728},[1955],{"type":43,"tag":1698,"props":1956,"children":1957},{"style":1722},[1958],{"type":49,"value":1959},"# See plugins available in a specific AppKit version:\n",{"type":43,"tag":1698,"props":1961,"children":1962},{"class":1700,"line":1771},[1963,1967,1971,1975,1980,1984,1989,1994,1998,2002,2006,2010,2014],{"type":43,"tag":1698,"props":1964,"children":1965},{"style":1705},[1966],{"type":49,"value":8},{"type":43,"tag":1698,"props":1968,"children":1969},{"style":1711},[1970],{"type":49,"value":1922},{"type":43,"tag":1698,"props":1972,"children":1973},{"style":1711},[1974],{"type":49,"value":1927},{"type":43,"tag":1698,"props":1976,"children":1977},{"style":1711},[1978],{"type":49,"value":1979}," --version",{"type":43,"tag":1698,"props":1981,"children":1982},{"style":1744},[1983],{"type":49,"value":1747},{"type":43,"tag":1698,"props":1985,"children":1986},{"style":1711},[1987],{"type":49,"value":1988},"VERSIO",{"type":43,"tag":1698,"props":1990,"children":1991},{"style":1755},[1992],{"type":49,"value":1993},"N",{"type":43,"tag":1698,"props":1995,"children":1996},{"style":1744},[1997],{"type":49,"value":1763},{"type":43,"tag":1698,"props":1999,"children":2000},{"style":1711},[2001],{"type":49,"value":1932},{"type":43,"tag":1698,"props":2003,"children":2004},{"style":1744},[2005],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2007,"children":2008},{"style":1711},[2009],{"type":49,"value":1941},{"type":43,"tag":1698,"props":2011,"children":2012},{"style":1755},[2013],{"type":49,"value":1946},{"type":43,"tag":1698,"props":2015,"children":2016},{"style":1744},[2017],{"type":49,"value":1951},{"type":43,"tag":1698,"props":2019,"children":2020},{"class":1700,"line":1797},[2021],{"type":43,"tag":1698,"props":2022,"children":2023},{"style":1722},[2024],{"type":49,"value":2025},"# Custom template:\n",{"type":43,"tag":1698,"props":2027,"children":2028},{"class":1700,"line":1833},[2029,2033,2037,2041,2046,2050,2055,2060,2064,2068,2072,2076,2080],{"type":43,"tag":1698,"props":2030,"children":2031},{"style":1705},[2032],{"type":49,"value":8},{"type":43,"tag":1698,"props":2034,"children":2035},{"style":1711},[2036],{"type":49,"value":1922},{"type":43,"tag":1698,"props":2038,"children":2039},{"style":1711},[2040],{"type":49,"value":1927},{"type":43,"tag":1698,"props":2042,"children":2043},{"style":1711},[2044],{"type":49,"value":2045}," --template",{"type":43,"tag":1698,"props":2047,"children":2048},{"style":1744},[2049],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2051,"children":2052},{"style":1711},[2053],{"type":49,"value":2054},"GIT_UR",{"type":43,"tag":1698,"props":2056,"children":2057},{"style":1755},[2058],{"type":49,"value":2059},"L",{"type":43,"tag":1698,"props":2061,"children":2062},{"style":1744},[2063],{"type":49,"value":1763},{"type":43,"tag":1698,"props":2065,"children":2066},{"style":1711},[2067],{"type":49,"value":1932},{"type":43,"tag":1698,"props":2069,"children":2070},{"style":1744},[2071],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2073,"children":2074},{"style":1711},[2075],{"type":49,"value":1941},{"type":43,"tag":1698,"props":2077,"children":2078},{"style":1755},[2079],{"type":49,"value":1946},{"type":43,"tag":1698,"props":2081,"children":2082},{"style":1744},[2083],{"type":49,"value":1951},{"type":43,"tag":2085,"props":2086,"children":2087},"br",{},[],{"type":49,"value":2089},"The output defines:",{"type":43,"tag":454,"props":2091,"children":2092},{},[2093,2125,2196],{"type":43,"tag":458,"props":2094,"children":2095},{},[2096,2101,2103,2108,2110,2116,2118,2124],{"type":43,"tag":56,"props":2097,"children":2098},{},[2099],{"type":49,"value":2100},"Plugins",{"type":49,"value":2102},": each has a key (plugin ID for ",{"type":43,"tag":64,"props":2104,"children":2106},{"className":2105},[],[2107],{"type":49,"value":214},{"type":49,"value":2109},"), plus ",{"type":43,"tag":64,"props":2111,"children":2113},{"className":2112},[],[2114],{"type":49,"value":2115},"requiredByTemplate",{"type":49,"value":2117},", and ",{"type":43,"tag":64,"props":2119,"children":2121},{"className":2120},[],[2122],{"type":49,"value":2123},"resources",{"type":49,"value":511},{"type":43,"tag":458,"props":2126,"children":2127},{},[2128,2132,2134,2139,2141,2146,2148,2153,2155,2160,2162,2167,2169,2174,2176,2181,2183,2188,2190,2195],{"type":43,"tag":56,"props":2129,"children":2130},{},[2131],{"type":49,"value":2115},{"type":49,"value":2133},": If ",{"type":43,"tag":56,"props":2135,"children":2136},{},[2137],{"type":49,"value":2138},"true",{"type":49,"value":2140},", that plugin is ",{"type":43,"tag":56,"props":2142,"children":2143},{},[2144],{"type":49,"value":2145},"mandatory",{"type":49,"value":2147}," for this template — do ",{"type":43,"tag":56,"props":2149,"children":2150},{},[2151],{"type":49,"value":2152},"not",{"type":49,"value":2154}," add it to ",{"type":43,"tag":64,"props":2156,"children":2158},{"className":2157},[],[2159],{"type":49,"value":214},{"type":49,"value":2161}," (it is included automatically); you must still supply all of its required resources via ",{"type":43,"tag":64,"props":2163,"children":2165},{"className":2164},[],[2166],{"type":49,"value":222},{"type":49,"value":2168},". If ",{"type":43,"tag":56,"props":2170,"children":2171},{},[2172],{"type":49,"value":2173},"false",{"type":49,"value":2175}," or absent, the plugin is ",{"type":43,"tag":56,"props":2177,"children":2178},{},[2179],{"type":49,"value":2180},"optional",{"type":49,"value":2182}," — add it to ",{"type":43,"tag":64,"props":2184,"children":2186},{"className":2185},[],[2187],{"type":49,"value":214},{"type":49,"value":2189}," only when the user's prompt indicates they want that capability (e.g. analytics\u002FSQL), and then supply its required resources via ",{"type":43,"tag":64,"props":2191,"children":2193},{"className":2192},[],[2194],{"type":49,"value":222},{"type":49,"value":511},{"type":43,"tag":458,"props":2197,"children":2198},{},[2199,2204,2206,2212,2213,2219,2221,2227,2228,2234,2236,2242],{"type":43,"tag":56,"props":2200,"children":2201},{},[2202],{"type":49,"value":2203},"Resources",{"type":49,"value":2205},": Each plugin has ",{"type":43,"tag":64,"props":2207,"children":2209},{"className":2208},[],[2210],{"type":49,"value":2211},"resources.required",{"type":49,"value":216},{"type":43,"tag":64,"props":2214,"children":2216},{"className":2215},[],[2217],{"type":49,"value":2218},"resources.optional",{"type":49,"value":2220}," (arrays). Each item has ",{"type":43,"tag":64,"props":2222,"children":2224},{"className":2223},[],[2225],{"type":49,"value":2226},"resourceKey",{"type":49,"value":216},{"type":43,"tag":64,"props":2229,"children":2231},{"className":2230},[],[2232],{"type":49,"value":2233},"fields",{"type":49,"value":2235}," (object: field name → description\u002Fenv). Use ",{"type":43,"tag":64,"props":2237,"children":2239},{"className":2238},[],[2240],{"type":49,"value":2241},"--set \u003Cplugin>.\u003CresourceKey>.\u003Cfield>=\u003Cvalue>",{"type":49,"value":2243}," for each required resource field of every plugin you include.",{"type":43,"tag":458,"props":2245,"children":2246},{},[2247,2252,2254,2259,2261,2684,2687,2689,2695,2697],{"type":43,"tag":56,"props":2248,"children":2249},{},[2250],{"type":49,"value":2251},"Scaffold",{"type":49,"value":2253}," (DO NOT use ",{"type":43,"tag":64,"props":2255,"children":2257},{"className":2256},[],[2258],{"type":49,"value":1708},{"type":49,"value":2260},"; use the CLI only):",{"type":43,"tag":1687,"props":2262,"children":2264},{"className":1689,"code":2263,"language":1691,"meta":1692,"style":1692},"databricks apps init --name \u003CNAME> --features \u003Cplugin1>,\u003Cplugin2> \\\n  --set \u003Cplugin1>.\u003CresourceKey>.\u003Cfield>=\u003Cvalue> \\\n  --set \u003Cplugin2>.\u003CresourceKey>.\u003Cfield>=\u003Cvalue> \\\n  --description \"\u003CDESC>\" --run none --profile \u003CPROFILE>\n# --run none: skip auto-run after scaffolding (review code first)\n# With custom template:\ndatabricks apps init --template \u003CGIT_URL> --name \u003CNAME> --features ... --set ... --profile \u003CPROFILE>\n",[2265],{"type":43,"tag":64,"props":2266,"children":2267},{"__ignoreMap":1692},[2268,2349,2439,2522,2573,2581,2590],{"type":43,"tag":1698,"props":2269,"children":2270},{"class":1700,"line":1701},[2271,2275,2279,2284,2289,2293,2298,2302,2306,2311,2315,2320,2325,2330,2335,2339,2344],{"type":43,"tag":1698,"props":2272,"children":2273},{"style":1705},[2274],{"type":49,"value":8},{"type":43,"tag":1698,"props":2276,"children":2277},{"style":1711},[2278],{"type":49,"value":1922},{"type":43,"tag":1698,"props":2280,"children":2281},{"style":1711},[2282],{"type":49,"value":2283}," init",{"type":43,"tag":1698,"props":2285,"children":2286},{"style":1711},[2287],{"type":49,"value":2288}," --name",{"type":43,"tag":1698,"props":2290,"children":2291},{"style":1744},[2292],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2294,"children":2295},{"style":1711},[2296],{"type":49,"value":2297},"NAM",{"type":43,"tag":1698,"props":2299,"children":2300},{"style":1755},[2301],{"type":49,"value":1946},{"type":43,"tag":1698,"props":2303,"children":2304},{"style":1744},[2305],{"type":49,"value":1763},{"type":43,"tag":1698,"props":2307,"children":2308},{"style":1711},[2309],{"type":49,"value":2310}," --features",{"type":43,"tag":1698,"props":2312,"children":2313},{"style":1744},[2314],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2316,"children":2317},{"style":1711},[2318],{"type":49,"value":2319},"plugin",{"type":43,"tag":1698,"props":2321,"children":2322},{"style":1744},[2323],{"type":49,"value":2324},"1>",{"type":43,"tag":1698,"props":2326,"children":2327},{"style":1711},[2328],{"type":49,"value":2329},",",{"type":43,"tag":1698,"props":2331,"children":2332},{"style":1744},[2333],{"type":49,"value":2334},"\u003C",{"type":43,"tag":1698,"props":2336,"children":2337},{"style":1711},[2338],{"type":49,"value":2319},{"type":43,"tag":1698,"props":2340,"children":2341},{"style":1744},[2342],{"type":49,"value":2343},"2>",{"type":43,"tag":1698,"props":2345,"children":2346},{"style":1755},[2347],{"type":49,"value":2348}," \\\n",{"type":43,"tag":1698,"props":2350,"children":2351},{"class":1700,"line":1728},[2352,2357,2361,2365,2369,2373,2377,2382,2386,2390,2394,2398,2403,2408,2412,2417,2421,2426,2431,2435],{"type":43,"tag":1698,"props":2353,"children":2354},{"style":1711},[2355],{"type":49,"value":2356},"  --set",{"type":43,"tag":1698,"props":2358,"children":2359},{"style":1744},[2360],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2362,"children":2363},{"style":1711},[2364],{"type":49,"value":2319},{"type":43,"tag":1698,"props":2366,"children":2367},{"style":1744},[2368],{"type":49,"value":2324},{"type":43,"tag":1698,"props":2370,"children":2371},{"style":1711},[2372],{"type":49,"value":511},{"type":43,"tag":1698,"props":2374,"children":2375},{"style":1744},[2376],{"type":49,"value":2334},{"type":43,"tag":1698,"props":2378,"children":2379},{"style":1711},[2380],{"type":49,"value":2381},"resourceKe",{"type":43,"tag":1698,"props":2383,"children":2384},{"style":1755},[2385],{"type":49,"value":1758},{"type":43,"tag":1698,"props":2387,"children":2388},{"style":1744},[2389],{"type":49,"value":1763},{"type":43,"tag":1698,"props":2391,"children":2392},{"style":1711},[2393],{"type":49,"value":511},{"type":43,"tag":1698,"props":2395,"children":2396},{"style":1744},[2397],{"type":49,"value":2334},{"type":43,"tag":1698,"props":2399,"children":2400},{"style":1711},[2401],{"type":49,"value":2402},"fiel",{"type":43,"tag":1698,"props":2404,"children":2405},{"style":1755},[2406],{"type":49,"value":2407},"d",{"type":43,"tag":1698,"props":2409,"children":2410},{"style":1744},[2411],{"type":49,"value":1763},{"type":43,"tag":1698,"props":2413,"children":2414},{"style":1711},[2415],{"type":49,"value":2416},"=",{"type":43,"tag":1698,"props":2418,"children":2419},{"style":1744},[2420],{"type":49,"value":2334},{"type":43,"tag":1698,"props":2422,"children":2423},{"style":1711},[2424],{"type":49,"value":2425},"valu",{"type":43,"tag":1698,"props":2427,"children":2428},{"style":1755},[2429],{"type":49,"value":2430},"e",{"type":43,"tag":1698,"props":2432,"children":2433},{"style":1744},[2434],{"type":49,"value":1763},{"type":43,"tag":1698,"props":2436,"children":2437},{"style":1755},[2438],{"type":49,"value":2348},{"type":43,"tag":1698,"props":2440,"children":2441},{"class":1700,"line":1771},[2442,2446,2450,2454,2458,2462,2466,2470,2474,2478,2482,2486,2490,2494,2498,2502,2506,2510,2514,2518],{"type":43,"tag":1698,"props":2443,"children":2444},{"style":1711},[2445],{"type":49,"value":2356},{"type":43,"tag":1698,"props":2447,"children":2448},{"style":1744},[2449],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2451,"children":2452},{"style":1711},[2453],{"type":49,"value":2319},{"type":43,"tag":1698,"props":2455,"children":2456},{"style":1744},[2457],{"type":49,"value":2343},{"type":43,"tag":1698,"props":2459,"children":2460},{"style":1711},[2461],{"type":49,"value":511},{"type":43,"tag":1698,"props":2463,"children":2464},{"style":1744},[2465],{"type":49,"value":2334},{"type":43,"tag":1698,"props":2467,"children":2468},{"style":1711},[2469],{"type":49,"value":2381},{"type":43,"tag":1698,"props":2471,"children":2472},{"style":1755},[2473],{"type":49,"value":1758},{"type":43,"tag":1698,"props":2475,"children":2476},{"style":1744},[2477],{"type":49,"value":1763},{"type":43,"tag":1698,"props":2479,"children":2480},{"style":1711},[2481],{"type":49,"value":511},{"type":43,"tag":1698,"props":2483,"children":2484},{"style":1744},[2485],{"type":49,"value":2334},{"type":43,"tag":1698,"props":2487,"children":2488},{"style":1711},[2489],{"type":49,"value":2402},{"type":43,"tag":1698,"props":2491,"children":2492},{"style":1755},[2493],{"type":49,"value":2407},{"type":43,"tag":1698,"props":2495,"children":2496},{"style":1744},[2497],{"type":49,"value":1763},{"type":43,"tag":1698,"props":2499,"children":2500},{"style":1711},[2501],{"type":49,"value":2416},{"type":43,"tag":1698,"props":2503,"children":2504},{"style":1744},[2505],{"type":49,"value":2334},{"type":43,"tag":1698,"props":2507,"children":2508},{"style":1711},[2509],{"type":49,"value":2425},{"type":43,"tag":1698,"props":2511,"children":2512},{"style":1755},[2513],{"type":49,"value":2430},{"type":43,"tag":1698,"props":2515,"children":2516},{"style":1744},[2517],{"type":49,"value":1763},{"type":43,"tag":1698,"props":2519,"children":2520},{"style":1755},[2521],{"type":49,"value":2348},{"type":43,"tag":1698,"props":2523,"children":2524},{"class":1700,"line":1797},[2525,2530,2534,2539,2543,2548,2553,2557,2561,2565,2569],{"type":43,"tag":1698,"props":2526,"children":2527},{"style":1711},[2528],{"type":49,"value":2529},"  --description",{"type":43,"tag":1698,"props":2531,"children":2532},{"style":1744},[2533],{"type":49,"value":1815},{"type":43,"tag":1698,"props":2535,"children":2536},{"style":1711},[2537],{"type":49,"value":2538},"\u003CDESC>",{"type":43,"tag":1698,"props":2540,"children":2541},{"style":1744},[2542],{"type":49,"value":1825},{"type":43,"tag":1698,"props":2544,"children":2545},{"style":1711},[2546],{"type":49,"value":2547}," --run",{"type":43,"tag":1698,"props":2549,"children":2550},{"style":1711},[2551],{"type":49,"value":2552}," none",{"type":43,"tag":1698,"props":2554,"children":2555},{"style":1711},[2556],{"type":49,"value":1932},{"type":43,"tag":1698,"props":2558,"children":2559},{"style":1744},[2560],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2562,"children":2563},{"style":1711},[2564],{"type":49,"value":1941},{"type":43,"tag":1698,"props":2566,"children":2567},{"style":1755},[2568],{"type":49,"value":1946},{"type":43,"tag":1698,"props":2570,"children":2571},{"style":1744},[2572],{"type":49,"value":1951},{"type":43,"tag":1698,"props":2574,"children":2575},{"class":1700,"line":1833},[2576],{"type":43,"tag":1698,"props":2577,"children":2578},{"style":1722},[2579],{"type":49,"value":2580},"# --run none: skip auto-run after scaffolding (review code first)\n",{"type":43,"tag":1698,"props":2582,"children":2584},{"class":1700,"line":2583},6,[2585],{"type":43,"tag":1698,"props":2586,"children":2587},{"style":1722},[2588],{"type":49,"value":2589},"# With custom template:\n",{"type":43,"tag":1698,"props":2591,"children":2593},{"class":1700,"line":2592},7,[2594,2598,2602,2606,2610,2614,2618,2622,2626,2630,2634,2638,2642,2646,2650,2655,2660,2664,2668,2672,2676,2680],{"type":43,"tag":1698,"props":2595,"children":2596},{"style":1705},[2597],{"type":49,"value":8},{"type":43,"tag":1698,"props":2599,"children":2600},{"style":1711},[2601],{"type":49,"value":1922},{"type":43,"tag":1698,"props":2603,"children":2604},{"style":1711},[2605],{"type":49,"value":2283},{"type":43,"tag":1698,"props":2607,"children":2608},{"style":1711},[2609],{"type":49,"value":2045},{"type":43,"tag":1698,"props":2611,"children":2612},{"style":1744},[2613],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2615,"children":2616},{"style":1711},[2617],{"type":49,"value":2054},{"type":43,"tag":1698,"props":2619,"children":2620},{"style":1755},[2621],{"type":49,"value":2059},{"type":43,"tag":1698,"props":2623,"children":2624},{"style":1744},[2625],{"type":49,"value":1763},{"type":43,"tag":1698,"props":2627,"children":2628},{"style":1711},[2629],{"type":49,"value":2288},{"type":43,"tag":1698,"props":2631,"children":2632},{"style":1744},[2633],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2635,"children":2636},{"style":1711},[2637],{"type":49,"value":2297},{"type":43,"tag":1698,"props":2639,"children":2640},{"style":1755},[2641],{"type":49,"value":1946},{"type":43,"tag":1698,"props":2643,"children":2644},{"style":1744},[2645],{"type":49,"value":1763},{"type":43,"tag":1698,"props":2647,"children":2648},{"style":1711},[2649],{"type":49,"value":2310},{"type":43,"tag":1698,"props":2651,"children":2652},{"style":1711},[2653],{"type":49,"value":2654}," ...",{"type":43,"tag":1698,"props":2656,"children":2657},{"style":1711},[2658],{"type":49,"value":2659}," --set",{"type":43,"tag":1698,"props":2661,"children":2662},{"style":1711},[2663],{"type":49,"value":2654},{"type":43,"tag":1698,"props":2665,"children":2666},{"style":1711},[2667],{"type":49,"value":1932},{"type":43,"tag":1698,"props":2669,"children":2670},{"style":1744},[2671],{"type":49,"value":1747},{"type":43,"tag":1698,"props":2673,"children":2674},{"style":1711},[2675],{"type":49,"value":1941},{"type":43,"tag":1698,"props":2677,"children":2678},{"style":1755},[2679],{"type":49,"value":1946},{"type":43,"tag":1698,"props":2681,"children":2682},{"style":1744},[2683],{"type":49,"value":1951},{"type":43,"tag":2085,"props":2685,"children":2686},{},[],{"type":49,"value":2688},"Optionally use ",{"type":43,"tag":64,"props":2690,"children":2692},{"className":2691},[],[2693],{"type":49,"value":2694},"--version \u003CVERSION>",{"type":49,"value":2696}," to target a specific AppKit version.",{"type":43,"tag":454,"props":2698,"children":2699},{},[2700,2751,2803],{"type":43,"tag":458,"props":2701,"children":2702},{},[2703,2708,2709,2715,2716,2722,2724,2729,2731,2735,2737,2743,2745,2750],{"type":43,"tag":56,"props":2704,"children":2705},{},[2706],{"type":49,"value":2707},"Required",{"type":49,"value":477},{"type":43,"tag":64,"props":2710,"children":2712},{"className":2711},[],[2713],{"type":49,"value":2714},"--name",{"type":49,"value":529},{"type":43,"tag":64,"props":2717,"children":2719},{"className":2718},[],[2720],{"type":49,"value":2721},"--profile",{"type":49,"value":2723},". Name: ≤26 chars, lowercase letters\u002Fnumbers\u002Fhyphens only. Use ",{"type":43,"tag":64,"props":2725,"children":2727},{"className":2726},[],[2728],{"type":49,"value":214},{"type":49,"value":2730}," only for ",{"type":43,"tag":56,"props":2732,"children":2733},{},[2734],{"type":49,"value":2180},{"type":49,"value":2736}," plugins the user wants (plugins with ",{"type":43,"tag":64,"props":2738,"children":2740},{"className":2739},[],[2741],{"type":49,"value":2742},"requiredByTemplate: false",{"type":49,"value":2744}," or absent); mandatory plugins must not be listed in ",{"type":43,"tag":64,"props":2746,"children":2748},{"className":2747},[],[2749],{"type":49,"value":214},{"type":49,"value":511},{"type":43,"tag":458,"props":2752,"children":2753},{},[2754,2758,2760,2765,2767,2772,2774,2780,2782,2787,2789,2794,2796,2801],{"type":43,"tag":56,"props":2755,"children":2756},{},[2757],{"type":49,"value":2203},{"type":49,"value":2759},": Pass ",{"type":43,"tag":64,"props":2761,"children":2763},{"className":2762},[],[2764],{"type":49,"value":222},{"type":49,"value":2766}," for every required resource (each field in ",{"type":43,"tag":64,"props":2768,"children":2770},{"className":2769},[],[2771],{"type":49,"value":2211},{"type":49,"value":2773},") for (1) all plugins with ",{"type":43,"tag":64,"props":2775,"children":2777},{"className":2776},[],[2778],{"type":49,"value":2779},"requiredByTemplate: true",{"type":49,"value":2781},", and (2) any optional plugins you added to ",{"type":43,"tag":64,"props":2783,"children":2785},{"className":2784},[],[2786],{"type":49,"value":214},{"type":49,"value":2788},". Add ",{"type":43,"tag":64,"props":2790,"children":2792},{"className":2791},[],[2793],{"type":49,"value":222},{"type":49,"value":2795}," for ",{"type":43,"tag":64,"props":2797,"children":2799},{"className":2798},[],[2800],{"type":49,"value":2218},{"type":49,"value":2802}," only when the user requests them.",{"type":43,"tag":458,"props":2804,"children":2805},{},[2806,2811,2812,2817,2819,2825,2826,2832],{"type":43,"tag":56,"props":2807,"children":2808},{},[2809],{"type":49,"value":2810},"Discovery",{"type":49,"value":62},{"type":43,"tag":64,"props":2813,"children":2815},{"className":2814},[],[2816],{"type":49,"value":38},{"type":49,"value":2818}," skill to resolve IDs (e.g. warehouse: ",{"type":43,"tag":64,"props":2820,"children":2822},{"className":2821},[],[2823],{"type":49,"value":2824},"databricks warehouses list --profile \u003CPROFILE>",{"type":49,"value":573},{"type":43,"tag":64,"props":2827,"children":2829},{"className":2828},[],[2830],{"type":49,"value":2831},"databricks experimental aitools tools get-default-warehouse --profile \u003CPROFILE>",{"type":49,"value":2833},").",{"type":43,"tag":52,"props":2835,"children":2836},{},[2837,2842,2844,2849,2851,2856,2858,2864,2865,2871,2873,2879],{"type":43,"tag":56,"props":2838,"children":2839},{},[2840],{"type":49,"value":2841},"DO NOT guess",{"type":49,"value":2843}," plugin names, resource keys, or property names — always derive them from ",{"type":43,"tag":64,"props":2845,"children":2847},{"className":2846},[],[2848],{"type":49,"value":198},{"type":49,"value":2850}," output. Example: if the manifest shows plugin ",{"type":43,"tag":64,"props":2852,"children":2854},{"className":2853},[],[2855],{"type":49,"value":22},{"type":49,"value":2857}," with a required resource ",{"type":43,"tag":64,"props":2859,"children":2861},{"className":2860},[],[2862],{"type":49,"value":2863},"resourceKey: \"sql-warehouse\"",{"type":49,"value":216},{"type":43,"tag":64,"props":2866,"children":2868},{"className":2867},[],[2869],{"type":49,"value":2870},"fields: { \"id\": ... }",{"type":49,"value":2872},", include ",{"type":43,"tag":64,"props":2874,"children":2876},{"className":2875},[],[2877],{"type":49,"value":2878},"--set analytics.sql-warehouse.id=\u003CID>",{"type":49,"value":511},{"type":43,"tag":52,"props":2881,"children":2882},{},[2883,2888,2889,2894,2896,2902,2904,2909,2911,2917,2919,2925,2926,2932,2933,2939],{"type":43,"tag":56,"props":2884,"children":2885},{},[2886],{"type":49,"value":2887},"Scaffolding Rules Protocol",{"type":49,"value":654},{"type":43,"tag":64,"props":2890,"children":2892},{"className":2891},[],[2893],{"type":49,"value":198},{"type":49,"value":2895}," may emit ",{"type":43,"tag":64,"props":2897,"children":2899},{"className":2898},[],[2900],{"type":49,"value":2901},"scaffolding.rules",{"type":49,"value":2903}," at the template level (top-level ",{"type":43,"tag":64,"props":2905,"children":2907},{"className":2906},[],[2908],{"type":49,"value":2901},{"type":49,"value":2910},") and on individual plugins (",{"type":43,"tag":64,"props":2912,"children":2914},{"className":2913},[],[2915],{"type":49,"value":2916},"plugins[].scaffolding.rules",{"type":49,"value":2918},"). Each block has ",{"type":43,"tag":64,"props":2920,"children":2922},{"className":2921},[],[2923],{"type":49,"value":2924},"must",{"type":49,"value":1073},{"type":43,"tag":64,"props":2927,"children":2929},{"className":2928},[],[2930],{"type":49,"value":2931},"should",{"type":49,"value":1073},{"type":43,"tag":64,"props":2934,"children":2936},{"className":2935},[],[2937],{"type":49,"value":2938},"never",{"type":49,"value":2940}," arrays of short directive strings. Consume them as follows:",{"type":43,"tag":1009,"props":2942,"children":2943},{},[2944,2989,2999,3032,3077],{"type":43,"tag":458,"props":2945,"children":2946},{},[2947,2952,2954,2959,2961,2966,2968,2973,2975,2980,2982,2988],{"type":43,"tag":56,"props":2948,"children":2949},{},[2950],{"type":49,"value":2951},"Gather",{"type":49,"value":2953}," — for every plugin in your final ",{"type":43,"tag":64,"props":2955,"children":2957},{"className":2956},[],[2958],{"type":49,"value":214},{"type":49,"value":2960}," list AND every plugin with ",{"type":43,"tag":64,"props":2962,"children":2964},{"className":2963},[],[2965],{"type":49,"value":2779},{"type":49,"value":2967},", read ",{"type":43,"tag":64,"props":2969,"children":2971},{"className":2970},[],[2972],{"type":49,"value":2916},{"type":49,"value":2974},". Union those with the top-level template ",{"type":43,"tag":64,"props":2976,"children":2978},{"className":2977},[],[2979],{"type":49,"value":2901},{"type":49,"value":2981}," into one working set, tagged by source (template vs ",{"type":43,"tag":64,"props":2983,"children":2985},{"className":2984},[],[2986],{"type":49,"value":2987},"\u003Cplugin>",{"type":49,"value":2833},{"type":43,"tag":458,"props":2990,"children":2991},{},[2992,2997],{"type":43,"tag":56,"props":2993,"children":2994},{},[2995],{"type":49,"value":2996},"Precedence",{"type":49,"value":2998}," — manifest rules override the directives baked into this skill. Where the manifest is silent on a topic, this skill's content is the floor.",{"type":43,"tag":458,"props":3000,"children":3001},{},[3002,3007,3009,3015,3017,3022,3024,3030],{"type":43,"tag":56,"props":3003,"children":3004},{},[3005],{"type":49,"value":3006},"Phase ordering",{"type":49,"value":3008}," — rules whose text begins with ",{"type":43,"tag":64,"props":3010,"children":3012},{"className":3011},[],[3013],{"type":49,"value":3014},"Before init",{"type":49,"value":3016}," MUST be executed before ",{"type":43,"tag":64,"props":3018,"children":3020},{"className":3019},[],[3021],{"type":49,"value":206},{"type":49,"value":3023},". Rules beginning with ",{"type":43,"tag":64,"props":3025,"children":3027},{"className":3026},[],[3028],{"type":49,"value":3029},"After init",{"type":49,"value":3031}," MUST be executed after init completes (e.g. migrations, typegen, connectivity checks). Rules without a phase prefix apply throughout the scaffold\u002Fdevelop loop.",{"type":43,"tag":458,"props":3033,"children":3034},{},[3035,3040,3042,3047,3049,3054,3056,3061,3063,3068,3070,3075],{"type":43,"tag":56,"props":3036,"children":3037},{},[3038],{"type":49,"value":3039},"Conflict detection",{"type":49,"value":3041}," — if a plugin ",{"type":43,"tag":64,"props":3043,"children":3045},{"className":3044},[],[3046],{"type":49,"value":2924},{"type":49,"value":3048}," rule contradicts a template ",{"type":43,"tag":64,"props":3050,"children":3052},{"className":3051},[],[3053],{"type":49,"value":2938},{"type":49,"value":3055}," rule on the same target (or vice versa), STOP and ask the user which to follow before proceeding. Do not silently pick one. Treat ",{"type":43,"tag":64,"props":3057,"children":3059},{"className":3058},[],[3060],{"type":49,"value":2924},{"type":49,"value":3062}," vs ",{"type":43,"tag":64,"props":3064,"children":3066},{"className":3065},[],[3067],{"type":49,"value":2938},{"type":49,"value":3069}," on the same action as a conflict; ",{"type":43,"tag":64,"props":3071,"children":3073},{"className":3072},[],[3074],{"type":49,"value":2931},{"type":49,"value":3076}," is advisory and does not block.",{"type":43,"tag":458,"props":3078,"children":3079},{},[3080,3085,3087,3092],{"type":43,"tag":56,"props":3081,"children":3082},{},[3083],{"type":49,"value":3084},"Reporting",{"type":49,"value":3086}," — before running ",{"type":43,"tag":64,"props":3088,"children":3090},{"className":3089},[],[3091],{"type":49,"value":206},{"type":49,"value":3093},", surface the merged working set to the user grouped by phase (Before init \u002F After init \u002F Always) and by severity (must \u002F should \u002F never), so the active guardrails are explicit.",{"type":43,"tag":52,"props":3095,"children":3096},{},[3097,3108],{"type":43,"tag":56,"props":3098,"children":3099},{},[3100,3102],{"type":49,"value":3101},"READ ",{"type":43,"tag":237,"props":3103,"children":3105},{"href":3104},"references\u002Fappkit\u002Foverview.md",[3106],{"type":49,"value":3107},"AppKit Overview",{"type":49,"value":3109}," for project structure, workflow, and pre-implementation checklist.",{"type":43,"tag":52,"props":3111,"children":3112},{},[3113,3118,3120,3124],{"type":43,"tag":56,"props":3114,"children":3115},{},[3116],{"type":49,"value":3117},"Genie Agent Workflow",{"type":49,"value":3119}," — when the user wants a Genie-powered app, do ",{"type":43,"tag":56,"props":3121,"children":3122},{},[3123],{"type":49,"value":2152},{"type":49,"value":3125}," start by asking for a Genie Space ID. Instead:",{"type":43,"tag":1009,"props":3127,"children":3128},{},[3129,3141,3146,3165,3178],{"type":43,"tag":458,"props":3130,"children":3131},{},[3132,3134,3140],{"type":49,"value":3133},"Ask which Unity Catalog tables the app should query (fully qualified: ",{"type":43,"tag":64,"props":3135,"children":3137},{"className":3136},[],[3138],{"type":49,"value":3139},"catalog.schema.table",{"type":49,"value":2833},{"type":43,"tag":458,"props":3142,"children":3143},{},[3144],{"type":49,"value":3145},"Ask whether to reuse an existing Genie space or create a new one.",{"type":43,"tag":458,"props":3147,"children":3148},{},[3149,3151,3157,3159,3163],{"type":49,"value":3150},"If creating: discover the warehouse, then create the space with ",{"type":43,"tag":64,"props":3152,"children":3154},{"className":3153},[],[3155],{"type":49,"value":3156},"databricks genie create-space",{"type":49,"value":3158}," (see ",{"type":43,"tag":237,"props":3160,"children":3161},{"href":330},[3162],{"type":49,"value":333},{"type":49,"value":3164}," for syntax and serialized space format).",{"type":43,"tag":458,"props":3166,"children":3167},{},[3168,3170,3176],{"type":49,"value":3169},"If reusing: discover existing spaces with ",{"type":43,"tag":64,"props":3171,"children":3173},{"className":3172},[],[3174],{"type":49,"value":3175},"databricks genie list-spaces --profile \u003CPROFILE>",{"type":49,"value":3177}," and let the user pick.",{"type":43,"tag":458,"props":3179,"children":3180},{},[3181,3183,3188,3190,3195],{"type":49,"value":3182},"Scaffold or wire the space ID into the app — derive ",{"type":43,"tag":64,"props":3184,"children":3186},{"className":3185},[],[3187],{"type":49,"value":222},{"type":49,"value":3189}," keys from ",{"type":43,"tag":64,"props":3191,"children":3193},{"className":3192},[],[3194],{"type":49,"value":198},{"type":49,"value":511},{"type":43,"tag":52,"props":3197,"children":3198},{},[3199,3201,3205],{"type":49,"value":3200},"Read the ",{"type":43,"tag":237,"props":3202,"children":3203},{"href":330},[3204],{"type":49,"value":333},{"type":49,"value":3206}," for configuration, SSE endpoints, and frontend integration.",{"type":43,"tag":1665,"props":3208,"children":3210},{"id":3209},"common-scaffolding-mistakes",[3211],{"type":49,"value":3212},"Common Scaffolding Mistakes",{"type":43,"tag":1687,"props":3214,"children":3216},{"className":1689,"code":3215,"language":1691,"meta":1692,"style":1692},"# ❌ WRONG: name is NOT a positional argument\ndatabricks apps init --features analytics my-app-name\n# → \"unknown command\" error\n\n# ✅ CORRECT: use --name flag\ndatabricks apps init --name my-app-name --features analytics --set \"...\" --profile \u003CPROFILE>\n",[3217],{"type":43,"tag":64,"props":3218,"children":3219},{"__ignoreMap":1692},[3220,3228,3257,3265,3274,3282],{"type":43,"tag":1698,"props":3221,"children":3222},{"class":1700,"line":1701},[3223],{"type":43,"tag":1698,"props":3224,"children":3225},{"style":1722},[3226],{"type":49,"value":3227},"# ❌ WRONG: name is NOT a positional argument\n",{"type":43,"tag":1698,"props":3229,"children":3230},{"class":1700,"line":1728},[3231,3235,3239,3243,3247,3252],{"type":43,"tag":1698,"props":3232,"children":3233},{"style":1705},[3234],{"type":49,"value":8},{"type":43,"tag":1698,"props":3236,"children":3237},{"style":1711},[3238],{"type":49,"value":1922},{"type":43,"tag":1698,"props":3240,"children":3241},{"style":1711},[3242],{"type":49,"value":2283},{"type":43,"tag":1698,"props":3244,"children":3245},{"style":1711},[3246],{"type":49,"value":2310},{"type":43,"tag":1698,"props":3248,"children":3249},{"style":1711},[3250],{"type":49,"value":3251}," analytics",{"type":43,"tag":1698,"props":3253,"children":3254},{"style":1711},[3255],{"type":49,"value":3256}," my-app-name\n",{"type":43,"tag":1698,"props":3258,"children":3259},{"class":1700,"line":1771},[3260],{"type":43,"tag":1698,"props":3261,"children":3262},{"style":1722},[3263],{"type":49,"value":3264},"# → \"unknown command\" error\n",{"type":43,"tag":1698,"props":3266,"children":3267},{"class":1700,"line":1797},[3268],{"type":43,"tag":1698,"props":3269,"children":3271},{"emptyLinePlaceholder":3270},true,[3272],{"type":49,"value":3273},"\n",{"type":43,"tag":1698,"props":3275,"children":3276},{"class":1700,"line":1833},[3277],{"type":43,"tag":1698,"props":3278,"children":3279},{"style":1722},[3280],{"type":49,"value":3281},"# ✅ CORRECT: use --name flag\n",{"type":43,"tag":1698,"props":3283,"children":3284},{"class":1700,"line":2583},[3285,3289,3293,3297,3301,3306,3310,3314,3318,3322,3327,3331,3335,3339,3343,3347],{"type":43,"tag":1698,"props":3286,"children":3287},{"style":1705},[3288],{"type":49,"value":8},{"type":43,"tag":1698,"props":3290,"children":3291},{"style":1711},[3292],{"type":49,"value":1922},{"type":43,"tag":1698,"props":3294,"children":3295},{"style":1711},[3296],{"type":49,"value":2283},{"type":43,"tag":1698,"props":3298,"children":3299},{"style":1711},[3300],{"type":49,"value":2288},{"type":43,"tag":1698,"props":3302,"children":3303},{"style":1711},[3304],{"type":49,"value":3305}," my-app-name",{"type":43,"tag":1698,"props":3307,"children":3308},{"style":1711},[3309],{"type":49,"value":2310},{"type":43,"tag":1698,"props":3311,"children":3312},{"style":1711},[3313],{"type":49,"value":3251},{"type":43,"tag":1698,"props":3315,"children":3316},{"style":1711},[3317],{"type":49,"value":2659},{"type":43,"tag":1698,"props":3319,"children":3320},{"style":1744},[3321],{"type":49,"value":1815},{"type":43,"tag":1698,"props":3323,"children":3324},{"style":1711},[3325],{"type":49,"value":3326},"...",{"type":43,"tag":1698,"props":3328,"children":3329},{"style":1744},[3330],{"type":49,"value":1825},{"type":43,"tag":1698,"props":3332,"children":3333},{"style":1711},[3334],{"type":49,"value":1932},{"type":43,"tag":1698,"props":3336,"children":3337},{"style":1744},[3338],{"type":49,"value":1747},{"type":43,"tag":1698,"props":3340,"children":3341},{"style":1711},[3342],{"type":49,"value":1941},{"type":43,"tag":1698,"props":3344,"children":3345},{"style":1755},[3346],{"type":49,"value":1946},{"type":43,"tag":1698,"props":3348,"children":3349},{"style":1744},[3350],{"type":49,"value":1951},{"type":43,"tag":1665,"props":3352,"children":3354},{"id":3353},"directory-naming",[3355],{"type":49,"value":3356},"Directory Naming",{"type":43,"tag":52,"props":3358,"children":3359},{},[3360,3365],{"type":43,"tag":64,"props":3361,"children":3363},{"className":3362},[],[3364],{"type":49,"value":206},{"type":49,"value":3366}," creates directories in kebab-case matching the app name.\nApp names must be lowercase with hyphens only (≤26 chars).",{"type":43,"tag":1665,"props":3368,"children":3370},{"id":3369},"other-frameworks-streamlit-fastapi-flask-gradio-dash-nextjs-etc",[3371],{"type":49,"value":3372},"Other Frameworks (Streamlit, FastAPI, Flask, Gradio, Dash, Next.js, etc.)",{"type":43,"tag":52,"props":3374,"children":3375},{},[3376],{"type":49,"value":3377},"Databricks Apps supports any framework that runs as an HTTP server. LLMs already know these frameworks — the challenge is Databricks platform integration.",{"type":43,"tag":52,"props":3379,"children":3380},{},[3381,3392,3394,3399,3400,3406],{"type":43,"tag":56,"props":3382,"children":3383},{},[3384,3385,3390],{"type":49,"value":3101},{"type":43,"tag":237,"props":3386,"children":3387},{"href":443},[3388],{"type":49,"value":3389},"Other Frameworks Guide",{"type":49,"value":3391}," BEFORE building any non-AppKit app.",{"type":49,"value":3393}," It covers port\u002Fhost configuration, ",{"type":43,"tag":64,"props":3395,"children":3397},{"className":3396},[],[3398],{"type":49,"value":906},{"type":49,"value":216},{"type":43,"tag":64,"props":3401,"children":3403},{"className":3402},[],[3404],{"type":49,"value":3405},"databricks.yml",{"type":49,"value":3407}," setup, dependency management, networking, and framework-specific gotchas.",{"type":43,"tag":1665,"props":3409,"children":3411},{"id":3410},"post-deploy-verification",[3412],{"type":49,"value":3413},"Post-Deploy Verification",{"type":43,"tag":52,"props":3415,"children":3416},{},[3417],{"type":49,"value":3418},"After deploying, verify the app is running:",{"type":43,"tag":1687,"props":3420,"children":3422},{"className":1689,"code":3421,"language":1691,"meta":1692,"style":1692},"databricks apps get \u003Capp-name> --profile \u003CPROFILE> -o json   # Check app_status.state: RUNNING; the `url` field is the app's URL\ndatabricks apps logs \u003Capp-name> --follow --profile \u003CPROFILE>  # Stream live logs (Ctrl+C to stop)\n",[3423],{"type":43,"tag":64,"props":3424,"children":3425},{"__ignoreMap":1692},[3426,3494],{"type":43,"tag":1698,"props":3427,"children":3428},{"class":1700,"line":1701},[3429,3433,3437,3442,3446,3451,3455,3459,3463,3467,3471,3475,3479,3484,3489],{"type":43,"tag":1698,"props":3430,"children":3431},{"style":1705},[3432],{"type":49,"value":8},{"type":43,"tag":1698,"props":3434,"children":3435},{"style":1711},[3436],{"type":49,"value":1922},{"type":43,"tag":1698,"props":3438,"children":3439},{"style":1711},[3440],{"type":49,"value":3441}," get",{"type":43,"tag":1698,"props":3443,"children":3444},{"style":1744},[3445],{"type":49,"value":1747},{"type":43,"tag":1698,"props":3447,"children":3448},{"style":1711},[3449],{"type":49,"value":3450},"app-nam",{"type":43,"tag":1698,"props":3452,"children":3453},{"style":1755},[3454],{"type":49,"value":2430},{"type":43,"tag":1698,"props":3456,"children":3457},{"style":1744},[3458],{"type":49,"value":1763},{"type":43,"tag":1698,"props":3460,"children":3461},{"style":1711},[3462],{"type":49,"value":1932},{"type":43,"tag":1698,"props":3464,"children":3465},{"style":1744},[3466],{"type":49,"value":1747},{"type":43,"tag":1698,"props":3468,"children":3469},{"style":1711},[3470],{"type":49,"value":1941},{"type":43,"tag":1698,"props":3472,"children":3473},{"style":1755},[3474],{"type":49,"value":1946},{"type":43,"tag":1698,"props":3476,"children":3477},{"style":1744},[3478],{"type":49,"value":1763},{"type":43,"tag":1698,"props":3480,"children":3481},{"style":1711},[3482],{"type":49,"value":3483}," -o",{"type":43,"tag":1698,"props":3485,"children":3486},{"style":1711},[3487],{"type":49,"value":3488}," json",{"type":43,"tag":1698,"props":3490,"children":3491},{"style":1722},[3492],{"type":49,"value":3493},"   # Check app_status.state: RUNNING; the `url` field is the app's URL\n",{"type":43,"tag":1698,"props":3495,"children":3496},{"class":1700,"line":1728},[3497,3501,3505,3510,3514,3518,3522,3526,3531,3535,3539,3543,3547,3551],{"type":43,"tag":1698,"props":3498,"children":3499},{"style":1705},[3500],{"type":49,"value":8},{"type":43,"tag":1698,"props":3502,"children":3503},{"style":1711},[3504],{"type":49,"value":1922},{"type":43,"tag":1698,"props":3506,"children":3507},{"style":1711},[3508],{"type":49,"value":3509}," logs",{"type":43,"tag":1698,"props":3511,"children":3512},{"style":1744},[3513],{"type":49,"value":1747},{"type":43,"tag":1698,"props":3515,"children":3516},{"style":1711},[3517],{"type":49,"value":3450},{"type":43,"tag":1698,"props":3519,"children":3520},{"style":1755},[3521],{"type":49,"value":2430},{"type":43,"tag":1698,"props":3523,"children":3524},{"style":1744},[3525],{"type":49,"value":1763},{"type":43,"tag":1698,"props":3527,"children":3528},{"style":1711},[3529],{"type":49,"value":3530}," --follow",{"type":43,"tag":1698,"props":3532,"children":3533},{"style":1711},[3534],{"type":49,"value":1932},{"type":43,"tag":1698,"props":3536,"children":3537},{"style":1744},[3538],{"type":49,"value":1747},{"type":43,"tag":1698,"props":3540,"children":3541},{"style":1711},[3542],{"type":49,"value":1941},{"type":43,"tag":1698,"props":3544,"children":3545},{"style":1755},[3546],{"type":49,"value":1946},{"type":43,"tag":1698,"props":3548,"children":3549},{"style":1744},[3550],{"type":49,"value":1763},{"type":43,"tag":1698,"props":3552,"children":3553},{"style":1722},[3554],{"type":49,"value":3555},"  # Stream live logs (Ctrl+C to stop)\n",{"type":43,"tag":3557,"props":3558,"children":3559},"blockquote",{},[3560],{"type":43,"tag":52,"props":3561,"children":3562},{},[3563,3568,3570,3576,3578,3584],{"type":43,"tag":56,"props":3564,"children":3565},{},[3566],{"type":49,"value":3567},"Note:",{"type":49,"value":3569}," ",{"type":43,"tag":64,"props":3571,"children":3573},{"className":3572},[],[3574],{"type":49,"value":3575},"databricks apps logs",{"type":49,"value":3577}," requires OAuth authentication and does not work with PAT. Use ",{"type":43,"tag":64,"props":3579,"children":3581},{"className":3580},[],[3582],{"type":49,"value":3583},"databricks apps get",{"type":49,"value":3585}," for status checks if using PAT auth.",{"type":43,"tag":3587,"props":3588,"children":3589},"style",{},[3590],{"type":49,"value":3591},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3593,"total":3701},[3594,3611,3623,3640,3652,3671,3678],{"slug":3595,"name":3595,"fn":3596,"description":3597,"org":3598,"tags":3599,"stars":23,"repoUrl":24,"updatedAt":3610},"databricks-agent-bricks","create Databricks Agent Bricks","Create Agent Bricks: Knowledge Assistants (KA) for document Q&A and Supervisor Agents for multi-agent orchestration (MAS).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3600,3603,3604,3607],{"name":3601,"slug":3602,"type":15},"Agents","agents",{"name":9,"slug":8,"type":15},{"name":3605,"slug":3606,"type":15},"Knowledge Management","knowledge-management",{"name":3608,"slug":3609,"type":15},"Multi-Agent","multi-agent","2026-07-15T05:41:38.548954",{"slug":3612,"name":3612,"fn":3613,"description":3614,"org":3615,"tags":3616,"stars":23,"repoUrl":24,"updatedAt":3622},"databricks-ai-functions","use Databricks built-in AI functions","Use Databricks built-in AI Functions (ai_classify, ai_extract, ai_summarize, ai_mask, ai_translate, ai_fix_grammar, ai_gen, ai_analyze_sentiment, ai_similarity, ai_parse_document, ai_prep_search, ai_query, ai_forecast) to add AI capabilities directly to SQL and PySpark pipelines without managing model endpoints. Also covers document parsing and building custom RAG pipelines (parse → prep_search → index → query).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3617,3618,3619],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":3620,"slug":3621,"type":15},"LLM","llm","2026-07-31T05:53:33.562077",{"slug":3624,"name":3624,"fn":3625,"description":3626,"org":3627,"tags":3628,"stars":23,"repoUrl":24,"updatedAt":3639},"databricks-ai-runtime","submit and manage Databricks GPU workloads","Databricks AI Runtime (`air`) CLI — the command-line tool for submitting and managing GPU training workloads on Databricks serverless compute. Use for: running `air` workloads, custom Docker image setup, environment configuration, and troubleshooting `air` jobs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3629,3632,3633,3636],{"name":3630,"slug":3631,"type":15},"CLI","cli",{"name":9,"slug":8,"type":15},{"name":3634,"slug":3635,"type":15},"Docker","docker",{"name":3637,"slug":3638,"type":15},"Engineering","engineering","2026-07-12T08:04:55.843982",{"slug":93,"name":93,"fn":3641,"description":3642,"org":3643,"tags":3644,"stars":23,"repoUrl":24,"updatedAt":3651},"create Databricks AI\u002FBI dashboards","Create Databricks AI\u002FBI dashboards. Must use when creating, updating, or deploying Lakeview dashboards as Databricks Dashboard have a unique json structure. CRITICAL: You MUST test ALL SQL queries via CLI BEFORE deploying. Follow guidelines strictly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3645,3646,3647,3650],{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":3648,"slug":3649,"type":15},"Data Visualization","data-visualization",{"name":9,"slug":8,"type":15},"2026-07-12T08:04:25.314591",{"slug":101,"name":101,"fn":3653,"description":3654,"org":3655,"tags":3656,"stars":23,"repoUrl":24,"updatedAt":3670},"design UX for Databricks AppKit applications","Design the UX of custom-code Databricks Apps (AppKit\u002FReact) data screens — KPI\u002Foverview pages, reports, charts, tables, and Genie\u002Fchat data assistants — mapped to concrete AppKit components. Use when BUILDING or reviewing the UI of an AppKit\u002FReact app that displays data or answers data questions: choosing genre, layout, charts, KPIs, semantic color, required states (loading\u002Fempty\u002Ferror), IBCS notation, and AI-result trust (showing generated SQL\u002Fsources for Genie\u002Fchat). A plain \"create a dashboard\" request means a managed AI\u002FBI (Lakeview) dashboard → use databricks-aibi-dashboards, NOT this skill. Also NOT for non-data frontend (forms, settings, auth, marketing) or scaffolding\u002Fbuild\u002Fdeploy (→ databricks-apps). Complements databricks-apps; use it alongside whenever a custom app has a chart, table, KPI, report, or Genie\u002Fchat\u002FAI surface.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3657,3658,3661,3664,3667],{"name":9,"slug":8,"type":15},{"name":3659,"slug":3660,"type":15},"Design","design",{"name":3662,"slug":3663,"type":15},"Frontend","frontend",{"name":3665,"slug":3666,"type":15},"React","react",{"name":3668,"slug":3669,"type":15},"UI Components","ui-components","2026-07-12T08:04:02.02398",{"slug":4,"name":4,"fn":5,"description":6,"org":3672,"tags":3673,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3674,3675,3676,3677],{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"slug":3679,"name":3679,"fn":3680,"description":3681,"org":3682,"tags":3683,"stars":23,"repoUrl":24,"updatedAt":3700},"databricks-apps-python","build Python backends for Databricks Apps","Python backend for Databricks Apps — FastAPI (default), Flask, Dash, Streamlit, Gradio, Reflex. **Default for a new Databricks App is `databricks-apps` (AppKit — Node\u002FTypeScript\u002FReact) — reach for it first.** Use this skill only when the user asks for a Python backend, extends an existing Python app, or the team is Python-only. Covers OAuth auth, app resources, SQL warehouse and Lakebase connectivity, foundation-model \u002F Vector Search \u002F model-serving APIs (via `databricks-python-sdk`), and deployment via CLI or DABs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3684,3685,3688,3691,3694,3697],{"name":9,"slug":8,"type":15},{"name":3686,"slug":3687,"type":15},"FastAPI","fastapi",{"name":3689,"slug":3690,"type":15},"Flask","flask",{"name":3692,"slug":3693,"type":15},"Gradio","gradio",{"name":3695,"slug":3696,"type":15},"Python","python",{"name":3698,"slug":3699,"type":15},"Streamlit","streamlit","2026-07-12T08:04:10.970845",31,{"items":3703,"total":3701},[3704,3711,3717,3724,3731,3739,3746,3755,3765,3782,3797,3809],{"slug":3595,"name":3595,"fn":3596,"description":3597,"org":3705,"tags":3706,"stars":23,"repoUrl":24,"updatedAt":3610},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3707,3708,3709,3710],{"name":3601,"slug":3602,"type":15},{"name":9,"slug":8,"type":15},{"name":3605,"slug":3606,"type":15},{"name":3608,"slug":3609,"type":15},{"slug":3612,"name":3612,"fn":3613,"description":3614,"org":3712,"tags":3713,"stars":23,"repoUrl":24,"updatedAt":3622},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3714,3715,3716],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":3620,"slug":3621,"type":15},{"slug":3624,"name":3624,"fn":3625,"description":3626,"org":3718,"tags":3719,"stars":23,"repoUrl":24,"updatedAt":3639},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3720,3721,3722,3723],{"name":3630,"slug":3631,"type":15},{"name":9,"slug":8,"type":15},{"name":3634,"slug":3635,"type":15},{"name":3637,"slug":3638,"type":15},{"slug":93,"name":93,"fn":3641,"description":3642,"org":3725,"tags":3726,"stars":23,"repoUrl":24,"updatedAt":3651},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3727,3728,3729,3730],{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":3648,"slug":3649,"type":15},{"name":9,"slug":8,"type":15},{"slug":101,"name":101,"fn":3653,"description":3654,"org":3732,"tags":3733,"stars":23,"repoUrl":24,"updatedAt":3670},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3734,3735,3736,3737,3738],{"name":9,"slug":8,"type":15},{"name":3659,"slug":3660,"type":15},{"name":3662,"slug":3663,"type":15},{"name":3665,"slug":3666,"type":15},{"name":3668,"slug":3669,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":3740,"tags":3741,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3742,3743,3744,3745],{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"slug":3679,"name":3679,"fn":3680,"description":3681,"org":3747,"tags":3748,"stars":23,"repoUrl":24,"updatedAt":3700},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3749,3750,3751,3752,3753,3754],{"name":9,"slug":8,"type":15},{"name":3686,"slug":3687,"type":15},{"name":3689,"slug":3690,"type":15},{"name":3692,"slug":3693,"type":15},{"name":3695,"slug":3696,"type":15},{"name":3698,"slug":3699,"type":15},{"slug":38,"name":38,"fn":3756,"description":3757,"org":3758,"tags":3759,"stars":23,"repoUrl":24,"updatedAt":3764},"configure Databricks CLI and authentication","Databricks CLI operations and the parent\u002Fentry-point skill for Databricks CLI use: authentication, profile selection, and bundles. Load this first for CLI, auth, profile, and bundle tasks, then load the matching product skill. For finding or exploring data, answering questions about the data, or generating SQL, load the databricks-data-discovery skill (it routes to Genie One). Contains up-to-date guidelines for Databricks-related CLI tasks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3760,3762,3763],{"name":684,"slug":3761,"type":15},"authentication",{"name":3630,"slug":3631,"type":15},{"name":9,"slug":8,"type":15},"2026-07-18T05:11:05.45506",{"slug":3766,"name":3766,"fn":3767,"description":3768,"org":3769,"tags":3770,"stars":23,"repoUrl":24,"updatedAt":3781},"databricks-dabs","manage Databricks Declarative Automation Bundles","Create, configure, validate, deploy, run, and manage Declarative Automation Bundles (DABs, formerly Databricks Asset Bundles). Use when working with Databricks resources via DABs including dashboards, jobs, pipelines, alerts, volumes, and apps.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3771,3774,3777,3778],{"name":3772,"slug":3773,"type":15},"Automation","automation",{"name":3775,"slug":3776,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},{"name":3779,"slug":3780,"type":15},"Deployment","deployment","2026-07-15T05:41:35.930355",{"slug":3783,"name":3783,"fn":3784,"description":3785,"org":3786,"tags":3787,"stars":23,"repoUrl":24,"updatedAt":3796},"databricks-data-discovery","discover and query Databricks data","Discover, explore, and query Databricks data via Genie — the CLI equivalent of the Genie One MCP. MUST be invoked whenever the user asks to find or locate data ('what tables are in X', 'where does X live', 'which catalog\u002Fschema has Y'), answer a natural-language question about the data, or write a SQL query.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3788,3789,3792,3793],{"name":17,"slug":18,"type":15},{"name":3790,"slug":3791,"type":15},"Data Engineering","data-engineering",{"name":9,"slug":8,"type":15},{"name":3794,"slug":3795,"type":15},"SQL","sql","2026-07-31T05:53:32.561877",{"slug":3798,"name":3798,"fn":3799,"description":3800,"org":3801,"tags":3802,"stars":23,"repoUrl":24,"updatedAt":3808},"databricks-dbsql","query and script Databricks SQL warehouses","Databricks SQL (DBSQL) advanced features and SQL warehouse capabilities. This skill MUST be invoked when the user mentions: \"DBSQL\", \"Databricks SQL\", \"SQL warehouse\", \"SQL scripting\", \"stored procedure\", \"CALL procedure\", \"materialized view\", \"CREATE MATERIALIZED VIEW\", \"pipe syntax\", \"|>\", \"geospatial\", \"H3\", \"ST_\", \"spatial SQL\", \"collation\", \"COLLATE\", \"ai_query\", \"ai_classify\", \"ai_extract\", \"ai_gen\", \"AI function\", \"http_request\", \"remote_query\", \"read_files\", \"Lakehouse Federation\", \"recursive CTE\", \"WITH RECURSIVE\", \"multi-statement transaction\", \"temp table\", \"temporary view\", \"pipe operator\". SHOULD also invoke when the user asks about SQL best practices, data modeling patterns, or advanced SQL features on Databricks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3803,3804,3806,3807],{"name":17,"slug":18,"type":15},{"name":3805,"slug":914,"type":15},"Database",{"name":9,"slug":8,"type":15},{"name":3794,"slug":3795,"type":15},"2026-07-12T08:04:08.678282",{"slug":3810,"name":3810,"fn":3811,"description":3812,"org":3813,"tags":3814,"stars":23,"repoUrl":24,"updatedAt":3822},"databricks-docs","search Databricks documentation","Databricks documentation reference via llms.txt index. Use when other skills do not cover a topic, looking up unfamiliar Databricks features, or needing authoritative docs on APIs, configurations, or platform capabilities.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3815,3816,3819],{"name":9,"slug":8,"type":15},{"name":3817,"slug":3818,"type":15},"Documentation","documentation",{"name":3820,"slug":3821,"type":15},"Reference","reference","2026-07-15T05:41:34.697746"]