verde is a tiling desktop workspace for AI coding agents. It runs Codex, Claude Code, OpenCode, and Cursor side by side in one native window — tile chat, terminal, and browser panes with vim-style keybinds, jump anywhere from a Ctrl+Shift+P command palette, and drive long-running project processes from chat. Verde talks to the provider CLIs already installed on your machine; there is no hosted relay, so your tokens, transcripts, and project files stay local.
The desktop app lives in packages/desktop/. Verde's UI is built with palette, our own Zig GUI framework package for native UI primitives and render-batch driven desktop rendering.
- Every agent, one window. Run Codex, Claude Code, OpenCode, and Cursor as tiled chat threads side by side.
- A real tiling workspace. Split chat, terminal, and browser panes, then rearrange, resize, zoom, and persist layouts with vim-style keybinds.
- Command palette (
Ctrl+Shift+P). A launcher that ranks chat threads, open panes, workspaces, and app commands in one searchable list. - Embedded browser pane. A native webview (WPE WebKit on Linux, WKWebView on macOS, WebView2 on Windows) tiled next to your agent.
- Project-scoped terminal dock. Ghostty-powered terminals with shell tabs and agent launch-profile tabs that persist with the layout.
- Managed workspace processes. Declare dev servers or workers in
verde.ymland control them from chat with the/stackand/processslash commands. - Local-first. No hosted inference and no relay; Verde drives the provider CLIs already on your machine.
- Scriptable. Every running instance exposes a Unix-socket IPC through
verde liveandverde state. - Native, not Electron. A single Zig + SDL3 binary built on Verde's own Palette UI framework.
Verde talks to provider runtimes on your machine rather than bundling its own hosted backend. Install and authenticate at least one provider before using the app:
- Codex: install Codex CLI and run
codex login. - Claude Code: install Claude Code and log in on your machine. Verde uses Anthropic's Claude Agent SDK to talk to the local Claude Code runtime.
- OpenCode: install OpenCode and make sure
opencodeis on yourPATH. - Cursor: install the Cursor CLI, make sure
agentis on yourPATH, and runagent login.CURSOR_API_KEYis also supported for headless environments.
Install the latest release from the website:
curl -fsSL https://verdeai.dev/install.sh | shOr download a release from GitHub Releases.
- Linux: download
verde-v<version>-linux-x86_64.tar.gz, extract it, then run./install-local.sh. - macOS: download the
.dmgor.zipfor your architecture, then moveVerde.appintoApplications. - Arch Linux: install
verde-binfrom the AUR.
yay -S verde-binLinux browser support uses the system WPE WebKit runtime. AUR installs it as a
package dependency; tarball installs will warn if required WPE libraries are
missing. On Arch-based systems, install wpewebkit and wpebackend-fdo; on
Debian 13+ systems, install libwpewebkit-2.0-1, libwpebackend-fdo-1.0-1,
libjavascriptcoregtk-6.0-1, libegl1, and libgles2.
Source builds require Zig 0.16.0 and SDL3 development files for your platform.
The default browser backend uses the host platform webview instead of bundled
Chromium. Linux builds also require WPE WebKit development
packages. Windows native-webview builds require the Microsoft WebView2 SDK
headers at compile time and WebView2Loader.dll next to verde.exe or on the
DLL search path.
For release-style local installs, use the packaged install scripts:
bash ./scripts/release/install-linux-local.sh
./scripts/release/install-macos-local.shSource builds use the native webview backend by default and do not download CEF. CEF is still available as an explicit fallback:
mise run build-cef
# or
zig build --release=safe -Dbrowser-backend=cef -Dcef-sdk-path=/path/to/cefThe native browser runtime targets the host platform webview stack: WPE WebKit on
Linux, WKWebView on macOS, and WebView2 on Windows. Linux requires WPE WebKit
runtime packages. Windows systems that do not include WebView2 need the
Microsoft WebView2 Runtime installed separately, and packaged builds must ship
or locate WebView2Loader.dll.
Use mise from the repo root. The repo pins Zig and ZLS to 0.16.0 in mise.toml.
mise install
mise run setup
mise run devCommon tasks:
mise run setup: checks desktop build dependencies.mise run dev: builds and runs Verde with the native webview backend.mise run run: builds and launches Verde in development mode.mise run debug: launches Verde with the in-app diagnostics window enabled.mise run build: creates a local release-style build for the current platform.mise run check-mac-webview: on macOS, rebuilds/installs the WKWebView app and runs automated package/runtime readiness checks, including Swift/CEF-free packaging and native-keyboard ownership guards.mise run mac-webview-manual-signoff: on macOS, runs the guided foreground physical-input signoff flow and writes a timestamped evidence run.mise run check-mac-webview-manual: on macOS, checks the latest timestamped physical-input evidence run required for final WKWebView signoff.mise run dev-cef: builds and runs Verde with the legacy CEF backend.mise run build-cef: creates a release-style build with the legacy CEF backend.mise run dev-sdl-gpu: runs with the SDL_GPU Palette renderer.
verde is both the desktop launcher and a CLI for reading persisted state or
controlling a running desktop app. CLI-only commands run before SDL startup, so
they can be used from scripts without opening a window.
Top-level commands:
verde # Launch the desktop app
verde app # Launch the desktop app explicitly
verde --help # Show CLI help
verde version [--json] # Print version metadata
verde capabilities [--json] # Print supported CLI/live features
verde open <url> [--json] # Open a URL in this Verde workspace's browser pane
verde completion <shell> # Print shell completion script
verde state <command> # Read persisted state while the app is closed
verde notify [options] # Update the current terminal surface
verde live <command> # Control or inspect the running appUse --json when scripting. Live IPC responses use a stable envelope:
{
"id": 1,
"ok": true,
"result": {}
}Errors return ok: false with an error.code and error.message.
verde completion prints static completion scripts for the supported shells.
The generated completions cover command names, nested live-control commands,
flags, and fixed flag values such as --kind chat|terminal,
--axis horizontal|vertical, and --decision approve|deny.
verde completion bash
verde completion zsh
verde completion fishCommon install patterns:
# bash
verde completion bash > ~/.local/share/bash-completion/completions/verde
# zsh
mkdir -p ~/.zfunc
verde completion zsh > ~/.zfunc/_verde
# Ensure ~/.zfunc is in fpath before compinit, for example:
# fpath=(~/.zfunc $fpath)
# fish
verde completion fish > ~/.config/fish/completions/verde.fishThe first completion slice is intentionally static so tab completion stays fast and never depends on the desktop app being open. Dynamic project, pane, process, and thread completions can be layered on top of this later.
State commands read Verde's persisted SQLite state and do not require the app to be running.
verde state path [--json]
verde state projects [--json]
verde state panes --project <id|index|path|current> [--json]
verde state threads --project <id|index|path|current> [--json]
verde state transcript --project <id|index|path|current> --thread <index|provider-id> [--json]pathprints the SDL pref path andstate.sqlitelocation.projectslists imported projects and the selected project.panesprints the saved workspace layout and terminal dock state for a project.threadslists saved chat threads for a project.transcriptprints one saved chat transcript by thread index or provider thread id.
Live commands talk to the running desktop app over a current-user Unix socket at
Verde's SDL pref path. Start the app normally first, for example with verde or
from source with mise run dev.
verde live capabilities [--json]
verde live status [--json]
verde live projects [--json]
verde live active [--json]
verde live panes [--project <id|index|path|current>] [--json]
verde live threads [--project <id|index|path|current>] [--json]
verde live terminals [--project <id|index|path|current>] [--json]
verde live surfaces [--json]
verde live processes [--json]
verde live inspect --pane <pane-id> [--project <id|index|path|current>] [--json]
verde live inspect --focused [--json]
verde live browser status [--json]
verde live browser open --url https://example.com [--project <id|index|path|current|self>] [--json]
verde live browser navigate --url https://example.com [--json]
verde live browser eval --script "document.title" [--json]
verde live browser post-json --json-payload '{"type":"ping"}' [--json]
verde live palette list [--json]
verde live palette run --command pane.split_terminal_down [--json]
verde live workspace select --project <id|index|path|current> [--json]
verde live workspace create --path /path/to/project [--json]
verde live workspace rename --project <id|index|path|current> --label "New name" [--json]
verde live workspace archive --project <id|index|path|current> [--json]capabilitiesprints the live method list without requiring the app to be running.statusreturns protocol version, app pid, selected project, focused pane, current pane graph, terminal/process summary, and browser runtime state, including backend kind, presentation kind, initialized/visible state, URL, last browser error, last bridge message, and last eval result.projectslists live projects.activereturns the current project and focused pane.surfaceslists in-memory terminal surface status and attention metadata.
Verde terminal children receive identity variables such as VERDE=1,
VERDE_SESSION_ID, VERDE_WORKSPACE_ID, VERDE_WORKSPACE_PATH,
VERDE_DOCK_ID, VERDE_PANE_ID, VERDE_SOCKET,
VERDE_LIVE_SOCKET, VERDE_SESSIONIZER_SOCKET, and VERDE_CLI.
Terminal tools can use those variables to update their pane surface:
verde notify --title "Codex needs input" --body "Approve command?" --status waiting
verde notify --status working --progress 0.4 --label "Running tests"
verde notify --status done --title "Agent finished"
verde notify --clearverde notify infers --session from VERDE_SESSION_ID; scripts can pass
--session, --workspace, --dock, or --pane explicitly. If the desktop app
is not running, verde notify --quiet exits without launching Verde or showing
an OS notification.
Provider hook integrations are intentionally opt-in and conservative:
verde integrations list
verde integrations doctor
verde integrations install codex
verde integrations install claudeverde integrations reports hook support without touching provider auth.
Codex uses project-local hooks: verde integrations install codex writes
.codex/hooks.json and .verde/hooks/codex-notify-hook.sh in the current
workspace, and refuses to overwrite an existing unmanaged .codex/hooks.json.
Other providers currently return an unsupported status; the generic
verde notify, OSC notification, and MCP surface paths remain available for
all terminal tools.
panes,threads, andterminalsinspect one project.processesreturns the terminal-pane process graph currently available to Verde.inspectreturns details for a specific pane or the focused pane.
Palette commands act on the currently selected desktop workspace, matching what the user could run from the command palette UI.
verde live palette list [--json]
verde live palette run --command pane.split_terminal_down [--json]listreturns every stable static command-palette id with title, section, and current enabled state.runinvokes one enabled command by stable id. Disabled commands return arejectedlive error; unknown ids returnnot_found.
verde open <url> is shorthand for verde live browser open --url <url>.
When run inside a Verde terminal pane, browser open defaults to that terminal's
workspace by resolving VERDE_WORKSPACE_ID; outside Verde it defaults to the
currently selected desktop workspace. The browser is a singleton runtime: opening
it in another workspace moves the browser pane there.
Browser commands route through the same backend-neutral browser contract used by
the Palette toolbar and inspector. Commands other than open and status
require the browser runtime to be visible somewhere.
verde open https://example.com [--json]
verde live browser status [--json]
verde live browser open --url https://example.com [--project <id|index|path|current|self>] [--json]
verde live browser navigate --url https://ziglang.org [--json]
verde live browser eval --script "JSON.stringify({title:document.title,url:location.href})" [--json]
verde live browser post-json --json-payload '{"type":"ping"}' [--json]statusreturns browser visibility, suspension, URL, lifecycle status, and the workspace/pane currently hosting the singleton browser.openensures a browser pane exists in the target workspace and optionally navigates it without switching the selected workspace or focusing the URL bar.navigatenormalizes and loads a URL in the active singleton browser runtime.evalqueues JavaScript evaluation in the active browser runtime; inspectverde live status --jsonforbrowser.last_eval_result.post-jsonsends a JSON payload through the host-to-page bridge.- Page-to-host bridge messages are processed only for app and loopback pages by
default:
app://,localhost,127.0.0.1, and[::1]. SetVERDE_BROWSER_ALLOW_UNTRUSTED_BRIDGE=1only for local diagnostics that need arbitrary pages ordata:URLs to call back into Verde.
Workspace commands mutate the project rail and return the updated workspace list.
verde live workspace select --project <id|index|path|current> [--json]
verde live workspace create --path /path/to/project [--json]
verde live workspace rename --project <id|index|path|current> --label "New name" [--json]
verde live workspace archive --project <id|index|path|current> [--json]createresolves~and relative paths the same way as the workspace import modal, and restores an archived workspace if the path was archived.select,rename, andarchiveaccept--projector--workspaceusing id, index, path, orcurrent.
Workspace panes are the primary live-control target. Most commands return the updated pane graph so scripts can keep using the returned pane IDs.
verde live pane focus --pane <pane-id> [--project <id|index|path|current>] [--json]
verde live pane focus --focused [--json]
verde live pane split --pane <pane-id> --kind chat --axis horizontal [--json]
verde live pane split --pane <pane-id> --kind terminal --axis vertical [--json]
verde live pane resize --pane <pane-id> --first <pane-id> --second <pane-id> --axis horizontal --ratio 0.6 [--json]
verde live pane move --pane <pane-id> --direction left|right|up|down [--json]
verde live pane minimize --pane <pane-id> [--json]
verde live pane maximize --pane <pane-id> [--json]
verde live pane restore --pane <pane-id> [--json]
verde live pane close --pane <pane-id> [--json]splitcreates a chat or terminal workspace pane next to the target pane.--kindacceptschatorterminal;--axisacceptshorizontalorvertical.resizeupdates the split ratio between two sibling panes.--ratiois a floating-point value such as0.6.moveswaps the target pane with the adjacent structural pane in the given direction, matching the keyboard move action.minimize,maximize,restore, andclosematch the pane header actions in the UI.
Chat commands resolve the target pane to its backing chat thread. They use the same draft, composer, send, stop, and approval paths as the UI.
verde live chat status --pane <pane-id> [--json]
verde live chat status --focused [--json]
verde live chat transcript --pane <pane-id> [--json]
verde live chat draft set --pane <pane-id> --text "explain this failure" [--json]
verde live chat draft append --pane <pane-id> --text "more detail" [--json]
verde live chat send --pane <pane-id> --prompt "run the tests and fix failures" [--json]
verde live chat send --pane <pane-id> "run the tests and fix failures" [--json]
verde live chat followup --pane <pane-id> --prompt "then update docs" [--json]
verde live chat stop --pane <pane-id> [--json]
verde live chat approve --pane <pane-id> --decision approve [--json]
verde live chat approve --pane <pane-id> --decision deny [--json]statusreturns thread title, provider, model, message count, send state, and pending approval status.transcriptreturns persisted messages for the pane's thread.draft setreplaces the current draft;draft appendappends to it.sendsends--prompt,--text, or a trailing prompt argument. If no prompt is supplied, it sends the current draft.followupqueues or steers a prompt while a send is active.stopaborts the current send for that chat thread.approveresolves the current pending approval.--decisionacceptsapproveordeny;--call <id>is accepted for future call-id targeting.
Terminal commands resolve the target workspace pane to its terminal dock and write through the same active PTY input path as the UI.
verde live terminal write --pane <pane-id> --text $'cargo test\r' [--json]
verde live terminal write --focused --text $'printf "ok\\n"\r' [--json]
verde live process list [--project <id|index|path|current>] [--json]
verde live process start --name <name> [--project <id|index|path|current>] [--json]
verde live process stop --name <name> [--project <id|index|path|current>] [--json]
verde live process restart --name <name> [--project <id|index|path|current>] [--json]
verde live process inspect --name <name> [--project <id|index|path|current>] [--json]
verde live process logs --name <name> [--project <id|index|path|current>] [--json]
verde live agent open --provider codex [--project <id|index|path|current>] [--json]
verde live stack start [--project <id|index|path|current>] [--json]
verde live stack stop [--project <id|index|path|current>] [--json]
verde live stack restart [--project <id|index|path|current>] [--json]terminal writesends text to the active terminal tab/pane. Include\rwhen you want to submit a shell command.process start,stop, andrestartcontrol entries loaded fromverde.yml.agent open --provider codexopens a first-class Codex TUI in the selected workspace without requiring averde.ymlentry.stack start,stop, andrestartapply the same action to every configured process and agent in the selected workspace.
- Use
--pane <id>for deterministic automation. - Use
--focusedfor interactive smoke tests. - Use
--project currentfor the selected project, or pass a project index, id, or path. - Chat commands require a chat pane. Terminal commands require a terminal pane.
- Exit
0means the CLI command parsed and, for live commands, received a live response. Scripts should still check the JSON envelope'sokfield. - Exit
1means command failure before a structured live response,2invalid arguments,3live server not running, and4offline state target not found. - Live IPC request failures return JSON error codes such as
not_found,invalid_request,invalid_target,rejected,unsupported, ormethod_not_found.
- Codex threads use the local
codexCLI and startcodex app-serverautomatically when needed. - Claude Code threads use Anthropic's Claude Agent SDK and require Claude Code to be installed and logged in locally.
- OpenCode threads use the local
opencodeCLI and can startopencode serveautomatically when needed. - Cursor threads use the local Cursor CLI ACP server (
agent acp) and requireagent loginorCURSOR_API_KEY. - Providers run against the project directory you import into Verde.
If prompt sending fails, first check that the selected provider is installed, available to Verde's launch environment, and authenticated.
Verde includes embedded terminal panes powered by Ghostty's libghostty-vt terminal engine.
- Open the command palette with
Ctrl+Shift+Pto search chat threads, jump to open panes, switch workspaces, or run an app command.Ctrl+Enteropens a thread in a new pane. - In a chat composer, run slash commands such as
/stackand/processto control configured workspace processes, alongside each provider's own slash commands. - Create a new chat thread with
CommandOrControl+T, or split a terminal pane below the focused workspace pane withCommandOrControl+Shift+T. - Switch workspaces by sidebar order with
Alt+1throughAlt+9, andAlt+0for the tenth workspace. - Move between workspace panes with
Alt+ArroworCtrl+H/J/K/L. - Move the focused workspace pane by swapping it with the adjacent pane using
Ctrl+Shift+H/J/K/L. - In a focused chat thread pane, press
Tabto return keyboard focus to the prompt box. - Workspace pane headers can split chat or terminal panes vertically (
C|,T|) or horizontally (C-,T-), zoom or unzoom a pane, minimize it into the restore strip, or close it. - Drag the divider between workspace panes to resize the split.
- Right-click inside a terminal pane to create normal shell tabs, launch-profile tabs for Claude, OpenCode, Codex, and Cursor, or new workspace terminal panes around the focused pane.
- Terminal-internal tabs remain inside the focused terminal pane. Terminal split actions create workspace terminal panes.
- Per-terminal zoom works with
Ctrl+-andCtrl+=while the terminal is focused, and the chosen zoom is restored with the terminal layout.
- App state is saved through SDL's pref path in
state.sqlite. - User config is loaded from
$XDG_CONFIG_HOME/verde/verde.jsonor~/.config/verde/verde.json. - Project stack config is loaded from
verde.ymlorverde.yamlin the workspace root.processes:andagents:entries both run in terminal docks; agent entries may also declareprovider,revive,notify,mcp, andhooksmetadata. New agent metadata defaults to disabled unless explicitly set. - On Omarchy systems, UI colors are loaded from an Omarchy-compatible
colors.toml. Verde first honorsVERDE_OMARCHY_COLORS=/path/to/colors.toml, then$XDG_CONFIG_HOME/omarchy/current/theme/colors.toml, then named Omarchy themes such as$XDG_CONFIG_HOME/omarchy/themes/verde/colors.tomlor~/.config/omarchy/themes/verde/colors.toml. Missing values fall back to Verde defaults. Seeexamples/omarchy/verde/colors.toml. theme.colorsinverde.jsoncan override Verde theme tokens. Omittheme.themeto keep Omarchy auto-detection, or set it to"default"to start from Verde's built-in colors.
Example project stack config:
processes:
web:
command: "npm run dev"
cwd: "."
restart: on_crash
agents:
codex:
provider: codex
command: "codex"
cwd: "."
revive: attach_or_create
notify: true
mcp: true
hooks: trueUse processes: for normal long-running commands such as dev servers. Use
agents: for terminal/TUI AI tools that should behave like first-class Verde
surfaces. With the Codex example above, Verde creates or reuses a terminal dock
for the agent and wires Codex hook events into pane/workspace attention. Plain
codex managed commands are launched with features.codex_hooks=true when
hooks: true is set, so PermissionRequest can mark the surface waiting and
Stop can mark it done.
Start or restart a configured Codex agent with:
verde live agent open --provider codex
verde live process restart --name codexUse verde live agent open --provider codex for the default Codex TUI flow; it
creates a managed terminal surface, applies Codex hook setup, and does not need
a verde.yml entry. Use verde live process restart --name codex when you
want to launch or restart the named agent declared in verde.yml. The same
default Codex TUI action is available from the workspace sidebar by
right-clicking the workspace new-thread/pencil button and choosing Open Codex TUI.
A Codex TUI opened manually in any Verde terminal still gets Verde identity
environment variables and can update the surface through verde notify, BEL,
OSC 777, or MCP, but it is not automatically a managed verde.yml agent unless
it is launched through the configured process entry.
Example config:
{
"theme": {
"theme": "default",
"colors": {
"background": "#101820",
"panel": "#151b24",
"accent": "#50c878",
"text": "#f0f0f5",
"selection": "#58a6ff"
}
},
"ui": {
"font_size": 20
},
"terminal": {
"font_size": 18,
"profiles": [
{
"label": "Local Agent",
"command": ["my-agent", "--interactive"]
}
]
},
"keybinds": {
"refresh": ["CommandOrControl+R", "CommandOrControl+Shift+R", "Ctrl+Shift+R", "F5"],
"new_thread": "CommandOrControl+T",
"sidebar": "CommandOrControl+S",
"sidebar_hidden": "Ctrl+Shift+S",
"browser": "Ctrl+B",
"workspace": {
"split_chat_vertical": "CommandOrControl+Alt+C",
"split_chat_horizontal": "CommandOrControl+Alt+Shift+C",
"split_terminal_vertical": "CommandOrControl+Alt+J",
"split_terminal_horizontal": "CommandOrControl+Shift+T",
"focus_up": ["Alt+Up", "Ctrl+K"],
"focus_down": ["Alt+Down", "Ctrl+J"],
"focus_left": ["Alt+Left", "Ctrl+H"],
"focus_right": ["Alt+Right", "Ctrl+L"],
"focus_prompt": "Tab",
"move_up": "Ctrl+Shift+K",
"move_down": "Ctrl+Shift+J",
"move_left": "Ctrl+Shift+H",
"move_right": "Ctrl+Shift+L",
"toggle_maximize": "CommandOrControl+Alt+M",
"minimize": "CommandOrControl+Alt+Minus",
"close": ["CommandOrControl+W", "Alt+X"],
"select": [
"Alt+1",
"Alt+2",
"Alt+3",
"Alt+4",
"Alt+5",
"Alt+6",
"Alt+7",
"Alt+8",
"Alt+9",
"Alt+0"
]
},
"terminal": {
"toggle": null,
"new_tab": "CommandOrControl+Alt+T",
"close": "CommandOrControl+Shift+W",
"rename_tab": "CommandOrControl+Shift+R",
"tab_previous": "CommandOrControl+Shift+PageUp",
"tab_next": "CommandOrControl+Shift+PageDown",
"split_up": null,
"split_down": null,
"split_left": null,
"split_right": null,
"focus_up": "CommandOrControl+Alt+Up",
"focus_down": "CommandOrControl+Alt+Down",
"focus_left": "CommandOrControl+Alt+Left",
"focus_right": "CommandOrControl+Alt+Right"
}
}
}Keybinds are loaded on startup and app refresh. Use a string for one shortcut or a string array for multiple shortcuts. Use null, an empty string, or an empty array to disable a binding.
On Linux, Verde writes runtime logs under SDL's pref path:
~/.local/share/verde/Native/logs/verde.stderr.log~/.local/share/verde/Native/logs/last-crash.log
Those files capture Zig panic output, provider helper stderr, and the last panic marker written before the app aborted.
Main third-party components used by the desktop app:
@anthropic-ai/claude-agent-sdkfor Claude Code provider integration.fff.nvim/fff-c/fff-searchfor fast file indexing and search, vendored invendor/fff. License: MIT.- Ghostty /
libghostty-vtfor terminal emulation and VT parsing. License: MIT. zsdlfromzig-gamedevfor Zig bindings to SDL3. License: MIT.- SDL3 from libsdl-org for windowing, input, display integration, and rendering support.
zqliteby Karl Seguin for SQLite access. License: MIT-style.zig_difandzig_markdownfor chat markdown and code rendering.stb_imageby Sean Barrett and contributors for image decoding, vendored invendor/stb_image.h. License: public domain or MIT.- Codicon, Nerd Fonts, Noto Sans, JetBrains Mono Nerd Font, and Cal Sans font assets for the native UI. See notices in
packages/desktop/src/assets/fonts.
If you redistribute Verde, keep the relevant upstream notices and license texts with the distributed app and any vendored source.
Verde is licensed under the MIT License. See LICENSE.