• Stars
    star
    1,794
  • Rank 25,900 (Top 0.6 %)
  • Language
    Go
  • License
    GNU Affero Genera...
  • Created almost 3 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Overlay networks based on WebRTC.

weron

Logo

Overlay networks based on WebRTC.

⚠️ weron has not yet been audited! While we try to make weron as secure as possible, it has not yet undergone a formal security audit by a third party. Please keep this in mind if you use it for security-critical applications. ⚠️

hydrun CI Docker CI Go Version Go Reference Matrix Binary Downloads

Overview

weron provides lean, fast & secure overlay networks based on WebRTC.

It enables you too ...

  • Access nodes behind NAT: Because weron uses WebRTC to establish connections between nodes, it can easily traverse corporate firewalls and NATs using STUN, or even use a TURN server to tunnel traffic. This can be very useful to for example SSH into your homelab without forwarding any ports on your router.
  • Secure your home network: Due to the relatively low overhead of WebRTC in low-latency networks, weron can be used to secure traffic between nodes in a LAN without a significant performance hit.
  • Join local nodes into a cloud network: If you run for example a Kubernetes cluster with nodes based on cloud instances but also want to join your on-prem nodes into it, you can use weron to create a trusted network.
  • Bypass censorship: The underlying WebRTC suite, which is what popular videoconferencing tools such as Zoom, Teams and Meet are built on, is hard to block on a network level, making it a valuable addition to your toolbox for bypassing state or corporate censorship.
  • Write your own peer-to-peer protocols: The simple API makes writing distributed applications with automatic reconnects, multiple datachannels etc. easy.

Installation

Containerized

You can get the OCI image like so:

$ podman pull ghcr.io/pojntfx/weron

Natively

Static binaries are available on GitHub releases.

On Linux, you can install them like so:

$ curl -L -o /tmp/weron "https://github.com/pojntfx/weron/releases/latest/download/weron.linux-$(uname -m)"
$ sudo install /tmp/weron /usr/local/bin
$ sudo setcap cap_net_admin+ep /usr/local/bin/weron # This allows rootless execution

On macOS, you can use the following:

$ curl -L -o /tmp/weron "https://github.com/pojntfx/weron/releases/latest/download/weron.darwin-$(uname -m)"
$ sudo install /tmp/weron /usr/local/bin

On Windows, the following should work (using PowerShell as administrator):

PS> Invoke-WebRequest https://github.com/pojntfx/weron/releases/latest/download/weron.windows-x86_64.exe -OutFile \Windows\System32\weron.exe

You can find binaries for more operating systems and architectures on GitHub releases.

Usage

TL;DR: Join a layer 3 (IP) overlay network on the hosted signaling server with sudo weron vpn ip --community mycommunity --password mypassword --key mykey --ips 2001:db8::1/32,192.0.2.1/24 and a layer 2 (Ethernet) overlay network with sudo weron vpn ethernet --community mycommunity --password mypassword --key mykey

1. Start a Signaling Server with weron signaler

The signaling server connects peers with each other by exchanging connection information between them. It also manages access to communities through the --password flag of clients and can maintain persistent communities even after all peers have disconnected.

While it is possible and reasonably private (in addition to TLS, connection information is encrypted using the --key flag of clients) to use the hosted signaling server at wss://weron.up.railway.app/, hosting it yourself has many benefits, such as lower latency and even better privacy.

The signaling server can use an in-process broker with an in-memory database or Redis and PostgreSQL; for production use the latter configuration is strongly recommended, as it allows you to easily scale the signaling server horizontally. This is particularly important if you want to scale your server infrastructure across multiple continents, as intra-cloud backbones usually have lower latency than residential connections, which reduces the amount of time required to connect peers with each other.

Expand containerized instructions
$ sudo podman network create weron

$ sudo podman run -d --restart=always --label "io.containers.autoupdate=image" --name weron-postgres --network weron -e POSTGRES_HOST_AUTH_METHOD=trust -e POSTGRES_DB=weron_communities postgres
$ sudo podman generate systemd --new weron-postgres | sudo tee /lib/systemd/system/weron-postgres.service

$ sudo podman run -d --restart=always --label "io.containers.autoupdate=image" --name weron-redis --network weron redis
$ sudo podman generate systemd --new weron-redis | sudo tee /lib/systemd/system/weron-redis.service

$ sudo podman run -d --restart=always --label "io.containers.autoupdate=image" --name weron-signaler --network weron -p 1337:1337 -e DATABASE_URL='postgres://postgres@weron-postgres:5432/weron_communities?sslmode=disable' -e REDIS_URL='redis://weron-redis:6379/1' -e API_PASSWORD='myapipassword' ghcr.io/pojntfx/weron:unstable weron signaler
$ sudo podman generate systemd --new weron-signaler | sudo tee /lib/systemd/system/weron-signaler.service

$ sudo systemctl daemon-reload

$ sudo systemctl enable --now weron-postgres
$ sudo systemctl enable --now weron-redis
$ sudo systemctl enable --now weron-signaler

$ sudo firewall-cmd --permanent --add-port=1337/tcp
$ sudo firewall-cmd --reload
Expand native instructions
sudo podman run -d --restart=always --label "io.containers.autoupdate=image" --name weron-postgres -e POSTGRES_HOST_AUTH_METHOD=trust -e POSTGRES_DB=weron_communities -p 127.0.0.1:5432:5432 postgres
sudo podman generate systemd --new weron-postgres | sudo tee /lib/systemd/system/weron-postgres.service

sudo podman run -d --restart=always --label "io.containers.autoupdate=image" --name weron-redis -p 127.0.0.1:6379:6379 redis
sudo podman generate systemd --new weron-redis | sudo tee /lib/systemd/system/weron-redis.service

sudo tee /etc/systemd/system/weron-signaler.service<<'EOT'
[Unit]
Description=weron Signaling Server
After=weron-postgres.service weron-redis.service

[Service]
ExecStart=/usr/local/bin/weron signaler --verbose=7
Environment="DATABASE_URL=postgres://postgres@localhost:5432/weron_communities?sslmode=disable"
Environment="REDIS_URL=redis://localhost:6379/1"
Environment="API_PASSWORD=myapipassword"

[Install]
WantedBy=multi-user.target
EOT

sudo systemctl daemon-reload

sudo systemctl restart weron-postgres
sudo systemctl restart weron-redis
sudo systemctl restart weron-signaler

sudo firewall-cmd --permanent --add-port=1337/tcp
sudo firewall-cmd --reload

It should now be reachable on ws://localhost:1337/.

To use it in production, put this signaling server behind a TLS-enabled reverse proxy such as Caddy or Traefik. You may also either want to keep API_PASSWORD empty to disable the management API completely or use OpenID Connect to authenticate instead; for more information, see the signaling server reference. You can also embed the signaling server in your own application using it's Go API.

2. Manage Communities with weron manager

While it is possible to create ephemeral communities on a signaling server without any kind of authorization, you probably want to create a persistent community for most applications. Ephemeral communities get created and deleted automatically as clients join or leave, persistent communities will never get deleted automatically. You can manage these communities using the manager CLI.

If you want to work on your self-hosted signaling server, first set the remote address:

$ export WERON_RADDR='http://localhost:1337/'

Next, set the API password using the API_PASSWORD env variable:

$ export API_PASSWORD='myapipassword'

If you use OIDC to authenticate, you can instead set the API password using goit like so:

$ export OIDC_CLIENT_ID='Ab7OLrQibhXUzKHGWYDFieLa2KqZmFzb' OIDC_ISSUER='https://pojntfx.eu.auth0.com/' OIDC_REDIRECT_URL='http://localhost:11337'
$ export API_KEY="$(goit)"

If we now list the communities, we see that none currently exist:

$ weron manager list
id,clients,persistent

We can create a persistent community using weron create:

$ weron manager create --community mycommunity --password mypassword
id,clients,persistent
mycommunity,0,true

It is also possible to delete communities using weron delete, which will also disconnect all joined peers:

$ weron manager delete --community mycommunity

For more information, see the manager reference. You can also embed the manager in your own application using its Go API.

3. Test the System with weron chat

If you want to work on your self-hosted signaling server, first set the remote address:

$ export WERON_RADDR='ws://localhost:1337/'

The chat is an easy way to test if everything is working correctly. To join a chatroom, run the following:

$ weron chat --community mycommunity --password mypassword --key mykey --names user1,user2,user3 --channels one,two,three

On another peer, run the following (if your signaling server is public, you can run this anywhere on the planet):

$ weron chat --community mycommunity --password mypassword --key mykey --names user1,user2,user3 --channels one,two,three
.wss://weron.up.railway.app/
user2!
+user1@one
+user1@two
+user1@three
user2>

You can now start sending and receiving messages or add new peers to your chatroom to test the network.

For more information, see the chat reference. You can also embed the chat in your own application using its Go API.

4. Measure Latency with weron utility latency

An insightful metric of your network is its latency, which you can measure with this utility; think of this as ping, but for WebRTC. First, start the latency measurement server like so:

$ weron utility latency --community mycommunity --password mypassword --key mykey --server

On another peer, launch the client, which should start measuring the latency immediately; press CTRL C to stop it and get the total statistics:

$ weron utility latency --community mycommunity --password mypassword --key mykey
# ...
128 B written and acknowledged in 110.111µs
128 B written and acknowledged in 386.12µs
128 B written and acknowledged in 310.458µs
128 B written and acknowledged in 335.341µs
128 B written and acknowledged in 264.149µs
^CAverage latency: 281.235µs (5 packets written) Min: 110.111µs Max: 386.12µs

For more information, see the latency measurement utility reference. You can also embed the utility in your own application using its Go API.

5. Measure Throughput with weron utility throughput

If you want to transfer large amounts of data, your network's throughput is a key characteristic. This utility allows you to measure this metric between two nodes; think of it as iperf, but for WebRTC. First, start the throughput measurement server like so:

$ weron utility throughput --community mycommunity --password mypassword --key mykey --server

On another peer, launch the client, which should start measuring the throughput immediately; press CTRL C to stop it and get the total statistics:

$ weron utility throughput --community mycommunity --password mypassword --key mykey
# ...
97.907 MB/s (783.253 Mb/s) (50 MB read in 510.690403ms)
64.844 MB/s (518.755 Mb/s) (50 MB read in 771.076908ms)
103.360 MB/s (826.881 Mb/s) (50 MB read in 483.745832ms)
89.335 MB/s (714.678 Mb/s) (50 MB read in 559.692495ms)
85.582 MB/s (684.657 Mb/s) (50 MB read in 584.233931ms)
^CAverage throughput: 74.295 MB/s (594.359 Mb/s) (250 MB written in 3.364971672s) Min: 64.844 MB/s Max: 103.360 MB/s

For more information, see the throughput measurement utility reference. You can also embed the utility in your own application using it's Go API.

6. Create a Layer 3 (IP) Overlay Network with weron vpn ip

If you want to join multiple nodes into an overlay network, the IP VPN is the best choice. It works similarly to i.e. Tailscale/WireGuard and can either dynamically allocate an IP address from a CIDR notation or statically assign one for you. On Windows, make sure to install TAP-Windows first. To get started, launch the VPN on the first peer:

$ sudo weron vpn ip --community mycommunity --password mypassword --key mykey --ips 2001:db8::1/64,192.0.2.1/24
{"level":"info","addr":"wss://weron.up.railway.app/","time":"2022-05-06T22:20:51+02:00","message":"Connecting to signaler"}
{"level":"info","id":"[\"2001:db8::6a/64\",\"192.0.2.107/24\"]","time":"2022-05-06T22:20:56+02:00","message":"Connected to signaler"}

On another peer, launch the VPN as well:

$ sudo weron vpn ip --community mycommunity --password mypassword --key mykey --ips 2001:db8::1/64,192.0.2.1/24
{"level":"info","addr":"wss://weron.up.railway.app/","time":"2022-05-06T22:22:30+02:00","message":"Connecting to signaler"}
{"level":"info","id":"[\"2001:db8::b9/64\",\"192.0.2.186/24\"]","time":"2022-05-06T22:22:36+02:00","message":"Connected to signaler"}
{"level":"info","id":"[\"2001:db8::6a/64\",\"192.0.2.107/24\"]","time":"2022-05-06T22:22:36+02:00","message":"Connected to peer"}

You can now communicate between the peers:

$ ping 2001:db8::b9
PING 2001:db8::b9(2001:db8::b9) 56 data bytes
64 bytes from 2001:db8::b9: icmp_seq=1 ttl=64 time=1.07 ms
64 bytes from 2001:db8::b9: icmp_seq=2 ttl=64 time=1.36 ms
64 bytes from 2001:db8::b9: icmp_seq=3 ttl=64 time=1.20 ms
64 bytes from 2001:db8::b9: icmp_seq=4 ttl=64 time=1.10 ms
^C
--- 2001:db8::b9 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 1.066/1.180/1.361/0.114 ms

If you temporarily lose the network connection, the network topology changes etc. it will automatically reconnect. For more information and limitations on proprietary operating systems like macOS, see the IP VPN reference. You can also embed the utility in your own application using its Go API.

7. Create a Layer 2 (Ethernet) Overlay Network with weron vpn ethernet

If you want more flexibility or work on non-IP networks, the Ethernet VPN is a good choice. It works similarly to n2n or ZeroTier. Due to API restrictions, this VPN type is not available on macOS; use Asahi Linux, a computer that respects your freedoms or the layer 3 (IP) VPN instead. To get started, launch the VPN on the first peer:

$ sudo weron vpn ethernet --community mycommunity --password mypassword --key mykey
{"level":"info","addr":"wss://weron.up.railway.app/","time":"2022-05-06T22:42:10+02:00","message":"Connecting to signaler"}
{"level":"info","id":"fe:60:a5:8b:81:36","time":"2022-05-06T22:42:11+02:00","message":"Connected to signaler"}

If you want to add an IP address to the TAP interface, do so with iproute2 or your OS tools:

$ sudo ip addr add 192.0.2.1/24 dev tap0
$ sudo ip addr add 2001:db8::1/32 dev tap0

On another peer, launch the VPN as well:

$ sudo weron vpn ethernet --community mycommunity --password mypassword --key mykey
{"level":"info","addr":"wss://weron.up.railway.app/","time":"2022-05-06T22:52:56+02:00","message":"Connecting to signaler"}
{"level":"info","id":"b2:ac:ae:b6:32:8c","time":"2022-05-06T22:52:57+02:00","message":"Connected to signaler"}
{"level":"info","id":"fe:60:a5:8b:81:36","time":"2022-05-06T22:52:57+02:00","message":"Connected to peer"}

And add the IP addresses:

$ sudo ip addr add 192.0.2.2/24 dev tap0
$ sudo ip addr add 2001:db8::2/32 dev tap0

You can now communicate between the peers:

$ ping 2001:db8::2
PING 2001:db8::2(2001:db8::2) 56 data bytes
64 bytes from 2001:db8::2: icmp_seq=1 ttl=64 time=1.20 ms
64 bytes from 2001:db8::2: icmp_seq=2 ttl=64 time=1.14 ms
64 bytes from 2001:db8::2: icmp_seq=3 ttl=64 time=1.24 ms
^C
--- 2001:db8::2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.136/1.193/1.239/0.042 ms

If you temporarily lose the network connection, the network topology changes etc. it will automatically reconnect. You can also embed the utility in your own application using its Go API.

8. Write your own protocol with wrtcconn

It is almost trivial to build your own distributed applications with weron, similarly to how PeerJS works. Here is the core logic behind a simple echo example:

// ...
for {
	select {
	case id := <-ids:
		log.Println("Connected to signaler", id)
	case peer := <-adapter.Accept():
		log.Println("Connected to peer", peer.PeerID, "and channel", peer.ChannelID)

		go func() {
			defer func() {
				log.Println("Disconnected from peer", peer.PeerID, "and channel", peer.ChannelID)
			}()

			reader := bufio.NewScanner(peer.Conn)
			for reader.Scan() {
				log.Printf("%s", reader.Bytes())
			}
		}()

		go func() {
			for {
				if _, err := peer.Conn.Write([]byte("Hello!\n")); err != nil {
					return
				}

				time.Sleep(time.Second)
			}
		}()
	}
}

You can either use the minimal adapter or the named adapter; the latter negotiates a username between the peers, while the former does not check for duplicates. For more information, check out the Go API and take a look at the provided examples, utilities and services in the package for examples.

🚀 That's it! We hope you enjoy using weron.

Reference

Command Line Arguments

$ weron --help
Overlay networks based on WebRTC.

Find more information at:
https://github.com/pojntfx/weron

Usage:
  weron [command]

Available Commands:
  chat        Chat over the overlay network
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  manager     Manage a signaling server
  signaler    Start a signaling server
  utility     Utilities for overlay networks
  vpn         Join virtual private networks built on overlay networks

Flags:
  -h, --help          help for weron
  -v, --verbose int   Verbosity level (0 is disabled, default is info, 7 is trace) (default 5)

Use "weron [command] --help" for more information about a command.
Expand subcommand reference

Signaling Server

$ weron signaler --help
Start a signaling server

Usage:
  weron signaler [flags]

Aliases:
  signaler, sgl, s

Flags:
      --api-password string     Password for the management API (can also be set using the API_PASSWORD env variable). Ignored if any of the OIDC parameters are set.
      --api-username string     Username for the management API (can also be set using the API_USERNAME env variable). Ignored if any of the OIDC parameters are set. (default "admin")
      --cleanup                 (Warning: Only enable this after stopping all other servers accessing the database!) Remove all ephemeral communities from database and reset client counts before starting
      --ephemeral-communities    Enable the creation of ephemeral communities (default true)
      --heartbeat duration      Time to wait for heartbeats (default 10s)
  -h, --help                    help for signaler
      --laddr string            Listening address (can also be set using the PORT env variable) (default ":1337")
      --oidc-client-id string   OIDC Client ID (i.e. myoidcclientid) (can also be set using the OIDC_CLIENT_ID env variable)
      --oidc-issuer string      OIDC Issuer (i.e. https://pojntfx.eu.auth0.com/) (can also be set using the OIDC_ISSUER env variable)
      --postgres-url string     URL of PostgreSQL database to use (i.e. postgres://myuser:mypassword@myhost:myport/mydatabase) (can also be set using the DATABASE_URL env variable). If empty, a in-memory database will be used.
      --redis-url string        URL of Redis database to use (i.e. redis://myuser:mypassword@myhost:myport/1) (can also be set using the REDIS_URL env variable). If empty, a in-process broker will be used.

Global Flags:
  -v, --verbose int   Verbosity level (0 is disabled, default is info, 7 is trace) (default 5)

Manager

$ weron manager --help
Manage a signaling server

Usage:
  weron manager [command]

Aliases:
  manager, mgr, m

Available Commands:
  create      Create a persistent community
  delete      Delete a persistent or ephemeral community
  list        List persistent and ephemeral communities

Flags:
  -h, --help   help for manager

Global Flags:
  -v, --verbose int   Verbosity level (0 is disabled, default is info, 7 is trace) (default 5)

Use "weron manager [command] --help" for more information about a command.

Chat

$ weron chat --help
Chat over the overlay network

Usage:
  weron chat [flags]

Aliases:
  chat, cht, c

Flags:
      --channels strings    Comma-separated list of channels in community to join (default [weron/chat/primary])
      --community string    ID of community to join
      --force-relay         Force usage of TURN servers
  -h, --help                help for chat
      --ice strings         Comma-separated list of STUN servers (in format stun:host:port) and TURN servers to use (in format username:credential@turn:host:port) (i.e. username:credential@turn:global.turn.twilio.com:3478?transport=tcp) (default [stun:stun.l.google.com:19302])
      --id-channel string   Channel to use to negotiate names (default "weron/chat/id")
      --key string          Encryption key for community
      --kicks duration      Time to wait for kicks (default 5s)
      --names strings       Comma-separated list of names to try and claim one from
      --password string     Password for community
      --raddr string        Remote address (default "wss://weron.up.railway.app/")
      --timeout duration    Time to wait for connections (default 10s)

Global Flags:
  -v, --verbose int   Verbosity level (0 is disabled, default is info, 7 is trace) (default 5)

Latency Measurement Utility

$ weron utility latency --help
Measure the latency of the overlay network

Usage:
  weron utility latency [flags]

Aliases:
  latency, ltc, l

Flags:
      --community string    ID of community to join
      --force-relay         Force usage of TURN servers
  -h, --help                help for latency
      --ice strings         Comma-separated list of STUN servers (in format stun:host:port) and TURN servers to use (in format username:credential@turn:host:port) (i.e. username:credential@turn:global.turn.twilio.com:3478?transport=tcp) (default [stun:stun.l.google.com:19302])
      --key string          Encryption key for community
      --packet-length int   Size of packet to send and acknowledge (default 128)
      --password string     Password for community
      --pause duration      Time to wait before sending next packet (default 1s)
      --raddr string        Remote address (default "wss://weron.up.railway.app/")
      --server              Act as a server
      --timeout duration    Time to wait for connections (default 10s)

Global Flags:
  -v, --verbose int   Verbosity level (0 is disabled, default is info, 7 is trace) (default 5)

Throughput Measurement Utility

$ weron utility throughput --help
Measure the throughput of the overlay network

Usage:
  weron utility throughput [flags]

Aliases:
  throughput, thr, t

Flags:
      --community string    ID of community to join
      --force-relay         Force usage of TURN servers
  -h, --help                help for throughput
      --ice strings         Comma-separated list of STUN servers (in format stun:host:port) and TURN servers to use (in format username:credential@turn:host:port) (i.e. username:credential@turn:global.turn.twilio.com:3478?transport=tcp) (default [stun:stun.l.google.com:19302])
      --key string          Encryption key for community
      --packet-count int    Amount of packets to send before waiting for acknowledgement (default 1000)
      --packet-length int   Size of packet to send (default 50000)
      --password string     Password for community
      --raddr string        Remote address (default "wss://weron.up.railway.app/")
      --server              Act as a server
      --timeout duration    Time to wait for connections (default 10s)

Global Flags:
  -v, --verbose int   Verbosity level (0 is disabled, default is info, 7 is trace) (default 5)

Layer 3 (IP) Overlay Networks

$ weron vpn ip --help
Join a layer 3 overlay network

Usage:
  weron vpn ip [flags]

Aliases:
  ip, i

Flags:
      --community string    ID of community to join
      --dev string          Name to give to the TAP device (i.e. weron0) (default is auto-generated; only supported on Linux, macOS and Windows)
      --force-relay         Force usage of TURN servers
  -h, --help                help for ip
      --ice strings         Comma-separated list of STUN servers (in format stun:host:port) and TURN servers to use (in format username:credential@turn:host:port) (i.e. username:credential@turn:global.turn.twilio.com:3478?transport=tcp) (default [stun:stun.l.google.com:19302])
      --id-channel string   Channel to use to negotiate names (default "weron/ip/id")
      --ips strings         Comma-separated list of IP networks to claim an IP address from and and give to the TUN device (i.e. 2001:db8::1/32,192.0.2.1/24) (on Windows, only one IPv4 and one IPv6 address are supported; on macOS, IPv4 addresses are ignored)
      --key string          Encryption key for community
      --kicks duration      Time to wait for kicks (default 5s)
      --max-retries int     Maximum amount of times to try and claim an IP address (default 200)
      --parallel int        Amount of threads to use to decode frames (default 8)
      --password string     Password for community
      --raddr string        Remote address (default "wss://weron.up.railway.app/")
      --static              Try to claim the exact IPs specified in the --ips flag statically instead of selecting a random one from the specified network
      --timeout duration    Time to wait for connections (default 10s)

Global Flags:
  -v, --verbose int   Verbosity level (0 is disabled, default is info, 7 is trace) (default 5)

Layer 2 (Ethernet) Overlay Networks

$ weron vpn ethernet --help
Join a layer 2 overlay network

Usage:
  weron vpn ethernet [flags]

Aliases:
  ethernet, eth, e

Flags:
      --community string   ID of community to join
      --dev string         Name to give to the TAP device (i.e. weron0) (default is auto-generated; only supported on Linux, macOS and Windows)
      --force-relay        Force usage of TURN servers
  -h, --help               help for ethernet
      --ice strings        Comma-separated list of STUN servers (in format stun:host:port) and TURN servers to use (in format username:credential@turn:host:port) (i.e. username:credential@turn:global.turn.twilio.com:3478?transport=tcp) (default [stun:stun.l.google.com:19302])
      --key string         Encryption key for community
      --mac string         MAC address to give to the TAP device (i.e. 3a:f8:de:7b:ef:52) (default is auto-generated; only supported on Linux)
      --parallel int       Amount of threads to use to decode frames (default 8)
      --password string    Password for community
      --raddr string       Remote address (default "wss://weron.up.railway.app/")
      --timeout duration   Time to wait for connections (default 10s)

Global Flags:
  -v, --verbose int   Verbosity level (0 is disabled, default is info, 7 is trace) (default 5)

Environment Variables

All command line arguments described above can also be set using environment variables; for example, to set --max-retries to 300 with an environment variable, use WERON_MAX_RETRIES=300.

Acknowledgements

Contributing

To contribute, please use the GitHub flow and follow our Code of Conduct.

To build and start a development version of weron locally, run the following:

$ git clone https://github.com/pojntfx/weron.git
$ cd weron
$ make depend
$ make && sudo make install
$ weron signal # Starts the signaling server
# In another terminal
$ weron chat --raddr ws://localhost:1337 --community mycommunity --password mypassword --key mykey --names user1,user2,user3 --channels one,two,three
# In another terminal
$ weron chat --raddr ws://localhost:1337 --community mycommunity --password mypassword --key mykey --names user1,user2,user3 --channels one,two,three

Of course, you can also contribute to the utilities and VPNs like this.

Have any questions or need help? Chat with us on Matrix!

License

weron (c) 2023 Felicitas Pojtinger and contributors

SPDX-License-Identifier: AGPL-3.0

More Repositories

1

go-nbd

Pure Go NBD server and client library.
Go
345
star
2

multiplex

Watch torrents with your friends.
Go
238
star
3

bofied

Modern network boot server.
Go
169
star
4

liwasc

List, wake and scan nodes in a network.
Go
161
star
5

ram-dl

A tool to download more RAM (yes, seriously!)
Go
129
star
6

htorrent

HTTP to BitTorrent gateway with seeking support.
Go
119
star
7

keygaen

Sign, verify, encrypt and decrypt data with PGP in your browser.
Go
115
star
8

octarchive

Simple tool to back up all repos on a GitHub/Gitea account to a local folder.
Go
111
star
9

r3map

High-performance remote memory region mounts and migrations in user space.
Go
78
star
10

gon2n

Go bindings, management daemons and CLIs for n2n edges and supernodes.
Go
76
star
11

pojde

Develop from any device with a browser.
Shell
65
star
12

hydrapp

Build fast apps that run everywhere with Go and a browser engine of your choice.
Go
58
star
13

tinynet

A `net` implementation for Go and TinyGo based on unisockets, targeting both WebAssembly and native platforms.
Go
47
star
14

stfs

Simple Tape File System (STFS), a file system for tapes and tar files.
Go
46
star
15

unisockets

A universal Berkeley sockets implementation for both WebAssembly (based on WebRTC) and native platforms with bindings for C, Go and TinyGo.
TypeScript
34
star
16

alpimager

Build custom Alpine Linux images with Docker.
Go
29
star
17

panrpc

Language-, transport- and serialization-agnostic RPC framework with remote closure support that allows exposing and calling functions on both clients and servers.
TypeScript
28
star
18

nextcloud-talk-bot-framework

A framework for writing Nextcloud Talk chatbots with every language that supports gRPC.
Go
24
star
19

skysweeper

Automatically delete your old skeets from Bluesky.
TypeScript
20
star
20

html2goapp

CLI and web app to convert HTML markup to go-app.dev's syntax.
Go
18
star
21

webnetes

Peer-to-Peer Computing Platform for the Browser and Node.
TypeScript
17
star
22

networked-linux-memsync

Efficient Synchronization of Linux Memory Regions over a Network: A Comparative Study and Implementation (Bachelor's Thesis)
Jupyter Notebook
16
star
23

connmapper

Visualize your system's internet connections on a globe.
TypeScript
16
star
24

nextcloud-talk-bot-jitsi

A bot for Nextcloud Talk that creates Jitsi meetings.
JavaScript
14
star
25

hydrun

Execute a command for the current directory on multiple architectures and operating systems.
Go
11
star
26

xeus-cling-binaries

Weekly builds of https://github.com/jupyter-xeus/xeus-cling.
Shell
10
star
27

goit

Get a OIDC token from your terminal.
Go
10
star
28

felicitas.pojtinger.com

My personal site.
HTML
9
star
29

uni-itsec-notes

Notes for the IT security course at HdM Stuttgart.
Makefile
9
star
30

tapisk

Expose a tape drive as a block device.
Go
9
star
31

uni-bwl-notes

Notes for the Planung und Kalkulation von IT-Projekten (econ 101) course at HdM Stuttgart.
Makefile
9
star
32

deliverance

Universal document publishing system.
Makefile
8
star
33

growlapse

Visualize plant growth over time with Go, WebDAV and WASM; @pojntfx's entry for #growlab.
Go
8
star
34

invaentory

Quickly find all IPv6 and IPv4 hosts in a LAN.
Go
7
star
35

rpiplay-binaries

Weekly builds of https://github.com/FD-/RPiPlay.
Shell
7
star
36

bagop

Build for all Go-supported platforms by default, disable those which you don't want.
Go
7
star
37

webpipe

Share files, sockets, pipes and char devices over WebRTC.
Go
6
star
38

uni-appsecurity-notes

Notes for the Anwendungssicherheit (app security) course at HdM Stuttgart.
6
star
39

webnetesctl

Frontend for webnetes, the peer-to-peer computing platform for the browser and node.
TypeScript
6
star
40

adwaita-gtk-ubuntu

A modern Ambiance replacement that keeps Ubuntu's identity while staying upstream.
CSS
6
star
41

go-app-grpc-chat-frontend-web

Web frontend for an example chat application using the `go-app` package and gRPC over WebSockets (like gRPC-Web).
Go
6
star
42

ipxe-binaries

Weekly builds of https://ipxe.org/, with an embedded script that chainloads /config.ipxe.
Shell
5
star
43

grpc-examples

gRPC example microservices in Go, Rust, C#, Python and JavaScript.
JavaScript
5
star
44

cadmium-builds

Weekly builds of https://github.com/Maccraft123/Cadmium.
Shell
5
star
45

consumat.io

Track, plan and enjoy content.
5
star
46

appl-alg-interpreter-binaries

Weekly builds and source mirror for Prof. Dr. Fridtjof Toenniessen's ApplAlgInterpreter.
Java
5
star
47

the-commitment

A contract requiring you to do one daily public OSS contribution, while allowing time for rest.
5
star
48

learn-chinese-platform

A modern and libre way to learn Chinese.
TypeScript
4
star
49

uni-algodat-notes

Personal notes and snippets for the Algorithms and Data Structures course at HdM Stuttgart.
Go
4
star
50

box

Setup for my personal (pet) server.
Makefile
4
star
51

uni-distributedsystems-notes

Notes for the distributed systems course at HdM Stuttgart.
4
star
52

uni-db1-notes

Personal notes for the DB1 course at HdM Stuttgart.
Makefile
4
star
53

go-isc-dhcp

Management daemons and CLIs for the ISC DHCP server and client.
Go
4
star
54

minitel

Instructions on how to use a Minitel as a Linux terminal.
4
star
55

hydrapile

Reliably cross-compile and distribute complex apps from Linux to macOS and Windows using native toolchains (via Darling/WINE) and package managers (Homebrew/MSYS2) with containers.
Dockerfile
4
star
56

atmosfeed

Create fully custom Bluesky feeds with Wasm modules, powered by Scale Functions.
TypeScript
4
star
57

donna

Minimal personal CRM.
Go
3
star
58

keystoregaen

Generate Java keystores in your browser.
Go
3
star
59

saltpanelo

Fast, smart and secure service mesh.
Go
3
star
60

image-builder

A tool to build KubeVirt disk images. Based on @Tedezed's implementation.
Shell
3
star
61

nebulark

Distribute your workload to the edge.
JavaScript
3
star
62

uni-se1-notes

Assignments for the SE1 course of HDM Stuttgart, as Jupyter notebooks.
Jupyter Notebook
2
star
63

adwaita-gtk-ubuntu-legacy

To test out whether it may be a better idea to use Adwaita instead of Ambiance in LTS if Communitheme won't be done in time.
SCSS
2
star
64

SwiftUIMenuBar

A menu bar app for macOS built with SwiftUI.
Swift
2
star
65

gon2n-frontend

React frontend for @pojntfx/gon2n.
TypeScript
2
star
66

xeus-sql-binaries

Weekly builds of https://github.com/jupyter-xeus/xeus-sql.
Shell
2
star
67

glode

Compute, Network and Storage Node based on WASM, libp2p and IPFS.
TypeScript
2
star
68

weron-archive

Overlay networks based on WebRTC.
Go
2
star
69

consumat.io-api

API spec for https://github.com/alphahorizonio/consumat.io.
2
star
70

gnome-shell-extension-sticky-app

A GNOME shell extension to toggle an app's visibility.
JavaScript
2
star
71

birdid

Bird + Cupid: Find the first interaction between two Twitter users
Go
2
star
72

go-cuse

CUSE bindings for Go.
Go
2
star
73

uni-webdev-backend-notes

Notes for the webdev backend course at HdM Stuttgart.
2
star
74

uni-netpractice-notes

Notes for the Praktikum Rechnernetze (networking practice) course at HdM Stuttgart.
2
star
75

consumat.io-frontend

Frontend for https://github.com/alphahorizonio/consumat.io.
TypeScript
2
star
76

mepi

Middle Earth Property Insurance, a uni project of @jakwai01, @dentremor, @lucas-goldner and @pojntfx for HdM Stuttgart.
2
star
77

jitsi-meet-node-client

A NodeJS client for Jitsi Meet.
JavaScript
2
star
78

ports2packets

Generates a CSV file with the packets that are to be sent in order to check if a UDP port is open.
Go
2
star
79

papilio

CLI and web app to configure the Terminus FE and SL series of USB Hubs.
Go
2
star
80

go-app-grpc-chat-backend

Backend for an example chat application using the `go-app` package and gRPC over WebSockets (like gRPC-Web).
Go
2
star
81

pojntfx

My personal repo.
Go
2
star
82

ppc32-builds

CI/CD build configurations to get binaries for projects on 32-Bit PowerPC (ppc32) machines.
Shell
1
star
83

mosalink-archive

Archive of research from 2017 on AX.25 mesh networks with batman-adv and eoax.
1
star
84

skytheon

Cross-post between Bluesky, Mastodon and Twitter in all directions with ease.
Go
1
star
85

pojde-rs

Experimental Rust implementation of https://github.com/pojntfx/pojde.
Rust
1
star
86

go-auth-utils

Simple auth utilities for Go to secure web APIs with.
Go
1
star
87

webwormhole-binaries

Weekly builds of https://github.com/saljam/webwormhole.
Shell
1
star
88

tftpdd

TFTP server daemon.
Go
1
star
89

go-app-experiments

Experiments with the `go-app` package
Go
1
star
90

gopojde

Experimental Go implementation of https://github.com/pojntfx/pojde.
Go
1
star
91

uni-hacking-notes

Notes for the hacking (IT-Sicherheit: Angriff & Verteidigung) course at HdM Stuttgart.
1
star
92

csv2go

Generates Go code containing a multi-dimensional array with the contents of a CSV file.
Go
1
star
93

clusterplatform

The Lean Distributed Cloud Computing System.
JavaScript
1
star
94

connaections

The TCP and UDP connections of a node, as an API. See https://github.com/pojntfx/connaections-frontend-web/ for a web frontend.
Go
1
star
95

bagccgop

Build for all gccgo-supported platforms by default, disable those which you don't want (bagop with CGo support).
Go
1
star
96

documatio

In goes Markdown, out come indexed HTML and PDF slides and documents.
Shell
1
star
97

uni-supply-chain-paper

A paper on supply chain security in software development for Uni.
1
star
98

simple-direct-democracy-backend

Fast and minimal backend for a simple direct democracy's suggestion and voting system.
JavaScript
1
star
99

ipxebuilderd

Build daemon and CLI for iPXE.
Go
1
star
100

transcommunal-confederation

Flags etc. of the Transcommunal Confederation and it's communes.
1
star