Netcat, curl and socat for WebSockets

Netcat, curl and socat for pre-built executables


Netcat, curl and socat for WebSockets.


Connect to public echo server

Serve and connect

Open a tab in Chromium using remote debugging.

Proxy TCP connections to WebSocket connections and back.

Broadcast all messages between connected WebSocket clients

See for further examples.


  • Connecting to and serving WebSockets from command line.
  • Executing external program and making it communicate to WebSocket using stdin/stdout.
  • Text and binary modes, converting between lines (or null-terminated records) and messages.
  • Inetd mode, UNIX sockets (including abstract namespaced on Linux).
  • Integration with Nginx using TCP or UNIX sockets.
  • Directly using unauthenticated SOCKS5 servers for connecting to WebSockets and listening WebSocket connection.
  • Auto-reconnect and connection-reuse modes.
  • Linux, Windows and Mac support, with pre-built executables.
  • Low-level WebSocket clients and servers with overridable underlying transport connection, e.g. calling external program to serve as a transport for websocat (for SSL, proxying, etc.).


There are multiple options for installing WebSocat. From easy to hard:

  • If you're on Fedora, you can install WebSocat from Copr: sudo dnf copr enable atim/websocat -y && sudo dnf install websocat
  • If you're on FreeBSD, you may install WebSocat with the following command: pkg install websocat.
  • If you're on Linux Debian or Ubuntu (or other dpkg-based), try downloading a pre-build executable from GitHub releases. Websocat is not yet officially packaged for Debian. Some older versions of Websocat may also have Debian package files avaialble on Github releases.
  • If you're on macOS, you can do:
    • brew install websocat using Homebrew
    • sudo port install websocat using MacPorts
  • Download a pre-build executable and install it to PATH.
  • Install the Rust toolchain and do cargo install --features=ssl websocat. If something fails with a -sys crate, try without --features=ssl;
  • Build Websocat from source code (see below), then move target/release/websocat somewhere to the PATH.

Pre-built binaries for Linux (usual and musl), Windows, OS X and Android are available on the releases page.

Building from source code

  1. Install the Rust toolchain. Note that Websocat v1 (i.e. the current stable version) may fail to support too new Rust due to its old dependencies which can be broken by e.g. this.
  2. cargo build --release --features=ssl.
  3. Find the executable somewhere under target/, e.g. in target/release/websocat.

Rust versions

Websocat versions Minimal Rust version Maximal Rust version
1.9 - 1.10 1.46
1.6 - 1.8 1.34
1.3 - 1.5 1.31 1.47
1.2 1.28 1.47
1.0-1.1 1.23 1.47

Early non-async versions of Websocat should be buildable by even older rustc.

Note that old versions of Websocat may misbehave if built by Rust 1.48 or later due to

SSL on Android

websocat's wss:// may fail on Android. As a workaround, download certificate bundle, for example, from and specify it explicitly:

SSL_CERT_FILE=cacert.pem /data/local/tmp/websocat wss://

Or just use --insecure option.


Basic usage examples are provided at the top of this README and in --help message. More tricks are described in

There is a list of all address types and overlays.

`websocat --help=long` output

Some notes

  • IPv6 is supported, surround your IP in square brackets or use it as is, depending on context.
  • Web socket usage is not obligatory, you can use any specs on both sides.
  • Typically one line in binary stream correspond to one WebSocket text message. This is adjustable with options.


  • It is not convenient when text and binary WebSocket messages are mixed. This affects mirror: specifier, making it a bit different from ws:// There are --binary-prefix, --text-prefix and --base64 options to handle mixture of binary and text.
  • Current version of Websocat don't receive notification about closed sockets. This makes serving without -E or -u options or in backpressure scenarios prone to socket leak.
  • Readline is not integrated. Users are advices to wrap websocat using rlwrap tool for more convenient CLI.
  • Build process of current version of Websocat is not properly automated and is fragile.

See also

  • wstunnel
  • wscat
  • websocketd
  • wsd

Collection of the latest Issues



Comment Icon0

"Some older versions of Websocat may also have Debian package files avaialble on Github releases." avaialble -> available



Comment Icon0

The Alpine package explicitly uses the --locked argument to ensure the proper dependencies. However, with the v1.10.1 release this fails:

Dropping the lock fixes the build, which implies that the lock file would need to be updated.



Comment Icon2

cmd=./websocat -t "#404" -H "Origin:" -v -v output=

I pass this input ~m~54~m~{"m":"set_auth_token","p":["unauthorized_user_token"]} output=

How to make it work? Thank you



Comment Icon30

Dear Vitaly

My internet provider let us the possibility to run Virtual Machine in the router gateway they provide. They also provide a REST API for managing Virtual Machines. All API are standard HTTP REST call except for accessing the virtual machine console (or screen) where they provide a Websocket API. Connecting this Websocket API using "websocat", I was able to connect the virtual machine console and to login. Perfect !

The problem begin when after login, I'm trying to use tools like VIM or NANO for file editting. Arrows do not work and those tools are impossible to use, chars are not interpreted correctly.

For example, when doing : 'vim test' (test is a new file), the first line in vim editor is : R65;5402;1c10;rgb:aaaa/aaaa/aaaa11;rgb:0000/0000/0000

and arrows are writing : ^[OA ^[OB ^[OC ^[OD even with VIM in ':set nocompatible'

I do not think the problem comes from the Linux machine I'm logged in (working fine without the Websocket access through API), but the issue is when connecting the console using websocat and the websocket API.

Do you have any idea ? Thanks for your help

Kind regards, nbanba



Comment Icon2

Tried to install it 3 times. It never finished after waiting more than 45 minutes.

Why so many dependencies for such a simple utility?

Why write a general utility in a language that is unlikely to be installed on anyone's machine. I think you would get wider adoption if you programmed it in C/C++.

Unfortunately, my need is urgent so I am going to move on to another solution. This would be a very useful utility if not for the heavyweight dependencies which make the installation fragile and slow.



Comment Icon5

The current naming scheme for released binaries is not predictable (architecture is not always present in the binary name).

Would it be possible to have a more consistent naming scheme for the released binaries so it is easier to automate a generic installation process for this tool (e.g. with binenv for instance) ?

Thanks !



Comment Icon4

It would be useful to add an option for websocat to bind to a source IP/interface - sometimes different interfaces have specific configurations for WebSocket connectivity, and having the ability to change this on the command line would be very helpful. There's no current way to do this today, so reverting to a pipe is the only way to accomplish this at the moment.



Comment Icon1

Please show the websocket server response status code in this message:

websocat: WebSocketError: Received unexpected status code

My websocket server will respond with HTTP 402 or 429 status codes, seeing these codes would be very helpfull.

My websocat version:




Comment Icon2


Dear Vitaly Shukela:

Thanks for your help and effort on this Project websocat

Since last issue, I could redirect websocket server message in Linux. websocat_linux64 works fine as expected for forwarding.

There is one difference between linux and windows version, I'd try both win64 and win32 versions(1.9.0 & 1.8.0),

ig, client connect to server in Linux, message wrote in debug file:

websocat -nu -t "ws://" foreachmsg:sh-c:"curl -s -X POST -d @-"

Redirection works as expected. But in Windows versions, error message shows in conosle:

[ERROR websocat::foreachmsg_peer] Reconnecting failed. Trying again in tight end less loop.

Message not forwarded after above message.

Thank you for your assistance sincerelly.

Best Regards.



Comment Icon8

I'm trying to use websocat as a client to test a server WebSocket implementation which is designed to take large messages (both text and binary).

But I seem to be unable to persuade websocat to send either text or binary as one message, split over several frames. Large content is sent as several messages of 64k each, and if I add --one-message I get one message... of 64k, with the rest of the data dropped. What I was expecting was one large message sent over several 64kb frames.

I can't see any mention of this in the issues or docs, which kind of surprises me. Specifically, for the benfit of anyone searching the issues like I've been, I believe I want to send a sequence of frames (or chunks) with the "fin" flag set on the final one.

Is this possible with websocat?



Comment Icon5

I'm under Windows 11, installed websocat via

My nginx server is configured to only accept TLSv1.3 connections via

it seems that websocat is not able to connect to it and errors out with:

which translates roughly to:

If I add TLSv1.2 to the nginx config as well, it works.



Comment Icon8

Hi There I want to get every time socket values to PHP file and manipulate it and store to my local database.

Is that possible using websocat ?

websocat -t 'wss://[email protected]' foreachmsg:exec:/home/dev/DATE/b.php

Or any way using linux terminal etc.... ?



Comment Icon2


before anything, I want to say thanks for this amazing tool! It really helped me accomplish so much with it! 😊

TL;DR: How can I use websockat as a "read only" service for use with systemd, that does not need an active STDIN?

At the moment I'm having a slight problem, but maybe I'm just overlooking something: I have a working script, that connects to a wss:// endpoint and reads log messages from there. I don't need or want to send anything towards that direction, it should only listen!

For now, I'm using a shellscript to work with the messages and let it sit in a screen instance, so I can safely detach from the terminal and have it running in the background. websocat's command line in this script is nothing but standard:

Ultimately, I would like to have it running as a daemon. Therefore I created the following little systemd unit:

But instead of enjoying a nice little service running in the background, it always fails on me and results in the following state:

It soon occured to me, that the problem is probably with websocat not having a valid STDIN available. After a bit of debugging, I was able to reproduce the same error also in a normal shell by closing fd 0 like so (note the 0>&- at the end of the command line):

As you can see, the "BrokenPipe" leads to the termination of the session. If I run it like that without closing STDIN, everything works just fine (in the shell).

How could I make this work as a read only service?



Comment Icon2

It seems there is an illegal formatting of data through jsonrpc: (the test is made through output of debug of chrome browser via websocket as in the doc example)

  1. launch chrome in debug (google-chrome-stable --remote-debugging-port=9222)
  2. get browser version parsed via jsonrpc echo '{"method":"Browser.getVersion","params":{}, "id":1}' | websocat -n1 --text - jsonrpc:ws://<youridofwebsocket> and you will get {"jsonrpc":"2.0","id":1, "method":"{"id":1,"result":... !! on value of method you have "{"id"... which seems illegal json, you must have "method":{"id"... without double quote before { (if you parse data through "jq" command (...| jq '.'), it gets errors

another problem, UserAgent value is split after Mozilla value, the rest is in the "params".

other problem, on the params there is an Array with no open double quote, but ending double quote.

On the end there is too inverted "]" and "}"

see complete line : {"jsonrpc":"2.0","id":1, "params":[(X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36","jsVersion":""}}]}

if you get data without jsonrpc:, so via echo '{"method":"Browser.getVersion","params":{}, "id":1}' | websocat -n1 --text - ws://<youridofwebsocket>

the data is correctly formatted as (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36","jsVersion":""}} and parsing it through ...| jq '.' is correct.

If you get other chrome debug command, you get same errors of formatting via jsonrpc: (added double quote, wrong of array ending/beggin ...)



Comment Icon9

I'm trying to create a websocket tunnel for a binary request-response TCP protocol. I'm using websocat version 1.8.0 I used websocat on the client side to listen on localhost and connect to the remote WebSocket endpoint

$ websocat_amd64-linux-static -E --binary tcp-l: ws://

Sometime it seems that the last packet of a request is not sent to the destination through the websocket. The client blocks waiting for the response. When I kill the client the last packet is sent.

You can reproduce the issue with the following setup on 2 linux machines. On the first machine, the receiver (IP, put a service to consume a request, reply, and consume another request.

On the second machine, the sender, launch websocat to listen on localhost. $ ./websocat_amd64-linux-static -E --binary tcp-l: ws://

On another terminal run the client to follow the request-response protocol

With this setup, the client blocks 50% of the time. When you kill the client the service outputs another OK. The problem is not evident using only localhost connections.



Comment Icon2

afaik, the websocket broadcast listens on an address. any request is brodcast to all other connections.

what would be useful instead is something like:


in this way only clients connecting to the same url will get all the messages sent by others connecting to the same address.

wss:// wss://

hint: just take everthing after the root and use it as a groupname. in the above examples: "dhgfdjkhfgdjhfg/group1" and wss:// will be 2 different groups as wss:// will be a third group.



Comment Icon5

When you use websocat in programmatic context, it would be useful to be able to be notified when the listening socket is actually ready and accepting connections, so that the using process can start connecting. Currently, you don't know, and the only thing you can do is to wait for a little while (milliseconds) and then hope that everything is ready.

E.g. there could be an option --notify-listening and this outputs a line for each listening socket on stderr, like

This would also open the door to an additional little feature:



Comment Icon5

websocat.exe -t wss-l: --pkcs12-der SSL/cert.pkcs12 --pkcs12-passwd 1 -E broadcast:mirror: websocat: An unknown error occurred while processing the certificate. (os error -2146893017)



Comment Icon0

I am using websockat v1.8 (windows prebuilt version).

If I am using "broadcast:wss://************" very often websocat crushes.

I have 3 local clients connecting to tcp-l port (usually quickly). Sometime connection works, but mostly websockat crushes. Using -E flag does not have effect.

I am not posting this to github because their signup procedure with dice captcha is idiotic.



Comment Icon2


I want to use websocat to ping WS Server on IPv6 address.

  • is websocat can do this for IPv6?

I've checked websocat and it is working fine (ping) for IPv4 and also for localhost IPv6 ( [::1] ) If I will specify normal IPv6 address (for example ws://[fe80::a394:39d0:768f:6538]:7688) then I'm getting error: WebSocketError: I/O failure Is anyone has got similar issue?

Below are detailed logs from websocat (strace)

[email protected]:~$ [email protected]:~$ websocat --binary ws://[fe80::a394:39d0:768f:6538]:7688 --ping-interval 3 websocat: WebSocketError: I/O failure websocat: error running [email protected]:~$ [email protected]:~$ strace -e trace=network -s 4096 websocat ws://localhost:7688 socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 6 connect(6, {???????sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}???????, 110) = -1 ENOENT (No such file or directory) socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 6 connect(6, {???????sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}???????, 110) = -1 ENOENT (No such file or directory) socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 6 connect(6, {???????sa_family=AF_INET, sin_port=htons(7688), sin_addr=inet_addr("")}???????, 16) = -1 EINPROGRESS (Operation now in progress) getsockopt(6, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 sendto(6, "GET / HTTP/1.1\r\nHost: localhost:7688\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: W8mGOKmyYr0oPH+h/xj+Ow==\r\n\r\n", 153, MSG_NOSIGNAL, NULL, 0) = 153 recvfrom(6, "HTTP/1.1 101 Switching Protocols\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: njTrLjXHXUecPB5bn+1sj+pu/7s=\r\n\r\n", 8192, 0, NULL, NULL) = 129 recvfrom(6, 0x55bfabd8fb11, 8063, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)

sendto(6, "\201\201\375n\312\26\367", 7, MSG_NOSIGNAL, NULL, 0) = 7 recvfrom(6, "\201\1\n", 8063, 0, NULL, NULL) = 3

recvfrom(6, 0x55bfabd8fb14, 8060, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)

sendto(6, "\201\201a\273;\303k", 7, MSG_NOSIGNAL, NULL, 0) = 7 recvfrom(6, "\201\1\n", 8060, 0, NULL, NULL) = 3

recvfrom(6, 0x55bfabd8fb17, 8057, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) www sendto(6, "\201\204\205\30\2463\362o\3219", 10, MSG_NOSIGNAL, NULL, 0) = 10 recvfrom(6, "\201\4www\n", 8057, 0, NULL, NULL) = 6 www recvfrom(6, 0x55bfabd8fb1d, 8051, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) ^Cstrace: Process 5158 detached

[email protected]:~$ [email protected]:~$ [email protected]:~$ strace -e trace=network -s 4096 websocat ws://[::1]:7688socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 6 connect(6, {???????sa_family=AF_INET6, sin6_port=htons(7688), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_scope_id=0}???????, 28) = -1 EINPROGRESS (Operation now in progress) getsockopt(6, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 sendto(6, "GET / HTTP/1.1\r\nHost: [::1]:7688\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: auCpxb+lYL5AnUREvBysUw==\r\n\r\n", 149, MSG_NOSIGNAL, NULL, 0) = 149 recvfrom(6, "HTTP/1.1 101 Switching Protocols\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: 2dVwwWixrWzNLaxJTB1GUeLRih0=\r\n\r\n", 8192, 0, NULL, NULL) = 129 recvfrom(6, 0x561fca8d3bf1, 8063, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) sacid sendto(6, "\201\206\317\202\237|\274\343\374\25\253\210", 12, MSG_NOSIGNAL, NULL, 0) = 12 recvfrom(6, "\201\6sacid\n", 8063, 0, NULL, NULL) = 8 recvfrom(6, 0x561fca8d3bf9, 8055, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) sacid

sendto(6, "\201\201\344\20\306\277\356", 7, MSG_NOSIGNAL, NULL, 0) = 7 recvfrom(6, "\201\1\n", 8055, 0, NULL, NULL) = 3 recvfrom(6, 0x561fca8d3bfc, 8052, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)

piotr sendto(6, "\201\206\213\32D\\373s+(\371\20", 12, MSG_NOSIGNAL, NULL, 0) = 12 recvfrom(6, "\201\6piotr\n", 8052, 0, NULL, NULL) = 8 recvfrom(6, 0x561fca8d3c04, 8044, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable) piotr

sendto(6, "\201\201\0324\203.\20", 7, MSG_NOSIGNAL, NULL, 0) = 7 recvfrom(6, "\201\1\n", 8044, 0, NULL, NULL) = 3 recvfrom(6, 0x561fca8d3c07, 8041, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)

^Cstrace: Process 5164 detached

[email protected]:~$ [email protected]:~$ [email protected]:~$ strace -e trace=network -s 4096 websocat ws://[fe80::a394:39d0:768f:6538]:7688 socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_IP) = 6 connect(6, {???????sa_family=AF_INET6, sin6_port=htons(7688), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "fe80::a394:39d0:768f:6538", &sin6_addr), sin6_scope_id=0}???????, 28) = -1 EINVAL (Invalid argument) websocat: WebSocketError: I/O failure websocat: error running +++ exited with 1 +++ [email protected]:~$ [email protected]alBox:~$ [email protected]:~$ ping fe80::a394:39d0:768f:6538 PING fe80::a394:39d0:768f:6538(fe80::a394:39d0:768f:6538) 56 data bytes ping: sendmsg: Invalid argument ping: sendmsg: Invalid argument ping: sendmsg: Invalid argument ping: sendmsg: Invalid argument ^C --- fe80::a394:39d0:768f:6538 ping statistics --- 4 packets transmitted, 0 received, 100% packet loss, time 3053ms

[email protected]:~$ ifconfig enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet netmask broadcast inet6 fe80::a394:39d0:768f:6538 prefixlen 64 scopeid 0x20 ether 08:00:27:b2:93:d4 txqueuelen 1000 (Ethernet) RX packets 47186 bytes 61226178 (61.2 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 6458 bytes 427339 (427.3 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet netmask inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1000 (Local Loopback) RX packets 864 bytes 78371 (78.3 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 864 bytes 78371 (78.3 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0


Thanks, Piotr



Comment Icon2

I have a simple WS echo server which just repeats text or binary frames with a trivial modification. If I connect to it with websocat with default options from a terminal, after typing a line of text and pressing Enter I get that line back, as expected. However I wanted to try getting character-by-character responses and passed --no-line (also -b), to no effect: it still does nothing until Enter is passed, then sends a frame containing the entire line. Am I misunderstanding what this option does?



Comment Icon1

I'm currently using websocat with the following command to establish a websocket connection to an Internet Server:

websocat -t -u tcp-l: reuse-raw:- | websocat -t - "$url" --ping-interval 60 > websocat.out &

So far everything works fine. However sporadically the websocket connection dies (due to my bad Internet connection) and it seems websocat somehow does not recognize this (the processes are still running fine). Once that happens i need to restablish the connection from scratch as communication is token based. Is there a way (commandline switch?) to identify dead/broken connections which terminates the websocat processes?



Comment Icon12

Hi, Vi!

Please, sorry my bad english. I'm brazilian.

I'm working with shellscript file and inside of this file I need to get the incomming message.

/* */

I've tried: websocat -t ws://localhost:8080 foreachmsg:exec:./

But, I don't now how to pass the incomming message to ./

Thanks a lot!


Find the latest versions by id

v1.10.0 - May 17, 2022


  • Add --close-status-code and --close-reason
  • Fix --queue-len option that took no effect
  • Fix racing to connect to multiple resolved addresses in tcp: specifier (i.e. "happy eyeballs") - now it skips errors if there is a working connection. This does not fix ws://localhost unfortunately.
  • crypto: overlay and associated options
  • prometheus: overlay and associated options
  • random: specifier

Release artifacts

(downloads below the table)

File TLS support Tested by author Notes
websocat.x86_64-unknown-linux-musl built-in OpenSSL 1.1.1n using similar build myself
websocat.x86_64-pc-windows-gnu.exe uses system crypto no
websocat.x86_64-apple-darwin uses system crypto no
websocat.x86_64-pc-windows-gnu.exe uses system crypto no
websocat.aarch64-linux-android built-in OpenSSL 1.1.1n basic test only
websocat.armv7-linux-androideabi built-in OpenSSL 1.1.1n basic test only
websocat.arm-unknown-linux-musleabi built-in OpenSSL 1.1.1n basic test only
websocat.aarch64-unknown-linux-musl built-in OpenSSL 1.1.1n no
websocat.x86_64-unknown-freebsd built-in OpenSSL 1.1.1n basic test only
websocat_nossl.i686-unknown-linux-musl none basic test only see some previous release notes for the reason of why no ssl
debug.7z unstripped versions of all executables above

v3.0.0-prealpha0 - Mar 19, 2022

You are recommended to use Websocat 1.9.0, not this release. This release does not necessarily preclude Websocat 1.10.0 in the future.

This release showcases rewritten Websocat using Tokio 1, Hyper 0.14 and Tungstenite instead of legacy dependencies. This opens up a world of QUIC, rfc8441 and other new things to keep Websocat relevant. A lot of features from Websocat1 are not yet implemented, CLI UI compatibility with Websocat1 is also not implemented yet. Help is partially implemented. Book is just started. Release artifacts build script is not dockerised.

It's "3.0" instead of "2.0" because of Websocat2 was supposed to be version based on Tokio 0.2 + Hyper 0.12 (or Hyper-less), split to multiple crates; but that was abandoned.

websocat3.i686-pc-windows-gnu, websocat3.x86_64-apple-darwin and websocat3.x86_64-pc-windows-gnu are built against native-tls, all the rest is built against rustls + webpki-roots.

v1.9.0 - Oct 30, 2021

  • ssl Cargo feature is now enabled by default
  • vendored_openssl Cargo feature is now not enabled by default
  • --stdout-announce-listening-ports option to print message when server port is ready to accept clients.
  • --no-close option now also affects Websocket server mode, not just client
  • timestamp: overlay to mangle message, prepending current timestamp as text
  • --print-ping-rtts option
  • Updated deps for #138 (not checked whether all yanks are resolved although).

Note that this release contains less pre-built executables than previous releases. You may want to try older versions.

file description tested?
websocat_linux64 Static amd64 with embedded openssl I'm using it myself
websocat_linux32_nossl Static i686 without ssl support (still crashes) tried once connecting to ws://
websocat_android Built in openssl, for Android armv7 Tried connecting to wss:// on Android 6 and Android 11
websocat_linuxarm32 Built in openssl Tried wss:// once, seems working
websocat_win32.exe Built with ssl enabled Tried in wine. ws:// connects, but ssl fails
websocat_win64.exe Built with ssl enabled Tried in wine. ws:// connects, but ssl fails
websocat_mac Should use system ssl, for x86_64 mac Tried in darling. ws:// connects, but ssl fails
websocat_freebsd Uses system openssl 111 Tried connecting to wss:// in VM
debug.7z unstripped executables for symbols

v1.8.0 - Apr 15, 2021

  • --accept-from-fd option for better systemd intergration
  • exec:/cmd:/sh-c: specifiers now don't terminate process prematurely
  • --foreachmsg-wait-read for better foreachmsg: overlay behaviour. Now foreachmsg:exec:./myscript is more meaningul.
  • --basic-auth option to insert basic authentication header more easily
  • Websocket close message is now logged in debug mode

Unfortunately, build system for providing prebuilt executables is not reproducible and was only partially automatized; and it is now falling apart - not all artifacts are provided. It may make sense to try previous (including substantially old, e.g. v1.0.0) versions of Websocat's prebuilt executables. Better building situation may arrive with Websocat 3.

OpenSSL is actually static in many versions, even without -static in the name.

v1.7.0 - Feb 22, 2021


  • Websocat now does not set terminal to nonblocking mode if isatty by default. This should help with #76.
  • New overlay log: that prints bytes as they travel though Websocat, for debugging.

Changed in released files:

  • Added websocat_arm-android-nosignal for running Websocat on old (e.g. 4.4) Android devices.
  • websocat_mipsel-linux-static failed to build. Use nossl version or reach for v1.6.0.
  • websocat_i386-linux-static fails due to Keep on using v1.6.0's version for a while.
  • Now I realize that OpenSSL is statically built-in everywhere, not just in *-static builds. Deb package dependency is probably irrelevant now.

v1.6.0 - Jul 08, 2020

A release to pretend that Websocat development is going on (while in reality it has mostly petered out). Also to check that release script still works.

Triggered by activity in #55.

Although version number "rolled back" to 1.x series, it is a continuation of the "2.0.0-alpha0" below and contains everything from it. It is possible to connect to a websocket using new "2.0"-ish scheme, but it's a low-level-only command and is not the default method.

In addition to everything specified in "v2.0.0-alhpa0" changelog, there are:

  • Base64 mode for binary WebSocket messages
  • Prefixes for text and binary WebSocket messages, allowing to discriminate incoming binary and text WebSocket messages and intermix outgoing binary and text WebSocket messages.
  • Sort-of-unfinished http-post-sse: specifier allowing to use HTTP server-sent events (in one direction) and POST request bodies (in the other direction) instead of (or in addition to) a WebSocket and to bridge them together. This mode is not tested properly although.

As usual, in case of Websocat fails to start or work for you, try a nossl version, try some previous release or try just building it from source code.

v2.0.0-alpha0 - Jan 09, 2020

Release is built on my laptop using script. Not tested at all (even on Linux), releasing just because of enough mini-features accumulated.

New features:

  • UDP multicast options
  • foreachmsg: overlay - run specifier (i.e. connect somewhere or execute a program) on each WebSocket message instead of on each WebSocket connection.
  • Various minor options like --max-messages or zero-length message handling.
  • Low-level Websocket features: --just-generate-key and --just-generate-accept options which help generating HTTP headers for WebSockets. ws-lowlevel-server: and ws-lowlevel-client: overlays to use expose WebSocket's data encoder/decoder without HTTP part.
  • Basic http:// client with arbitrary method, uri and so on.
  • Delay for autoreconnect: overlay
  • More pre-built release assets

It is not actual Websocat 2.0, as planned [disruptive] internal changes are not finished and by default it works like good old Websocat 1.0.

As usual, it may be worth to try older builds in case of problems.

v1.5.0 - Aug 18, 2019


  • Using client URI's like websocat #404 now adds basic authentication HTTP header to request
  • New command-line option: --header-to-env
  • Minor dependencies update
  • Built with newer Rust on newer Debian

As usual, try various neighbouring and previous versions in case of problems.

P.S. Bonus: preview of advanced UDP options for static x86_64 linux version.

v1.4.0 - Mar 21, 2019

  • New options: --server-protocol, --ping-timeout, --ping-interval, --server-header
  • Fixed replying to WebSocket pings
  • Fixed replying to requests with Sec-WebSocket-Protocol.

Not systematically tested; multiple published files may suit you; try v1.2.0 or 1.1.0 if something fails. v1.2.0 release contains some additional prebuilt targets.

v1.3.0 - Mar 06, 2019

Not all release artifacts available for 1.2.0 is uploaded for 1.3.0 (at least yet).

Not formally tested, especially on non-Linux.

More than one file may suit you. It may be worth to try alternative files and/or previous versions in case of failure.

Ubuntu 16.04 or Debian Jessie should use ssl1.0 variant of the deb package.

v1.2.0 - Nov 01, 2018


  • More than one file may be suitable for you
  • In case of strange problems, report to issues and try another suitable file
  • In case of problems it may be worth to try previous pre-built file
  • If there are problems with libssl, try nossl version

Not properly tested yet.

Special for Ubuntu 16.04 (and maybe other older systems), there are additional deb packages that depend on libssl1.0 instead of libssl1.1.

v1.1.0 - Aug 30, 2018


  • Static files aside from the websocket for easy prototyping
  • SOCKS5 proxy client
  • wss:// listener
  • Setting environment variables for exec:
  • Sending SIGHUP signal to child process on client disconnect
  • --jsonrpc mode

v1.1-pre - Jul 13, 2018

With --set-environment option and --static-file

Files here may be re-uploaded from time to time.

v1.0.0 - Jul 04, 2018

Note that not all attached executables are actually really tested. File issues if something fails.

If usual version fails, try nossl version.

v1.0.0-beta - Jun 20, 2018

Also Windows actually tested somewhat.

Actually the release is created just to avoid master running too ahead of the pre-built code.

Note that attached files are based on futher commits compared to the tag.

v1.0.0-alpha - May 10, 2018

Based on older tokio-core because of single-threadedness requirement.

Only Linux tested a bit, only one release executable linked to SSL.

v0.5.1-alpha - Mar 14, 2018

For the impatient.

Many things not implemented, non-Linux not tested, some issues not solved, etc.

No SSL everywhere.

v0.4.0 - Jan 18, 2017

So now can build non-degraded websocat from

v0.3.0 - Dec 22, 2016

Built against patched websocket library. musl version is slower. Only one build have ssl enabled. Open Github issue if you want more targets to be included in a release.

New features:

  • Unix sockets
  • Executing programs and command lines
  • Unidirectional mode
  • Text mode (don't rely on it)

v0.2.0 - Nov 24, 2016

Built with modified version of rust-websocket.

Information - Updated Jul 13, 2022

Stars: 4.1K
Forks: 167
Issues: 94

Repositories & Extras

Command line interface to manage clipboard

you can download a cb-bin (Only x64 is supported)

Command line interface to manage clipboard

Command Line Argument Parser for Rust

It is a simple-to-use, efficient, and full-featured library for parsing command line arguments and subcommands when writing command line, console or terminal applications

Command Line Argument Parser for Rust

Command-line tool for working with LNP/BP technology stack

If the build fails, make sure you are using nightly channel for rust compiler:

Command-line tool for working with LNP/BP technology stack

Command Line Utility for Phylum

The command line interface (CLI) allows users to submit their project package dependencies to Phylum's API for analysis

Command Line Utility for Phylum

Command line json text parsing and processing utility

parsing json compliant with rust and cargo

Command line json text parsing and processing utility

Command line interface for Re:infer

re is the official command line interface for Linux (x86_64-unknown-linux-musl)

Command line interface for Re:infer

Command line interface for TMC, written in Rust

Published Builds will be located to the here

Command line interface for TMC, written in Rust

Command line application for searching in Usage

Command line application for searching in

Command line application for searching in Usage


Command-line tool to mirror installed software on multiple machines

Outputs a human-readable (RON) file to sync between machines:

Command-line tool to mirror installed software on multiple machines

Command-line tool for working with SAS binary — sas7bdat — files

ReadStat library developed by ReadStat repository is included as a readstat-sys crate is created

Command-line tool for working with SAS binary — sas7bdat — files
Facebook Instagram Twitter GitHub Dribbble