Installation

Install a tunnel provider first (cloudflared is recommended — free, no account needed):

terminal
$ brew install cloudflared
$ npm install -g checkpoint

checkpoint login

Sign in to your Checkpoint account. Opens the browser for authentication. Detects if already logged in and skips the browser flow if so.

The login flow uses a browser-based callback — no passwords are ever typed into the terminal. Sessions stay valid indefinitely as long as the refresh token is valid.

terminal
$ checkpoint login
Opening browser for authentication...
✓ Logged in as you@example.com

checkpoint start

Start tunneling a local port and get a shareable link.

terminal
$ checkpoint start -p 3000 -n my-feature
Starting tunnel...
✓ Tunnel active
Share URL: https://app.checkpoint.build/share/ab3x7qmn
FlagRequiredDescription
-p, --port <port>requiredLocal port your dev server is running on (e.g. 3000, 5173)
-n, --name <name>optionalTunnel name. Prompted interactively if omitted. Reuse a name to resume the same share URL and comments.
--provider <provider>optionalcloudflared (default) or ngrok. Auto-detected from $PATH if not specified.

What happens step by step

  1. Checks you are logged in
  2. Prompts for a tunnel name if -n was not passed
  3. Verifies something is actually running on localhost:<port> (HEAD request, 2s timeout)
  4. Authenticates with Supabase, refreshing tokens if needed
  5. Auto-detects the tunnel provider from $PATH (prefers cloudflared)
  6. Starts the injection proxy on a random local port
  7. Launches the tunnel provider pointed at the proxy port
  8. Registers the tunnel in the database (or reconnects to an existing one with the same name)
  9. Starts a 30-second heartbeat to keep the tunnel marked active
  10. Prints the share URL
  11. Waits until Ctrl+C, then deactivates the tunnel and shuts down cleanly

checkpoint stop

Stop an active tunnel by name. This deactivates the tunnel and marks it as inactive in the dashboard.

terminal
$ checkpoint stop -n my-feature
Deactivating tunnel...
✓ Tunnel deactivated
FlagRequiredDescription
-n, --name <name>requiredName of the tunnel to stop

checkpoint list

List all tunnels for your workspace with their current status and share URLs.

terminal
$ checkpoint list
Your tunnels:
● my-feature https://app.checkpoint.build/share/ab3x7qmn (active)
○ old-tunnel https://app.checkpoint.build/share/xy9z2klm (inactive)

Reconnecting to existing tunnels

If a tunnel with the same name already exists, the CLI reuses it — updating the connection details — rather than creating a new tunnel. This preserves the share URL and all comments.

This behavior is automatic when you use checkpoint start with a name that already exists. The CLI will:

  • Reuse the existing share URL and comments
  • Update the tunnel connection details
  • Mark the tunnel as active
  • Continue the 30-second heartbeat

checkpoint restart

Stop and immediately restart a tunnel. Useful for refreshing the connection or switching providers.

terminal
$ checkpoint restart -n my-feature
Stopping tunnel...
✓ Tunnel stopped
Starting tunnel...
✓ Tunnel active
Share URL: https://app.checkpoint.build/share/ab3x7qmn
FlagRequiredDescription
-n, --name <name>requiredName of the tunnel to restart
--provider <provider>optionalSwitch to a different provider (cloudflared or ngrok)

checkpoint delete

Permanently delete a tunnel and all its comments. This action cannot be undone.

terminal
$ checkpoint delete -n old-tunnel
This will permanently delete the tunnel and all comments.
Type 'DELETE' to confirm: DELETE
✓ Tunnel deleted
FlagRequiredDescription
-n, --name <name>requiredName of the tunnel to delete
--forceoptionalSkip confirmation prompt (use with caution)

Common workflows

Starting a new tunnel

terminal
$ checkpoint start -p 3000 -n my-feature

Resuming an existing tunnel

terminal
$ checkpoint start -p 3000 -n my-feature
Reusing existing tunnel...
✓ Tunnel reconnected

Checking tunnel status

terminal
$ checkpoint list

Cleaning up old tunnels

terminal
$ checkpoint delete -n old-tunnel

checkpoint share

Register an existing public tunnel URL (e.g. from a manually started ngrok session) with Checkpoint without the CLI managing the tunnel process.

terminal
$ checkpoint share -u https://abc123.ngrok.io -n my-tunnel
FlagRequiredDescription
-u, --url <url>requiredThe public HTTPS tunnel URL to register
-n, --name <name>optionalName for this tunnel (default: My Tunnel)
-p, --port <port>optionalLocal port for reference (default: 3000)

checkpoint status

Show login status and which tunnel providers are installed. Prints whether you are logged in (and as which email), and which of cloudflared / ngrok are available in $PATH.

terminal
$ checkpoint status
✓ Logged in as you@example.com
✓ cloudflared found
✗ ngrok not found

checkpoint logout

Sign out and clear saved credentials from this machine. Does not invalidate tokens server-side.

terminal
$ checkpoint logout

Tunnel providers

ProviderDetectionStartup timeoutURL pattern
cloudflaredwhich cloudflared30 seconds*.trycloudflare.com
ngrokwhich ngrok15 seconds*.ngrok.io / .app / .dev