Wyvern
What You View, Engine Renders Natively

A lightweight CLI tool that opens native webview windows for user interaction and returns structured JSON results — with zero browser dependency, declarative CLI extensions, and an MCP-ready JSON schema (MCP server ships in Phase E).
Current release: v0.5.0 — headless CI/agent hardening (30s idle timeout, fail-fast undriven dialogs), plus Phase H/I/G features from v0.4.0.
Quickstart
- Download the latest release for your platform from GitHub Releases.
- Extract the archive. Keep
bin/wyvern,bin/wyvern-viewer, andshare/wyvern/ui/together (same layout as the tarball). - Add the extract
bin/directory to yourPATH(so both binaries resolve as siblings). - Try (default viewer is embedded — launches
wyvern-viewer):
HTTP host notes
- Dialogs are served by an ephemeral local HTTP host (
wyvern-host) from packagedshare/wyvern/ui/. - Product default:
--viewer embedded(optionalwyvern-viewersibling binary). - CI / agents / headless: set
WYVERN_VIEWER=noneor pass--viewer none(no native window). - Blocking dialogs must be driven to completion by the test harness (click a button / submit) in ~1 second. We do not design tests that block until Playwright or session timeout shuts them down — those limits are hang detectors only.
# Instant headless smoke (no dialog host)
WYVERN_VIEWER=none
# Blocking message in CI: spawn wyvern, read WYVERN_DIALOG_URL, click btn-ok (~1s)
# See docs/plans/phase-C/c9-testing-headless.md and tests/e2e/message.spec.ts
Release artifacts (no clone required):
| Platform | Artifact |
|---|---|
| macOS Apple Silicon | wyvern_<version>_aarch64-apple-darwin.tar.gz |
| macOS Intel | wyvern_<version>_x86_64-apple-darwin.tar.gz |
| Windows x86_64 | wyvern_<version>_x86_64-pc-windows-msvc.zip |
| Linux x86_64 | wyvern_<version>_x86_64-unknown-linux-gnu.tar.gz |
Each archive uses a bin/ layout: bin/wyvern, bin/wyvern-viewer, and share/wyvern/ui/ (message, input, markdown, question, chrome).
Quick examples
# Discover shipped skills (copy-paste examples)
# Visual welcome guide (multi-page wizard hub)
# Skill catalog (text, JSON, or detail view)
# Bundled example catalog (README frontmatter)
# Extension-specific help at match time
# Open a markdown file as a dialog
# Bundled wizard examples (auto-infers --ui-root from wizard.json)
# XHTML report panels (view or review mode)
# Interactive CSV table (sort / filter / Finish → JSON)
# Requires `python3` on PATH. On Windows, install Python 3 and ensure the
# `python3` command resolves (the Windows `py` launcher is not used).
# CSV as a markdown pipe table
Shipped examples live under share/wyvern/examples/ (path-picker, template-picker, agent-dag, askuserquestion-hook, xhtml-review). Each folder includes a README with launch commands.
Optional: Compose render
If sc-compose is installed, wyvern can render Jinja2 templates to HTML previews:
What it does
Wyvern bridges the gap between CLI tools and rich user interaction. Pass it a JSON command, get back a JSON result — or use argv shorthands for common file types and prefix skills. No Electron. No Chrome. Just the OS's built-in webview rendering your HTML.
v0.5.0 hardens headless/CI paths (WYVERN_VIEWER=none): shorter idle budget, non-zero exit when agents fail to drive blocking dialogs, and clearer test harness rules. v0.4.0 added XHTML reporting and wizard native pickers on top of the core dialog API and extension runtime:
- Blocking dialog commands:
message,input,markdown,question,chrome - Multi-page
wizardflows with browser-history navigation (since v0.2.0) - Wizard native pickers — in-page file/folder choosers via
WyvernApiduring wizard sessions (Phase I) - XHTML reporting —
.xhtmlsuffix,report-xhtmlmanifests, and review finish flow (Phase H) - Extensions — suffix and prefix argv skills (
.html,.csv,compose render,md,guide, and more via bundled registry) - Discoverability —
wyvern help,wyvern guide,wyvern extensions list, andwyvern examples listfor agent-facing skill and example discovery (Phase G)
# Show a dialog
# → {"button": "yes"}
# Collect input
# → {"button": "ok", "input": "feature/my-branch"}
# Render a markdown doc
Why Wyvern
| Wyvern | Electron | OS dialogs | |
|---|---|---|---|
| Bundle size | ~5MB | ~150MB | 0 |
| HTML/CSS/JS UI | ✅ | ✅ | ❌ |
| No browser required | ✅ | ❌ | ✅ |
| Custom wizards | ✅ | ✅ | ❌ |
| Declarative CLI extensions | ✅ | ❌ | ❌ |
| MCP-compatible | Phase E | ❌ | ❌ |
| JSON I/O | ✅ | custom | ❌ |
Dialog types
message— blocking modal with title, body, icon, and standard button combos (ok,yes_no,ok_cancel,yes_no_cancel,retry_cancel, or custom)input— text entry, multiline, or file/folder choosermarkdown— styled markdown viewer (file, inlinecontent, orwyvern file.mdshorthand)question— blocking native renderer based on Claude's publicAskUserQuestionAPIchrome— foundation chrome frame and platform safe zones (used by other dialog types)wizard— multi-page flows with stack navigation (POST /api/wizard/navigate,finish, visited-stack JSON on dismiss); in-page native file/folder pickers viaWyvernApi.postPickerFile/postPickerFolder(Phase I)
Platform support
| Platform | Engine | Load time | Memory |
|---|---|---|---|
| macOS | WebKit (system) | ~instant | ~30–50MB |
| Windows | WebView2 | fast | ~40–60MB |
| Linux | WebKitGTK | moderate | ~100–150MB |
Docs
Deferred (post–v0.5.0)
--interactive— persistent stdin loop withshow,hide, andexitlifecycle actions (Phase E)wyvern --mcp— MCP server; JSON schema is MCP-ready today, binary ships Phase E- User extension registry —
~/.config/wyvern/extensions.json(post–Phase F) notification— future fire-and-forget path for ephemeral updates;messagestays blocking
Wyvern: Defy the digital chasm. Unleash native clarity.