🎯

gpui-async

🎯Skill

from longbridge/gpui-component

VibeIndex|
What it does

Enables asynchronous operations and background tasks in GPUI, allowing seamless coordination between UI updates and concurrent computations.

gpui-async

Installation

Install skill:
npx skills add https://github.com/longbridge/gpui-component --skill gpui-async
25
Last UpdatedJan 26, 2026

Skill Details

SKILL.md

Async operations and background tasks in GPUI. Use when working with async, spawn, background tasks, or concurrent operations. Essential for handling async I/O, long-running computations, and coordinating between foreground UI updates and background work.

Overview

GPUI provides integrated async runtime for foreground UI updates and background computation.

Key Concepts:

  • Foreground tasks: UI thread, can update entities (cx.spawn)
  • Background tasks: Worker threads, CPU-intensive work (cx.background_spawn)
  • All entity updates happen on foreground thread

Quick Start

Foreground Tasks (UI Updates)

```rust

impl MyComponent {

fn fetch_data(&mut self, cx: &mut Context) {

let entity = cx.entity().downgrade();

cx.spawn(async move |cx| {

// Runs on UI thread, can await and update entities

let data = fetch_from_api().await;

entity.update(cx, |state, cx| {

state.data = Some(data);

cx.notify();

}).ok();

}).detach();

}

}

```

Background Tasks (Heavy Work)

```rust

impl MyComponent {

fn process_file(&mut self, cx: &mut Context) {

let entity = cx.entity().downgrade();

cx.background_spawn(async move {

// Runs on background thread, CPU-intensive

let result = heavy_computation().await;

result

})

.then(cx.spawn(move |result, cx| {

// Back to foreground to update UI

entity.update(cx, |state, cx| {

state.result = result;

cx.notify();

}).ok();

}))

.detach();

}

}

```

Task Management

```rust

struct MyView {

_task: Task<()>, // Prefix with _ if stored but not accessed

}

impl MyView {

fn new(cx: &mut Context) -> Self {

let entity = cx.entity().downgrade();

let _task = cx.spawn(async move |cx| {

// Task automatically cancelled when dropped

loop {

tokio::time::sleep(Duration::from_secs(1)).await;

entity.update(cx, |state, cx| {

state.tick();

cx.notify();

}).ok();

}

});

Self { _task }

}

}

```

Core Patterns

1. Async Data Fetching

```rust

cx.spawn(async move |cx| {

let data = fetch_data().await?;

entity.update(cx, |state, cx| {

state.data = Some(data);

cx.notify();

})?;

Ok::<_, anyhow::Error>(())

}).detach();

```

2. Background Computation + UI Update

```rust

cx.background_spawn(async move {

heavy_work()

})

.then(cx.spawn(move |result, cx| {

entity.update(cx, |state, cx| {

state.result = result;

cx.notify();

}).ok();

}))

.detach();

```

3. Periodic Tasks

```rust

cx.spawn(async move |cx| {

loop {

tokio::time::sleep(Duration::from_secs(5)).await;

// Update every 5 seconds

}

}).detach();

```

4. Task Cancellation

Tasks are automatically cancelled when dropped. Store in struct to keep alive.

Common Pitfalls

❌ Don't: Update entities from background tasks

```rust

// ❌ Wrong: Can't update entities from background thread

cx.background_spawn(async move {

entity.update(cx, |state, cx| { // Compile error!

state.data = data;

});

});

```

βœ… Do: Use foreground task or chain

```rust

// βœ… Correct: Chain with foreground task

cx.background_spawn(async move { data })

.then(cx.spawn(move |data, cx| {

entity.update(cx, |state, cx| {

state.data = data;

cx.notify();

}).ok();

}))

.detach();

```

Reference Documentation

Complete Guides

  • API Reference: See [api-reference.md](references/api-reference.md)

- Task types, spawning methods, contexts

- Executors, cancellation, error handling

  • Patterns: See [patterns.md](references/patterns.md)

- Data fetching, background processing

- Polling, debouncing, parallel tasks

- Pattern selection guide

  • Best Practices: See [best-practices.md](references/best-practices.md)

- Error handling, cancellation

- Performance optimization, testing

- Common pitfalls and solutions

More from this repository10

🎯
gpui-style-guide🎯Skill

Enforces consistent GPUI component design patterns by providing a comprehensive style guide for creating and reviewing Rust UI components.

🎯
gpui-action🎯Skill

Defines and manages keyboard-driven actions and key bindings for declarative UI interactions in GPUI applications.

🎯
gpui-event🎯Skill

Enables type-safe event handling, subscriptions, and observations for coordinating component interactions in GPUI applications.

🎯
gpui-layout-and-style🎯Skill

Provides CSS-like layout and styling for Rust GPUI components using type-safe, chainable methods for flexbox, sizing, colors, and spacing.

🎯
gpui-entity🎯Skill

Manages application state through safe, concurrent entities with read, update, and weak reference capabilities for reactive and async-friendly state handling in GPUI.

🎯
gpui-focus-handle🎯Skill

Enables keyboard-driven focus management and navigation between focusable elements in GPUI user interfaces.

🎯
gpui-context🎯Skill

gpui-context skill from longbridge/gpui-component

🎯
gpui-test🎯Skill

Enables comprehensive testing of GPUI applications with deterministic, single-threaded test execution for UI components and async operations.

🎯
gpui-element🎯Skill

Enables low-level, performance-critical custom UI element creation with precise control over layout, painting, and interaction phases in GPUI.

🎯
gpui-global🎯Skill

Manages global application state and configuration in GPUI, enabling centralized data access and sharing across components.