Quickstart
Install grove, set up the machine once, write a grove.toml, and run your dev server on an HTTPS hostname of its own with no port in the URL.
Install the binary
npm install -g @grove-sh/cliOr, with Go handy, go install github.com/grove-sh/cli/cmd/grove@latest. The npm package is a shim that picks the binary for your platform, so either way you end up with one static executable and no runtime.
Set up the machine, once
grove installThis generates a local certificate authority, adds it to your trust stores, and prints the one privileged step your platform needs to reach port 443. It runs that step when you say yes, or straight away with --yes. Setting up a machine says what the step is on Linux and on macOS.
Check it
grove doctorDoctor is the first thing to run after install, before anything has had a chance to go wrong. A healthy machine reads running, installed and trusted, and a runtime bundle that carries grove’s root. Anything else names the fix.
Set up the project, once
grove initThis writes a grove.toml at the root of the worktree from what it finds: a route per app, and the ports a supabase stack would publish. Read it before you trust it. Grove is guessing which variable each app reads its URL from, and it’s guessing from your dependencies.
Run something in the context
grove exec -- vite devGrove leases a port for the route this directory belongs to, sets PORT and whatever else the config names, and routes https://<context>.grov.site to it for as long as the command runs. grove ls shows what’s live.
In a real project that wrapper belongs in the script, so pnpm dev stays pnpm dev:
{
"scripts": {
"dev": "grove exec -- vite dev"
}
}