HTML is the new markdown. Lavish is the new editor for your HTML artifacts.
Agents are good at producing rich HTML artifacts, but the human-agent collaboration loop on such artifacts is lacking and falls back into screenshots and long responses for “tell me what to change.” That loses the thing HTML is best at: interactivity.
Lavish Editor opens agent-generated HTML files in a local browser, lets you pinpoint elements and selected text, edit rendered Mermaid diagrams as whiteboards, and send feedback to the agent to address.
Lavish Editor is an AXI, which means -
Install the Lavish skill in the Agent Skills format with npx skills:
npx skills add kunchenguid/lavish-axi --skill lavish
That is the entire setup - no npm install needed.
The skill teaches your agent to run Lavish through npx -y lavish-axi, so the CLI comes along on demand.
In restricted subprocess sandboxes, CI, or agent harnesses where npx -y exits opaquely, the skill also documents direct installed-copy fallbacks through the local or global npm install path.
Its frontmatter also includes Hermes Agent metadata, so Hermes-compatible harnesses can categorize and surface it as a first-class productivity skill.
This installs the public lavish skill.
The repository also contains an internal lavish-design brand skill for maintainers; default npx skills add ... --list and skills.sh discovery hide it unless INSTALL_INTERNAL_SKILLS=1 is set.
Then, in agents that expose skills as slash commands (Claude Code, for example), invoke it directly:
/lavish let's discuss our plan here
Or just ask for anything that is easier to grasp visually - a plan, comparison, diagram, table, code view, or report - and the agent loads the skill on its own when it recognizes the task.
By default the skill lands in the current project's skills directory (.claude/skills/, for example); add -g to install it for all projects (~/.claude/skills/).
The skill is the recommended path, but it is not the only one.
Lavish is an AXI, so any capable agent can run the CLI directly with nothing installed at all. Just tell your agent:
Use `npx -y lavish-axi` to write a product or technical plan for what we discussed.
Want Lavish's ambient context - including your live open sessions - fed into every agent session instead of loading on demand? Install the CLI globally and opt into the hook:
npm install -g lavish-axi
lavish-axi setup hooks
This installs a SessionStart hook for Claude Code, Codex, OpenCode, and GitHub Copilot CLI that surfaces open sessions, visualization playbooks, and usage guidance at the start of each session.
Unlike the skill, the hook also shows your live open sessions, so a fresh agent session can resume an in-flight review.
Restart your agent session after running this so the new hook takes effect.
Lavish also ships as an Agent Plugin - the vendor-neutral packaging standard for skills and MCP servers - so clients that speak that format can load it directly.
No marketplace is involved. The installed npm package is the plugin: plugin.json sits at the package root next to the skills/ directory, so whatever npm install already put on disk is a complete, conformant plugin. Install the CLI, then register it:
npm install -g lavish-axi
lavish-axi setup plugin
That registers the installed package with every supported client it finds - VS Code, Cursor, and GitHub Copilot CLI - and reports which ones were absent. It is opt-in and idempotent, and it repairs the registered path after a reinstall or relocation. Reload each client afterward.
Each client is registered independently: one that cannot be registered is reported with what to do about it, and never blocks the others or fails the command.
To register by hand instead, point any client at the package directory (npm root -g/lavish-axi):
| Client | Register with |
|---|---|
| VS Code | "chat.pluginLocations": { "<package-dir>": true } in user settings |
| Cursor | link the package dir at ~/.cursor/plugins/local/lavish-axi (setup plugin handles Windows link compatibility) |
| GitHub Copilot CLI | copilot plugin install <package-dir> (or copilot plugin install kunchenguid/lavish-axi straight from the repo) |
Codex and ChatGPT install plugins only from marketplace sources, so Codex users should use the session hook above instead.
Lavish declares no MCP server - the CLI itself is the agent interface - so a plugin install brings the same lavish skill, and the skill and plugin are alternatives rather than a stack.
git clone https://github.com/kunchenguid/lavish-axi.git
cd lavish-axi
pnpm install --frozen-lockfile
pnpm run build
pnpm link
┌───────────────┐
│ Agent writes │
│ artifact.html │
└───────┬───────┘
▼
┌────────────────────────┐
│ lavish-axi <file_path> │
│ opens local browser UI │
└───────┬────────────────┘
▼
┌────────────────────────┐
│ Human annotates text │
│ or elements, sends │
│ chat, or queues layout │
│ issues from the inbox │
└───────┬────────────────┘
▼
┌────────────────────────┐
│ lavish-axi poll waits │
│ and returns prompts │
│ the user queued │
└────────────────────────┘
lavish-axi or directly in a browser.
Run lavish-axi design for the single source of agent-facing design guidance and optional CDN or Mermaid snippets.lavish-axi <html-file>, export, and share run a render-free check for artifacts missing an explicit page background and return a one-line self_paint_warning.
The check fails open - any stylesheet link, @import, Tailwind runtime script, color-scheme, or html/body/:root background signal suppresses it - and it never blocks the open.layout-warnings, that reaches the agent through the normal feedback path when they send.
Detection never returns lavish-axi poll and never wakes an agent; only the user queueing a fix does. The one exception is a fatal artifact_failures response, for failures that make the review itself unusable, such as the artifact document or one of its own local assets failing to load.Open means the latest completed check for its viewport still detects it. Queued for fix means the user asked for a repair - it stays unresolved and counted, and cannot be queued again while that request is outstanding.
Resolved requires a newer successful artifact load plus a complete check at the same viewport that no longer detects it; it then leaves the count but keeps a bounded history.
Still present (recurring) means a queued issue survived a newer revision, so it is selectable again with its earlier attempt retained. Unverified means a reload or check failed or was incomplete, so the prior issue was preserved rather than cleared. Returned means a resolved issue came back on a later revision.
Dismissal applies only to the current artifact revision; a later revision surfaces the issue again if it is still detected. A check at one viewport never clears an issue found at another, and a viewport removed from the configured diagnostic set (LAVISH_AXI_DIAGNOSTIC_VIEWPORTS, default all) is marked obsolete with an explicit reason rather than reading as fixed./assets/logo.png will not resolve through Lavish's artifact route.lavish-axi export writes <name>.export.html by inlining local assets only, stripping the annotation SDK, and leaving remote CDN/font references as links that still need network access.
lavish-axi share publishes the same local-inlined HTML to ht-ml.app, a third-party hosting service not part of Lavish.
Publishing sends the artifact to ht-ml.app's servers, public by default, or private and password-protected with --password; the response includes a secret update_key shown once for later management.
Bundling never fetches remote URLs, Lavish itself does not set a CSP, local reads stay confined and size-capped, and absolute file:// paths outside safe inlined asset references are redacted before output.
Per-asset and per-bundle inline caps default to 10 MB and 25 MB, overridable with LAVISH_AXI_EXPORT_MAX_ASSET_BYTES and LAVISH_AXI_EXPORT_MAX_BUNDLE_BYTES.
Unresolved local assets or export notices such as author-set CSP meta tags and redacted file URLs are surfaced in command or browser output.
Use --token or LAVISH_AXI_HTML_APP_TOKEN for an optional bearer token; set LAVISH_AXI_HTML_APP_API_URL only when overriding the ht-ml.app API base.data-lavish-question controls (application-owned form state is left alone). While a queued layout-issue batch is outstanding, closely spaced saves coalesce so one batch of fixes costs one refresh. To also reload on sibling asset changes, add data-lavish-live-reload-root to the root element or <meta name="lavish-live-reload" content="root">.data-lavish-action.
For reversible choices, let option clicks update local state, then queue exactly one final answer from a per-question submit or Queue answer button with window.lavish.queuePrompt().
Mark only custom (non-native) clickable elements with data-lavish-action so Lavish does not annotate them, and use data-lavish-question or queueKey when pre-send updates for the same question should replace each other.
Queued annotation preview pills and chat history share a scrollable Conversation panel above a sticky composer, so long feedback queues do not push the text box or send controls off screen.
The browser chrome keeps editing actions in the overflow menu (copy path, reload artifact, copy DOM snapshot, export standalone HTML, publish link, end session), while the composer exposes Send & End beside Send to Agent to submit queued prompts and user-ended attribution together.lavish-axi poll send even across reloads, and only blocks human sends while the agent is working on delivered feedback; the agent's reply (--agent-reply) concludes that work and re-enables sends.
The no-timeout poll always writes an immediate stderr banner so it is visibly not hung; it adds the periodic stderr wait ticks only in an interactive terminal, so when stderr is piped (as under agent harnesses) the captured output carries no tick noise. Stdout always stays reserved for the final response; if the poll is interrupted or times out, re-run it because queued feedback is never lost.
Codex-specific guidance keeps that poll attached to the active turn instead of hiding it in a background task, because completed background tasks may not resume the agent.lavish-axi end <html-file> is agent-initiated.
A plain lavish-axi <html-file> after a user-initiated end refuses to reopen the browser and returns guidance instead; pass --reopen only when the user asks for further review or something important needs their visual attention.
Agent-initiated ends keep reopening normally, same as before.
lavish-axi poll's ended response and the feedback response for the final batch before an end both carry next_step guidance telling the agent to stop polling and deliver remaining updates in chat instead of reopening..mermaid container becomes an embedded editable Excalidraw whiteboard.
Click a diagram to unlock editing, and use its Fullscreen action to edit it over the whole viewport.
Whiteboard scenes autosave locally.
If a live reload changes the Mermaid source, the whiteboard shows that its edits are stale; reopening it lets the reviewer re-convert and discard the saved edits or keep editing the saved scene.
Use Queue feedback to add a bounded edit summary plus local .excalidraw scene and PNG preview paths to the Conversation panel, then click Send to Agent to deliver it.
The agent updates the artifact's Mermaid source, which remains authoritative.
Flowchart, sequence, class, ER, and state diagrams convert to editable shapes; other diagram types are images that reviewers can draw and annotate.
Lavish changes only the browser view, so saved, standalone, and exported artifacts still render plain Mermaid.LAVISH_AXI_IDLE_TIMEOUT_MS (default 30 minutes) with no browser or poll connections.
Set LAVISH_AXI_IDLE_TIMEOUT_MS=0 or off to disable idle self-shutdown.~/.lavish-axi/ by default, or LAVISH_AXI_STATE_DIR when set.LAVISH_AXI_DIAGNOSTIC_VIEWPORTS sets which viewport classes the layout-issue inbox tracks (mobile, compact, desktop; comma-separated, default all). Warnings whose class leaves the set are marked obsolete with an explicit reason instead of silently reading as fixed.LAVISH_AXI_PORT to choose the server port; it defaults to 4387.127.0.0.1) by default. Set LAVISH_AXI_HOST to bind elsewhere; a wildcard (0.0.0.0 or ::) binds every interface. Binding beyond loopback exposes an unauthenticated server that can read and serve arbitrary local files to anything that can reach it, so only do so on a trusted network. Set LAVISH_AXI_LINK_HOST to control the hostname written into generated session links (defaults to the bind address, or loopback when bound to a wildcard).403) any request whose Host header is missing or not one it answers to: the loopback names (127.0.0.1, ::1, localhost) plus the configured bind and link host. If you reach the server under another name - a wildcard bind accessed by LAN IP, a reverse-proxy hostname, or an extra interface - list those names in LAVISH_AXI_ALLOWED_HOSTS (whitespace-separated) to allow them. Behind a reverse proxy, the forwarded X-Forwarded-Host is validated against the same list, so add your public hostname there and have the proxy send it together with X-Forwarded-Proto. Set LAVISH_AXI_ALLOWED_HOSTS to * to disable the check entirely (only when the server sits behind your own authentication or proxy).LAVISH_AXI_NO_OPEN=1, equivalent to --no-open, to create or resume a session without launching a browser window.| Command | Description |
|---|---|
lavish-axi | Show current sessions and usage guidance. |
lavish-axi update | Check for or apply the latest npm release through the AXI SDK self-updater. |
lavish-axi <html-file> | Open or resume a Lavish Editor session, with the open-time layout gate enabled by default. Unresolved layout issues from earlier in the session are preserved. Refuses to reopen a session the user explicitly ended from the browser unless --reopen is passed. |
lavish-axi poll <html-file> | Long-poll until the user sends feedback or ends the session; detected layout issues wait in the user's Layout issues inbox and arrive only when queued. Leave no-timeout polls running, or re-run them if interrupted. Codex guidance keeps polls attached to the active turn. On status: ended, stop polling and do not reopen uninvited. |
lavish-axi end <html-file> | End a session as the agent; unlike a user-initiated end from the browser, this still allows a plain reopen later. |
lavish-axi export <html-file> | Write a portable copy of the artifact: one HTML file with its local assets inlined, so it opens with no server and no sibling files. Remote CDN/font references are left as links. |
lavish-axi share <html-file> | Publish the artifact (local assets inlined) to ht-ml.app, a third-party host not part of Lavish, and print a visitable URL plus a secret update key; shares are public by default, and --password makes viewers enter the password before viewing. |
lavish-axi stop | Shut down the background server. |
lavish-axi playbook [id] | List focused artifact guidance or show one playbook; agents must open each matching playbook before writing HTML. |
lavish-axi design | Show agent-facing design guidance, including optional CDN and Mermaid snippets. |
lavish-axi setup hooks | Install or repair optional SessionStart hooks for Claude Code, Codex, OpenCode, and GitHub Copilot CLI; restart the agent session afterward. |
lavish-axi setup plugin | Register the installed package as an Agent Plugin in VS Code, Cursor, and GitHub Copilot CLI; opt-in, idempotent, no marketplace involved. Reload each client afterward. |
lavish-axi server | Run the local Lavish Editor server. |
Known playbook IDs: diagram, table, comparison, plan, code, input, slides.
One artifact often combines several playbooks, such as a plan that includes a comparison and a diagram, so agents must match against each use_when trigger and open every matching playbook before writing HTML.
For flows, architecture, state, or sequence diagrams, open the diagram playbook for the recommended tooling and SVG guidance.
| Command | Flag | Description |
|---|---|---|
lavish-axi <html-file> | --no-open | Ensure the server/session exists without opening another browser window. |
lavish-axi <html-file> | --no-gate | Skip the open-time layout curtain for this browser open. |
lavish-axi <html-file> | --reopen | Reopen a session the user explicitly ended from the browser; without it, a plain open refuses and explains why instead of reopening uninvited. |
lavish-axi update | --check | Report current vs latest npm version without installing an update. |
lavish-axi export | --out <path> | Write the export to a specific path instead of <name>.export.html next to the source. |
lavish-axi share | --password <pw> | Make the third-party ht-ml.app page private; viewers must supply the password. |
lavish-axi share | --token <t> | Attach an optional bearer token (LAVISH_AXI_HTML_APP_TOKEN); never required to publish. |
lavish-axi poll | --agent-reply "..." | Show the agent's reply in the existing browser chat and re-enable human sends before polling again. |
lavish-axi poll | --timeout-ms <ms> | Test/debug escape hatch only; agents should normally omit it and leave the long poll running. |
lavish-axi stop | --port <port> | Shut down a server running on a non-default port. |
lavish-axi server | --verbose | Log session and watcher events to stderr; can also be enabled with LAVISH_AXI_DEBUG=1. Detached server output is appended to ~/.lavish-axi/server.log (or LAVISH_AXI_STATE_DIR/server.log) for startup and crash diagnostics. |
pnpm run check # Run all verification commands
pnpm run build # Bundle the publishable CLI, chrome, and design assets
pnpm run build:skill # Regenerate the installable lavish skill
pnpm test # Run node:test tests
pnpm run lint # Run ESLint
pnpm run format:check # Check Prettier formatting
pnpm run typecheck # Run TypeScript checkJs validation
JavaScript
92.4%
HTML
5.2%
CSS
2.4%
HTML is the new markdown. Lavish is the new editor for your HTML artifacts.
Agents are good at producing rich HTML artifacts, but the human-agent collaboration loop on such artifacts is lacking and falls back into screenshots and long responses for “tell me what to change.” That loses the thing HTML is best at: interactivity.
Lavish Editor opens agent-generated HTML files in a local browser, lets you pinpoint elements and selected text, edit rendered Mermaid diagrams as whiteboards, and send feedback to the agent to address.
Lavish Editor is an AXI, which means -
Install the Lavish skill in the Agent Skills format with npx skills:
npx skills add kunchenguid/lavish-axi --skill lavish
That is the entire setup - no npm install needed.
The skill teaches your agent to run Lavish through npx -y lavish-axi, so the CLI comes along on demand.
In restricted subprocess sandboxes, CI, or agent harnesses where npx -y exits opaquely, the skill also documents direct installed-copy fallbacks through the local or global npm install path.
Its frontmatter also includes Hermes Agent metadata, so Hermes-compatible harnesses can categorize and surface it as a first-class productivity skill.
This installs the public lavish skill.
The repository also contains an internal lavish-design brand skill for maintainers; default npx skills add ... --list and skills.sh discovery hide it unless INSTALL_INTERNAL_SKILLS=1 is set.
Then, in agents that expose skills as slash commands (Claude Code, for example), invoke it directly:
/lavish let's discuss our plan here
Or just ask for anything that is easier to grasp visually - a plan, comparison, diagram, table, code view, or report - and the agent loads the skill on its own when it recognizes the task.
By default the skill lands in the current project's skills directory (.claude/skills/, for example); add -g to install it for all projects (~/.claude/skills/).
The skill is the recommended path, but it is not the only one.
Lavish is an AXI, so any capable agent can run the CLI directly with nothing installed at all. Just tell your agent:
Use `npx -y lavish-axi` to write a product or technical plan for what we discussed.
Want Lavish's ambient context - including your live open sessions - fed into every agent session instead of loading on demand? Install the CLI globally and opt into the hook:
npm install -g lavish-axi
lavish-axi setup hooks
This installs a SessionStart hook for Claude Code, Codex, OpenCode, and GitHub Copilot CLI that surfaces open sessions, visualization playbooks, and usage guidance at the start of each session.
Unlike the skill, the hook also shows your live open sessions, so a fresh agent session can resume an in-flight review.
Restart your agent session after running this so the new hook takes effect.
Lavish also ships as an Agent Plugin - the vendor-neutral packaging standard for skills and MCP servers - so clients that speak that format can load it directly.
No marketplace is involved. The installed npm package is the plugin: plugin.json sits at the package root next to the skills/ directory, so whatever npm install already put on disk is a complete, conformant plugin. Install the CLI, then register it:
npm install -g lavish-axi
lavish-axi setup plugin
That registers the installed package with every supported client it finds - VS Code, Cursor, and GitHub Copilot CLI - and reports which ones were absent. It is opt-in and idempotent, and it repairs the registered path after a reinstall or relocation. Reload each client afterward.
Each client is registered independently: one that cannot be registered is reported with what to do about it, and never blocks the others or fails the command.
To register by hand instead, point any client at the package directory (npm root -g/lavish-axi):
| Client | Register with |
|---|---|
| VS Code | "chat.pluginLocations": { "<package-dir>": true } in user settings |
| Cursor | link the package dir at ~/.cursor/plugins/local/lavish-axi (setup plugin handles Windows link compatibility) |
| GitHub Copilot CLI | copilot plugin install <package-dir> (or copilot plugin install kunchenguid/lavish-axi straight from the repo) |
Codex and ChatGPT install plugins only from marketplace sources, so Codex users should use the session hook above instead.
Lavish declares no MCP server - the CLI itself is the agent interface - so a plugin install brings the same lavish skill, and the skill and plugin are alternatives rather than a stack.
git clone https://github.com/kunchenguid/lavish-axi.git
cd lavish-axi
pnpm install --frozen-lockfile
pnpm run build
pnpm link
┌───────────────┐
│ Agent writes │
│ artifact.html │
└───────┬───────┘
▼
┌────────────────────────┐
│ lavish-axi <file_path> │
│ opens local browser UI │
└───────┬────────────────┘
▼
┌────────────────────────┐
│ Human annotates text │
│ or elements, sends │
│ chat, or queues layout │
│ issues from the inbox │
└───────┬────────────────┘
▼
┌────────────────────────┐
│ lavish-axi poll waits │
│ and returns prompts │
│ the user queued │
└────────────────────────┘
lavish-axi or directly in a browser.
Run lavish-axi design for the single source of agent-facing design guidance and optional CDN or Mermaid snippets.lavish-axi <html-file>, export, and share run a render-free check for artifacts missing an explicit page background and return a one-line self_paint_warning.
The check fails open - any stylesheet link, @import, Tailwind runtime script, color-scheme, or html/body/:root background signal suppresses it - and it never blocks the open.layout-warnings, that reaches the agent through the normal feedback path when they send.
Detection never returns lavish-axi poll and never wakes an agent; only the user queueing a fix does. The one exception is a fatal artifact_failures response, for failures that make the review itself unusable, such as the artifact document or one of its own local assets failing to load.Open means the latest completed check for its viewport still detects it. Queued for fix means the user asked for a repair - it stays unresolved and counted, and cannot be queued again while that request is outstanding.
Resolved requires a newer successful artifact load plus a complete check at the same viewport that no longer detects it; it then leaves the count but keeps a bounded history.
Still present (recurring) means a queued issue survived a newer revision, so it is selectable again with its earlier attempt retained. Unverified means a reload or check failed or was incomplete, so the prior issue was preserved rather than cleared. Returned means a resolved issue came back on a later revision.
Dismissal applies only to the current artifact revision; a later revision surfaces the issue again if it is still detected. A check at one viewport never clears an issue found at another, and a viewport removed from the configured diagnostic set (LAVISH_AXI_DIAGNOSTIC_VIEWPORTS, default all) is marked obsolete with an explicit reason rather than reading as fixed./assets/logo.png will not resolve through Lavish's artifact route.lavish-axi export writes <name>.export.html by inlining local assets only, stripping the annotation SDK, and leaving remote CDN/font references as links that still need network access.
lavish-axi share publishes the same local-inlined HTML to ht-ml.app, a third-party hosting service not part of Lavish.
Publishing sends the artifact to ht-ml.app's servers, public by default, or private and password-protected with --password; the response includes a secret update_key shown once for later management.
Bundling never fetches remote URLs, Lavish itself does not set a CSP, local reads stay confined and size-capped, and absolute file:// paths outside safe inlined asset references are redacted before output.
Per-asset and per-bundle inline caps default to 10 MB and 25 MB, overridable with LAVISH_AXI_EXPORT_MAX_ASSET_BYTES and LAVISH_AXI_EXPORT_MAX_BUNDLE_BYTES.
Unresolved local assets or export notices such as author-set CSP meta tags and redacted file URLs are surfaced in command or browser output.
Use --token or LAVISH_AXI_HTML_APP_TOKEN for an optional bearer token; set LAVISH_AXI_HTML_APP_API_URL only when overriding the ht-ml.app API base.data-lavish-question controls (application-owned form state is left alone). While a queued layout-issue batch is outstanding, closely spaced saves coalesce so one batch of fixes costs one refresh. To also reload on sibling asset changes, add data-lavish-live-reload-root to the root element or <meta name="lavish-live-reload" content="root">.data-lavish-action.
For reversible choices, let option clicks update local state, then queue exactly one final answer from a per-question submit or Queue answer button with window.lavish.queuePrompt().
Mark only custom (non-native) clickable elements with data-lavish-action so Lavish does not annotate them, and use data-lavish-question or queueKey when pre-send updates for the same question should replace each other.
Queued annotation preview pills and chat history share a scrollable Conversation panel above a sticky composer, so long feedback queues do not push the text box or send controls off screen.
The browser chrome keeps editing actions in the overflow menu (copy path, reload artifact, copy DOM snapshot, export standalone HTML, publish link, end session), while the composer exposes Send & End beside Send to Agent to submit queued prompts and user-ended attribution together.lavish-axi poll send even across reloads, and only blocks human sends while the agent is working on delivered feedback; the agent's reply (--agent-reply) concludes that work and re-enables sends.
The no-timeout poll always writes an immediate stderr banner so it is visibly not hung; it adds the periodic stderr wait ticks only in an interactive terminal, so when stderr is piped (as under agent harnesses) the captured output carries no tick noise. Stdout always stays reserved for the final response; if the poll is interrupted or times out, re-run it because queued feedback is never lost.
Codex-specific guidance keeps that poll attached to the active turn instead of hiding it in a background task, because completed background tasks may not resume the agent.lavish-axi end <html-file> is agent-initiated.
A plain lavish-axi <html-file> after a user-initiated end refuses to reopen the browser and returns guidance instead; pass --reopen only when the user asks for further review or something important needs their visual attention.
Agent-initiated ends keep reopening normally, same as before.
lavish-axi poll's ended response and the feedback response for the final batch before an end both carry next_step guidance telling the agent to stop polling and deliver remaining updates in chat instead of reopening..mermaid container becomes an embedded editable Excalidraw whiteboard.
Click a diagram to unlock editing, and use its Fullscreen action to edit it over the whole viewport.
Whiteboard scenes autosave locally.
If a live reload changes the Mermaid source, the whiteboard shows that its edits are stale; reopening it lets the reviewer re-convert and discard the saved edits or keep editing the saved scene.
Use Queue feedback to add a bounded edit summary plus local .excalidraw scene and PNG preview paths to the Conversation panel, then click Send to Agent to deliver it.
The agent updates the artifact's Mermaid source, which remains authoritative.
Flowchart, sequence, class, ER, and state diagrams convert to editable shapes; other diagram types are images that reviewers can draw and annotate.
Lavish changes only the browser view, so saved, standalone, and exported artifacts still render plain Mermaid.LAVISH_AXI_IDLE_TIMEOUT_MS (default 30 minutes) with no browser or poll connections.
Set LAVISH_AXI_IDLE_TIMEOUT_MS=0 or off to disable idle self-shutdown.~/.lavish-axi/ by default, or LAVISH_AXI_STATE_DIR when set.LAVISH_AXI_DIAGNOSTIC_VIEWPORTS sets which viewport classes the layout-issue inbox tracks (mobile, compact, desktop; comma-separated, default all). Warnings whose class leaves the set are marked obsolete with an explicit reason instead of silently reading as fixed.LAVISH_AXI_PORT to choose the server port; it defaults to 4387.127.0.0.1) by default. Set LAVISH_AXI_HOST to bind elsewhere; a wildcard (0.0.0.0 or ::) binds every interface. Binding beyond loopback exposes an unauthenticated server that can read and serve arbitrary local files to anything that can reach it, so only do so on a trusted network. Set LAVISH_AXI_LINK_HOST to control the hostname written into generated session links (defaults to the bind address, or loopback when bound to a wildcard).403) any request whose Host header is missing or not one it answers to: the loopback names (127.0.0.1, ::1, localhost) plus the configured bind and link host. If you reach the server under another name - a wildcard bind accessed by LAN IP, a reverse-proxy hostname, or an extra interface - list those names in LAVISH_AXI_ALLOWED_HOSTS (whitespace-separated) to allow them. Behind a reverse proxy, the forwarded X-Forwarded-Host is validated against the same list, so add your public hostname there and have the proxy send it together with X-Forwarded-Proto. Set LAVISH_AXI_ALLOWED_HOSTS to * to disable the check entirely (only when the server sits behind your own authentication or proxy).LAVISH_AXI_NO_OPEN=1, equivalent to --no-open, to create or resume a session without launching a browser window.| Command | Description |
|---|---|
lavish-axi | Show current sessions and usage guidance. |
lavish-axi update | Check for or apply the latest npm release through the AXI SDK self-updater. |
lavish-axi <html-file> | Open or resume a Lavish Editor session, with the open-time layout gate enabled by default. Unresolved layout issues from earlier in the session are preserved. Refuses to reopen a session the user explicitly ended from the browser unless --reopen is passed. |
lavish-axi poll <html-file> | Long-poll until the user sends feedback or ends the session; detected layout issues wait in the user's Layout issues inbox and arrive only when queued. Leave no-timeout polls running, or re-run them if interrupted. Codex guidance keeps polls attached to the active turn. On status: ended, stop polling and do not reopen uninvited. |
lavish-axi end <html-file> | End a session as the agent; unlike a user-initiated end from the browser, this still allows a plain reopen later. |
lavish-axi export <html-file> | Write a portable copy of the artifact: one HTML file with its local assets inlined, so it opens with no server and no sibling files. Remote CDN/font references are left as links. |
lavish-axi share <html-file> | Publish the artifact (local assets inlined) to ht-ml.app, a third-party host not part of Lavish, and print a visitable URL plus a secret update key; shares are public by default, and --password makes viewers enter the password before viewing. |
lavish-axi stop | Shut down the background server. |
lavish-axi playbook [id] | List focused artifact guidance or show one playbook; agents must open each matching playbook before writing HTML. |
lavish-axi design | Show agent-facing design guidance, including optional CDN and Mermaid snippets. |
lavish-axi setup hooks | Install or repair optional SessionStart hooks for Claude Code, Codex, OpenCode, and GitHub Copilot CLI; restart the agent session afterward. |
lavish-axi setup plugin | Register the installed package as an Agent Plugin in VS Code, Cursor, and GitHub Copilot CLI; opt-in, idempotent, no marketplace involved. Reload each client afterward. |
lavish-axi server | Run the local Lavish Editor server. |
Known playbook IDs: diagram, table, comparison, plan, code, input, slides.
One artifact often combines several playbooks, such as a plan that includes a comparison and a diagram, so agents must match against each use_when trigger and open every matching playbook before writing HTML.
For flows, architecture, state, or sequence diagrams, open the diagram playbook for the recommended tooling and SVG guidance.
| Command | Flag | Description |
|---|---|---|
lavish-axi <html-file> | --no-open | Ensure the server/session exists without opening another browser window. |
lavish-axi <html-file> | --no-gate | Skip the open-time layout curtain for this browser open. |
lavish-axi <html-file> | --reopen | Reopen a session the user explicitly ended from the browser; without it, a plain open refuses and explains why instead of reopening uninvited. |
lavish-axi update | --check | Report current vs latest npm version without installing an update. |
lavish-axi export | --out <path> | Write the export to a specific path instead of <name>.export.html next to the source. |
lavish-axi share | --password <pw> | Make the third-party ht-ml.app page private; viewers must supply the password. |
lavish-axi share | --token <t> | Attach an optional bearer token (LAVISH_AXI_HTML_APP_TOKEN); never required to publish. |
lavish-axi poll | --agent-reply "..." | Show the agent's reply in the existing browser chat and re-enable human sends before polling again. |
lavish-axi poll | --timeout-ms <ms> | Test/debug escape hatch only; agents should normally omit it and leave the long poll running. |
lavish-axi stop | --port <port> | Shut down a server running on a non-default port. |
lavish-axi server | --verbose | Log session and watcher events to stderr; can also be enabled with LAVISH_AXI_DEBUG=1. Detached server output is appended to ~/.lavish-axi/server.log (or LAVISH_AXI_STATE_DIR/server.log) for startup and crash diagnostics. |
pnpm run check # Run all verification commands
pnpm run build # Bundle the publishable CLI, chrome, and design assets
pnpm run build:skill # Regenerate the installable lavish skill
pnpm test # Run node:test tests
pnpm run lint # Run ESLint
pnpm run format:check # Check Prettier formatting
pnpm run typecheck # Run TypeScript checkJs validation
JavaScript
92.4%
HTML
5.2%
CSS
2.4%