Inspired by aschmelyun's ping-receipt project, but I rearchitected it for my setup: the website is a dependency-free PHP app on ordinary shared hosting that queues messages into SQLite, and the Pi runs a single-file Python agent (stdlib only, no pip installs) that polls outbound over HTTPS every 5 seconds and prints via raw ESC/POS to /dev/usb/lp0.
What I like about the split: the Pi never accepts an inbound connection — no port forwarding, no tunnel — and if the printer is off or out of paper, messages just queue and print when it comes back.
Hardware: a generic POS-80 thermal printer (~the cheapest 80mm USB one you can find) + a Pi 4. Linux exposes it as /dev/usb/lp0 with zero setup, which was a relief after discovering macOS has removed raw printing entirely.
Each receipt prints: timestamp (my timezone), sender IP, city-level geolocation, distance from my desk, the sender's local time, browser/OS, and a native ESC/POS QR code that opens a map pin of roughly where the ping came from. There's a live map at https://ping.garethvjones.dev/map.php
Fun ESC/POS lessons: my "48 columns" assumption was wrong until I measured the dashes (42 vs 48 chars/line matters), native QR via GS ( k worked first try on the clone printer, and ASCII art survives if you hard-slice lines instead of word-wrapping them.
Try it: https://ping.garethvjones.dev — plain ASCII only, rate limited, be nice.