Elyra
Elyra The coding agent e The native code editor Elyra Grove Native local development environment Askr The real server for Laravel & PHP Elyra Framework Rust + Svelte 5 framework for desktop apps Elyra Conductor Local project conductor Elyra SQL Server MySQL-compatible SQL server in Rust Elyra Félagi Agents as teammates on one board Elyra SQL Client Native desktop SQL workbench Elyra SQL Anywhere Replication-ready SQL engine Elyra Sjá SEO & GEO workspace for macOS Elyra DataGrid Server-driven data grid for Laravel
Internals
Architecture
Release notes
Changelog
Elyra

CLI reference

Every command speaks to the daemon over local IPC and accepts a global --json flag for machine-readable output.

grove <command> [args] [--json]

Lifecycle

Command Description
grove init [--php 8.4] [--no-php] First-run setup: config, root CA, a PHP build, and (when elevated) the resolver + CA trust. Parks ~/Code by default.
grove daemon Run the daemon in the foreground (used by the service manager).
grove start Start the daemon in the background.
grove stop Stop the daemon gracefully.
grove restart Restart the daemon.
grove gui Start the daemon if needed and launch the desktop GUI.
grove install / uninstall Install/remove Grove as an OS service (launchd/systemd); uninstall also removes the resolver + CA trust.
grove status Daemon + environment status.
grove doctor Diagnostics.

Sites

Command Description
grove new <name> [--kind <kit>] [--path ~/Code] [--php 8.4] [--git] Scaffold a new project via laravel new and link it. --kind: laravel (plain) | livewire | react | vue | a community kit vendor/package (--using) | static.
grove park [<dir>] Park a directory — every subfolder becomes <name>.<tld>.
grove unpark [<dir>] Stop parking a directory.
grove link [name] [--path <dir>] Link a single directory as a site.
grove unlink <name> Remove a linked site.
grove forget <name> Remove a site from the list without deleting its files.
grove restore <name> Restore a previously forgotten site.
grove list (alias links) List every served site.
grove secure <name> / unsecure <name> Toggle HTTPS for a site.
grove isolate <name> <version> / unisolate <name> Pin / clear a site's PHP version.
grove proxy <name> <url> Route <name>.<tld> to a running dev server.
grove share <name> [--subdomain s] [--server host:port] [--token t] [--basic-auth user:pass] Share a site publicly through a tunnel server (see TUNNEL.md).
grove import Import parked dirs + linked sites from an existing Laravel Valet config.

Dev processes

Grove runs a site's long-running dev processes for you — typically the Vite dev server (HMR) and a queue worker, plus anything else the application declares — with the site's own Node/PHP. No artisan serve needed (Grove already serves). Output goes to the Logs panel (dev-<site>-*.log). In the GUI it's the ⚡ toggle per site.

Command Description
grove dev start [site] Start the site's dev processes. Defaults to the site in the current directory.
grove dev stop [site] Stop them, including anything they spawned. Defaults to the current directory.
grove dev list List sites with dev processes running.

On Laravel 13.16+, Grove asks the application what to run via php artisan dev:list --json --except-vendor, so processes you register with DevCommands are supervised too:

use Illuminate\Foundation\Console\DevCommands;

DevCommands::artisan('reverb:start', 'reverb')->orange();
DevCommands::register('stripe listen --forward-to '.config('app.url'))->green();

Two entries are deliberately skipped: server (Grove already serves the site over FPM on its .test domain) and logs (grove logs tails the app log already). Vendor-registered processes are excluded so an arbitrary Composer package can't start processes inside the daemon.

Each process writes to dev-<site>-<name>.log in Grove's log directory, listed by grove logs. php and the Node package manager are resolved to the versions the site pins, not whatever is on your PATH.

Grove falls back to a Vite dev server plus a queue worker for non-Laravel sites and Laravel versions without dev:list.

Run grove dev instead of php artisan dev, not alongside it. Both supervise the same processes, so running both gives you two Vite servers fighting over port 5173 and two queue workers competing for the same jobs. grove dev start warns when it sees a php artisan dev process running. The check can't tell which project that process belongs to, so it is a warning rather than an error.

Debugging (Xdebug)

Command Description
grove debug on / off Load / unload Xdebug into FPM pools (trigger mode).
grove debug status Show whether Xdebug is enabled and available per PHP build.
grove debug env Print shell exports for debugging a CLI process: eval "$(grove debug env)".

See DEBUGGING.md. Grove's fully-static PHP can't load Xdebug — register a PHP that has it (grove php register).

PHP

Command Description
grove php install <version> Download a self-contained static PHP-FPM build (e.g. 8.5, 8.4, 8.3).
grove php register <version> <fpm-binary> Register a custom php-fpm binary (bring-your-own).
grove php discover Auto-discover php-fpm binaries on this machine.
grove php list List registered PHP builds.
grove use <version> Set the global default PHP version.

Node.js

Command Description
grove node install <version> Download a Node.js build (major like 22, or exact 22.23.1).
grove node list List installed + installable Node versions.
grove node use <site> <version> / unuse <site> Pin / clear a site's Node version.

Services

Command Description
grove service list List bundled services and their state.
grove service install <key> Download + initialise a service (postgres, mysql, redis).
grove service start|stop|restart <key> Control a service.
grove service port <key> <port> Override a service's listen port.
grove env [site] Print a .env snippet for the bundled services.

Reproducible environments (grove.toml)

Commit a grove.toml to a project so a teammate can go from git clone to a running, identical environment in one command.

Command Description
grove up Bring the current project up from its grove.toml (link, pin PHP/Node, start services, optional dev).
grove up <path> Target a different project directory.
grove up --write Scaffold a starter grove.toml for the current project.
grove up --no-dev Bring up but skip starting dev processes.
# grove.toml
name = "myapp"
php = "8.4"
node = "22"
secure = true
services = ["mysql", "redis"]
dev = true

Reproducible bundles

Package a whole project environment — grove.toml, .env, and its database — into one shareable file, and restore it with a single command. Reproducible dev environments without Docker; ideal for onboarding a teammate.

Command Description
grove bundle export Bundle the current project into <name>.grovebundle.
grove bundle export <path> --out <file> Choose the project and output file.
grove bundle export --no-env Exclude the project's .env (secrets).
grove bundle import <file> Unpack, bring the environment up, and load the database.
grove bundle import <file> --into <dir> Restore into a specific directory.

Team secrets (Grove Teams)

End-to-end encrypted .env sync for your team. Secrets are encrypted on your machine (age / X25519) to members' public keys; the backend only stores ciphertext. Requires an active Teams license (grove license activate).

Command Description
grove secret set <project> KEY=VALUE Encrypt + push a secret.
grove secret pull <project> [--write] Fetch + decrypt (optionally write .env).
grove secret share <project> <public-key> Grant a teammate access + re-encrypt.
grove secret revoke <project> <public-key> Remove a teammate + re-encrypt.
grove secret members <project> List members with access.
grove secret whoami Print your member public key.

The backend URL defaults to https://teams.elyracode.com (GROVE_TEAMS_SERVER overrides it).

License (Grove Pro / Teams)

Activate a purchased license to unlock Pro/Teams features. Verified offline (Ed25519) — no connection required. The free, open-source core is never gated.

Command Description
grove license activate <key> Activate a license key (from your purchase email).
grove license status Show the current entitlement (plan, seats, renewal).
grove license deactivate Remove the stored license.

Also available in the desktop app under Settings → License.

Request timeline

Grove proxies every *.test site, so it records a live, framework-agnostic log of recent requests — method, path, status, duration — with zero setup. Also shown in the desktop app's Requests panel.

Command Description
grove requests Recent requests across all sites (newest first), with ids.
grove requests <site> Filter to one site.
grove requests --limit <n> Cap the number of entries.
grove replay <id> Re-issue a captured request through Grove (id from grove requests).
grove request <id> --as <fmt> Print the request as curl, http, or pest.
grove explain <id> Curate a debugging bundle (request + causal chain + error log) for an AI assistant.
grove sql-capture on|off|status Correlate SQL queries with the timeline (MySQL).

Causal chain

With grove sql-capture on, Grove turns on MySQL's general query log and reads it back to build a per-request causal chain: expand a request in the desktop app's Requests panel (or via the MCP grove_request_chain tool / grove requests --json) to see the SQL it issued and the mail it sent within its time window, plus derived metrics (duration, query count). A toolbar toggle turns SQL capture on/off. Grove sits in front of every request and captures mail centrally, so this needs zero app instrumentation.

In the desktop app, click any request to see its headers and body, replay it, or copy it as a curl command, a .http file, or a Pest test — a framework-agnostic way to re-run a failed request (or turn it into a regression test) while you fix the code.

AI tools (MCP)

Expose your local environment to AI clients (Claude, Cursor) over the Model Context Protocol — read-only, local-only. See MCP.md for client setup.

Command Description
grove mcp Run the MCP server over stdio (your AI client launches this for you).

Webhooks

Grove captures any request to /__grove/hooks/<bucket> on a site and answers 200 — a local webhook.site. Expose it publicly with grove share <site> and point Stripe, GitHub, etc. at https://<public-url>/__grove/hooks/<bucket>. Inspect each delivery and re-deliver it to your app while you fix the handler.

Command Description
grove hooks List captured webhooks (newest first), with ids.
grove hooks replay <id> --to <url> Re-deliver a webhook to a local handler.
grove hooks clear Drop all captured webhooks.

Also available as the Webhooks panel in the desktop app, where you can inspect payloads and copy any delivery as a curl/.http/Pest test.

Database snapshots

Looking to browse or edit data? That's the Database panel in the desktop app (auto-connects from each site's .env) — see DATABASE.md. The commands below are for point-in-time snapshots.

Point-in-time snapshots of Grove's bundled MySQL / PostgreSQL — snapshot before a risky migration and roll back in one command. Stored as SQL under $GROVE_HOME/snapshots/.

Command Description
grove db snapshot [--engine mysql|postgres] [--db NAME] [--note TEXT] Snapshot a database (MySQL: omit --db for all).
grove db list List stored snapshots.
grove db restore <id> Restore a snapshot by id.
grove db rm <id> Delete a snapshot.

Toolchain on your PATH

Expose Grove's bundled php, composer, node, npm, npx and laravel, auto-switching to whatever version each project pins (grove isolate / grove node use) — so you can drop Herd/Valet entirely.

Command Description
grove path install Create the shims + provision the toolchain, then print the PATH line to add.
grove path show Show whether the shims are installed and on your PATH.
grove path uninstall Remove the shims.

Docker / OrbStack

Running containers are discovered automatically and served as <name>.test with trusted HTTPS — no command needed. They appear in grove list with the proxy driver, and can be started/stopped from the GUI. Toggle with [general].docker. See DOCKER.md.

GUI-only tools

The desktop app's Tools panel adds actions without a CLI equivalent: Restart daemon, Migrate MySQL from Herd, Convert database (MySQL/PostgreSQL/SQLite), and the Xdebug toggle.

Mail

Command Description
grove mail List captured emails.
grove mail show <id> Show one captured email.
grove mail clear Discard all captured emails.

Logs

Command Description
grove logs List available log sources (per-site Laravel logs + Grove service logs).
grove logs <site> [--lines 100] View recent entries from a source.

TLS / CA

Command Description
grove ca trust Generate (if needed) and trust the Grove root CA in the system store.
grove ca uninstall Remove the Grove root CA from the system store.