clientproxy.io
→ console
← All documentation

Share a local development server through a public HTTPS URL

Give someone a URL to a web app running on your computer. ClientProxy connects your computer to a public proxy and forwards HTTP requests to the local port you choose in the dashboard.

Your computer and local server must remain running while people use the link.

What you need

  • A ClientProxy account, a tunnel with an assigned eligible product, and its Tunnel ID and API Key.
  • The tunnel-client installed for your operating system.
  • A local HTTP server. The first example uses Python 3; you can substitute your app.

1. Start a small demo server

Create an empty folder, add an index.html file containing this page, and open a terminal in that folder:

<!doctype html>
<html lang="en">
  <meta charset="utf-8">
  <title>My ClientProxy demo</title>
  <h1>Hello from my computer</h1>
  <p>This page is being shared through ClientProxy.</p>
</html>

Start the server:

python3 -m http.server 3000 --bind 127.0.0.1

On Windows, use py -m http.server 3000 --bind 127.0.0.1 if Python is installed through the Windows launcher.

Open http://127.0.0.1:3000 and confirm the page loads. Python serves files in the current folder, so use the demo folder rather than your project root or home directory.

For your own app, start its normal development command and note its actual HTTP port.

2. Create the tunnel and domain mapping

In the ClientProxy dashboard:

  1. Open Client Tunnels, create a tunnel, and select a proxy server.
  2. Assign an eligible product using Assign Product.
  3. Open the tunnel's Domains and select Add Domain.
  4. Select Auto-generate default domain.
  5. Set Local IP:port to 127.0.0.1:3000 and save.
  6. Copy the generated domain, Tunnel ID, and subscription API Key.

The backend address is configured in the dashboard. There is no --port argument in this client.

3. Start the tunnel client

Keep the demo server running. In a second terminal, run:

tunnel-client \
  --api-url https://api-eu.clientproxy.io/api \
  --tunnel-id YOUR_TUNNEL_ID \
  --api-key YOUR_API_KEY

Replace the placeholders with your credentials. On Windows, the equivalent single-line command is:

tunnel-client.exe --api-url https://api-eu.clientproxy.io/api --tunnel-id YOUR_TUNNEL_ID --api-key YOUR_API_KEY

Use api-us or api-asia instead of api-eu if that is the API region for your setup. Run the binary from its extracted directory if it is not on your PATH. If you installed it as a background service, configure that service rather than starting another client for the same tunnel.

Keep the API key private; screenshots and shared command snippets should contain placeholders.

4. Share and verify the HTTPS URL

Open https://YOUR_GENERATED_DOMAIN. You should see Hello from my computer. Open it from another device or your phone on mobile data, then send the URL to your reviewer.

Edit index.html, save it, and refresh the public page to see the change.

When finished, press Ctrl+C in the tunnel-client terminal. If the client runs as a service, stop the service or remove the domain mapping instead.

Using Vite for a React or Vue project

Vite checks the HTTP Host header. Add your exact generated hostname to your existing Vite configuration, preserving your plugins and other settings:

export default defineConfig({
  // Keep your existing plugins and settings here.
  server: {
    host: '127.0.0.1',
    port: 5173,
    strictPort: true,
    allowedHosts: ['YOUR_GENERATED_DOMAIN'],
    hmr: false,
  },
});

Replace YOUR_GENERATED_DOMAIN with the hostname only, without https:// or a path. Map the tunnel domain to 127.0.0.1:5173, restart Vite, and reconnect the tunnel client.

This example disables hot module replacement because the current tunnel client does not relay WebSocket upgrades. Refresh the page manually after changes. Vite's server options documentation explains host allowlists and WebSocket requirements for HMR. Use a specific allowed hostname rather than allowedHosts: true.

Use this workflow for trusted review of development work. The public endpoint exposes whichever pages, files, and APIs your development server makes available; it does not add a reviewer login.

Troubleshooting

ProblemWhat to check
Local page does not loadConfirm your development server is running on the expected port
Public page cannot reach the backendConfirm the mapping points at the machine and port visible to the client
Vite reports a blocked hostAdd the exact public hostname to server.allowedHosts and restart Vite
App references localhost in browser requestsUse relative API URLs or configure the app's public base URL
Changes do not appear automaticallyRefresh manually; WebSocket HMR is unavailable in this client
Mapping still uses the previous portReconnect the tunnel client

If you run the client inside a container, 127.0.0.1 refers to that container unless host networking is in use. The commands above run the client directly on your computer.