Official agent skill

Appkit UI Variants

by databricks in databricks/appkit

Builds a piece of UI in multiple variants, lets the developer pick one live in the browser, then finalizes the chosen variant into source

OfficialApache-2.0Auto-check passed

Install Appkit UI Variants

skills CLI
$ npx skills add databricks/appkit --skill appkit-ui-variants -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install databricks/appkit appkit-ui-variants --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/databricks/appkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/appkit/skills/appkit-ui-variants .claude/skills/appkit-ui-variants && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
appkit-ui-variants
GitHub stars
105
Token cost
~2.3k tokens
SKILL.md length
1,209 words
Files
1
Skills in repo
4
Repo updated
First seen
Licence
Apache-2.0

At a glance

Builds a piece of UI in multiple variants, lets the developer pick one live in the browser, then finalizes the chosen variant into source

  • Works in 6 steps: Understand the request → Author the variants → Ensure the recorder is running → …
  • SKILL.md covers The pieces, 1. Understand the request, 2. Author the variants and 3. Ensure the recorder is…, plus 6 more sections
  • Calls pnpm and jq

What it does

Appkit UI Variants is an agent skill from databricks/appkit, published by the product's own GitHub organization. Builds a piece of UI in multiple variants, lets the developer pick one live in the browser, then finalizes the chosen variant into source

Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It works with macOS and Databricks. The repository describes itself as: Build Databricks Apps faster with our brand-new Node.js + React SDK. Built for humans and AI. The licence is Apache-2.0.

Example prompts

  • “Use the appkit-ui-variants skill to build a piece of UI in multiple variants, lets the developer pick one live in the browser, then finalizes the…”
  • “/appkit-ui-variants”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Understand the request
  2. Author the variants
  3. Ensure the recorder is running
  4. Hand off to the developer
  5. Finalize when the developer says they've chosen
  6. Wrap up

What it can do on your machine

Read from SKILL.md and the folder at commit 97e00e9. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • pnpm
    • jq

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Appkit UI Variants loads about 2.3k tokens when it runs. Until then it costs about 39 tokens; SKILL.md has 1,209 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~39
When it runs · the whole SKILL.md, loaded when a task matches
~2.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from databricks/appkit at commit 97e00e9, republished under its Apache-2.0 licence (© databricks). 1,209 words, ~2,286 tokens.

Download SKILL.mdSave it as .claude/skills/appkit-ui-variants/SKILL.md (or your agent's skills folder).
name
appkit-ui-variants
description
Builds a piece of UI in multiple variants, lets the developer pick one live in the browser, then finalizes the chosen variant into source
argument-hint
<what to build>

UI — Build in Variants, Pick Live, Finalize

User input: $ARGUMENTS

Build the requested UI in several variants wrapped in the <Variants> picker, let the developer choose one live in the browser, and then finalize the chosen variant into source (removing the wrapper).

The picker lets a developer choose between several candidate UIs live in the browser during local dev; you then finalize the chosen one into source.

These rules govern your behavior, not your narration. Apply every rule silently. To the developer, speak only about what you're building and what they need to do — never about the mechanism (the choices file, how a choice is stored, "I read it next turn", or whether you decided to ask).

The pieces

  • <Variants> / <Variant> — @databricks/appkit-ui/react. A dev-time wrapper that renders one candidate at a time with a hover-revealed switcher (prev/next, an index pill + label) and a Confirm tick.
  • The recorder — built into @databricks/appkit. Records the confirmed choice: Confirm POSTs { blockId, chosenIndex, label } to POST /api/ui-variants/confirm, upserted into a JSONL file keyed by blockId. It runs automatically in dev and drops out of production on its own — there's nothing to set up.
  • Choices file — node_modules/.databricks/appkit/.appkit-ui-choices.jsonl, gitignored. A keyed store: one line per <Variants> blockId (not an append log) — re-confirming a variant replaces that block's line, so the file always reflects the current choice: { "ts": "...", "blockId": "hero-cta", "chosenIndex": 1, "label": "Solid" }. Its path is relative to the dev server's cwd, not the repo root, so discover it (finalize step 4) rather than assuming a fixed location.

1. Understand the request

Work out what to build (a component, a section, a page) and where it lives, then pick the natural target file (e.g. a *.route.tsx or a component under src/components/…), and decide the block breakdown before authoring. Two rules shape this step:

  • Ask for what and where; build for how it looks. Before generating, ask at most one or two questions only if the answer changes the build — ambiguous target/surface, an unclear axis of variation, or real-vs-placeholder data on a data screen. Do not ask appearance/taste questions ("bold or minimal?", "which color?"); make one bold and one minimal instead. If the request is clear enough, skip questions. Never turn it into a checklist.
  • One <Variants> block = one independent decision — default to one block per distinct section the user names (a hero + about page → two blocks), and default 3 meaningfully different variants per block.

2. Author the variants

Wrap each section's candidates in its own <Variants> block, following the authoring rules below. Note the file path + every blockId — you need them to finalize.

  • MUST treat one <Variants> block as one independent decision and default to one block per distinct section/region the user names. A page with a hero and an about-us section is two blocks (blockId="hero", blockId="about"), so the developer chooses each section independently. Use a single whole-page block only when the user asks for whole-page options or the sections must move together as one unit.
  • MUST give every <Variants> block a stable, unique blockId within its file. Duplicate ids are ambiguous — refuse and disambiguate.
  • MUST wrap each candidate in <Variant label="…"> with a short, distinct label. The label is shown in the switcher and recorded on confirm.
  • SHOULD default to 3 variants unless the user asks for a specific count. Make them meaningfully different (layout / emphasis / density).
  • Keep each variant self-contained: imports it needs should already be present so finalizing to any one of them leaves the file valid.
  • Layout: <Variants> defaults to block layout (full-width, stacking) — correct for sections, heroes, and pages. Pass layout="inline" only when wrapping a small inline element such as a single button.

One block per section, each candidate a labelled <Variant>:

tsx
import { Variants, Variant } from "@databricks/appkit-ui/react";

// "page with a hero and an about-us section" → one block per section
<Variants blockId="hero">
  <Variant label="Centered">…hero A…</Variant>
  <Variant label="Split with stats">…hero B…</Variant>
  <Variant label="Minimal">…hero C…</Variant>
</Variants>

<Variants blockId="about">
  <Variant label="Two column">…about A…</Variant>
  <Variant label="Timeline">…about B…</Variant>
  <Variant label="Team grid">…about C…</Variant>
</Variants>

3. Ensure the recorder is running

  • The recorder runs automatically in dev — no setup needed.
  • Confirm the dev server is running so the browser can POST the choice.

4. Hand off to the developer

Tell the developer to make the choice in the browser:

Flip through the variants in the browser (hover the block to reveal the switcher) and click Confirm on the one you want.

Then get the "I've chosen" signal — the developer's next message.

The signal is turn-based. Do not start a background watcher. The confirm is recorded to the file; read it on your next turn. How to prompt for it:

  • If your tool has an interactive question prompt and the developer is in an active session, you MAY ask via that prompt — options like "I've picked — finalize" / "Still deciding" / "Cancel" — to save them typing.
  • Otherwise, ask in plain text and read the file on a later turn.

Two hard rules: the question must carry a "still deciding / later" option so it never blocks the developer; and only ask when someone is there to answer — if unsure, use plain text. If the developer says "done" but no line exists for the block yet, they haven't clicked Confirm — ask them to, don't finalize nothing.

Show full SKILL.md (409 more words)Show less

5. Finalize when the developer says they've chosen

  1. When the developer says they've chosen, discover the choices file (path is relative to the dev server's cwd):
    bash
    f=$(find . -path '*/node_modules/.databricks/appkit/.appkit-ui-choices.jsonl' 2>/dev/null | head -1)
    cat "$f"   # find the line for your block's blockId
  2. For the line matching your block's blockId, reconcile chosenIndex against label: check the <Variant> at chosenIndex (zero-based) still has the recorded label. If they don't match, the file was edited after confirm — prefer the <Variant> whose label matches; if none matches, stop and ask the developer to re-confirm.
  3. Find the <Variants blockId="<that id>"> block and replace the whole block with the chosen <Variant>'s inner JSX — remove the <Variants>/<Variant> wrapper, drop the now-unused import if nothing else uses it, reconcile surrounding code, then format/lint the file (pnpm check:fix, or pnpm exec oxlint --fix <file> && pnpm exec oxfmt --write <file>).
  4. Remove the consumed line for that blockId from the choices file. Match the blockId structurally (not a loose substring) so a label containing the text can't delete the wrong line: tmp=$(mktemp); jq -Rc 'fromjson? | select(.blockId != "<that id>")' "$f" > "$tmp" && mv "$tmp" "$f".
  5. Confirm the finalized UI back to the developer.

6. Wrap up

Offer to iterate (new variants, tweaks) if the developer wants another round.

Edge cases

  • Developer confirms before you ask. The choice waits in the file; read it whenever you next act.
  • Developer changed their mind. The store is keyed by blockId, so re-confirming overwrites the previous line. Read whatever line is there now.
  • Endpoint absent (prod build / feature off). The switcher still works as a viewer; Confirm shows "Recorder unavailable". Nothing is recorded — nothing to finalize.
  • Duplicate blockId in a file. Ambiguous — refuse to finalize automatically; ask which block, or re-author with unique ids.

Keeping it out of production

<Variants> is dev-time scaffolding. Always finalize (or remove) every block before a production build — a leftover block ships the dev-only picker to production.

Anti-patterns

  • Wrapping several sections in one <Variants> block (forces whole-page combos, hides most combinations) — one block per section instead.
  • Cosmetic-only variants (same layout, tweaked padding) — make them meaningfully different or don't offer a choice.
  • Starting a background watcher/monitor to catch the confirm — the flow is turn-based on purpose; read the file when the developer says they're done.
  • Leaving the <Variants> wrapper in source after a choice — always finalize (or remove) it; a leftover block ships the dev-only picker to production.
  • Forgetting to clear the consumed choices line after finalizing.

© databricks, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in packages/appkit/skills/appkit-ui-variants of databricks/appkit.

Open the folder on GitHubat commit 97e00e9

Compare with similar skills

Appkit UI Variants next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Appkit UI Variants compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Appkit UI Variants this skilldatabricks/appkit105—~2.3kAutomated safety check: PassApache-2.0
Databricks App Designdatabricks/databricks-agent-skills345—~1.7kAutomated safety check: PassCustom licence
Build Appdatabricks-solutions/databricks-apps-cookbook183—~3.4kAutomated safety check: PassCustom licence
Databricks Appsdatabricks/databricks-agent-skills345—~5.4kAutomated safety check: PassCustom licence
Site ArchitectureAvdLee/RocketSimApp80311 repos~3.3kAutomated safety check: PassCustom licence
Engine Whats Newflutter/flutter179k—~978Automated safety check: PassBSD-3-Clause

Similar skills

  • Databricks App Design

    databricks/databricks-agent-skills

    Official

    Design the UX of custom-code Databricks Apps (AppKit/React) data screens — KPI/overview pages, reports, charts, tables, and Genie/chat data assistants — mapped to concrete AppKit components.

    345 GitHub stars~1.7k tokensUpdated today
    Business, Finance & HRAuto-check passed
  • Build App

    databricks-solutions/databricks-apps-cookbook

    Build Databricks Apps from this cookbook: minimum folder layout and app.yaml per framework (Dash, Streamlit, Reflex, FastAPI), multi-page wiring, docs category-first workflow then README recipes…

    183 GitHub stars~3.4k tokensUpdated 4 days ago
    Backend & APIsAuto-check passed
  • Databricks Apps

    databricks/databricks-agent-skills

    Official

    Build apps on Databricks Apps platform. An agent skill from databricks/databricks-agent-skills.

    345 GitHub stars~5.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Site Architecture

    AvdLee/RocketSimApp

    When the user wants to plan, map, or restructure their website's page hierarchy, navigation, URL structure, or internal linking.

    803 GitHub starsUsed in 11 repos~3.3k tokens
    Marketing & SEOAuto-check passed
  • Engine Whats New

    flutter/flutter

    Generates the "what's new" release summary and diff file for changes in the Flutter engine (//engine/src/flutter) between two releases (e.g., 3.47 vs 3.44).

    179k GitHub stars~978 tokensUpdated today
    MobileAuto-check passed
  • macOS Spm App Packaging

    Dimillian/Skills

    Scaffold, build, and package SwiftPM-based macOS apps without an Xcode project.

    4k GitHub starsUsed in 5 repos~1.2k tokens
    MobileAuto-check passed

More from databricks/appkit

  • Bullet Brief

    databricks/appkit

    Official

    Format the final answer as a tight markdown bullet list — one idea per bullet, no preamble.

    105 GitHub stars~142 tokensUpdated today
    Auto-check passed
  • Haiku

    databricks/appkit

    Official

    Format the final answer as a traditional 5-7-5 haiku. An agent skill from databricks/appkit.

    105 GitHub stars~164 tokensUpdated today
    Auto-check passed
  • Routing Brief

    databricks/appkit

    Official

    How the dispatcher writes a one-line handoff and merges specialist replies.

    105 GitHub stars~196 tokensUpdated today
    Auto-check passed

Works with

Questions about Appkit UI Variants

What does Appkit UI Variants do?

Builds a piece of UI in multiple variants, lets the developer pick one live in the browser, then finalizes the chosen variant into source. Appkit UI Variants is an agent skill from databricks/appkit, published by the product's own GitHub organization.

How do I install Appkit UI Variants in Claude Code?

Run `npx skills add databricks/appkit --skill appkit-ui-variants -a claude-code`. Or copy the skill folder (packages/appkit/skills/appkit-ui-variants in databricks/appkit) into .claude/skills/appkit-ui-variants in your project. Claude Code loads it when a task matches its description.

How do I install Appkit UI Variants in Codex?

Run `npx skills add databricks/appkit --skill appkit-ui-variants -a codex`. Or copy the skill folder (packages/appkit/skills/appkit-ui-variants in databricks/appkit) into .agents/skills/appkit-ui-variants in your project. Codex loads it when a task matches its description.

Can I use Appkit UI Variants in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add databricks/appkit --skill appkit-ui-variants -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/appkit-ui-variants, .gemini/skills/appkit-ui-variants, .github/skills/appkit-ui-variants and .opencode/skills/appkit-ui-variants in your project.

What does Appkit UI Variants need to run?

Going by SKILL.md and its folder, Appkit UI Variants needs the command-line tools its instructions call (pnpm and jq).

Does Appkit UI Variants access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Appkit UI Variants safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Appkit UI Variants use?

Appkit UI Variants is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Appkit UI Variants use?

About 2.3k tokens (SKILL.md is roughly 9.1k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Appkit UI Variants?

Skills that share tags, products or a category with Appkit UI Variants: Databricks App Design (databricks/databricks-agent-skills, 345 stars), Build App (databricks-solutions/databricks-apps-cookbook, 183 stars), Databricks Apps (databricks/databricks-agent-skills, 345 stars) and Site Architecture (AvdLee/RocketSimApp, 803 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Appkit UI Variants?

databricks (a GitHub organization, an official publisher) maintains it in databricks/appkit, which has 105 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 7, 2026.

Source: databricks/appkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.