Tailscale Setup
Set up Tailscale so your phone can securely connect to Grove on your Mac.
Grove uses Tailscale to securely connect your phone to your dev machine. Both devices must be on the same Tailscale network (tailnet). Only devices in your tailnet can access Grove — no ports are exposed to the public internet.
1. Create a Tailscale account
Sign up at login.tailscale.com if you don't have an account. The free plan (Personal) works fine for Grove.
2. Install Tailscale on your Mac
brew install --cask tailscaleOpen the Tailscale app and sign in. Verify it's running:
tailscale statusYou should see your machine listed with a 100.x.x.x IP address and a hostname like your-machine.tail-net.ts.net.
3. Install Tailscale on your phone
Download Tailscale from the App Store and sign in with the same account you used on your Mac.
Both your Mac and phone must be signed into the same Tailscale account. If they're on different accounts, they're on different tailnets and can't see each other.
4. Enable HTTPS Certificates
- Go to the DNS page in the Tailscale admin console
- Enable MagicDNS if it isn't already on
- Under HTTPS Certificates, click Enable HTTPS
- Acknowledge that your machine names will appear on a public certificate transparency ledger
Grove uses these certificates to serve terminal sessions over secure HTTPS connections.
5. Enable Funnel
The first time you run grove start, it runs tailscale funnel which will prompt you to approve Funnel for your tailnet. Approve it and you're done.
If you want to enable Funnel manually ahead of time:
- Go to the Access controls page in the admin console
- Expand the Funnel section
- Click Add Funnel to policy
Grove uses Funnel to expose its API endpoint so the mobile app can reach your server.
6. Verify the connection
On your phone, open the Tailscale app and confirm it shows Connected. You should see your Mac listed as a peer.
On your Mac, run:
tailscale statusBoth your Mac and phone should appear in the output. If they do, you're ready to run grove start.
How Grove uses Tailscale
Grove uses two Tailscale features:
| Feature | What it does | Used for |
|---|---|---|
| Funnel | Exposes a path on your Tailscale hostname over HTTPS | The Grove API at https://<your-machine>.tail-net.ts.net/grove |
| TLS Certificates | Auto-generated certs for your Tailscale hostname | Terminal sessions at https://<your-machine>.tail-net.ts.net:<port> |
When you run grove start, it automatically:
- Gets your Tailscale hostname and IP
- Sets up a Funnel at the
/grovepath for the API - Generates TLS certificates (cached in
~/.config/grove/certs/)
When a terminal session starts, it launches ttyd on its own HTTPS port using those certificates.
Authentication is handled by Tailscale itself — only devices on your tailnet can connect. No passwords or API keys needed.
Troubleshooting
"Tailscale is not running"
Open the Tailscale app on your Mac:
open -a TailscaleThen verify with tailscale status.
Can't see sessions from phone
This is the most common issue. Check all of these:
- Tailscale is connected on your phone — open the Tailscale app and make sure it says Connected, not Disconnected
- Same account — both devices must be on the same Tailscale account
- Both devices appear in
tailscale status— run this on your Mac and confirm your phone is listed
Funnel setup fails
Make sure Funnel is enabled in your tailnet policy. Go to the Access controls page, expand the Funnel section, and click Add Funnel to policy if it hasn't been added. Then restart Grove:
grove stop
grove startCertificate errors
Verify that MagicDNS and HTTPS certificates are both enabled on the DNS page. You can test cert generation manually:
tailscale cert your-machine.tail-net.ts.netReplace your-machine.tail-net.ts.net with your actual Tailscale hostname (shown in tailscale status).
Phone shows "unable to connect"
- Toggle Tailscale off and on again on your phone
- Make sure your Mac isn't asleep — terminal sessions run on your Mac and it needs to be awake
- Check that the Grove server is still running (
grove startin a terminal, or check the background process)