v0.8.0-Second Vow
Pre-releaseOpenPencil v0.8.0
v0.8.0 is a pre-release for the Rust OpenPencil stack. It marks the first release line where the Rust desktop, CLI, web host, and wasm-backed SDKs are the actively shipped OpenPencil product surface.
Highlights
- Rust desktop app is now the primary OpenPencil experience, with installer artifacts for macOS, Windows, and Linux.
opCLI ships as standalone release artifacts for the same desktop target matrix.- Rust web host is published as a GHCR Docker image for tagged releases.
- Web SDK packages are published to npm and attached as tarballs for
@zseven-w/op-web-sdk,@zseven-w/op-web-sdk-react, and@zseven-w/op-web-sdk-vue. - Homebrew tap and Scoop bucket entries are updated after the GitHub pre-release is published.
- Desktop update checks can discover pre-release GitHub releases, so
v0.8.0can be offered before it is promoted to a stable release. - Issue triage for this release reviewed 19 open GitHub issues: 5 are expected to close with v0.8.0, and 3 are partially covered but should remain open unless split into follow-ups.
What's New
Rust Editor
- The Rust editor shell is the release target for the canvas, panels, toolbar, property inspector, AI chat surface, agent settings, and desktop/web hosts.
- Canvas painting, hit-testing, and editor chrome now share the layout-resolved
LayoutScenepath, reducing stale scene lookups during hover, selection, pen editing, and reveal paint. - Rotated canvas elements now keep editor chrome aligned with rendered geometry:
- hover outlines follow the hovered node's root-to-node flip/rotation chain;
- single-selection and multi-selection outlines inherit rotated/flipped ancestor transforms;
- selected path editor handles and arc-edit handles inherit the same transform chain;
- fallback behavior still preserves direct node rotation for callers that do not have traversal-captured transforms.
- Canvas interaction paths continue to support pan/zoom, selection, handle hit-testing, rotation handles, pen/path overlays, smart guide overlays, layer hover state, and reveal animation paint.
- The widget layer remains platform-clean: native and web rendering go through the shared
RenderBackendfacade rather than Skia or browser APIs in widget code.
Desktop App
- Desktop artifacts are built from the Rust native host for macOS, Windows, and Linux.
- The desktop app can detect release availability from GitHub, including pre-release builds when the pre-release channel is enabled.
- File opening, recent-file persistence, MCP/web-service integration, and editor chrome are shipped through the Rust app path.
CLI
- The
opcommand-line tool is distributed as a standalone binary alongside desktop artifacts. - Installer scripts support stable releases by default and can opt into the newest pre-release with
OP_PRERELEASE=1. - Package manager manifests are updated for both desktop and CLI distribution channels after the GitHub pre-release is published.
Web And SDK
- The Rust web host is published as a GHCR image tagged with the release version.
- The web host agent settings expose built-in agent profiles only; desktop/CLI-oriented provider connect cards, ACP agent setup, and the MCP tab are hidden from the web UI.
- The public web SDK remains focused on viewing
.opfiles, backed by the Rust wasm bundle. - React and Vue adapters are published with the base SDK so host apps can embed
.opviewers without depending on the retired TypeScript app workspace.
Rust vs. TypeScript v0.7.5
v0.8.0 is not a routine patch on top of the TypeScript app. It is the first release line where the Rust implementation replaces the retired TypeScript + Electron stack that ended at v0.7.5.
Feature Comparison
| Area | TypeScript + Electron (v0.7.5) |
Rust (v0.8.0) |
|---|---|---|
| Primary app | React 19 + TanStack Start web app packaged with Electron 35. | Rust editor shell shared by desktop, web host, and SDK-backed rendering paths. |
| Desktop runtime | Electron app with bundled Chromium and Node.js runtime. | Native winit + GPU Skia desktop binary; no embedded browser engine. |
| Canvas and editor UI | CanvasKit/Skia canvas driven from React, Zustand stores, and pen-* packages. |
Layout, hit-testing, painting, overlays, and editor chrome run through Rust LayoutScene and RenderBackend. |
| CLI | op CLI compiled from TypeScript and connected to the web/desktop server path. |
Standalone Rust op binary shipped for the same macOS, Windows, and Linux target matrix as desktop. |
| MCP | pen-mcp Node/Bun package with Node.js fallback behavior. |
Built-in Rust op-mcp path; desktop can expose stdio and live HTTP MCP endpoints without requiring Node.js for the main app path. |
| AI runtime | agent-native Zig NAPI plus TypeScript service wrappers for providers and agent orchestration. |
Rust agent runtime from vendor/agent, with provider integration in the Rust workspace. |
| SDK surface | pen-engine, pen-react, and related pen-* packages exposed a broader TypeScript embedding/editing surface. |
Public npm SDKs are intentionally narrower: read-only .op viewing through the wasm-backed op-web-sdk, plus React and Vue adapters. |
| Code organization | Root JavaScript/Bun monorepo with apps/* and packages/pen-*. |
Root Cargo workspace in crates/; JavaScript/Bun only remains under packages/ for web SDK publishing. |
Performance And Footprint Comparison
| Area | TypeScript + Electron (v0.7.5) |
Rust (v0.8.0) |
|---|---|---|
| Desktop footprint | Ships a full Chromium runtime and Node.js-backed desktop stack. | Native desktop artifacts per target, with no embedded browser engine; exact binary and installer sizes vary by OS, architecture, and packaging format. Current raw desktop binaries are roughly in the mid-50 MB range. |
| Web payload | JavaScript application plus CanvasKit/WASM payload. | Rust web build measured at 8.2 MB wasm / 2.18 MB gzip over the wire after icon catalog splitting. |
| Rendering consistency | Web and desktop behavior depended on the web app/Electron runtime boundary. | Native and web targets share the Rust render path: skia-safe on native, CanvasKit on WebGL2. |
| Interaction hot paths | React/store synchronization could put document serialization and state updates on interactive paths. | Pan/zoom no longer re-serializes the document every frame; wheel-zoom CPU was reduced from about 69% to about 0% on the measured hot path. |
| Large documents | No comparable large-document benchmark is published in this repository for v0.7.5. |
A 10,000-node nested auto-layout canvas writes, reads, and snapshots layout with no panics and about 0% idle CPU; a full layout snapshot returns in about 0.68 s. |
| Memory model | JavaScript garbage collection can introduce latency variance. | Rust ownership avoids GC pauses on editor-state and layout hot paths. |
These numbers are release-note level measurements from the Rust release line and are intended to explain the migration impact. They are not a full benchmark suite across every v0.7.5 workflow, and artifact sizes should be checked against the final release assets for each platform.
Issues Addressed
As of 2026-07-09, the GitHub issues page has 19 open issues. Based on the v0.8.0 feature set and the Rust replacement scope, this release is expected to close 5 of them after final release validation:
- #129 — completes the Rust rewrite tracked by the public planning issue.
- #123 — replaces the
@zseven-w/agent-nativechat crash path with the Rust agent runtime. - #148 — ships OpenCode support through the Rust agent settings and chat provider path.
- #163 — replaces the Docker image path that depended on a missing
@zseven-w/agent-nativeruntime package. - #164 — adds SVG export through the Rust export pipeline, including desktop/web host export and web SDK active-page SVG export.
The release also partially covers several open issues, but they should stay open unless the remaining scope is split into follow-up issues:
- #62 — Gemini support is present, but Stitch import is not covered by this release.
- #120 — Linux native artifacts are included, but the remote-file workflow request is broader than packaging.
- #162 — the Rust release addresses parts of the crash/export surface, but the issue also includes UI, clipboard, fill-layer, and text-quality requests.
Compatibility And Migration Notes
- The retired TypeScript apps and
pen-*packages are not included in this release line. - The repository root is now a Cargo workspace. JavaScript/Bun tooling for the SDK family lives under
packages/. - Consumers that previously depended on the retired TypeScript app packages should migrate to the Rust desktop app, the
opCLI, or the read-only web SDK depending on their use case. - npm packages for this pre-release are published under the
nextdist-tag rather than replacing the stable npm tag.
Release Artifacts
- macOS: notarized
OpenPencil-0.8.0-<arch>-mac.dmgfor the desktop app, plus standaloneopCLI archives. - Windows:
OpenPencil-0.8.0-<arch>-win-setup.exe, plus portable desktop andopCLI archives. - Linux:
OpenPencil-0.8.0-<arch>-linux.AppImage,OpenPencil-0.8.0-<arch>-linux.deb, plus raw desktop andopCLI archives. - Web SDK: published npm packages and attached npm tarballs for the base SDK, React adapter, and Vue adapter.
- Package managers: Homebrew cask/formula and Scoop desktop/CLI manifests.
- CLI installers:
install-op.shandinstall-op.ps1.
CLI Install
macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/ZSeven-W/openpencil/main/scripts/install-op.sh | bashFor the newest pre-release:
curl -fsSL https://raw.githubusercontent.com/ZSeven-W/openpencil/main/scripts/install-op.sh | OP_PRERELEASE=1 bashWindows PowerShell:
irm https://raw.githubusercontent.com/ZSeven-W/openpencil/main/scripts/install-op.ps1 | iexFor the newest pre-release:
$env:OP_PRERELEASE = "1"; irm https://raw.githubusercontent.com/ZSeven-W/openpencil/main/scripts/install-op.ps1 | iexDocker
The release workflow publishes the web image to GHCR as:
docker pull ghcr.io/zseven-w/openpencil-web:v0.8.0This is the only Docker image variant for the Rust release line. The retired openpencil-claude, openpencil-codex, openpencil-opencode, openpencil-copilot, openpencil-gemini, and openpencil-full images are not published for v0.8.0.
Because this is a pre-release, the workflow does not publish or update a Docker latest tag.
Known Limitations
- The web SDK is read-only in this release line; full editing remains in the Rust app/host surfaces.
- Desktop auto-update currently checks for available releases and opens the platform installer path; it does not yet perform a signed in-place self-update.
- Pre-release package manager entries are intended for early validation before
v0.8.0is promoted to a stable release.
Validation Guidance
- Use the GitHub release assets when validating platform-specific installer behavior; use npm/GHCR/package-manager channels when validating downstream distribution.
- For canvas/editor validation, include rotated parent frames with selected child nodes, multi-selection, path editor handles, arc-edit handles, and hover outlines to confirm editor chrome stays attached to rendered geometry.
- For migration validation, confirm downstream consumers no longer expect the retired TypeScript app workspace or
pen-*packages at the repository root.
Web Docker Image
- Image:
ghcr.io/zseven-w/openpencil-web:v0.8.0 - Digest:
sha256:a84e37c488f6bb8ccba9c633d0bfe989b9b8b80040df43939acba6f0e013e688