Build high-performance desktop apps with GPUI using Rust. Best practices for state, UI, and async interaction.

Install

mkdir -p .claude/skills/gpui && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/14282" && unzip -o skill.zip -d .claude/skills/gpui && rm skill.zip

Installs to .claude/skills/gpui

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

GPUI UI framework best practices for building desktop applications. Use when writing GPUI code, creating UI components, handling state/events, async tasks, animations, lists, forms, testing, or working with Zed-style Rust GUI code.
231 chars✓ has a “when” trigger
Intermediate

Key capabilities

  • Write new GPUI views or components
  • Implement state management with Entity
  • Handle events and keyboard shortcuts
  • Work with async tasks and background work
  • Build forms, lists, or dialogs
  • Style components with Tailwind-like API

How it works

This skill provides a guide with 40+ rules across 8 categories for building desktop applications with the GPUI UI framework.

Inputs & outputs

You give it
GPUI code, component definitions, state management logic
You get back
GPUI desktop application UI components and functionality

When to use gpui

  • Build GPUI components
  • Manage state with Entity
  • Implement keyboard shortcuts
  • Handle async UI tasks

About this skill

GPUI Best Practices

Comprehensive guide for building desktop applications with GPUI, the UI framework powering Zed editor. Contains 40+ rules across 8 categories, prioritized by impact.

When to Apply

Reference these guidelines when:

  • Writing new GPUI views or components
  • Implementing state management with Entity
  • Handling events and keyboard shortcuts
  • Working with async tasks and background work
  • Building forms, lists, or dialogs
  • Styling components with Tailwind-like API
  • Testing GPUI applications

Rule Categories by Priority

PriorityCategoryImpactPrefix
1Core ConceptsCRITICALcore-
2RenderingCRITICALrender-
3State ManagementHIGHstate-
4Event HandlingHIGHevent-
5Async & ConcurrencyMEDIUM-HIGHasync-
6StylingMEDIUMstyle-
7ComponentsMEDIUMcomp-
8Anti-patternsCRITICALanti-

Quick Reference

1. Core Concepts (CRITICAL)

  • core-ownership-model - Understand GPUI's single ownership model
  • core-entity-operations - Use read/update/observe/subscribe correctly
  • core-weak-entity - Use WeakEntity to break circular references
  • core-context-types - Know when to use App, Context<T>, AsyncApp

2. Rendering (CRITICAL)

  • render-render-vs-renderonce - Choose Render for stateful, RenderOnce for components
  • render-element-composition - Build element trees with div() and method chaining
  • render-conditional - Use .when() and .when_some() for conditional styling
  • render-shared-string - Use SharedString to avoid string copying
  • render-builder-pattern - Design components with builder pattern

3. State Management (HIGH)

  • state-notify - Always call cx.notify() after state changes
  • state-observe - Use cx.observe() to react to Entity changes
  • state-subscribe - Use cx.subscribe() for typed events
  • state-global - Use Global trait for app-wide state
  • state-keyed-state - Use window.use_keyed_state() for persistent state

4. Event Handling (HIGH)

  • event-actions - Define and register actions for keyboard shortcuts
  • event-listener - Use cx.listener() for view-bound event handlers
  • event-focus - Manage focus with FocusHandle and key_context
  • event-propagation - Understand event bubbling and stop_propagation

5. Async & Concurrency (MEDIUM-HIGH)

  • async-task-lifecycle - Store or detach tasks to prevent cancellation
  • async-debounce - Implement debounce with timer + task replacement
  • async-background-spawn - Use background_spawn for CPU-intensive work
  • async-weak-entity - Use WeakEntity for safe cross-await access
  • async-error-handling - Use .log_err() and .detach_and_log_err()

6. Styling (MEDIUM)

  • style-flexbox - Use h_flex() and v_flex() for layouts
  • style-theme-colors - Always use cx.theme() for colors
  • style-spacing - Use DynamicSpacing for responsive spacing
  • style-elevation - Use elevation system for layered surfaces

7. Components (MEDIUM)

  • comp-stateless - Prefer RenderOnce with #[derive(IntoElement)]
  • comp-traits - Implement Disableable, Selectable, Sizable traits
  • comp-focus-ring - Add focus ring for accessibility
  • comp-dialog - Use WindowExt for dialog management
  • comp-variant - Use variant enums for component styles

8. Anti-patterns (CRITICAL)

  • anti-silent-error - Never silently discard errors with let _ =
  • anti-drop-task - Never drop Task without storing or detaching
  • anti-drop-subscription - Always detach or store subscriptions
  • anti-circular-reference - Avoid Entity cycles, use WeakEntity
  • anti-missing-notify - Never forget cx.notify() after state changes
  • anti-unwrap - Avoid unwrap(), use ? or explicit handling

Architecture Overview

┌─────────────────────────────────────────────────────────┐
│                    Application (App)                     │
│              (Single owner of all Entities)              │
└─────────────────────────────────────────────────────────┘
                            │
        ┌───────────────────┼───────────────────┐
        │                   │                   │
    ┌───────────┐       ┌───────────┐       ┌──────────┐
    │ Entity<A> │       │ Entity<B> │       │ Global<C>│
    └───────────┘       └───────────┘       └──────────┘
        │                   │                   │
        │ read/update       │ read/update       │ via App
        │ via Context<A>    │ via Context<B>    │
        │
    ┌─────────────────────────────────────────────────┐
    │           UI Rendering (Render trait)           │
    │      Each frame: fn render(&mut self, ...)      │
    │      Returns: impl IntoElement (Element tree)   │
    └─────────────────────────────────────────────────┘
        │
        ├─ observe() → changes trigger render
        ├─ subscribe() → events trigger reactions
        ├─ notify() → signal changes
        └─ emit() → send typed events

How to Use

Read individual rule files for detailed explanations and code examples:

rules/core-ownership-model.md
rules/render-render-vs-renderonce.md
rules/anti-silent-error.md

Each rule file contains:

  • Brief explanation of why it matters
  • Incorrect code example with explanation
  • Correct code example with explanation
  • Additional context and references

When not to use it

  • When not working with GPUI
  • When not building desktop applications

Limitations

  • Specific to the GPUI UI framework
  • Focuses on Zed-style Rust GUI code

How it compares

This guide offers categorized and prioritized rules for GPUI development, contrasting with an unguided approach.

Compared to similar skills

gpui side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
gpui (this skill)06moNo flagsIntermediate
tauri761moReviewAdvanced
rust-errors51moNo flagsAdvanced
hula-skill37moReviewIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

You might also like

tauri

EpicenterHQ

Tauri path handling, cross-platform file operations, and API usage. Use when working with file paths in Tauri frontend code, accessing filesystem APIs, or handling platform differences in desktop apps.

76185

rust-errors

EpicenterHQ

Rust to TypeScript error handling patterns for Tauri apps. Use when defining Rust errors that will be passed to TypeScript, handling Tauri command errors, or creating discriminated union error types.

521

hula-skill

HuLaSpark

HuLa project skill for frontend (Vue 3 + Vite + UnoCSS + Naive UI/Vant), backend (Tauri v2 + Rust + SeaORM/SQLite), full-stack flows, and build/release work. Use when the user mentions hula or HuLa or requests changes in this repository; after triggering, ask which scope (frontend/backend/fullstack/build-release) to enable.

34

makepad-shaders

ZhangHanDong

CRITICAL: Use for Makepad shader system. Triggers on: makepad shader, makepad draw_bg, Sdf2d, makepad pixel, makepad glsl, makepad sdf, draw_quad, makepad gpu, makepad 着色器, makepad shader 语法, makepad 绘制

16

waterui

water-rs

Build cross-platform apps with WaterUI. Use when writing views, handling state, styling UI, or debugging WaterUI Rust code. Covers reactive bindings, layout, components, and the water CLI.

12

waller-wallpaper-session

gvastethecreator

Extend or debug the Wallpaper Session, monitor drafts, preview flows, editor flow, and profile composition across React, Tauri, and Rust. Use for monitor wallpaper features, profile bugs, preview issues, or domain-model changes.

00

Search skills

Search the agent skills registry