Skip to content
Docs

Quickstart

This page lets you activate a paid destination and confirm end-to-end UDP delivery on a Linux server.

Before you start

  • Have a shredstream.sh purchase for one destination.
  • Control a server with a stable public IP address or a stable one-to-one UDP port mapping.
  • Have Python 3 and sudo access on the receiving Linux server.
  • Choose an unused UDP port and substitute it consistently for 9000 in this procedure.
  • Have access to the shredstream.sh dashboard for the paid destination.

Set the destination values

This procedure uses UDP port 9000 as a runnable example. Keep that value when it is free, or replace every occurrence with one port you control. Register the server's public IP, not a private address. Behind NAT, make the chosen public port forward to the receiving socket.

Both the verification packet and later shreds come from ${SOURCE_IP}. Permit inbound UDP from that exact address. This rule remains necessary when cloud firewalls, host firewalls, or network ACLs admit other traffic. Missing source permission causes most quickstart activation failures.

Open the host firewall

Use this ufw command when ufw manages the host firewall:

bash

sudo ufw allow proto udp from 203.23.178.228 to any port 9000sudo ufw status numbered

Use the matching command from Firewall configuration when the host uses iptables or nftables. Add the same source CIDR, ${SOURCE_IP}/32, to the cloud firewall or security group when the server runs behind one. Do not replace the narrow source with this internet-wide range:

text

0.0.0.0/0

Start a receiver

Run this command in a terminal on the destination server. It binds all local IPv4 interfaces on UDP port 9000, prints the verification payload as text, and reports aggregate stream counters once per second.

bash

python3 - <<'PY'import socketimport time HOST = "0.0.0.0"PORT = 9000SOURCE_IP = "203.23.178.228" sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 8 * 1024 * 1024)sock.bind((HOST, PORT))print(f"listening on udp://{HOST}:{PORT}", flush=True) stream_packets = 0stream_bytes = 0last_report = time.monotonic() while True:    data, peer = sock.recvfrom(65535)    if not peer[0] == SOURCE_IP:        print(f"ignored source={peer[0]}:{peer[1]} bytes={len(data)}", flush=True)        continue    if data.startswith(b"SHREDCAST-VERIFY"):        print(data.decode("utf-8", errors="replace"), flush=True)        continue    stream_packets += 1    stream_bytes += len(data)    now = time.monotonic()    if now - last_report >= 1.0:        print(            f"source={peer[0]} stream_packets={stream_packets} "            f"stream_bytes={stream_bytes}",            flush=True,        )        stream_packets = 0        stream_bytes = 0        last_report = nowPY

Leave this terminal running. The receive buffer setting asks the kernel for 8 MiB. The kernel may cap the effective buffer according to host policy. Changing that cap is an operating-system task and is not required to read the one verification datagram.

Register and verify the destination

  1. In the dashboard, select your paid destination.
  2. Set its address to the server's public IP.
  3. Set its UDP port to 9000.
  4. Save both destination fields.
  5. Issue the verification challenge.
  6. In the receiver terminal, find the line starting with ${CHALLENGE_PREFIX}.
  7. Copy its token value.
  8. Enter that value in the dashboard verification field.
  9. Submit it before ${CHALLENGE_TTL_SECONDS} seconds elapse.
  10. Leave the receiver running.

The literal prefix ${CHALLENGE_PREFIX} opens the datagram. Its destination ID comes next and its token follows. Neither the delimiter nor post-prefix encoding is published. Read the complete printable payload instead of assuming spaces, colons, JSON, or line breaks.

Each request sends exactly one challenge datagram, which UDP will not retransmit. Ask again through the dashboard if the receiver prints nothing or the ${CHALLENGE_TTL_SECONDS} second window expires. Submit only the latest request's token.

Confirm the stream

After the dashboard accepts the token, watch the existing receiver terminal. Stream datagrams from ${SOURCE_IP} should replace the single verification message. The exact activation delay is not currently specified.

Open a second terminal and observe counters without decoding payloads:

bash

sudo tcpdump -n -i any -c 20 'src host 203.23.178.228 and udp dst port 9000'

After 20 matches, tcpdump exits. A working feed produces continuing traffic whose rate changes with Solana network activity. Arrival proves current delivery, not ordering or future completeness. Service datagrams may reach ${WIRE.maxPacketBytes} bytes.

Confirm that the Python stream counter reports ${SOURCE_IP} for accepted traffic. Since no UDP source port is published, omit it from the filter. Select only source IP, protocol, and your destination port.

Preserve the working configuration

The example ufw rule is managed by ufw. Linux distributions determine iptables and nftables persistence, which lies outside the product contract. After confirming delivery, persist the chosen rule with the host's normal firewall configuration.

Keep the public IP and port stable. Changing either field counts as a destination address change and requires a new verification challenge. Each destination receives an allowance of three address edits daily.

Monitor receive errors, kernel UDP drops, process restarts, and firewall changes. Raw UDP supplies no retransmission, ordering, or backpressure. A slow or stopped receiver cannot ask the sender to replay missed packets. Base sustained capacity on local receiver measurements, with headroom for short peaks. No required percentage is published.

If no packet arrives

Run the tcpdump command while requesting a new challenge. If tcpdump sees nothing, check the public IP, cloud rule, host rule, NAT mapping, and dashboard port. If tcpdump sees the challenge but Python does not, another process may own the port or the receiver may be bound to a different interface. Inspect the binding with:

bash

sudo ss -ulnp | grep ':9000 '

Do not debug the shred decoder until the network path works. First prove that one datagram from ${SOURCE_IP} reaches the configured UDP socket. Then complete verification. Then count stream datagrams. Decode payloads only after those three checks pass.

Parameters

NameTypeDefaultNotes
destination IPpublic IP addressnoneThe public address registered in the dashboard and controlled by the customer.
destination portUDP port9000 in examplesChoose one unused port and use the same value in the dashboard, firewall, NAT mapping, and receiver.
source IPIPv4 address203.23.178.228Allow this exact source for the challenge and stream; customers cannot configure it.
challenge lifetimeseconds600Submit the token within this window or request a resend.
example receive buffer requestbytes8388608The Python example requests this socket buffer; the operating system may cap it.

When it goes wrong

No challenge appears before the dashboard window closes. Example error: `verification timed out`.

Cause. UDP from 203.23.178.228 is blocked, the public IP or port is wrong, NAT does not forward the port, or no socket is bound.

Fix. Start the receiver, allow 203.23.178.228/32 through every firewall, confirm the mapping, and request a resend.

The receiver exits immediately. Example error: `OSError: [Errno 98] Address already in use`.

Cause. Another process already owns UDP port 9000 on the selected bind address.

Fix. Stop the conflicting process or choose a free UDP port, then update the receiver, firewall, NAT mapping, and dashboard together.

The token is rejected. Example error: `challenge expired`.

Cause. The token was submitted after 600 seconds or came from an earlier challenge.

Fix. Request a new challenge, copy its token from the current datagram, and submit it within the active window.

Verification completes but no stream packets appear. Example error: `receiver idle: 0 datagrams`.

Cause. The receiver, host firewall, or cloud rule no longer matches the verified destination port.

Fix. Compare the dashboard destination with the socket binding and every firewall rule, then restore the exact verified IP and port.

Questions

Which address must the firewall allow?
At the exact registered destination port, admit inbound UDP from ${SOURCE_IP}. The verification challenge and stream both use this origin. Since its UDP source port is unpublished, omit that field from the filter. Apply equivalent rules at cloud and host layers when both exist.
What should I do when the challenge is lost?
Leave the receiver running and confirm that ${SOURCE_IP} is allowed, then use the dashboard to repeat the challenge. Only one verification datagram follows each request, and UDP will not retransmit it. Return the new packet's token within ${CHALLENGE_TTL_SECONDS} seconds. Never reuse an expired request's value.
How do I know the stream is reaching the server?
Filter tcpdump by ${SOURCE_IP}, protocol UDP, and your registered port. Then confirm that the receiver's datagram counter advances. This separates network delivery from payload decoding. No exact activation interval or peak rate is published.