Home

Awesome

Piping Server

npm CodeFactor Build status GitHub Actions Docker Automated build

Infinitely transfer between every device over HTTP/HTTPS
<img src="demo_images/piping-server-terminal-hello.gif" alt="Piping Server hello" width="600">

Transfer

Piping Server is simple. You can transfer as follows.

# Send
echo 'hello, world' | curl -T - https://ppng.io/hello
# Get
curl https://ppng.io/hello > hello.txt

Piping Server transfers data to POST /hello or PUT /hello into GET /hello. The path /hello can be anything such as /mypath or /mypath/123/. A sender and receivers who specify the same path can transfer. Both the sender and the recipient can start the transfer first. The first one waits for the other.

You can also use Web UI like https://ppng.io on your browser. A more modern UI is found in https://piping-ui.org, which supports E2E encryption.

Stream

The most important thing is that the data are streamed. This means that you can transfer any data infinitely. The demo below transfers an infinite text stream with seq inf.

<img src="demo_images/seq-inf.gif" alt="infnite text stream" width="400">

Ideas

Piping Server is designed based on the ideas as follows.

Applications

Any data such as text streams, video streams and protocols can be streamed over Piping Server. Here are applications that fully use the power of pure HTTP.
See: "The Power of Pure HTTP – screen share, real-time messaging, SSH and VNC"

<table> <tr> <td><img src="demo_images/text-stream-chat.gif" width="300"></td> <td><img src="demo_images/screen-share.gif" width="300"></td> <td><img src="demo_images/piping-draw.gif" width="300"></td> </tr> <tr> <td><a href="https://github.com/nwtgck/piping-server-streaming-upload-htmls/blob/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/text_stream.html">Text stream chat</a></td> <td><a href="https://github.com/nwtgck/piping-server-streaming-upload-htmls/blob/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/screen_share.html">Screen share</a></td> <td><a href="https://github.com/nwtgck/piping-draw-web">Drawing share</a></td> </tr> </table> <table> <tr> <td><img src="demo_images/piping-ui.gif" width="300"></td> <td><img src="demo_images/piping-ssh.gif" width="300"></td> <td><img src="demo_images/piping-vnc.gif" width="300"></td> </tr> <tr> <td><a href="https://github.com/nwtgck/piping-ui-web">E2E encryption file transfer</a></td> <td><a href="https://github.com/nwtgck/piping-ssh-web">SSH on Web browser</a></td> <td><a href="https://github.com/nwtgck/piping-vnc-web">VNC on Web browser</a></td> </tr> </table>

The most important thing is that Piping Server stays simple. The applications use Piping Server as a core of data communication. It transfers data to POST /thepath into GET /thepath streamingly. The stream makes real-time communications over every device possible.

See "Ecosystem around Piping Server · nwtgck/piping-server Wiki" to find more about softwares using Piping Server.

Power of HTTP

In my experiment, Piping Server transferred 1,110TB (≈ 1PB) in a single HTTP request for 64 days and 2 hours at least. This means that it can transfer huge data and keep a request for about 2 months.

<img src="demo_images/1110TB-transfer.gif" alt="The power of HTTP" width="400">

Engineer-friendly help

Get help and version only with curl.

curl https://ppng.io/help
curl https://ppng.io/version

Transfer to multiple receivers

You can transfer to multiple receivers. In the demo below, query parameter ?n=3 is specified to allow three receivers.

<img src="https://github.com/nwtgck/piping-server/raw/develop/demo_images/piping-server-multi-transfer.gif" alt="Piping Server multiple transfer" width="450">

Public servers

Here are public Piping Servers.

Self-host on Docker

Run a Piping Server on http://localhost:8080 as follows.

docker run -p 8080:8080 nwtgck/piping-server

Run a server in background and it automatically always restarts.

docker run -p 8080:8080 -d --restart=always nwtgck/piping-server

Self-host using portable binaries

Run a Piping Server on http://localhost:8080 as follows on Linux.

curl -L https://github.com/nwtgck/piping-server-pkg/releases/download/v1.12.0/piping-server-pkg-linuxstatic-x64.tar.gz | tar xzvf -
./piping-server-pkg-linuxstatic-x64/piping-server --http-port=8080

The binaries are for multi-platform including Linux on x64, Linux on ARM64, Linux on ARMv7, Intel macOS, Apple Silicon macOS and Windows on x64. See https://github.com/nwtgck/piping-server-pkg to run on the other platform.

Self-host on free services

Here are easier ways to own your Piping Server.

See "Ecosystem around Piping Server · nwtgck/piping-server Wiki" to find more about self-hosting.

Headers passed from sender to receivers

Here are headers passed to receivers.

Server options

Here is available CLI options by piping-server --help.

Options:
  --help          Show help                                            [boolean]
  --version       Show version number                                  [boolean]
  --host          Bind address (e.g. 127.0.0.1, ::1)                    [string]
  --http-port     Port of HTTP server                            [default: 8080]
  --enable-https  Enable HTTPS                        [boolean] [default: false]
  --https-port    Port of HTTPS server                                  [number]
  --key-path      Private key path                                      [string]
  --crt-path      Certification path                                    [string]

Piping Server written in Rust

Piping Server is also developed in Rust.
https://github.com/nwtgck/piping-server-rust