Changelog
All notable changes to Elyra Grove are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
0.2.4 — 2026-06-30
Fixed
-
Tunnelled sites now render assets correctly (Vite, CSS, JS). The tunnel no longer rewrites the
Hostheader to the local site name — it preserves the public host so the app builds correct public asset URLs, and routes locally via a newX-Grove-Siteheader instead. It also setsX-Forwarded-Proto, and Grove's proxy maps it to FastCGIHTTPS=on, so apps generatehttps://URLs (no mixed-content blocking) without needing TrustProxies configured.Update both the macOS app and the
grove-tunnelserver on your host to 0.2.4 — the server is what preserves the public host.
0.2.3 — 2026-06-30
Added
- The public tunnel URL now shows inline in the Sites row (a 🌍 chip you can click to copy) while a site is shared — not just in the transient toast. The Tunnels panel continues to list every active tunnel.
- A turnkey
deploy/tunnel/setup.shfor standing up your own tunnel server in one command.
0.2.2 — 2026-06-30
Added
- Zero-config tunnels. Grove now defaults to the public tunnel server
grove.elyracode.com, sogrove share <site>works out of the box and gives ahttps://<random>.grove.elyracode.comURL — no[tunnel]config needed. - Open-server mode.
grove-tunnelcan run without a token (omit--token) for a public community server; clients no longer need a token. - On-demand HTTPS authorization.
grove-tunnelexposes/__grove_askso a fronting Caddy can mint per-subdomain Let's Encrypt certificates safely (only for hostnames under the server's own domain) — no DNS API required. - Deployment kit in
deploy/tunnel/: Caddyfile, systemd unit and a step-by-step guide for running your own server.
0.2.1 — 2026-06-30
Added
- Tunnel management in the GUI — a new Tunnels panel and a per-row Share button in the Sites table. The daemon now owns tunnel lifecycles, so the GUI/CLI can start, stop and list public tunnels.
- Request inspector — a live table of recent tunnelled requests (time, site,
method, path, status, duration), ideal for debugging webhooks.
grove sharealso prints requests live in the terminal. - Remove a site from the list —
grove forget <name>(and a trash button in the GUI) hides a site without deleting its files;grove restore <name>brings it back. Backed by a newignoredlist inconfig.toml.
Removed
docs/SIGNING.md(internal signing notes) is no longer part of the docs.
0.2.0 — 2026-06-30
Added
- Public tunnels (
grove share) — a native, self-hostable alternative to Expose/ngrok, built in with zero external dependencies:grove share <site>exposes a local*.testsite at a public URL for demos, real-device testing and webhooks.- New
grove-tunnelserver binary you deploy on a host with a wildcard domain. Requests are multiplexed over a single yamux connection and proxied withhyperend-to-end (streaming bodies, rewrittenHost). - Options:
--subdomain,--server,--token,--basic-auth. [tunnel]config section (server,token) so the flags can be omitted.- See docs/TUNNEL.md.
0.1.5 — 2026-06-30
Fixed
- GUI now connects to the daemon reliably.
GrovePathsuses a fixedGrovedirectory (e.g.~/Library/Application Support/Grove) instead of a reverse-DNS ProjectDirs name, so the CLI, root daemon and GUI always agree on the same home + IPC socket. Previously the GUI looked incom.elyra.Grovewhile the daemon ran inGrove, so it showed “Stopped”.
Added
sudo grove installnow also ensures the system resolver and root CA, so*.testkeeps resolving even if another tool (e.g. Herd) removed/etc/resolver/<tld>.
0.1.4 — 2026-06-30
Added
- Root background service on macOS:
sudo grove installnow installs a system LaunchDaemon that binds the privileged ports (53/80/443), starts at boot, and runs PHP workers as your user (GROVE_RUN_USER). This is the piece that makes*.testserving work after just installing the app + runningsudo grove install— no more manualsudo grove start.
Fixed
- The daemon's IPC socket is now world-accessible, so the user-level GUI can talk to the root daemon.
0.1.3 — 2026-06-30
Fixed
- PHP now serves under a privileged (root) daemon: PHP-FPM workers run as
the real user (
SUDO_USER/GROVE_RUN_USER) with--allow-to-run-as-rooton the master, instead of php-fpm refusing to start as root. - Static assets are served directly (try_files): existing files such as
built Vite assets under
/build/are returned as-is instead of being routed throughindex.php, so SPA/Vite front-ends render correctly.
Changed
- Bumped
tauri-actionto v1 and several GUI dev-dependencies (Dependabot).
0.1.2 — 2026-06-29
Added
- The desktop app now bundles the
groveCLI as a sidecar, so it can locate and start the daemon (with fallbacks to common install paths). - macOS builds are code-signed and notarized, so the app opens without the configured — no more “app is damaged” on download.
Fixed
- GUI “spawning daemon: No such file or directory” when the CLI wasn't on PATH.
0.1.1 — 2026-06-29
Added
- In-app auto-update (macOS/Linux GUI): the app checks for new releases on
launch and offers a one-click “Install & restart”. Updates are cryptographically
signed; the release pipeline publishes signed updater artifacts +
latest.json.
0.1.0 — 2026-06-29
First public release. A native, cross-platform local development environment in
Rust that serves *.test domains with local HTTPS, multi-version PHP/Node and
bundled services — with zero external dependencies.
Core
- Embedded DNS resolver for
*.<tld>(defaulttest) → loopback; refuses any other TLD so it can't act as an open resolver (hickory). - HTTP/HTTPS reverse proxy binding 80/443, routing by
Hostheader (hyper), with a minimal built-in FastCGI client to PHP-FPM. - Driver system: Laravel, WordPress, generic PHP, static, and reverse-proxy (Vite/Node) — auto-detected from filesystem signatures.
- Local TLS: a private root CA generated on first run, with per-site leaf
certificates issued on demand via SNI (rcgen + rustls,
ringprovider). - Declarative TOML config as the single source of truth.
- Single long-running daemon binding the privileged ports; CLI and GUI are
thin clients over a Unix-socket JSON-RPC (
grove-ipc).
Runtimes
- Bundled PHP: download self-contained static PHP-FPM builds
(
grove php install 8.5|8.4|8.3) — no Homebrew/Herd. Plus bring-your-own (grove php register) and auto-discovery. - Per-site PHP version (
grove isolate) with lazy, on-demand FPM pools. - Bundled Node.js: download official node/npm/npx builds
(
grove node install 22); per-site Node version (grove node use).
Services (bundled, no separate install)
- PostgreSQL and MySQL via portable prebuilt binaries; Redis built
from source on install — all downloaded and supervised by Grove under
$GROVE_HOME/services. grove service install|start|stop|restart, persisted auto-start that only runs installed services on daemon boot, and per-service port config.- Built-in mail-catcher: an SMTP server that captures outgoing mail, with a Mailpit-style viewer.
grove env [site]generates a.envsnippet wiring an app to the bundled services (DB/Redis/mail).
Sites
grove new— scaffold a fresh Laravel project (bundled PHP CLI + Composer) or a static site, or link an existing project.grove park/link/secure/proxy;~/Codeis parked by default ongrove init.- Valet import (
grove import) for migrating existing setups.
GUI (Tauri 2 + Svelte 5)
- Desktop app sharing the Elyra Conductor look & feel (Tokyo Night palette, JetBrains Mono), as a thin client over the daemon.
- Panels: Sites (driver, per-site PHP/Node, HTTPS toggle, open in browser/Finder), Services, Mail, PHP, Node, Logs, Doctor, plus Settings (⌘,) and About.
- Create New Site wizard and Park folder import.
- macOS menu-bar icon: click to open, right-click to quit; closing the window hides Grove to the menu bar.
- Animated boot splash.
Lifecycle & ops
grove init(first-run setup),start/stop/restart,gui,install/uninstallas an OS service (launchd/systemd),doctor,logs, and--jsoneverywhere for scripting / elyra-conductor.- macOS resolver + trust-store integration; Linux/Windows stubs.
Notes
- macOS is the verified platform for 0.1.0. Linux/Windows resolver and trust integration are stubbed and tracked for a later release.