Repository navigation
Releases: devaryakjha/gpuicn
Release list
gpuicn v0.9.3
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 toLinkPreview::image_placeholder,
MessageEmbed::image_placeholderorMessageEmbed::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 asimage. - 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 runson_loadonce; fetch the image there and pass it
throughimageon the next render.labelandaria_labelreplace the
text, such as for a translation.
- It takes the box the image would take, so nothing moves when the image
Upgrading
cargo install gpuicn-cli --version 0.9.3 --locked
gpuicn update --to 0.9.3Crate users: cargo update -p gpuicn.
gpuicn v0.9.2
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).LinkPreviewis 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_toggleadds a "Collapse preview" / "Expand preview" chevron that
hides the image, andon_removeadds a "Remove preview" button.MessageEmbedis the integration attachment: a colored bar (any color,
a hex string, orgood,warninganddanger), 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.
Fixed
- Dialog: a dialog taller than the window scrolls with the wheel over its
surface.dialog_popupusedocclude(), 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 fordialogwithocclude(), switch it the same way
(#109).
Upgrading
cargo install gpuicn-cli --version 0.9.2 --locked
gpuicn update --to 0.9.2Crate users: cargo update -p gpuicn.
gpuicn v0.9.1
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_tooltipshows the full date and time when the
reader hovers the time, on header, continuation and compact rows (#94).
on_gutter_clickmakes 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)andNotice::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_jumphands 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 insidemax_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_rowsandmax_rowschange the growth
cap without rebuilding the state, andComposer::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.1Crate users: cargo update -p gpuicn.
gpuicn v0.9.0
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 runui::app::run: the startermain.rsis 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::installdoes the same without a window.- Theme pairs:
UiTheme::set_pair,UiTheme::set_appearancewith
Appearance::{Light, Dark, System}, andtheme::follow_system. - shadcn's base colors:
gpuicn initwritesassets/theme.cssfrom
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 darkchanges it;gpuicn theme import theme.csstakes a theme
from the shadcn theme editor or tweakcn;gpuicn theme previewprints every
token. gpuicn updatemoves an app to a release (config, Cargo pins, fonts,
theme files, thenstatus);gpuicn doctorchecks everything against
the CLI's release and prints a fix per finding;gpuicn remove --unused
deletes components your code never names.gpuicn.tomlis 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 incrates/ui/testsfails a
change that reintroduces a raw color, text size, opacity, mode branch,
popover background, hover state, key glyph orpub(crate)item. - Focus is one 3px outer ring in
ringat 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 derivedcontrol()colors per mode. Every GPUI Kit
component color follows a token (a test enumerates them). - Motion:
transition_withandpresence_withover 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). Passscrollbar_handleto 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 incrates/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.mdstates the rules. - Releases ship
catalog-screenshots-<tag>.zip, the light and dark sheet of
every preview, anddocs/screenshots/v0.9.0holds this release's.
Breaking changes
UiTheme::shadowsentries areArc<[BoxShadow]>; call.to_vec()where a
Vecis needed.sidebar_is_mobile(window, cx)takes the window.UiColors::slotis 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 doctorApps 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
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_labeldraws 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
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
maintags it,
publishesgpuicnandgpuicn-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
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_tooltiptakes any view). There is a new
MessageHighlight::Permalinkand a per-rowaria_description. - Message List: an opt-in keyboard selection mode (
track_focus,
selected,on_select,selectable,on_key). - Markdown:
selection_rootmounts window text selection, so a drag
selects across messages and Cmd+C or Ctrl+C copies it.CustomEmojidraws
inline emoji images at text height, andMarkdownImagessends every image
through the app's resolver. - Command:
set_leadingandset_trailingslots, 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
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
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
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 libvulkan1Use 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-workspaceEach .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.



