Agent skill

Bezel

by crabtalk in crabtalk/bezel

Build native GUI apps in Rust with bezel, the gpui component library (bezel, bezel-gpui, bezel-ui, bezel-theme, bezel-motion, bezel-icons, bezel-markdown, bezel-editor, bezel-terminal).

MITAuto-check passedFrontend & Design

Install Bezel

skills CLI
$ npx skills add crabtalk/bezel --skill bezel -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install crabtalk/bezel bezel --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/crabtalk/bezel.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/bezel .claude/skills/bezel && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
bezel
GitHub stars
172
Token cost
~1.6k tokens
SKILL.md length
708 words
Files
1
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

Build native GUI apps in Rust with bezel, the gpui component library (bezel, bezel-gpui, bezel-ui, bezel-theme, bezel-motion, bezel-icons, bezel-markdown, bezel-editor, bezel-terminal).

  • Works in 6 steps: No style parameters.… → Stateless paint is a catalog trait on… → Interaction is yours. A widget returns a… → …
  • Styling UI in a gpui app
  • SKILL.md covers Fetch the page before writing…, The dependency line, Bootstrap and Write it the way the library…, plus 2 more sections
  • Calls cargo; reaches bezel.gallery

What it does

Bezel is an agent skill from crabtalk/bezel. Build native GUI apps in Rust with bezel, the gpui component library (bezel, bezel-gpui, bezel-ui, bezel-theme, bezel-motion, bezel-icons, bezel-markdown, bezel-editor, bezel-terminal). Use when adding or styling UI in a gpui app, choosing a bezel component, theming with Brand/Tint, or when a bezel/gpui build fails to link or paints no text. Triggers on bezel, gpui, Theme::of(cx), theme.button, ui::widgets, bezel.gallery.

Its SKILL.md is about 1.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Frontend & Design, covering Design systems, Theming and dark mode and iOS development. It works with Rust. The repository describes itself as: A SwiftUI-lean GPUI component library, style flows through the environment, never through parameters. The licence is MIT.

When your agent uses it

  • Styling UI in a gpui app
  • Choosing a bezel component
  • Theming with Brand/Tint
  • A bezel/gpui build fails to link

Example prompts

  • “/bezel”

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. No style parameters. theme.button("Save", ButtonStyle::Prominent, None)
  2. Stateless paint is a catalog trait on Theme. Import the group, reach the
  3. Interaction is yours. A widget returns a gpui::Div; you attach .id()
  4. Write no numbers. ui::stack::row() already carries the system gap.
  5. Motion is named. Take a spec from the motion catalog; no inline
  6. Theme by Brand, not by token. One hue for greys, one for accent, one

What it can do on your machine

Read from SKILL.md and the folder at commit bcefab1. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • cargo

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • bezel.gallery

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Bezel loads about 1.6k tokens when it runs. Until then it costs about 111 tokens; SKILL.md has 708 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~111
When it runs · the whole SKILL.md, loaded when a task matches
~1.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from crabtalk/bezel at commit bcefab1, republished under its MIT licence (© crabtalk). 708 words, ~1,613 tokens.

Download SKILL.mdSave it as .claude/skills/bezel/SKILL.md (or your agent's skills folder).
name
bezel
description
Build native GUI apps in Rust with bezel, the gpui component library (bezel, bezel-gpui, bezel-ui, bezel-theme, bezel-motion, bezel-icons, bezel-markdown, bezel-editor, bezel-terminal). Use when adding or styling UI in a gpui app, choosing a bezel component, theming with Brand/Tint, or when a bezel/gpui build fails to link or paints no text. Triggers on `bezel`, `gpui`, `Theme::of(cx)`, `theme.button`, `ui::widgets`, `bezel.gallery`.

bezel

A gpui component library, SwiftUI-lean. Style flows through the environment — components read Theme::of(cx) at paint time. There are no color, font or size parameters, and that is the thing to internalise before writing a call.

Fetch the page before writing the call

Every doc page is served as markdown. Signatures here are wrong to guess.

wantfetch
the index of every pagehttps://bezel.gallery/llms.txt
one componenthttps://bezel.gallery/docs/<slug>.md
all of it, one file (~88KB)https://bezel.gallery/llms-full.txt

Slugs by group — fetch the one you need:

  • Style theme, color, typography, layout, material
  • Motion motion-curves, motion-catalog
  • Assets icons
  • Input buttons, text-field, textarea, select, combobox, checkbox-radio, toggle, toggle-group, slider, date-picker
  • Menus menu, context-menu, palette, menubar
  • Presentation dialog, sheet, tooltip, hover-card
  • Layout group-box, tabs, nav-row, collapsible, split, titlebar, control-bar, floating
  • Data scroll-area, follow, table, tree, virtual-list
  • Content badge, tag, avatar, breadcrumb, pagination, empty-state, skeleton
  • Status progress, status-dot, alerts, step-row, loaders, stats
  • Patterns agent-activity, agent-tools, agent-composer, agent-transcript, agent-diff, agent-terminal, agent-orbs, agent-avatar, document, editor, syntax

With the sources checked out, crates/ui/src/ is the truth and cargo run -p gallery shows every component live.

The dependency line

toml
[dependencies]
bezel = "0.2"
gpui = { package = "bezel-gpui", version = "0.3" }
gpui_platform = { package = "bezel-gpui-platform", version = "0.3", features = ["font-kit"] }

Three, not one: actions! expands to literal gpui:: paths, and the facade re-exports gpui but not the platform backend. The package rename is what keeps those paths resolving. gpui, gpui_platform and gpui_web must be the same version. Never write a plain gpui = "0.2" beside bezel — see Traps.

markdown, syntax, blocks and terminal are peer crates an app names itself (bezel-markdown, …); the facade deliberately does not carry them.

Bootstrap

Four calls no snippet can skip, in this order:

rust
gpui_platform::application().run(|cx: &mut App| {
    ui::register_fonts(cx).ok();                  // bundled Geist into the text system
    theme::appearance::init(AppearanceMode::System, cx);  // Theme::of(cx) panics without it
    focus::init(cx);                              // tab order, enter/space activation
    cx.set_menus(vec![Menu::new("app").items([MenuItem::action("Quit", Quit)])]);
    cx.open_window(opts, |window, cx| {
        theme::appearance::observe_window(window, cx).detach();  // repaint on light/dark flip
        cx.new(Root::new)
    }).unwrap();
    cx.activate(true);
});

apps/hello in the repo is this and nothing else — the smallest correct consumer.

Write it the way the library is written

  1. No style parameters. theme.button("Save", ButtonStyle::Prominent, None) takes no color and no size. Override by chaining gpui modifiers on what comes back: theme.group_box().rounded(px(4.0)). If you find yourself wanting a color argument, you want a chain modifier instead.
  2. Stateless paint is a catalog trait on Theme. Import the group, reach the method: use ui::widgets::{ButtonStyle, Buttons}; → theme.button(…). The groups are Buttons, Controls, Icons, Scaffolding, Layout, Content and Status. Stateful things are entities you hold (TextField, Table, Orb, Palette).
  3. Interaction is yours. A widget returns a gpui::Div; you attach .id() and .on_click(). bezel never owns your handlers.
  4. Write no numbers. ui::stack::row() already carries the system gap. .gap(px(12.0)) is a deviation, and should read as one. Sizes come from TextStyle and ControlSize, not from px.
  5. Motion is named. Take a spec from the motion catalog; no inline durations or cubic-beziers.
  6. Theme by Brand, not by token. One hue for greys, one for accent, one radius, set before appearance::init. Lightness is not a knob — that is what keeps a rebranded palette at the contrast ratios it was verified at.
Show full SKILL.md (254 more words)Show less

Traps

  • Two gpuis. Declaring your own gpui dependency alongside bezel can put a second copy in the graph: two type universes, whose best failure is a trait bound error and whose worst is a window that paints shapes but no text. Go through the package = "bezel-gpui" rename above, or bezel::gpui.
  • Theme::of(cx) before appearance::init — the global is not there yet.
  • wasm. std::time::Instant panics on wasm32-unknown-unknown; use web-time. Reach for bezel-gpui-web instead of gpui_platform, and turn bezel's platform feature off (it is off by default).
  • No fonts registered silently falls back to system faces; on Linux, missing the geist-weights faces paints every weight at 400.
  • No menu, no cmd-q. A gpui app gets no menu bar for free.
  • Icon color. gpui reads an SVG's color off the element's own style and paints nothing when unset — set it on the glyph, not on the parent. theme.icon(glyph::Search) carries a tone and a ladder step already; icons::icon(..) is the bare builder and needs both.
  • Fade keys must be unique. Two elements sharing one trade hover animations.

When bezel is the thing that is wrong

Component missing a case, a doc page whose snippet does not compile, a panic inside ui/theme — that is a bug in the library, not something to paper over in app code. Reduce it to the smallest gpui app that shows it, then open an issue at https://github.com/crabtalk/bezel/issues with the repro, the bezel and bezel-gpui versions, the platform, and what you expected. Do not work around it silently: the workaround is the bug report nobody filed.

© crabtalk, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/bezel of crabtalk/bezel.

Open the folder on GitHubat commit bcefab1

Compare with similar skills

Bezel next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Bezel compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Bezel this skillcrabtalk/bezel172—~1.6kAutomated safety check: PassMIT
Worklog Designregisx001/Worklog261—~3.3kAutomated safety check: PassMIT
Design SystemWrongStack/WrongStack370—~3.9kAutomated safety check: PassMIT
Cometchat iOS Customizationcometchat/cometchat-skills130—~1.1kAutomated safety check: PassMIT
Cometchat iOS Migrationcometchat/cometchat-skills130—~940Automated safety check: PassMIT
Impeccablebestofjs/bestofjs3.1k27 repos~2.6kAutomated safety check: PassMIT

Similar skills

  • Worklog Design

    regisx001/Worklog

    Design and UI skill for the Worklog desktop project manager.

    261 GitHub stars~3.3k tokensUpdated 1 mo ago
    Frontend & DesignAuto-check passed
  • Design System

    WrongStack/WrongStack

    Use this skill BEFORE writing or restyling ANY user-facing interface.

    370 GitHub stars~3.9k tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Cometchat iOS Customization

    cometchat/cometchat-skills

    Brand and restyle the CometChat iOS UI Kit — theme colours, typography, per-component styles, localisation and sounds.

    130 GitHub stars~1.1k tokensUpdated 3 days ago
    Frontend & DesignAuto-check passed
  • Cometchat iOS Migration

    cometchat/cometchat-skills

    Upgrade an existing CometChat iOS integration from UI Kit v4 to v5 — composite components removed, theming replaced, properties renamed.

    130 GitHub stars~940 tokensUpdated 3 days ago
    MobileAuto-check passed
  • Impeccable

    bestofjs/bestofjs

    A skill your agent uses when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a…

    3.1k GitHub starsUsed in 27 repos~2.6k tokens
    Frontend & DesignAuto-check passed
  • Builds or updates a design system in Figma from a codebase in ordered phases: discovery, variables and tokens, components, theming and documentation, with checkpoints.

    65k GitHub starsUsed in 2 repos~4.4k tokens
    Frontend & DesignAuto-check passed

More from crabtalk/bezel

  • Bezel Contributing

    crabtalk/bezel

    Work inside the bezel repo — where code goes across the crate layers, the five laws a change has to obey, and everything a component has to land with (gallery row, docs page, tests, the nightly…

    172 GitHub stars~1.1k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Bezel

What does Bezel do?

Build native GUI apps in Rust with bezel, the gpui component library (bezel, bezel-gpui, bezel-ui, bezel-theme, bezel-motion, bezel-icons, bezel-markdown, bezel-editor, bezel-terminal). Bezel is an agent skill from crabtalk/bezel. Build native GUI apps in Rust with bezel, the gpui component library (bezel, bezel-gpui, bezel-ui, bezel-theme, bezel-motion, bezel-icons, bezel-markdown, bezel-editor, bezel-terminal).

When should I use Bezel?

Bezel fits situations like: styling UI in a gpui app; choosing a bezel component; theming with Brand/Tint; A bezel/gpui build fails to link.

How do I install Bezel in Claude Code?

Run `npx skills add crabtalk/bezel --skill bezel -a claude-code`. Or copy the skill folder (skills/bezel in crabtalk/bezel) into .claude/skills/bezel in your project. Claude Code loads it when a task matches its description.

How do I install Bezel in Codex?

Run `npx skills add crabtalk/bezel --skill bezel -a codex`. Or copy the skill folder (skills/bezel in crabtalk/bezel) into .agents/skills/bezel in your project. Codex loads it when a task matches its description.

Can I use Bezel in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add crabtalk/bezel --skill bezel -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/bezel, .gemini/skills/bezel, .github/skills/bezel and .opencode/skills/bezel in your project.

What does Bezel need to run?

Going by SKILL.md and its folder, Bezel needs the command-line tools its instructions call (cargo).

Does Bezel access the network?

SKILL.md names 1 domain. In commands or code: bezel.gallery; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Bezel safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Bezel use?

Bezel is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Bezel use?

About 1.6k tokens (SKILL.md is roughly 6.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Bezel?

Skills that share tags, products or a category with Bezel: Worklog Design (regisx001/Worklog, 261 stars), Design System (WrongStack/WrongStack, 370 stars), Cometchat iOS Customization (cometchat/cometchat-skills, 130 stars) and Cometchat iOS Migration (cometchat/cometchat-skills, 130 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Bezel?

crabtalk (a GitHub organization) maintains it in crabtalk/bezel, which has 172 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 7, 2026.

Source: crabtalk/bezel on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.