/building-settings-ui
Use this skill when adding or modifying settings UI in Tambo Cloud. Covers where a new settings section belongs (Agent tab vs Settings tab), and the component patterns used across both pages (card layout, toasts, confirmation dialogs, destructive styling, save behavior
$ npx -y skills add tambo-ai/tambo --skill building-settings-ui --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/building-settings-ui
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use this skill when adding or modifying settings UI in Tambo Cloud. Covers where a new settings section belongs (Agent tab vs Settings tab), and the component patterns used across both pages (card layout, toasts, confirmation dialogs, destructive styling, save behavior
SKILL.md
building-settings-ui.SKILL.mdname: building-settings-ui
description: >-
Use this skill when adding or modifying settings UI in Tambo Cloud. Covers where a new settings
section belongs (Agent tab vs Settings tab), and the component patterns used across both pages
(card layout, toasts, confirmation dialogs, destructive styling, save behavior conventions).
Triggers on "add a new settings section", "where should X go?", "settings UI", "settings page",
"agent page", or any work touching apps/web/components/dashboard-components/project-details/,
project-settings.tsx, or agent-settings.tsx.
Not for full-stack feature building (DB, tRPC, tests); those patterns will get their own skills.
metadata:
internal: true
Building Settings UI
Guide for placing and styling settings sections in the Tambo Cloud dashboard. Covers two concerns: where a feature belongs (which tab/page), and how to build the UI component to match existing patterns.
Architecture
Settings are split across two top-level tabs in the project layout:
- **Agent tab** (`/[projectId]/agent`) - How the AI agent behaves
- **Settings tab** (`/[projectId]/settings`) - Project infrastructure and access
Each tab renders a flat vertical stack of Card components. There is no sidebar navigation; each page is short enough to scroll naturally.
Tab layout
Overview | Observability | Agent | Settings
- Layout file: `apps/web/app/(authed)/(dashboard)/[projectId]/layout.tsx`
- Agent page: `apps/web/app/(authed)/(dashboard)/[projectId]/agent/page.tsx`
- Settings page: `apps/web/app/(authed)/(dashboard)/[projectId]/settings/page.tsx`
Gotchas
1. **Do not add a new top-level tab** without explicit team alignment. Current tabs (Overview, Observability, Agent, Settings) have been stable. 2. **`EditWithTamboButton` goes inside `CardTitle`**, not as a sibling of `CardHeader`. It must have a `description` prop explaining what the section configures. 3. **Invalidate the query before toasting** in `onSuccess`. Reversing the order can show a success toast while the UI still displays old data. 4. **Use `DeleteConfirmationDialog`**, never inline `AlertDialog` for destructive confirmations. 5. **Use `text-destructive` semantic color**, never `text-red-500`. Cancel/discard buttons are NOT destructive.
---
Feature Placement
Agent Tab Sections
| # | Section | What it configures | Component | | --- | ------------------- | -------------------------------------------------- | -------------------------------- | | 1 | Model | Provider + model selection, API key, custom params | `provider-key-section.tsx` | | 2 | Custom Instructions | System prompt, prompt override toggle | `custom-instructions-editor.tsx` | | 3 | Skills | Skill definitions and imports | `skills-section.tsx` | | 4 | Tool Call Limit | Max tool calls per response | `tool-call-limit-editor.tsx` | | 5 | MCP | MCP server URLs + headers | `available-mcp-servers.tsx` |
**Container:** `apps/web/components/dashboard-components/agent-settings.tsx`
Settings Tab Sections
| # | Section | What it configures | Component | | --- | -------------- | ------------------------------ | -------------------------- | | 1 | Name | Project display name | `project-name-section.tsx` | | 2 | API Keys | API key list + create | `api-key-list.tsx` | | 3 | Authentication | OAuth mode, token requirements | `oauth-settings.tsx` | | 4 | Danger Zone | Project deletion | `danger-zone-section.tsx` |
**Container:** `apps/web/components/dashboard-components/project-settings.tsx`
All section components live in `apps/web/components/dashboard-components/project-details/`.
Placement Decision Tree
1. **Configures AI agent behavior?** (model selection, prompts, tools, memory, context) -> **Agent tab** 2. **Configures project infrastructure?** (API keys, naming, deletion, billing, webhooks) -> **Settings tab** 3. **Configures who can access?** (auth, tokens, team members, permissions) -> **Settings tab** 4. **Monitoring or debugging view?** -> **Observability tab** 5. **High-level summary or status?** -> **Overview tab** 6. **None of the above?** -> Ask the user.
Conditional and Dependent Settings
Some settings only apply when another setting is in a specific state. Follow these patterns:
**Show but warn (soft dependency).** The section renders normally but displays an `Alert` when the dependency isn't met. The user can still see and configure the setting. Use this when the feature exists but won't work at runtime.
Example: Skills section shows a provider compatibility notice when the selected provider doesn't support skills:
// skills-section.tsx
const isProviderSupported = SKILLS_SUPPORTED_PROVIDERS.has(
defaultLlmProviderName,
);
// Renders full skills UI + warning Alert if !isProviderSupported
**Conditionally pass props (data dependency).** The parent reads one setting and passes it as a prop so the child can adapt its behavior. Use this when the child's content or options change based on the parent's state.
Example: MCP servers section receives `providerType` to toggle agent-mode-specific UI:
// agent-settings.tsx
<AvailableMcpServers providerType={projectData?.providerType} />;
// available-mcp-servers.tsx
const isAgentMode = providerType === AiProviderType.AGENT;Example: Custom LLM parameters change available suggestions based on provider and model:
// provider-key-section.tsx passes selectedProvider to the parameter editor
<CustomLlmParametersEditor selectedProvider={selectedProvider} />**Rules for new dependent settings:**
1. Never hide a section entirely based on another setting's state. Always render the
Read more
name: building-settings-ui description: >- Use this skill when adding or modifying settings UI in Tambo Cloud. Covers where a new settings section belongs (Agent tab vs Settings tab), and the component patterns used across both pages (card layout, toasts, confirmation dialogs, destructive styling, save behavior conventions). Triggers on "add a new settings section", "where should X go?", "settings UI", "settings page", "agent page", or any work touching apps/web/components/dashboard-components/project-details/, project-settings.tsx, or agent-settings.tsx. Not for full-stack feature building (DB, tRPC, tests); those patterns will get their own skills. metadata: internal: true
Building Settings UI
Guide for placing and styling settings sections in the Tambo Cloud dashboard. Covers two concerns: where a feature belongs (which tab/page), and how to build the UI component to match existing patterns.
Architecture
Settings are split across two top-level tabs in the project layout:
- **Agent tab** (`/[projectId]/agent`) - How the AI agent behaves
- **Settings tab** (`/[projectId]/settings`) - Project infrastructure and access
Each tab renders a flat vertical stack of Card components. There is no sidebar navigation; each page is short enough to scroll naturally.
Tab layout
Overview | Observability | Agent | Settings
- Layout file: `apps/web/app/(authed)/(dashboard)/[projectId]/layout.tsx`
- Agent page: `apps/web/app/(authed)/(dashboard)/[projectId]/agent/page.tsx`
- Settings page: `apps/web/app/(authed)/(dashboard)/[projectId]/settings/page.tsx`
Gotchas
1. **Do not add a new top-level tab** without explicit team alignment. Current tabs (Overview, Observability, Agent, Settings) have been stable. 2. **`EditWithTamboButton` goes inside `CardTitle`**, not as a sibling of `CardHeader`. It must have a `description` prop explaining what the section configures. 3. **Invalidate the query before toasting** in `onSuccess`. Reversing the order can show a success toast while the UI still displays old data. 4. **Use `DeleteConfirmationDialog`**, never inline `AlertDialog` for destructive confirmations. 5. **Use `text-destructive` semantic color**, never `text-red-500`. Cancel/discard buttons are NOT destructive.
---
Feature Placement
Agent Tab Sections
| # | Section | What it configures | Component | | --- | ------------------- | -------------------------------------------------- | -------------------------------- | | 1 | Model | Provider + model selection, API key, custom params | `provider-key-section.tsx` | | 2 | Custom Instructions | System prompt, prompt override toggle | `custom-instructions-editor.tsx` | | 3 | Skills | Skill definitions and imports | `skills-section.tsx` | | 4 | Tool Call Limit | Max tool calls per response | `tool-call-limit-editor.tsx` | | 5 | MCP | MCP server URLs + headers | `available-mcp-servers.tsx` |
**Container:** `apps/web/components/dashboard-components/agent-settings.tsx`
Settings Tab Sections
| # | Section | What it configures | Component | | --- | -------------- | ------------------------------ | -------------------------- | | 1 | Name | Project display name | `project-name-section.tsx` | | 2 | API Keys | API key list + create | `api-key-list.tsx` | | 3 | Authentication | OAuth mode, token requirements | `oauth-settings.tsx` | | 4 | Danger Zone | Project deletion | `danger-zone-section.tsx` |
**Container:** `apps/web/components/dashboard-components/project-settings.tsx`
All section components live in `apps/web/components/dashboard-components/project-details/`.
Placement Decision Tree
1. **Configures AI agent behavior?** (model selection, prompts, tools, memory, context) -> **Agent tab** 2. **Configures project infrastructure?** (API keys, naming, deletion, billing, webhooks) -> **Settings tab** 3. **Configures who can access?** (auth, tokens, team members, permissions) -> **Settings tab** 4. **Monitoring or debugging view?** -> **Observability tab** 5. **High-level summary or status?** -> **Overview tab** 6. **None of the above?** -> Ask the user.
Conditional and Dependent Settings
Some settings only apply when another setting is in a specific state. Follow these patterns:
**Show but warn (soft dependency).** The section renders normally but displays an `Alert` when the dependency isn't met. The user can still see and configure the setting. Use this when the feature exists but won't work at runtime.
Example: Skills section shows a provider compatibility notice when the selected provider doesn't support skills:
// skills-section.tsx const isProviderSupported = SKILLS_SUPPORTED_PROVIDERS.has( defaultLlmProviderName, ); // Renders full skills UI + warning Alert if !isProviderSupported
**Conditionally pass props (data dependency).** The parent reads one setting and passes it as a prop so the child can adapt its behavior. Use this when the child's content or options change based on the parent's state.
Example: MCP servers section receives `providerType` to toggle agent-mode-specific UI:
// agent-settings.tsx
<AvailableMcpServers providerType={projectData?.providerType} />;
// available-mcp-servers.tsx
const isAgentMode = providerType === AiProviderType.AGENT;Example: Custom LLM parameters change available suggestions based on provider and model:
// provider-key-section.tsx passes selectedProvider to the parameter editor
<CustomLlmParametersEditor selectedProvider={selectedProvider} />**Rules for new dependent settings:**
1. Never hide a section entirely based on another setting's state. Always render the
Repo: tambo-ai/tambo
Other skills on tambo.
- /ai-sdk-model-manager
Manages AI SDK model configurations - updates packages, identifies missing models, adds new models with research, and updates documentation
Open skill - /api-resource-lifecycle
Guides CRUD operations for API resources with cascading dependencies, descriptive validation, and orphan prevention. Use when adding delete/remove operations, creating validation logic, building resources that depend on other resources, or when the user mentions "cascade
Open skill - /compound-components
Creates unstyled compound components that separate business logic from styles. Use when building headless UI primitives, creating component libraries, implementing Radix-style namespaced components, or when the user mentions "compound components", "headless", "unstyled",
Open skill - /creating-styled-wrappers
Creates styled wrapper components that compose headless/base compound components. Use when refactoring styled components to use base primitives, implementing opinionated design systems on top of headless components, or when the user mentions "use base components", "compose
Open skill - /validating-accessibility
Use this skill when creating, modifying, or reviewing any .tsx component in apps/web, even if the user doesn't mention "accessibility." Covers semantic HTML, aria labels, navigation landmarks, forms, dialogs, and keyboard navigation. Trigger on: adding buttons, links, toggles,
Open skill - /building-with-tambo
Integrates Tambo into existing React apps — detects tech stack, installs @tambo-ai/react, wires TamboProvider, registers components with Zod schemas, and sets up tools/context. Use when adding AI-powered generative UI to an existing codebase. Triggers on "add Tambo", "integrate
Open skill

