The public printer ● live
A shared virtual Zebra, live on the internet, the same
simulator you get with an API key: raw TCP 9100, HTTPS ingest, authentic ~HS/SGD status,
fault injection with a real hold queue, and a REST API for CI assertions. Everything printed appears
on the wall below, for everyone, instantly. Everything it supports, in one list.
Try it from your terminal, like a real Zebra
This printer listens on raw TCP, exactly like hardware on port 9100. Open a socket and write ZPL, from a shell or any language:
printf '^XA^FO50,50^A0N,45,45^FDhello from my terminal^FS^XZ' | nc -q1 print.stripyhorse.io 9101 # or send a file: nc -q1 print.stripyhorse.io 9101 < label.zpl # ask it for status, Zebra-style (~HS: three STX/ETX lines, fault flags and all): printf '~HS' | nc -q1 print.stripyhorse.io 9101 # or probe it with SGD: printf '! U1 getvar "device.friendly_name"\r\n' | nc -q1 print.stripyhorse.io 9101
$zpl = '^XA^FO50,50^A0N,45,45^FDhello from powershell^FS^XZ' $c = New-Object Net.Sockets.TcpClient('print.stripyhorse.io', 9101) $s = $c.GetStream() $b = [Text.Encoding]::ASCII.GetBytes($zpl) $s.Write($b, 0, $b.Length); $s.Flush(); $c.Close() # or send a file: $b = [IO.File]::ReadAllBytes('label.zpl') # ask it for status, Zebra-style (~HS answers three STX/ETX lines): $c = New-Object Net.Sockets.TcpClient('print.stripyhorse.io', 9101) $c.ReceiveTimeout = 3000 $s = $c.GetStream() $b = [Text.Encoding]::ASCII.GetBytes('~HS') $s.Write($b, 0, $b.Length); $s.Flush() (New-Object IO.StreamReader($s)).ReadToEnd() $c.Close()
import socket zpl = b"^XA^FO50,50^A0N,45,45^FDhello from python^FS^XZ" with socket.create_connection(("print.stripyhorse.io", 9101), timeout=10) as s: s.sendall(zpl) # ask it for status, Zebra-style (~HS: three STX/ETX lines, fault flags and all): with socket.create_connection(("print.stripyhorse.io", 9101), timeout=10) as s: s.sendall(b"~HS") print(s.recv(1024).decode())
<?php $zpl = "^XA^FO50,50^A0N,45,45^FDhello from php^FS^XZ"; $printer = fsockopen("print.stripyhorse.io", 9101, $errno, $errstr, 10); fwrite($printer, $zpl); fclose($printer); // ask it for status, Zebra-style (~HS: three STX/ETX lines, fault flags and all): $printer = fsockopen("print.stripyhorse.io", 9101, $errno, $errstr, 10); fwrite($printer, "~HS"); echo fread($printer, 1024); fclose($printer);
using System.Net.Sockets; using System.Text; var zpl = "^XA^FO50,50^A0N,45,45^FDhello from csharp^FS^XZ"; using (var printer = new TcpClient("print.stripyhorse.io", 9101)) using (var stream = printer.GetStream()) { stream.Write(Encoding.ASCII.GetBytes(zpl)); } // ask it for status, Zebra-style (~HS: three STX/ETX lines, fault flags and all): using (var printer = new TcpClient("print.stripyhorse.io", 9101)) using (var stream = printer.GetStream()) { stream.Write(Encoding.ASCII.GetBytes("~HS")); var buf = new byte[1024]; var n = stream.Read(buf, 0, buf.Length); Console.WriteLine(Encoding.ASCII.GetString(buf, 0, n)); }
import java.net.Socket; import java.nio.charset.StandardCharsets; public class PrintLabel { public static void main(String[] args) throws Exception { String zpl = "^XA^FO50,50^A0N,45,45^FDhello from java^FS^XZ"; try (Socket printer = new Socket("print.stripyhorse.io", 9101)) { printer.getOutputStream().write(zpl.getBytes(StandardCharsets.US_ASCII)); } // ask it for status, Zebra-style (~HS: three STX/ETX lines, fault flags and all): try (Socket printer = new Socket("print.stripyhorse.io", 9101)) { printer.getOutputStream().write("~HS".getBytes(StandardCharsets.US_ASCII)); byte[] buf = new byte[1024]; int n = printer.getInputStream().read(buf); System.out.println(new String(buf, 0, n, StandardCharsets.US_ASCII)); } } }
Network only allows printers by IP address? The same printer answers at 15.204.122.174 9101.
…or paste ZPL here
Break the printer
Real printers jam. Inject a fault, print
something: the job holds in the receive buffer (watch ~HS report it), then clears
and flushes. Faults auto-clear after 60s.
Three faults here, because this printer is shared. A printer of your own has all six, plus a roll and a ribbon that run out mid-job, stored objects, and your labels kept exactly as you sent them instead of anonymized for a public wall. That is the free account, no card.
The literal three-line answer any script
gets from ~HS on port 9100, decoded field by field:
| Field | Raw | Meaning |
|---|
The wall: last 10 jobs
Jobs play back at their print speed (^PR, else 2 in/s), copies feed one
after another, and the odometer counts every one, the same inbox a private printer gets.
Privacy & safety: label text is masked into same-shaped gibberish before storage (on every route in, terminal included), embedded images are stripped, and only the last 10 jobs are kept.
* Every label here is masked before it is stored, because the wall is public and shows a stranger's print to everyone: same shape, same layout, none of the actual words, embedded images stripped. Your own print is shown back to you unmasked up by the paste box, and a private printer keeps your labels exactly as sent.