name: 01-appkit-scaffold
description: >
Scaffold new Databricks AppKit applications using the Databricks CLI and Agent Skills.
Creates blank or plugin-enabled AppKit projects (Lakebase, Analytics, Genie, Files).
Use when asked to create a Databricks app, scaffold an AppKit project, bootstrap a
new app, or set up a full-stack TypeScript Databricks application. Triggers on
"create app", "new app", "scaffold", "AppKit", "databricks app", "blank app",
"bootstrap app", "init app". To add a plugin to an existing app, use the
04-appkit-plugin-add skill instead.
license: Apache-2.0
compatibility: Requires Databricks CLI >= 0.295.0 and Node.js v22+
allowed-tools: Bash(databricks:) Bash(npm:) Bash(git:) Bash(node:) Read
clients: [ide_cli, genie_code]
bundle_resource: apps
deploy_verb: apps_deploy
deploy_note: >
Scaffolding does not deploy — it delegates deploy to 03-appkit-deploy (the apps_deploy contract).
apps init is usually allow-listed on Genie Code via runDatabricksCli and completes without local npm
(deps install server-side on deploy); the allow-list is non-deterministic, so if it is transiently
blocked, retry / set ENABLE_DATABRICKS_CLI=true rather than declaring it impossible. Pass --output-dir
so the project lands in your repo/home, not /Workspace/<name>. The reliable deploy spine remains the
SDK SNAPSHOT path (03-appkit-deploy). The aitools install + apps manifest verbs are hard-blocked on Genie Code —
use the git clone skills-install path and blank-scaffold plugin discovery instead. npx @databricks/appkit docs is IDE-only (npx absent on Genie Code → WebFetch the docs site). Omit --profile on Genie Code.
coverage: full
metadata:
author: prashanth subrahmanyam
version: "1.1.0"
domain: apps
role: scaffold
standalone: true
last_verified: "2026-06-02"
volatility: medium
upstream_sources: [] # Project-specific scaffold workflow; see See Also for canonical upstream.
Scaffold Databricks AppKit Applications
Create and configure Databricks AppKit projects — blank or with plugins — using the Databricks CLI and official Agent Skills.
When to Use
- Creating a brand-new Databricks AppKit application
- Scaffolding a blank app or one with specific plugins (Lakebase, Analytics, Genie, Files)
- Setting up a full-stack TypeScript app that deploys to Databricks Apps
Not for adding plugins to an existing app. Use the 04-appkit-plugin-add skill for that.
Working in Genie Code (client routing)
Scaffolding works on both clients; the per-step notes below carry the details. This table is the index so the skill stands alone even if you jump straight to a step:
| IDE/CLI (as written) | Genie Code substitution | Step |
|---|---|---|
databricks aitools install / aitools tools |
hard-blocked via runDatabricksCli — skills are loaded in-session, so the install/gate is a no-op; if you need the files materialized, use the git clone install path |
1, 2 |
databricks apps manifest |
hard-blocked — discover plugins by blank-scaffolding first and reading appkit.plugins.json, or WebFetch the AppKit docs |
2 |
databricks apps init … |
usually allow-listed via runDatabricksCli (allow-list is non-deterministic — may be transiently blocked; if so retry or set ENABLE_DATABRICKS_CLI=true, don't declare it impossible); add --output-dir (. or an explicit home path) so it doesn't land at /Workspace/<name>; ⚠ npm not found is expected (deps install server-side on deploy) |
2 |
databricks warehouses list / aitools tools get-default-warehouse |
aitools blocked → use databricks warehouses list --output json via runDatabricksCli |
2 |
npm install / npm run dev (local dev server) |
no local Node toolchain — skip; verify on the deployed app (03-appkit-deploy) |
3 |
npx @databricks/appkit docs … |
npx absent (P9) — WebFetch https://databricks.github.io/appkit/ | docs |
--profile <PROFILE> on any databricks … |
omit — Genie Code injects the workspace + OAuth | all |
databricks apps deploy |
not run from this skill — see the 03-appkit-deploy deploy-routing contract |
next |
Scaffold into your workshop project root (<artifact_root> — the local repo on IDE/CLI; /Workspace/Users/<your-email>/vibe-coding-workshop on Genie Code, a git clone of the workshop repo so generated bundles are recognized, NOT the .assistant/skills copy), never /tmp. See skills/genie-code-environment for the full manifest.
Prerequisites
Before scaffolding, run the prerequisites check:
bash apps_lakebase/skills/00-appkit-navigator/scripts/validate-prereqs.sh --profile $PROFILE
If the script is unavailable, verify each prerequisite manually:
# 1. Databricks CLI >= 0.295.0
databricks --version
# 2. Node.js v22+
node --version
# 3. Authenticated CLI profile
databricks auth profiles
# 4. Verify access to the target workspace
databricks current-user me --host <WORKSPACE_URL>
# If this returns 403, you do not have access. Stop and ask the user for a different workspace.
If the CLI is not installed or outdated, see the Databricks CLI installation guide.
Profile Selection: If the calling prompt specifies a profile, use it. Otherwise, list all profiles with databricks auth profiles, present them to the user, and let the user choose. Do not silently default to a profile when multiple are available.
Programmatic profile discovery (for scripted or multi-phase workflows):
TARGET_HOST="<WORKSPACE_URL>"
PROFILE=$(databricks auth profiles --output json 2>/dev/null \
| jq -r --arg host "$TARGET_HOST" \
'[.profiles[] | select(.host == $host)] | .[0].name // empty')
# If $PROFILE is empty, no CLI profile exists for this host yet:
# IDE/CLI client → create one following PRE-REQUISITES §11, then re-run the discovery above.
# Genie Code → not applicable; skip this whole block (pre-authenticated, no profiles — omit --profile everywhere).
Step 1: Install Databricks Agent Skills
Agent Skills give the AI assistant access to data exploration, CLI execution, and workspace resource discovery. They are maintained in the official repository:
Source repository: https://github.com/databricks/databricks-agent-skills
IMPORTANT — Always check the upstream repo for the latest install method BEFORE installing.
Fetch the README from the repository above (e.g. via WebFetch, curl, or browsing) to confirm the current installation commands. The install process may change between releases.
Install to the project (all IDEs)
Clone the skills into the project-level .agents/skills/ directory. This path follows the agentskills.io cross-agent standard and is discovered by Cursor, VS Code / Copilot, Windsurf, Claude Code, and any compatible agent.
git clone --depth 1 https://github.com/databricks/databricks-agent-skills .agents/skills/databricks-skills
The .agents/ directory is already in .gitignore — cloned skills are not committed to the repo.
Alternative (canonical CLI method — requires Databricks CLI v1.0.0+):
databricks aitools install
The CLI auto-detects your coding agent(s) and installs the stable skills to the right location (Claude Code → ~/.claude/skills/; Cursor / Codex CLI / OpenCode / GitHub Copilot / Antigravity → their respective skill dirs). For per-skill selection use databricks aitools install <name>. See the databricks-agent-skills README and the AI-Assisted Development docs.
Note (verb name): the canonical verb is
databricks aitools install— the olderdatabricks experimental aitools installform is deprecated. If your CLI is older than v1.0.0 and only accepts theexperimentalform, prefer thegit cloneinstall above (it has no CLI-version dependency), or upgrade the CLI.
Client note — Genie Code: the entire
aitoolsverb family (bothaitools installand the legacyexperimental aitools install) is hard-blocked viarunDatabricksCli— it is not allow-listed, so the CLI install path does not work here. On Genie Code the Databricks skills are already available in-session, so this step is effectively a no-op — skip it. If you specifically need the.agents/skills/files materialized in the workspace, use thegit clonepath above — it is confirmed working on Genie Code (git is present and github.com is reachable).
Optional: IDE-native install (in addition to the project clone)
Some IDEs have their own plugin/skill systems that provide deeper integration. These are optional extras on top of the project-level install above.
| IDE | Optional extra | What it does |
|---|---|---|
| Cursor | /add-plugin databricks-skills (run in chat) |
Installs to Cursor's plugin cache for cross-project availability |
| Claude Code | databricks aitools install (or /plugin install databricks@databricks-agent-skills) |
Installs to ~/.claude/skills/ for cross-project availability |
| VS Code / Copilot | No extra needed | Discovers .agents/skills/ automatically (docs) |
| Windsurf | No extra needed | Discovers .agents/skills/ automatically (docs) |
Fallback
If you cannot reach the repository, use the bundled fallback script:
bash scripts/install-agent-skills.sh
Verification
After installation, confirm the skills are available. The CLI tools should respond:
databricks aitools tools --help
Verify the Lakebase skill is present (needed in the Setup Lakebase step and later):
ls .agents/skills/databricks-skills/skills/databricks-lakebase/SKILL.md 2>/dev/null \
&& echo "Lakebase skill: OK" \
|| echo "WARNING: Lakebase skill not found — re-run git clone step"
This is idempotent — safe to run multiple times.
Step 2: Scaffold the App
Pre-scaffold check
GATE: Before scaffolding, verify that agent skills from Step 1 are available:
databricks aitools tools --help
If this command fails or is not recognized, go back to Step 1 and install agent skills first. Do not proceed without completing Step 1. Checking the filesystem for skill files is NOT a substitute — the CLI integration may be broken even if files exist.
Client note — Genie Code: this gate assumes the local CLI
aitoolsintegration (IDE path). On Genie Code the skills are loaded in-session andapps init(Step 2) does not depend on a localaitoolsinstall — ifaitools tools --helpis page-gated or unavailable, skip this gate and proceed to scaffold.
Discover Available Plugins (Optional)
Before scaffolding with plugins, inspect the available plugin manifest:
databricks apps manifest --profile <PROFILE>
This shows all available plugins, which are requiredByTemplate (mandatory — do not add to --features), and what --set resource fields each plugin requires. Plugin names and resource keys can change between AppKit versions — always derive them from the manifest rather than guessing.
For blank scaffolds (no --features), this step is optional.
Client note — Genie Code:
databricks apps manifestis hard-blocked viarunDatabricksCli(not allow-listed). To discover plugins/resource keys without it, do a blank scaffold first and read the generatedappkit.plugins.jsonin the project, or consult the AppKit docs (viaWebFetchof databricks.github.io/appkit).
Reference: Upstream SKILL.md — App Manifest and Scaffolding
Client note — Genie Code (scaffold location). On Genie Code,
databricks apps initignores therunDatabricksCliworking directory and writes the project to the workspace root (e.g./Workspace/<APP_NAME>), not your home/repo folder. Verified: a flaglessapps initlanded at/Workspace/<name>and needed a re-run with--output-dirto reach the home directory. So on Genie Code always add--output-dirto the commands below —--output-dir .for the current folder page, or an explicit--output-dir /Workspace/Users/<your-email>/<repo>. (IDE: the local CLI scaffolds into the current directory as usual — no--output-dirneeded unless you want a different target.)
Option A: Blank Scaffold (Default)
A minimal AppKit app with only the server plugin — no data plugins.
databricks apps init --name <APP_NAME> --description "<DESCRIPTION>" --run none --profile <PROFILE>
Option B: Scaffold with Plugins
Add plugins during scaffold using the --features flag. Combine multiple features with commas.
# Analytics only (SQL queries + dashboards)
databricks apps init --name <APP_NAME> --description "<DESC>" --features analytics --set analytics.sql-warehouse.id=<WAREHOUSE_ID> --run none --profile <PROFILE>
# Lakebase only (PostgreSQL persistence)
databricks apps init --name <APP_NAME> --description "<DESC>" --features lakebase --run none --profile <PROFILE>
# Multiple plugins
databricks apps init --name <APP_NAME> --description "<DESC>" --features analytics,lakebase,genie --set analytics.sql-warehouse.id=<WAREHOUSE_ID> --run none --profile <PROFILE>
Available features: analytics, lakebase, genie, files
Non-Interactive Shells (AI Assistants, CI)
When running from a non-interactive shell (no TTY), --name is mandatory — the CLI will error with "--name is required in non-interactive mode" if omitted. Always provide --name, --run none, and --profile. (On Genie Code, also add --output-dir — see the scaffold-location note above.)
Client note — Genie Code:
apps initis usually allow-listed viarunDatabricksCliand completes even thoughnpmis absent (it prints⚠ npm not foundand skipsnpm install— that is expected; deps install server-side on deploy). Pass--output-dir .(or an explicit home path) so the project does not land at/Workspace/<name>. TherunDatabricksCliallow-list is non-deterministic (not cleanly page-gated):apps initmay be blocked on one attempt and allowed on the next. If it is blocked, do not declare scaffolding impossible — retry, or setENABLE_DATABRICKS_CLI=trueto run the raw CLI in the shell. Whatever happens here, the reliable deploy spine is the SDK SNAPSHOT path (w.apps.deploy(..., mode=AppDeploymentMode.SNAPSHOT)viaexecuteCode), which bypasses the allow-list entirely — see03-appkit-deploy. blocked ≠ impossible — try the next path.
Naming Rules
- Max 26 characters, lowercase letters/numbers/hyphens only (no underscores)
dev-prefix adds 4 chars, max 30 total
Discover Warehouse ID (if needed)
When using analytics or genie features, you need a SQL Warehouse ID:
databricks aitools tools get-default-warehouse --profile <PROFILE>
If aitools tools is unavailable (older CLI or page-gated on Genie Code), fall back to databricks warehouses list --output json | jq -r '.[0].id'.
Step 3: Post-Scaffold Setup
cd <APP_NAME>
# Verify scaffold produced expected files
ls app.yaml databricks.yml package.json server/server.ts
Verify the server entry point uses await:
grep -q 'await createApp' server/server.ts && echo "OK" || echo "FIX: replace .catch(console.error) with await"
If the scaffold generated createApp({...}).catch(console.error), replace the file contents with the await createApp() pattern from references/appkit-project-structure.md § "Server Entry Point Pattern."
Note: app.yaml only contains the start command — it does not include a name field. The app name is defined in databricks.yml under resources.apps.app.name.
npm install
npm run dev
If any files are missing, the scaffold may have partially failed. Re-run the scaffold command with --run none and try again.
This starts the dev server with hot reload on http://localhost:8000.
What's Next
After the scaffold is working locally:
- Build features: Use the
02-appkit-buildskill to implement UI and backend from a PRD - Deploy: Use the
03-appkit-deployskill for the full deploy workflow (config validation, build, deploy, UI verification, error diagnosis). Do not rundatabricks apps deploydirectly from this skill — the deploy skill covers it more thoroughly. - Add plugins: Use the
04-appkit-plugin-addskill to add Lakebase, Analytics, Genie, or Files plugins
Adding a Plugin to an Existing App
To add a plugin (Lakebase, Analytics, Genie, Files) to an existing AppKit project, use the 04-appkit-plugin-add skill. It covers plugin registration, environment variables, app.yaml configuration, and frontend integration.
After scaffolding with --features, consult the 04-appkit-plugin-add skill for detailed plugin configuration and frontend integration guidance.
AppKit Documentation (Live)
For the latest API details, component props, and hook signatures — always consult the live docs:
npx @databricks/appkit docs # documentation index
npx @databricks/appkit docs "<query>" # search for a specific topic
npx @databricks/appkit docs --full # full index with all API entries
Client note — Genie Code:
npx/npmare absent from the Genie Code shell (onlynodeis present), sonpx @databricks/appkit docscannot run. Fetch the docs directly instead —WebFetch(or browse) databricks.github.io/appkit.
Read references/appkit-project-structure.md § "Server Entry Point Pattern" and compare against the generated server/server.ts. For the full project layout and dev workflow details, see the same file.
Quick Reference
| Task | Command |
|---|---|
| Install agent skills | git clone --depth 1 https://github.com/databricks/databricks-agent-skills .agents/skills/databricks-skills (all IDEs) |
| Scaffold blank app | databricks apps init --name <N> --run none --profile <P> (Genie Code: add --output-dir) |
| Scaffold with analytics | databricks apps init --name <N> --features analytics --set analytics.sql-warehouse.id=<W> --run none --profile <P> (Genie Code: add --output-dir) |
| Get warehouse ID | databricks aitools tools get-default-warehouse --profile <P> (fallback: databricks warehouses list) |
| Explore table schema | databricks aitools tools discover-schema catalog.schema.table --profile <P> |
| Run ad-hoc SQL | databricks aitools tools query "SELECT ..." --profile <P> |
| Install deps | cd <APP> && npm install |
| Dev server | npm run dev |
| Build | npm run build |
| Validate | databricks apps validate |
| Deploy | databricks apps deploy --profile <P> |
| Browse AppKit docs | npx @databricks/appkit docs |
Client note — Genie Code: in this table, omit
--profileand rundatabricks …viarunDatabricksCli; add--output-dirtoapps init; replacenpx @databricks/appkit docswith a WebFetch of the docs site; and use thegit clonerow (notaitools) to install skills. See the "Working in Genie Code" routing table above.
See Also
- Authoritative upstream: databricks-agent-skills /
databricks-apps— canonical CLI scaffold patterns and Apps platform reference. - AppKit docs hub: databricks.github.io/appkit