Docs
grovs.io Start for free

Try locally

Run the full stack on your laptop to explore the dashboard and test link tracking, with no public server or DNS.

Prerequisites

RequirementNotes
Docker with Docker Compose v2On Windows, run the commands from WSL2 with Docker integration enabled.
Free port 80Or choose another port with GROVS_WEB_PORT.

Install

1
Run the installer

From the directory where you want the new grovs folder:

Bash
curl -fsSL https://raw.githubusercontent.com/grovs-io/self-host/main/install.sh | GROVS_DOMAIN=local bash
cd grovs

GROVS_DOMAIN=local selects the local trial without asking for a domain. The installer downloads the Compose files, generates your admin login and starts all services. It uses the release version bundled with the installer.

2
Open the dashboard

Open http://dashboard.lvh.me:3002 and log in with the admin email and password printed by setup. lvh.me and its subdomains resolve to 127.0.0.1, your own machine. The API uses port 80 by default.

If port 80 is in use, add GROVS_WEB_PORT=8080 before bash in the installer command and run it in a fresh directory. GROVS_DASHBOARD_PORT changes the dashboard port. Both are saved in .env.

Manual setup

To clone and inspect the repository yourself, run these in a fresh directory instead of the installer:

Bash
git clone https://github.com/grovs-io/self-host.git grovs
cd grovs
GROVS_RELEASE_URL="$(curl -fsSL -o /dev/null -w '%{url_effective}' https://github.com/grovs-io/self-host/releases/latest)"
GROVS_VERSION="${GROVS_RELEASE_URL##*/}" GROVS_DOMAIN=local ./scripts/setup.sh
docker compose -f docker-compose.yml -f docker-compose.local.yml pull
docker compose -f docker-compose.yml -f docker-compose.local.yml up -d

For an existing installation, follow Upgrades instead of rerunning the installer.

Check startup

Bash
docker compose -f docker-compose.yml -f docker-compose.local.yml ps -a
docker compose -f docker-compose.yml -f docker-compose.local.yml logs --tail=100 migrate web
curl --fail http://api.lvh.me/up

Use http://api.lvh.me:8080/up if you chose port 8080. migrate should finish with exit code 0; it does not stay running. Analytics can take about a minute after startup to become available.

Limits of a local trial

Local HTTP works for a trial. Universal Links and App Links need a public HTTPS installation: follow Deploy on a server. A phone's 127.0.0.1 is the phone, not your laptop.

Stop and resume

Both commands keep your data:

Bash
docker compose -f docker-compose.yml -f docker-compose.local.yml stop
docker compose -f docker-compose.yml -f docker-compose.local.yml up -d

To remove the trial and delete all its database and upload volumes:

Bash
docker compose -f docker-compose.yml -f docker-compose.local.yml down --volumes
Last updated 2026-10-26
Was this page helpful?