From dev
Raycast CLI expert for extension development. Use when users need to create, develop, test, or publish Raycast extensions.
npx claudepluginhub leobrival/topographic-plugins-officialThis skill is limited to using the following tools:
Raycast is a productivity platform that allows developers to build custom extensions using TypeScript and React. This guide provides essential workflows and quick references for creating and publishing Raycast extensions.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Raycast is a productivity platform that allows developers to build custom extensions using TypeScript and React. This guide provides essential workflows and quick references for creating and publishing Raycast extensions.
# Check prerequisites
node --version # Required: Node.js 22.14+
open -a Raycast # Required: Raycast 1.26.0+
# Create extension via Raycast
# Open Raycast → Type "Create Extension"
# Install dependencies
pnpm install
# Start development
pnpm dev
# Test in Raycast
# Open Raycast (Cmd + Space)
# Extension appears at top of search
# Create extension via Raycast
# Open Raycast → Type "Create Extension"
# Choose template or start from scratch
# Navigate to extension directory
cd ~/Developer/my-extension
# Install dependencies
pnpm install
# Start development
pnpm dev
# Open Raycast to test
# Extension appears at top of root search
# Start development mode
pnpm dev
# Edit files in src/ directory
# Changes reflect immediately in Raycast
# View logs in terminal
# View errors in Raycast overlay
# Toggle hot reload if needed
# Raycast → Preferences → Extensions → Development
# "Auto-reload on file changes"
# Run linter
pnpm lint
# Build for production
pnpm build
# Add README and screenshots
cat > README.md << 'EOF'
# Extension Name
Description and usage
EOF
# Add screenshots to assets/
# Take screenshots of each command
# Publish to Raycast Store
pnpm publish
# For public extensions:
# - Authenticates with GitHub
# - Creates PR in raycast/extensions repo
# - Awaits team review
# Add API preferences to package.json
# Configure authentication in preferences
# Start development
pnpm dev
# Test API integration
# View logs in terminal
# Handle errors with showToast
# Build and test
pnpm build
# Check for errors
pnpm dev
# View terminal for build/runtime errors
# Check error overlay in Raycast
# Shows stack trace and details
# Restart Raycast if needed
# Cmd+Q → Reopen Raycast
# Clear cache if needed
# Raycast → Settings → Advanced → Clear Cache
When to use which command:
pnpm dev or npx ray developpnpm lint or npx ray lintpnpm build or npx ray buildnpx ray migratepnpm publish or npx ray publishmy-extension/
├── package.json # Extension metadata
├── tsconfig.json # TypeScript config
├── README.md # Documentation
├── assets/
│ ├── icon.png # 512x512 icon
│ └── screenshot-1.png # Screenshots
└── src/
└── index.tsx # Main command
import { List, ActionPanel, Action, Icon } from "@raycast/api";
export default function Command() {
return (
<List>
<List.Item
title="Item"
icon={Icon.Star}
actions={
<ActionPanel>
<Action.OpenInBrowser url="https://example.com" />
</ActionPanel>
}
/>
</List>
);
}
import { getPreferenceValues } from "@raycast/api";
interface Preferences {
apiKey: string;
}
const { apiKey } = getPreferenceValues<Preferences>();
async function fetchData() {
const response = await fetch("https://api.example.com/data", {
headers: {
Authorization: `Bearer ${apiKey}`,
},
});
return response.json();
}
import { showToast, Toast } from "@raycast/api";
try {
const data = await fetchData();
} catch (error) {
await showToast({
style: Toast.Style.Failure,
title: "Error",
message: String(error),
});
}
import { LocalStorage } from "@raycast/api";
// Save data
await LocalStorage.setItem("favorites", JSON.stringify(items));
// Load data
const stored = await LocalStorage.getItem("favorites");
const favorites = stored ? JSON.parse(stored) : [];
Common Issues:
Extension not appearing in Raycast
pnpm devHot reload not working
Build errors
pnpm install and verify tsconfig.jsonAPI authentication fails
Extension crashes
For detailed troubleshooting steps, see the Troubleshooting Guide.
Load as needed for detailed information:
Commands Reference - Complete CLI command documentation with all flags, options, and configuration files. Use when you need exact syntax, package.json structure, tsconfig settings, or ESLint configuration.
Common Patterns - Real-world patterns for development workflows, API integration, UI components, authentication, data storage, menu bar extensions, background commands, and publishing. Use for implementing specific features or workflows.
Troubleshooting Guide - Detailed error messages, diagnosis steps, and resolution strategies for development, build, runtime, API, storage, UI, publishing, and performance issues. Use when encountering errors or unexpected behavior.
When to use each reference: