Dashboard Create Screen

Generate dashboard screens with auto-routing and navigation setup

✨ The solution you've been looking for

Verified
Tested and verified by our team
12587 Stars

Create a new screen in the Multi-site Dashboard with automatic route registration

dashboard react routing components navigation full-stack screen-generation calypso
Repository

See It In Action

Interactive preview & real-world examples

Live Demo
Skill Demo Animation

AI Conversation Simulator

See how users interact with this skill

User Prompt

I need to create a new 'Site Analytics' screen under the sites section that shows detailed analytics for a specific site

Skill Processing

Analyzing request...

Agent Response

Complete screen component with route registration and navigation menu entry automatically added

Quick Start (3 Steps)

Get up and running in minutes

1

Install

claude-code skill install dashboard-create-screen

claude-code skill install dashboard-create-screen
2

Config

3

First Trigger

@dashboard-create-screen help

Commands

CommandDescriptionRequired Args
@dashboard-create-screen create-site-management-screenAdd a new screen to the sites dashboard area with menu navigationNone
@dashboard-create-screen build-user-profile-featureGenerate a new user-facing screen in the me/profile areaNone
@dashboard-create-screen add-admin-dashboard-sectionCreate administrative screens with proper route hierarchyNone

Typical Use Cases

Create Site Management Screen

Add a new screen to the sites dashboard area with menu navigation

Build User Profile Feature

Generate a new user-facing screen in the me/profile area

Add Admin Dashboard Section

Create administrative screens with proper route hierarchy

Overview

Dashboard Create Screen Skill

Creates new screens in client/dashboard with automatic route discovery and registration.

Step 1: Discover Available Routes

First, find all router files and extract available routes.

Find Router Files

Use Glob to discover router files:

client/dashboard/app/router/*.tsx
client/dashboard/app/router/*.ts

Extract Routes from Each File

For each router file, use Grep to extract route information.

Find exported route constants:

export\s+const\s+(\w+Route)\s*=\s*createRoute

Extract parent relationships:

getParentRoute:\s*\(\)\s*=>\s*(\w+Route)

Extract path segments:

path:\s*['"]([^'"]+)['"]

Extract component import paths:

import\(\s*['"]([^'"]+)['"]\s*\)

Build Route Information

For each discovered route, record:

  • Route variable name (e.g., siteBackupsRoute)
  • Parent route name (e.g., siteRoute)
  • Path segment (e.g., 'backups')
  • Source file path
  • Component directory (derived from import path)

Step 2: Discover Navigation Menus (After Route Selection)

Menu discovery happens after the user selects a parent route. Find menus relative to the route’s location.

Determine Menu Search Path

Based on the selected parent route’s import path, determine where to search for menus:

  1. Extract the component directory from the parent route’s lazy import

    • Example: import('../../sites/backups') → search in client/dashboard/sites/
    • Example: import('../../me/profile') → search in client/dashboard/me/
  2. Use Glob to find menu files in that area:

    client/dashboard/{area}/**/*-menu/index.tsx
    
  3. Also check the app-level menu for top-level routes:

    client/dashboard/app/*-menu/index.tsx
    

Extract Menu Information

For each discovered menu file, use Grep to find:

Existing menu items pattern:

<ResponsiveMenu\.Item\s+to=

Route references in menu:

to=\{?\s*[`'"/]([^`'"}\s]+)

This helps understand the menu’s structure and where to add new items.

Menu items use ResponsiveMenu.Item:

1<ResponsiveMenu.Item to="/path/to/screen">
2	{ __( 'Menu Label' ) }
3</ResponsiveMenu.Item>

Conditional menu items check feature support:

1{ siteTypeSupports.featureName && (
2	<ResponsiveMenu.Item to={ `/sites/${ siteSlug }/feature` }>
3		{ __( 'Feature' ) }
4	</ResponsiveMenu.Item>
5) }

Step 3: Gather User Input

Ask the user for the following using AskUserQuestion:

  1. Parent Route: Present discovered routes grouped by source file
  2. Screen Name: lowercase-with-dashes (e.g., custom-settings)
  3. Route Path: URL path segment (e.g., custom-settings)
  4. Page Title: Human-readable title (e.g., Custom settings)
  5. Page Description (optional): Description shown below title
  6. Add to Navigation Menu?: Yes or No

Step 4: Determine File Locations

Based on the selected parent route’s import path, determine where to create the component.

Pattern: If parent imports from ../../sites/backups, new screen goes in client/dashboard/sites/{screen-name}/

For sites area: client/dashboard/sites/{screen-name}/index.tsx For me area: client/dashboard/me/{screen-name}/index.tsx For other areas: Follow the same pattern from parent’s import path

Step 5: Create Component File

Generate a basic component with the standard layout.

Screen Template

 1import { __ } from '@wordpress/i18n';
 2import { PageHeader } from '../../components/page-header';
 3import PageLayout from '../../components/page-layout';
 4
 5export default function {ComponentName}() {
 6	return (
 7		<PageLayout
 8			header={
 9				<PageHeader
10					title={ __( '{PageTitle}' ) }
11					description={ __( '{PageDescription}' ) }
12				/>
13			}
14		>
15			{/* Content goes here */}
16		</PageLayout>
17	);
18}

Step 6: Register the Route

Add the route definition to the same router file as the parent route.

Route Definition Pattern

Add after other route exports in the file:

 1export const {routeName}Route = createRoute( {
 2	head: () => ( {
 3		meta: [
 4			{
 5				title: __( '{PageTitle}' ),
 6			},
 7		],
 8	} ),
 9	getParentRoute: () => {parentRoute},
10	path: '{routePath}',
11} ).lazy( () =>
12	import( '{componentImportPath}' ).then( ( d ) =>
13		createLazyRoute( '{routeId}' )( {
14			component: d.default,
15		} )
16	)
17);

Wire into Route Tree

Find where the parent route is used in the create*Routes() function and add the new route.

For standalone routes (direct child of main area route):

1// Find the routes array (e.g., siteRoutes, meRoutes)
2// Add the new route to the array
3siteRoutes.push( newScreenRoute );

For nested routes (child of a feature route):

1// Find where parent uses .addChildren()
2// Add the new route to the children array
3parentRoute.addChildren( [ existingRoute, newScreenRoute ] )

Step 7: Add Navigation Menu Entry (Optional)

If the user requested a navigation menu entry, add it to the discovered menu file.

Locate Target Menu File

Use the menu discovered in Step 2 based on the route’s area:

  1. From the parent route’s import path, extract the area (e.g., sites, me, plugins)
  2. Glob for client/dashboard/{area}/**/*-menu/index.tsx
  3. If multiple menus found, present them to the user for selection
  4. If no area-specific menu found, fall back to client/dashboard/app/primary-menu/index.tsx

Add Menu Item

Read the target menu file and find an appropriate location (typically before the closing </ResponsiveMenu> tag).

Build the route path from parent route’s path + new screen path:

  • If parent path is /sites/$siteSlug and screen path is analytics/sites/${ siteSlug }/analytics
  • If parent path is /me and screen path is api-keys/me/api-keys

Insert menu item:

1<ResponsiveMenu.Item to={ `{fullRoutePath}` }>
2	{ __( '{PageTitle}' ) }
3</ResponsiveMenu.Item>

Match Existing Patterns

Analyze the existing menu items to match the pattern:

  • If menu uses template literals with siteSlug, use the same pattern
  • If menu uses simple strings, use simple strings
  • If menu items have conditional wrappers, ask user if one is needed

Conditional Menu Items

If the screen requires feature gating (check if similar items in the menu use conditions):

1{ siteTypeSupports.{featureName} && (
2	<ResponsiveMenu.Item to={ `/sites/${ siteSlug }/{routePath}` }>
3		{ __( '{PageTitle}' ) }
4	</ResponsiveMenu.Item>
5) }

Coding Standards

Follow the coding standards documented in client/dashboard/docs/.

What Users Are Saying

Real feedback from the community

Environment Matrix

Dependencies

React 18+
TypeScript
@wordpress/i18n

Framework Support

WordPress Calypso ✓ (required) React Router ✓ TanStack Router ✓

Context Window

Token Usage ~3K-8K tokens depending on existing route structure complexity

Security & Privacy

Information

Author
Automattic
Updated
2026-01-30
Category
full-stack