Blast is an embeddable engine that runs unmodified Raycast extensions outside Raycast. It builds an extension, runs each command in its own Node.js process, and hands your app what to draw: scenes, a ready-made view model with Raycast's client behaviour, and requests for anything that touches the OS. You bring the UI; Blast brings the extensions.
Compatibility is measured against the latest @raycast/api, not claimed:
- API coverage:
@raycast/api2.10.1, 1537/1538 current symbols (the remaining one needs the embedder's browser), 942/942 deprecated (COVERAGE.md). - Real extensions: across all 1,939 corpus extensions Blast's shared libraries cover, 91.4% of 5,759 commands render in a sandboxed, offline sweep (SWEEP.md); 237/253 curated commands render (SMOKE.md); extensions with their own dependencies install and render 51/52 (SMOKE-DEPS.md).
Status: alpha.
3.0.0-alpha.1is on npm under thenexttag, published from GitHub Actions with provenance (release);lateststill points at Blast v1 forcliandruntime. The previous prototype is kept at tagarchive/v2-prototype-2026-10-18.
npm install @blastlauncher/engine@next @blastlauncher/client-core@next
npx @blastlauncher/cli@next run ./my-extension index- Done:
- headless runtime and host (M1);
- real-extension runs (M2);
- API coverage (M3);
- terminal client (M4);
- the embeddable engine (M5): in-process API and
blast servewith a schema,client-coreviews over the wire, capability registry, native handlers, lean per-extension dependency installs, npm release build; - evidence at scale (M6): latest-API tracking, a sandboxed corpus sweep with
primary-action probes, Suspense and
use(), dependencies as part of launch (decision 0012), the Go example on views, TUI polish, and pre-releases via npm trusted publishing (docs/release.md). - real examples (M7, in progress): an AppKit launcher over
blast serve(examples/macos-launcher), walkthroughs, pastecloseMainWindow, macOS window operations without yabai, and an in-process web launcher (examples/web-launcher); - extensions in the browser (M8): run a Raycast extension from its GitHub URL with nothing installed, inside almostnode's cross-origin sandbox (decision 0013, examples/browser-demo).
- Engine size: about 13 MiB installed without the optional shared libraries.
- Next: more real embedder examples. Backlog in PLAN.md, "Later".
In process (JS/TS: Node 24, Bun, Electron).
import { createEngine } from "@blastlauncher/host"; // published as @blastlauncher/engine
import { createController } from "@blastlauncher/client-core";
const engine = createEngine({ handlers: { "clipboard.copy": (p) => myClipboard(p) } });
const extension = engine.openExtension({ extensionDir: "./my-extension" });
await extension.dependencies.install();
const { session } = await extension.launch("index");
const controller = createController({ platform: "macOS" });
session.scenes((scene) => apply(controller.scene(scene)));
controller.subscribe((view) => draw(view)); // rows, actions, search, toasts…
// apply(): send result.events to session.sendEvent, run result.effectsOut of process (any language). Spawn blast serve and speak versioned
NDJSON over stdio: open extensions, launch commands, receive scenes or view
models, send input, answer capability requests. See the
JSON Schema and the
Go example.
Full guide: docs/embedding.md.
| Package | What it is |
|---|---|
host |
The engine: bundling, dependency installs, sessions, capability registry |
runtime |
Runs one command: React reconciler + the @raycast/api implementation |
protocol |
Message types, capability catalog, embedder protocol and schema |
client-core |
Framework-free Raycast client behaviour and the UI controller |
serve |
blast serve, the engine over stdio |
native |
Optional OS handlers for macOS, Windows and Linux (clipboard, open, …) |
shared-deps |
Optional fallback copies of common extension libraries |
cli |
blast run, a headless debug client |
tui |
A terminal reference client (OpenTUI, Bun) |
The engine core is platform-free: OS actions are capabilities your app
answers, or that you hand to @blastlauncher/native
(decision 0010).
Requires Bun and Node.js 24.
bun install --frozen-lockfile
bun run blast run fixtures/extensions/hello-list index # headless scene dump
bun run tui path/to/extension # terminal client
bun run blast:serve # engine over stdiobun run verify # the only gate: format, lint, types, compat, protocol, workflow, tests
bun run release:build # npm tarballs into .cache/release (publishing: docs/release.md)- Architecture · Capabilities · CLI · TUI · Decisions
- Cut a v3 prerelease
- Plan, milestones and backlog
- Contributor and agent workflow
Blast v1 was an Electron launcher that ran Raycast extensions, published as
the @blastlauncher/cli, runtime, api, renderer and utils npm
packages (1.x). Its last app release is
v0.0.14
(August 2023), and its final source is
f713dd6 on main.
v3 is a from-scratch rewrite and an ongoing personal experiment, not a product.
MIT