{"repo":"janbjorge/pipegate","free":true,"listed":false,"github":"https://github.com/janbjorge/pipegate","clone":"git clone https://github.com/janbjorge/pipegate.git","description":"PipeGate is a lightweight, self-hosted proxy built with FastAPI.","language":"Python","stars":242,"topics":[],"license":"MIT","category":"self-hosted-apps","readme_excerpt":"PipeGate Self-hosted HTTP tunnel -- poor man's ngrok. Expose a local server to the internet through a single WebSocket. No accounts, no cloud dependencies, no daemon -- just a server on your VPS and a client next to your app. 400 lines of Python. Quick Start Requests to http://yourserver:8000/a1b2c3d4/anything now reach http://localhost:3000/anything . CLI Pin a connection ID so your public URL stays stable across token renewals: Flag takes precedence over the env var. How It Works A caller hits the server at /{connection id}/{path} . The server wraps the request into a JSON message (method, path, headers, base64-encoded body) tagged with a correlation id (UUID4), and pushes it into an in-memory asyncio.Queue for that connection. A background task drains the queue over the WebSocket to the tunnel client. The client receives the message, makes a real HTTP request to your local service, and sends back a response message with the same correlation id . The server matches it to the waiting asyncio.Future and returns the response to the original caller. Multiple requests fly concurrently over one WebSocket -- the correlation ID is what ties each request to its response. Bodies are base64-encoded so binary payloads survive the JSON text frames. What happens when things go wrong Situation What PipeGate does --- --- Client is slow / not connected Queue fills up, caller gets 503 Request body too large Rejected immediately with 413 Client disconnects mid-request Pending future fails wit","default_branch":null,"files":null,"tree":[],"storefront":"/r/janbjorge","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/janbjorge/pipegate/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}