A lightweight print server for Raspberry Pi that works with the ReminderPrint iOS app. Send reminders and daily agendas from your iPhone and have them printed instantly on any ESC/POS thermal receipt printer.
iPhone (ReminderPrint App) → Tailscale VPN → Raspberry Pi → USB → Thermal Printer
The Pi runs a small HTTP server that receives jobs from the iOS app and prints them as formatted receipts. Tailscale provides a secure connection from anywhere in the world — no port forwarding required.
- Print reminders instantly from your iPhone
- Schedule daily agenda printouts from your Apple Calendar
- Secure API key authentication
- Works over local WiFi or remotely via Tailscale
- Auto-starts on boot
- Compatible with any ESC/POS thermal printer
Hardware
- Raspberry Pi 3 or newer
- Any ESC/POS compatible thermal receipt printer (58mm or 80mm)
- USB cable to connect printer to Pi
- MicroSD card (8GB or larger)
Software
- Raspberry Pi OS Lite (64-bit)
- The ReminderPrint iOS app — Android coming soon
Download and flash Raspberry Pi OS Lite (64-bit) using Raspberry Pi Imager or Balena Etcher.
If using Raspberry Pi Imager, use the settings cog to set a hostname (printserver), enable SSH, and configure your WiFi.
If using Balena Etcher, manually add these files to the bootfs partition after flashing:
Enable SSH:
touch /Volumes/bootfs/sshConfigure WiFi — create /Volumes/bootfs/wpa_supplicant.conf:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=AU
network={
ssid="YourWiFiName"
psk="YourWiFiPassword"
key_mgmt=WPA-PSK
}
Set username/password:
echo 'pi:'$(openssl passwd -6 'yourpassword') > /Volumes/bootfs/userconf.txtBoot the Pi, SSH in, then clone this repo and run the setup script:
ssh pi@printserver.local
git clone https://github.com/jackbuhlerr/ReminderPrint.git
cd ReminderPrint
chmod +x setup.sh
./setup.shThe script will automatically:
- Install all dependencies
- Install and enable Tailscale
- Configure USB printer permissions
- Set up the print server as a background service that starts on boot
- Generate a unique API key for your server
Save the API key shown at the end — you will need it in the iOS app.
After the script finishes, authenticate Tailscale:
sudo tailscale upOpen the URL it shows to log in. Then get your Tailscale IP:
tailscale ip -4Open ReminderPrint, tap the printer status button, and under Connection enter:
- Server URL:
http://<your-tailscale-ip>:8000 - API Key: (shown at the end of the setup script)
Tap Reconnect Printer — it should go green. You are ready to print.
Prefer to set up manually? See MANUAL_SETUP.md for step-by-step instructions.
Any printer that supports ESC/POS over USB should work, including most thermal receipt printers from:
- Epson TM series
- Star Micronics
- Zyprinter
- MUNBYN
- Xprinter
- Most generic 58mm/80mm thermal printers
Check if the server is online.
Headers
x-api-key: your-api-key
Response
{ "status": "online" }Print a reminder immediately.
Headers
x-api-key: your-api-key
Content-Type: application/json
Body
{
"title": "Buy groceries",
"due": "Today 5:00 PM",
"priority": "Immediate",
"notes": "Optional notes"
}Response
{ "status": "printed" }Schedule a daily agenda print.
Body
{
"scheduledAt": "2026-04-27T07:00:00+10:00",
"timezone": "Australia/Sydney",
"title": "Today's Agenda",
"sections": [
{
"calendar": "Personal",
"events": [
{
"title": "Dentist",
"start": "09:00 AM",
"end": "10:00 AM",
"location": "Main St"
}
]
}
]
}Response
{ "status": "scheduled", "fire_at": "2026-04-27T07:00:00+10:00", "seconds_until": 3600 }List all scheduled jobs.
Cancel a scheduled agenda print.
The API key is set via the PRINT_API_KEY environment variable. To change it:
sudo systemctl edit printserverAdd:
[Service]
Environment=PRINT_API_KEY=yournewkeyThen restart:
sudo systemctl restart printserverPrinter not detected
ls /dev/usb/
lsusbMake sure the printer is powered on and connected. It should appear as lp0 or lp1.
Permission denied on /dev/usb/lp0
sudo chmod 666 /dev/usb/lp0Server not reachable from app
- Ensure Tailscale is running on both the Pi and iPhone
- Use
http://nothttps:// - Test from your Mac:
curl http://<tailscale-ip>:8000/status -H "x-api-key: yourkey"Check server logs
sudo journalctl -u printserver -fMIT