{"id":15887425,"url":"https://github.com/n0-computer/dumbpipe","last_synced_at":"2026-05-08T12:04:16.695Z","repository":{"id":210190971,"uuid":"725706407","full_name":"n0-computer/dumbpipe","owner":"n0-computer","description":"Unix pipes between devices","archived":false,"fork":false,"pushed_at":"2026-04-17T15:27:15.000Z","size":330,"stargazers_count":610,"open_issues_count":25,"forks_count":42,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-04-17T16:42:01.778Z","etag":null,"topics":["holepunching","magic","pipes"],"latest_commit_sha":null,"homepage":"https://dumbpipe.dev","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/n0-computer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-11-30T17:49:19.000Z","updated_at":"2026-04-14T14:09:16.000Z","dependencies_parsed_at":"2026-03-16T18:05:09.408Z","dependency_job_id":null,"html_url":"https://github.com/n0-computer/dumbpipe","commit_stats":null,"previous_names":["n0-computer/dumb-pipe"],"tags_count":36,"template":false,"template_full_name":null,"purl":"pkg:github/n0-computer/dumbpipe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n0-computer%2Fdumbpipe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n0-computer%2Fdumbpipe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n0-computer%2Fdumbpipe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n0-computer%2Fdumbpipe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/n0-computer","download_url":"https://codeload.github.com/n0-computer/dumbpipe/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n0-computer%2Fdumbpipe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32779663,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"ssl_error","status_checked_at":"2026-05-08T08:22:45.650Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["holepunching","magic","pipes"],"created_at":"2024-10-06T06:02:16.376Z","updated_at":"2026-05-08T12:04:16.684Z","avatar_url":"https://github.com/n0-computer.png","language":"Rust","funding_links":[],"categories":["Rust","DevTools"],"sub_categories":[],"readme":"# Dumb pipe\n\nThis is an example to use [iroh](https://crates.io/crates/iroh) to create a dumb pipe to connect two machines with a QUIC connection.\n\nIroh will take care of hole punching and NAT traversal whenever possible, and fall back to a\nrelay if hole punching does not succeed.\n\nIt is also useful as a standalone tool for quick copy jobs.\n\nThis is inspired by the unix tool [netcat](https://en.wikipedia.org/wiki/Netcat). While netcat\nworks with IP addresses, dumbpipe works with 256 bit endpoint ids and therefore is somewhat location transparent. In addition, connections are encrypted using TLS.\n\n# Installation\n\nWith [Cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html):\n\n```\ncargo install dumbpipe\n```\n\nIf you've installed [Homebrew](https://brew.sh), you can install it using the following command:\n\n```\nbrew install dumbpipe\n```\n\n# Examples\n\n## Use dumbpipe to stream video using [ffmpeg / ffplay](https://ffmpeg.org/):\n\nThis is using standard input and output.\n\n### Sender side\n\nOn Mac OS:\n```\nffmpeg -f avfoundation -r 30 -i \"0\" -pix_fmt yuv420p -f mpegts - | dumbpipe listen\n```\nOn Linux:\n```\nffmpeg -f v4l2 -i /dev/video0 -r 30 -preset ultrafast -vcodec libx264 -tune zerolatency -f mpegts - | dumbpipe listen\n```\noutputs ticket\n\n### Receiver side\n```\ndumbpipe connect endpointealvvv4nwa522qhznqrblv6jxcrgnvpapvakxw5i6mwltmm6ps2r4aicamaakdu5wtjasadei2qdfuqjadakqk3t2ieq | ffplay -f mpegts -fflags nobuffer -framedrop -\n```\n\n- Adjust the ffmpeg options according to your local platform and video capture devices.\n- Use ticket from sender side\n\n## Share a shell for pair- or ensemble programming with [tty-share](https://github.com/elisescu/tty-share):\n\nSharing a terminal session over the internet is useful for collaboration between programmers, but the public [tty-share](https://github.com/elisescu/tty-share) server isn't very reliable and, more importantly, [it is not end-to-end encrypted](https://tty-share.com/how-it-works/#end-to-end-encryption).\n\nOn the server:\n\n```\n$ dumbpipe listen-tcp --host localhost:8000 \u0026\n$ tty-share\n```\n\nOn the client(s):\n\n```\n$ dumbpipe connect-tcp --addr localhost:8000 \u003cticket\u003e \u0026\n$ tty-share http://localhost:8000/s/local/\n```\n\n## Forward development web server\n\nYou have a development webserver running on port 3000, and want to share it with\na colleague in another office or on the other side of the world.\n\n### The web server\n```\nnpm run dev\n\u003e    - Local:        http://localhost:3000\n```\n\n### The dumbpipe listener\n\n*Listens* on an endpoint and forwards all incoming requests to the dev web\nserver that is listening on localhost on port 3000. Any number of connections can\nflow through a single dumb pipe, but they will be separate local tcp connections.\n\n```\ndumbpipe listen-tcp --host localhost:3000\n```\nThis command will output a ticket that can be used to connect.\n\n### The dumbpipe connector\n\n*Listens* on a tcp interface and port on the local machine. In this case on port 3001.\nForwards all incoming connections to the endpoint given in the ticket.\n\n```\ndumbpipe connect-tcp --addr 0.0.0.0:3001 \u003cticket\u003e\n```\n\n### Testing it\n\nYou can now browse the website on port 3001.\n\n## Forward a Unix Socket Application (e.g., Zellij)\n\nYou can forward applications that communicate over Unix sockets, like the terminal multiplexer [Zellij](https://zellij.dev/).\n\nNote: Zellij keeps its session sockets under `$ZELLIJ_SOCKET_DIR/\u003cVERSION\u003e/session-name`\n\n![image](https://github.com/user-attachments/assets/b8fbb988-57db-40cd-95e2-208e01fbaad6)\n\n1. On the remote host (with Zellij running):\n\n```bash\nzellij --version\n# zellij 0.42.2\n# Forward the remote Zellij socket\n# Socket path follows pattern: /tmp/zellij-0/\u003cVERSION\u003e/\u003csession-name\u003e\ndumbpipe listen-unix --socket-path /tmp/zellij-0/0.42.2/remote-task-1234\n```\n\nThis will give you a `\u003cticket\u003e`.\n\n2. On your local machine:\n\n```bash\nzellij --version\n# zellij 0.42.1\n\n# Create the local socket directory structure\nmkdir -p /tmp/zj-remote/0.42.1\n\n# Create a local socket connected to the remote one\ndumbpipe connect-unix --socket-path /tmp/zj-remote/0.42.1/remote-task-1234 \u003cticket\u003e\n```\n\n3. Attach your local Zellij client:\n\n```bash\n# In a new terminal window/tab, set the socket directory and attach\nZELLIJ_SOCKET_DIR=/tmp/zj-remote zellij attach remote-task-1234\n```\n\n# Advanced features\n\n## Combining Listeners\n\nYou can mix and match listeners. For example, forward from a remote Unix socket to a local TCP port:\n\n```bash\n# Machine A: Listen on a Unix socket\ndumbpipe listen-unix --socket-path /var/run/my-app.sock\n\n# Machine B: Connect to it via a local TCP port\ndumbpipe connect-tcp --addr 127.0.0.1:8080 \u003cticket\u003e\n```\n\n## Custom ALPNs\n\nDumbpipe has an expert feature to specify a custom [ALPN](https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation) string. You can use it to interact with\nexisting iroh services.\n\nE.g. here is how to interact with the iroh-blobs\nprotocol:\n\n```\necho request1.bin | dumbpipe connect \u003cticket\u003e --custom-alpn utf8:/iroh-bytes/2 \u003e response1.bin\n```\n\n(`/iroh-bytes/2` is the ALPN string for the iroh-blobs protocol, which used to be called iroh-bytes.)\n\nif request1.bin contained a valid request for the `/iroh-bytes/2` protocol, response1.bin will\nnow contain the response.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fn0-computer%2Fdumbpipe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fn0-computer%2Fdumbpipe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fn0-computer%2Fdumbpipe/lists"}