# Announcing Glaze: desktop apps with a Racket backend and a web frontend (system WebView, no native toolchain)

**URL:** <https://racket.discourse.group/t/announcing-glaze-desktop-apps-with-a-racket-backend-and-a-web-frontend-system-webview-no-native-toolchain/4435>\
**Category:** Show & Tell\
**Created:** [October 14, 2026, 11:01pm UTC](https://racket.discourse.group/t/announcing-glaze-desktop-apps-with-a-racket-backend-and-a-web-frontend-system-webview-no-native-toolchain/4435 "2026-10-14T23:01:34Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![turinglambdaai](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/turinglambdaai/32/2716_2.png) [@turinglambdaai](https://racket.discourse.group/u/turinglambdaai)\
**Post date:** [October 14, 2026, 11:01pm UTC](https://racket.discourse.group/t/announcing-glaze-desktop-apps-with-a-racket-backend-and-a-web-frontend-system-webview-no-native-toolchain/4435/1 "2026-10-14T23:01:34Z")

</div>

Following my post about [Rivet](https://racket.discourse.group/t/announcing-rivet-first-party-native-desktop-apps-with-a-racket-core-swiftui-winui-3-gtk4/4433) (native SwiftUI / WinUI 3 / GTK4 hosts), this is its sibling: [Glaze](https://github.com/turinglambdaai/glaze) (MIT, on the package catalog as `glaze`) is for the other trade-off — **one web UI codebase, Racket for all the logic** , shipped as a real desktop app.

Glaze serves your frontend from a local Racket server and displays it inside a native desktop window backed by the OS WebView: WebView2 on Windows, WKWebView on macOS, WebKitGTK on Linux. No Rust toolchain, no bundled Chromium — the Racket backend binds the system WebView through pure FFI, so binaries stay small and `raco pkg install glaze` is all you need.

## Quick start

```bash
raco pkg install --auto glaze
raco glaze init myapp
cd myapp && racket main.rkt

```

A native window opens hosting your frontend. Any web stack works — plain HTML/CSS/JS, Tailwind, Svelte, React.

## What's in the box

- **JSON API bridge** — the page calls Racket with plain `fetch("/api/...")`
- **Capability-gated routes** — default-deny permissions with path and command scopes; the frontend only gets what you grant
- **Scoped plugins** : filesystem, shell (bounded output + timeouts), persistent JSON stores, SQLite, HTTP client, clipboard, notifications, file/folder/message dialogs
- **Global shortcuts** , structured logging with SSE push, tray support
- **Agent-friendly verification built in** : `webview-title` / `webview-url` / `webview-capture!` (screenshot) on all three backends, so a coding agent can visually verify the app it's building
- **GUI-first, fail fast** : if the required WebView runtime is missing, startup fails with actionable install/repair guidance — Glaze never silently turns your desktop app into a browser tab

All three WebView backends run the same real-window CI end-to-end tests (open, load, capture, navigate, close).

## Shipped on Glaze

- [HackDigest](https://github.com/turinglambdaai/hackdigest) — Hacker News with built-in translation and AI digests, desktop app (React + TypeScript frontend)

## Honest gaps

- The frontend↔backend channel currently runs over loopback HTTP/SSE rather than a native WebView message transport — it works and is capability-gated, but a native transport is on the roadmap.
- Linux needs a desktop session or Xvfb (fine for CI, worth knowing).
- If you want per-platform native widgets instead of one web UI, that's Rivet's job (see the sibling thread).

## Try it

Docs are installed with the package (`raco docs glaze`), and the README walks through the first app in about ten lines of Racket.

Current release: v0.15.0. Issues and feedback welcome — [issue tracker](https://github.com/turinglambdaai/glaze/issues) or this thread. If you build something with it, I'd genuinely love to see it.
