Skip to content

Releases: devaryakjha/gpuicn

gpuicn v0.9.3

Choose a tag to compare

@github-actions github-actions released this 04 Nov 12:24
39065d3

gpuicn v0.9.3

A request from Matty: embed cards can hold a click-to-load placeholder where
their image goes, for applications that ask before loading remote images.
The change is additive; the runtime pins are unchanged: GPUI Kit 0.9.0 on
gpui-pre 0.3.11 and gpui-icons 0.6.0.

Added

  • Embed: ImagePlaceholder, passed to LinkPreview::image_placeholder,
    MessageEmbed::image_placeholder or MessageEmbed::thumbnail_placeholder
    in place of the image (#111).
    • It takes the box the image would take, so nothing moves when the image
      loads: the card's inner width at the pixel size from .size(w, h), or
      16:9 when the size is unknown, large below the text or a thumbnail on the
      right by the same rules as image.
    • A muted surface shows the image icon, "Load image" and the host, and
      fills with the accent color on hover.
    • It is a button named "Load image from {host}" with the focus ring. Click,
      Enter or Space runs on_load once; fetch the image there and pass it
      through image on the next render. label and aria_label replace the
      text, such as for a translation.

Embed, light
Embed, dark

Upgrading

cargo install gpuicn-cli --version 0.9.3 --locked
gpuicn update --to 0.9.3

Crate users: cargo update -p gpuicn.

gpuicn v0.9.2

Choose a tag to compare

@github-actions github-actions released this 04 Nov 07:21
63e16eb

gpuicn v0.9.2

Two requests from Matty: a new Embed component for cards under a chat
message, and dialogs taller than the window now scroll under the pointer.
Every change is additive; the runtime pins are unchanged: GPUI Kit 0.9.0 on
gpui-pre 0.3.11 and gpui-icons 0.6.0.

Added

  • Embed (gpuicn add embed): two cards for what a chat server attaches to
    a post (#108).
    • LinkPreview is an Open Graph preview: a muted site name, a title that
      wraps to two lines and opens the link, a description clamped to three
      lines, and an image. The image is large below the text, or a thumbnail
      on the right when it is narrower than 150px or roughly square. The caller
      passes its pixel size, so the card holds the box before the bytes load.
      on_toggle adds a "Collapse preview" / "Expand preview" chevron that
      hides the image, and on_remove adds a "Remove preview" button.
    • MessageEmbed is the integration attachment: a colored bar (any color,
      a hex string, or good, warning and danger), pretext, an author line
      with an icon, a title, a body slot for your Markdown, a fields grid with
      short fields two to a row, an image, a thumbnail and a footer with an
      icon and a time.
    • Both follow MessageDensity, read every color from the theme, and are
      groups named by their title. Linked titles take focus and open on Enter.

Embed, light
Embed, dark

Fixed

  • Dialog: a dialog taller than the window scrolls with the wheel over its
    surface. dialog_popup used occlude(), which hid the wheel from the
    dialog's scrolling viewport, so the content stayed clipped. It now uses
    block_mouse_except_scroll(): clicks and hover still stop at the surface,
    and the backdrop still keeps the wheel from the page behind. If you built
    your own surface for dialog with occlude(), switch it the same way
    (#109).

Upgrading

cargo install gpuicn-cli --version 0.9.2 --locked
gpuicn update --to 0.9.2

Crate users: cargo update -p gpuicn.

gpuicn v0.9.1

Choose a tag to compare

@github-actions github-actions released this 04 Nov 04:04
2e21f99

gpuicn v0.9.1

Seven additions Matty asked for while building its chat client. Every change
is additive: existing code compiles and draws as before, and installed source
from v0.9.0 changes only in the files below (gpuicn diff lists them). The
runtime pins are unchanged: GPUI Kit 0.9.0 on gpui-pre 0.3.11 and gpui-icons
0.6.0.

Added

  • Message: timestamp_tooltip shows the full date and time when the
    reader hovers the time, on header, continuation and compact rows (#94).
    on_gutter_click makes the avatar column a click target for selecting the
    row, while clicks on the body stay free for text selection and links (#98).
  • Toast: Notice::action(label, handler) and Notice::cancel(label) add
    buttons to a notification. Pressing either dismisses it; the action runs its
    handler first. Tab reaches them before the close button, and hovering the
    stack pauses the timeout as before (#95).
  • MessageList: on_jump hands the "Jump to latest" pill to the
    application, which can load the newest page after a jump into the past
    instead of scrolling to the loaded end. show_jump(true) keeps the pill
    visible at the loaded end of such a window (#97).
  • Attachment: dimensions(width, height) sizes an image thumbnail from the
    file's metadata, keeping its aspect ratio inside max_size (360 × 240 by
    default), and holds that box with a muted fill while the image loads, so the
    transcript does not jump (#99).
  • Sidebar: roving_focus(true) makes the navigation rows one tab stop.
    Tab lands on the focused or selected row and the next Tab leaves; Up and
    Down move between rows (wrapping, skipping disabled ones), Home and End jump
    to the ends, and the focused row scrolls into view (#100).
  • Composer: ComposerState::set_max_rows and max_rows change the growth
    cap without rebuilding the state, and Composer::max_height(px) caps the
    text box in pixels, for example at 40% of the window, following resizes and
    keeping the draft (#101).
  • ScrollArea: track_scroll(&ScrollHandle) shares the scroll position
    with the caller.

Upgrading

cargo install gpuicn-cli --version 0.9.1 --locked
gpuicn update --to 0.9.1

Crate users: cargo update -p gpuicn.

gpuicn v0.9.0

Choose a tag to compare

@github-actions github-actions released this 03 Nov 22:54
7329d1e

gpuicn v0.9.0

The consistency release. Every component now reads every color, size, radius,
shadow and duration from the theme through one set of primitives, a lint keeps
it that way, and setting up a themed app is one command. The runtime pins are
unchanged: GPUI Kit 0.9.0 on gpui-pre 0.3.11 and gpui-icons 0.6.0.

One-command setup

cargo install gpuicn-cli --version 0.9.0 --locked
gpuicn new my-app --base-color zinc --appearance dark
cd my-app && cargo run
  • ui::app::run: the starter main.rs is a window title, a theme pair and
    a root view. app::run(AppConfig::new("My App").themes(light, dark), |_, _| Root)
    opens the platform with the Lucide assets, loads the bundled Geist fonts,
    installs the pair, follows the operating system's appearance and opens the
    window. AppConfig::install does the same without a window.
  • Theme pairs: UiTheme::set_pair, UiTheme::set_appearance with
    Appearance::{Light, Dark, System}, and theme::follow_system.
  • shadcn's base colors: gpuicn init writes assets/theme.css from
    neutral, stone, zinc, mauve, olive, mist or taupe and generates
    src/ui/app_theme.rs. gpuicn theme set --base-color stone --radius 0.5rem --appearance dark changes it; gpuicn theme import theme.css takes a theme
    from the shadcn theme editor or tweakcn; gpuicn theme preview prints every
    token.
  • gpuicn update moves an app to a release (config, Cargo pins, fonts,
    theme files, then status); gpuicn doctor checks everything against
    the CLI's release and prints a fix per finding; gpuicn remove --unused
    deletes components your code never names.
  • gpuicn.toml is version 2 with a [theme] table. Version 1 files still load.

Consistent by construction

  • Primitives in theme::primitives: text, icon, focus, disabled,
    surface, control, clipped_image, dismiss, hover_reveal_in_group.
    Every component uses them; the registry lint in crates/ui/tests fails a
    change that reintroduces a raw color, text size, opacity, mode branch,
    popover background, hover state, key glyph or pub(crate) item.
  • Focus is one 3px outer ring in ring at 50%, shown through
    focus_visible, on every control.
  • Tokens: status colors (success, warning, info, with foregrounds),
    destructive_foreground, typography (xs to xl with line heights),
    breakpoints, and derived control() colors per mode. Every GPUI Kit
    component color follows a token (a test enumerates them).
  • Motion: transition_with and presence_with over the theme durations,
    UiEasing::Emphasized; dialogs fade in and no longer scroll themselves.
  • Input and Textarea share one InputCore; Message hover actions use a group
    instead of state.

Reliability

  • MessageList has a position-based scrollbar (MessageListScrollbar)
    that estimates unmeasured rows from the measured average, so the thumb
    tracks position in long histories instead of jumping as rows are measured
    (#83). Pass scrollbar_handle to share one across re-renders.
  • Toast schedules on deadlines instead of polling every 50ms.
  • Tooltip installs one Escape interceptor for the application.
  • Every component is drawn in both themes by a test; interactive ones have
    behavior tests in crates/ui/tests/catalog.rs.

Message

  • density(MessageDensity::Compact): one line per post, the time always in
    the gutter, the name inline, half the row padding (#88).

For contributors

  • One preview file per component under site/src/previews/;
    cargo xtask new-component <name> scaffolds a component everywhere the
    catalog expects one. docs/design.md states the rules.
  • Releases ship catalog-screenshots-<tag>.zip, the light and dark sheet of
    every preview, and docs/screenshots/v0.9.0 holds this release's.

Breaking changes

  • UiTheme::shadows entries are Arc<[BoxShadow]>; call .to_vec() where a
    Vec is needed.
  • sidebar_is_mobile(window, cx) takes the window.
  • UiColors::slot is public but #[doc(hidden)].

Upgrading

cargo install gpuicn-cli --version 0.9.0 --locked --force
gpuicn update --to 0.9.0     # config, pins, fonts, theme files; then `gpuicn diff`
gpuicn update --overwrite    # replace installed files once your edits are reviewed
gpuicn doctor

Apps that keep their own main.rs can switch to ui::app::run or keep
calling ui::theme::init(cx); doctor accepts both.

gpuicn v0.8.0

Choose a tag to compare

@github-actions github-actions released this 03 Nov 16:08
2c6042c

gpuicn v0.8.0

The runtime moves to GPUI Kit 0.9.0 on gpui-pre 0.3.11, with gpui-icons
0.6.0. This release also fixes the rendering and interaction problems found
while reviewing the 0.7 chat components in the catalog, most of them in dark
mode. Keep these pins together:

gpui_platform = { package = "gpui-pre-platform", version = "=0.3.11", features = ["font-kit"] }
gpui-icons = "=0.6.0"
gpui-kit = { version = "=0.9.0", default-features = false, features = ["component"] }

GPUI Kit 0.9 makes its public theme structs #[non_exhaustive], so struct
literals such as Theme { .., ..Default::default() } no longer compile.
Start from Default::default() and assign fields. See the GPUI Kit
release notes.

gpui-pre 0.3.11 no longer installs a Fetch client on the web. A browser app
that shows images from URLs must pass one in:

let platform = gpui_kit::web::WebPlatform::new_with_backend(true, backend);
let http_client = std::sync::Arc::new(platform.fetch_http_client());
Application::with_platform(std::rc::Rc::new(platform)).with_http_client(http_client)

Fixes

  • Rounded corners: GPUI clips children to a rectangle, so square content
    poked past rounded frames, most visibly in dark mode. Command and Emoji
    Picker paint their surface on the rounded root, Attachment and Markdown
    images take the frame's inner radius, and thumbnail images take the frame's
    aspect ratio so tall images no longer overflow.
  • Attachment: the upload bar stays clear of the rounded corners on file
    cards and image thumbnails.
  • Dialog: pressing the backdrop closes the dialog again, and the same for
    the mobile sidebar sheet. Alert dialogs still ignore it.
  • Dark theme: the modal scrim is 50% black, since GPUI has no backdrop
    blur to pair with shadcn's 10%. The Kit theme now starts from Kit's palette
    for the active mode, so colors gpuicn doesn't set, such as scrollbar
    tracks, no longer keep light values in dark mode.
  • Scroll Area: the scrollbar has no track in any state.
  • Kbd and Command: modifier and arrow symbols draw as icons, because the
    browser build has no fallback font for them. kbd::key_label draws the
    same inline.
  • Message: a continuation row's hover time floats in the gutter, so
    hovering no longer changes the row's height.

Emoji Picker

Recents set after a pick now wait for the next EmojiPickerState::open, so
picking several emoji doesn't shift the grid. Call open each time you show
the picker; it applies the held recents and focuses the search field.

Upgrading

Update the pins above together, then run gpuicn diff and
gpuicn add <component> --overwrite for the components you use. The theme,
dialog, command, kbd, emoji picker, attachment, markdown, message, scroll area
and sidebar sources changed.

gpuicn v0.7.1

Choose a tag to compare

@github-actions github-actions released this 03 Nov 11:48
b0e42ef

gpuicn v0.7.1

A maintenance release with no changes to the components, the crate API or the
CLI. Installed source from v0.7.0 is identical; gpuicn diff shows nothing.

Changed

  • The website's WASM preview is built with wasm-opt -Oz, which shrinks it
    from 25.8 MiB to 13.7 MiB. At 25.8 MiB it was over Cloudflare's 25 MiB asset
    limit, so the v0.7.0 site could not deploy. This release puts the 0.7.0
    components on ui.imajha.com.
  • Releases now run entirely in CI. Merging a version bump to main tags it,
    publishes gpuicn and gpuicn-cli, builds the signed and notarized macOS
    app and the Linux archives, publishes the GitHub release and deploys the
    website. See CONTRIBUTING.

gpuicn v0.7.0

Choose a tag to compare

@github-actions github-actions released this 03 Nov 10:42
8129d3e

gpuicn v0.7.0

This release closes the gaps Matty found in the chat components, and adds a
composer, an emoji picker and a lightbox. Runtime pins are unchanged from
v0.6.0: GPUI Kit 0.8.1 on gpui-pre 0.3.10, and gpui-icons 0.5.0.

New components

  • Composer: a growing message box. Enter sends and Shift+Enter adds a
    line. It can read and set the selection, insert at the caret, wrap a
    selection, report the caret's rectangle, and tell when an input method is
    composing. Key and paste hooks run before the editor, so the app can claim
    pasted images and files. @, ~, : and / open an autocomplete popup
    above the trigger, filled with suggestions from the app.
  • Emoji Picker: search from two characters, category tabs, a virtualized
    grid with keyboard navigation, skin tones, and frequently used, recently
    used and custom emoji supplied by the app. It reports the picked shortcode.
  • Lightbox: a full-window image viewer with zoom, pan, previous and next
    from the keyboard and mouse, caller toolbar actions and focus return.

Changes to existing components

  • Message: reaction chips can show a custom emoji image and a who-reacted
    tooltip (reaction_tooltip takes any view). There is a new
    MessageHighlight::Permalink and a per-row aria_description.
  • Message List: an opt-in keyboard selection mode (track_focus,
    selected, on_select, selectable, on_key).
  • Markdown: selection_root mounts window text selection, so a drag
    selects across messages and Cmd+C or Ctrl+C copies it. CustomEmoji draws
    inline emoji images at text height, and MarkdownImages sends every image
    through the app's resolver.
  • Command: set_leading and set_trailing slots, for avatars and unread
    badges.

Every image slot takes an ImageSource from the app; gpuicn never fetches.

Upgrading

Message now depends on Tooltip in the registry. Copied-source apps should run
gpuicn diff, then gpuicn add message --overwrite (which brings in
tooltip), before adding the new components. Without selection_root,
Markdown in a gpuicn app can't be selected.

gpuicn v0.5.0

Choose a tag to compare

@devaryakjha devaryakjha released this 28 Oct 12:45
9f11d08

gpuicn v0.5.0

gpuicn drops the beta suffix with this release. It is still experimental:
APIs and styling can change between minor versions, and gpuicn diff shows
what an update changes in your copy.

The runtime moves to GPUI Kit 0.8.1 and its pinned gpui-pre 0.3.10. No
component API changes. The minimum Rust is now 1.98, because gpui-pre 0.3.10
needs it on macOS. Keep these pins together:

gpui_platform = { package = "gpui-pre-platform", version = "=0.3.10", features = ["font-kit"] }
gpui-icons = "=0.5.0"
gpui-kit = { version = "=0.8.1", default-features = false, features = ["component"] }

GPUI Kit 0.8 makes some of its own changes, such as scroll bounce by default on
macOS and the ScrollWheelEvent rename to ScrollEvent. See its
release notes if your app
uses GPUI Kit directly.

gpui-icons 0.5.0 bundles Lucide 1.63.0, with 1,924 icons. Ten icons Lucide
renamed keep their old names as aliases and constants, so
LucideIcon::Music still works and points at EighthNotes.

Installed source never updates itself. After upgrading the CLI, run
gpuicn diff to review the changes, then gpuicn add <component> --overwrite.

gpuicn v0.5.0-beta.4

gpuicn v0.5.0-beta.4 Pre-release
Pre-release

Choose a tag to compare

@devaryakjha devaryakjha released this 21 Sep 11:31
1538861

gpuicn v0.5.0-beta.4

This release brings the GPUI Kit 0.6.2–0.6.4 component update into gpuicn. It adds styled Carousel, Empty, and Input Group components, and exposes the existing styled Textarea as its own catalog and install target.

Carousel keeps GPUI Kit’s pointer, trackpad, keyboard, looping, and reduced-motion behavior. gpuicn applies the Nova surface and projects shared colors, fonts, radii, and focus tokens from UiTheme into GPUI Kit’s component theme.

The runtime now uses GPUI Kit 0.6.4, GPUI 0.3.5, and gpui-icons 0.4.1. Keep these versions together. Older gpui-icons releases pin GPUI 0.3.4 and conflict with the updated platform dependency.

Other fixes in this beta:

  • Input and Textarea can intercept native paste payloads, including images and files.
  • Select clears its filter when it closes, so reopening shows every option.
  • Dialog and Alert Dialog controls route actions through the dialog that owns them, even when another control holds focus.
  • Textarea composes directly with Field for labels and validation.
  • Source-install examples include their required component dependencies.
  • The download page groups macOS and Linux builds behind one architecture picker.

Existing copied Rust source does not update itself. Save local edits, install the beta.4 CLI, point gpuicn.toml at the beta.4 registry, then reinstall components with --overwrite.

Downloads:

  • macOS ARM64: Developer ID signed, accepted by Apple notarization, and stapled. SHA-256 2b07abfcfcc7be753a5970bde700969701a930c9de5bc580e6dad001a39fd9b2.
  • Linux x86-64: experimental Ubuntu 24.04/glibc 2.39 build. SHA-256 b0884c8cae503918b9a891a8611439b9efef7b032dd8f768e6eb0309c9d4abee.
  • Linux ARM64: experimental Ubuntu 24.04/glibc 2.39 build. SHA-256 dc18cc2805c8e86190bd655ff168e7ae86bd36d038ae58c63bdd57938a5d6878.

Linux ARM64 runtime behavior, broad Linux desktop compatibility, full screen-reader workflows, and performance budgets remain unqualified. Upstream mobile support does not qualify gpuicn on iOS or Android.

Validation:

  • Release CI passed workspace tests, Clippy, copied-source and crate registry installs, WASM build, and web catalog checks.
  • Download build run built macOS ARM64, Linux x86-64, and Linux ARM64 from merge commit 153886160730e2d3ebcb044d30bfce2ba907fd7d.
  • The exact Linux x86-64 archive stayed running for a 20-second Xvfb/Mesa startup check on Ubuntu without logged errors. This proves startup only, not graphics performance.
  • The release-tree WASM preview passed real browser checks for Carousel buttons, pagination and keyboard input; Input Group single-line and multiline editing; Empty rendering; Select close/reopen behavior; and Dialog and Alert Dialog actions in light and dark themes.

Experimental Linux preview — x86-64 and ARM64

Choose a tag to compare

Experimental optimized builds of gpuicn Workspace for Linux. These are separate x86-64 (Intel/AMD) and ARM64 (AArch64) binaries, not a universal Linux package.

Built from commit 72e2a907cf20 with Rust 1.97.1, locked dependencies and both X11 and Wayland backends enabled. The archive includes a stripped release executable, licenses and launch instructions. The crate's internal version is still beta.3; this preview tag identifies the newer Linux source revision.

Requirements

Ubuntu 24.04 or a compatible Linux desktop with glibc 2.39 or newer and a working Vulkan driver. Ubuntu 22.04 and Alpine/musl are not supported by these binaries. Other distributions have not been qualified.

On Ubuntu, install any missing runtime libraries:

sudo apt install libxcb1 libxkbcommon0 libxkbcommon-x11-0 libfontconfig1 libwayland-client0 libwayland-cursor0 libvulkan1

Use the appropriate graphics driver for your machine. Mesa users can install mesa-vulkan-drivers. Headless software rendering over VNC may remain slow even with an optimized build.

Run

Download the archive for your CPU, extract it, open its folder in a terminal and run:

./gpuicn-workspace

Each .sha256 file verifies its matching archive with sha256sum -c FILE.sha256. The JSON files record architecture, source revision, size and hash.

Testing status

  • x86-64: built natively on Ubuntu 24.04. The packaged release received a bounded headless X11 startup check using Mesa software rendering. The earlier development build received an informal remote-desktop trial; it worked but was laggy.
  • ARM64: cross-compiled with Ubuntu 24.04 ARM64 libraries. Architecture and package integrity checked. Not runtime-tested.
  • Hardware-accelerated performance, Wayland sessions, accessibility, IME and broader distro compatibility still need testing.

Linux now uses $XDG_DATA_HOME/gpuicn-workspace/workspace.json or ~/.local/share/gpuicn-workspace/workspace.json. Earlier trial data under ~/Library/Application Support/gpuicn Workspace/ stays in use if the new file does not exist. GPUICN_WORKSPACE_DATA can override the path.

This preview does not replace the existing macOS release or qualify full Linux support. Please report failures with your CPU architecture, distro, session type, GPU/driver and terminal output.