<p>There's a special kind of friction that only shows up when someone else touches your project. You've had it running locally for months — the right PHP version, a MySQL database, Redis for the queue, a Vite server humming. It all works. Then a teammate clones the repo, and… it doesn't. Wrong PHP. No database. "Which services do I need again?" A README with six manual steps, three of which are subtly out of date.</p><p>Grove 0.8 fixes that with a small, boring, wonderful idea: put the environment in the repo.</p><h2>Why: the README was never the source of truth</h2><p>Every project already documents its environment somewhere — usually a <code>## Local setup</code> section in the README, written once and slowly rotting. It says "PHP 8.4, MySQL, run <code>npm run dev</code>." It's prose. Nobody can run prose.</p><p>Meanwhile the actual setup lives in your head and your machine: the PHP version you pinned, the database you spun up, the queue worker you remember to start. None of it travels with the code.</p><p>Grove is uniquely placed to close that gap, because it already does all of those things — pin PHP, pin Node, install and run databases, supervise dev processes. The only thing missing was a way to write it down in a form Grove could execute. So we added one file and one command.</p><h2>How: grove.toml + grove up</h2><p>You commit a <code>grove.toml</code> to the project root. It's short and readable — a description of what this project needs, not a script:</p><pre><code class="language-toml"># grove.toml
name = "myapp"
php = "8.4"
node = "22"
secure = true
services = ["mysql", "redis"]
dev = true
</code></pre><p>Then anyone — a new teammate, a future you on a fresh laptop — runs one command after cloning:</p><pre><code class="language-text">$ grove up
Bringing up myapp…
  ✓ link
  ✓ https on
  ✓ php 8.4
  ✓ mysql
  ✓ redis
  ✓ dev
✓ myapp is up → https://myapp.test
</code></pre><p>That's the whole onboarding. <code>grove up</code> reads the file and orchestrates the steps you'd otherwise do by hand: it links the project as a <code>.test</code> site, turns on HTTPS, pins PHP 8.4 and Node 22 (downloading them if this machine doesn't have them yet), installs and starts MySQL and Redis, and fires up the dev processes. From <code>git clone</code> to a running, styled, HTTPS app in one line.</p><h3>Starting from nothing</h3><p>Don't have a <code>grove.toml</code> yet? Grove writes you a friendly, commented one, pre-filled with your defaults:</p><pre><code class="language-text">$ grove up --write
✓ wrote /Users/you/Code/myapp/grove.toml — edit it, then run `grove up`
</code></pre><pre><code class="language-toml"># grove.toml — this project's local environment, committed to the repo.
# A teammate runs `grove up` after cloning to get an identical setup.

name = "myapp"
php = "8.4"
# node = "22"
secure = true

# Bundled services Grove should install + start for this project:
# services = ["mysql", "redis"]
services = []

# Start the dev processes (Vite + queue worker) as part of `grove up`:
# dev = true
</code></pre><p>Uncomment what you need, commit it, and you're done. A couple of flags round it out: <code>grove up ~/Code/other-project</code> targets a different directory, and <code>grove up --no-dev</code> brings everything up but leaves the dev processes off (handy on CI, or when you just want the database).</p><h3>The nice part: no new machinery</h3><p>Here's what I like most about this release. <code>grove up</code> didn't invent anything. Linking sites, pinning versions, installing services, starting dev processes — Grove already did all of that, each as its own command. <code>grove up</code> is just a conductor: it reads the file and plays those existing operations in order. Small surface, big payoff. That's the shape a good feature tends to have.</p><h2>Where this takes Grove</h2><p>For a while, Grove's pitch was "a better local server — a native, open Valet." With 0.8 it quietly becomes something more: a place where a project's environment is versioned alongside its code. Change the PHP version for a feature branch? It's a diff. Onboard a contributor? It's <code>git clone &amp;&amp; grove up</code>. The environment stops being tribal knowledge and becomes a reviewable, committed part of the repo.</p><pre><code class="language-text">$ git clone git@github.com:you/myapp.git
$ cd myapp
$ grove up
</code></pre><p>Three lines to a running app. Grove auto-updates — after it relaunches, hit Tools → Restart daemon, drop a <code>grove.toml</code> in your project, and try it. 🌱🌳</p><p>The workbench is getting interesting: next up we're looking at AI-assisted log triage in the Doctor panel, branch-aware database environments, and webhook capture-and-replay over tunnels. Ideas welcome!</p>