TopicPush: notifications to your phone with a plain HTTP request. 1. Open the TopicPush app. It creates a topic for you (or add your own). 2. Publish to it from anywhere: curl -d "Backup done" https://topicpush.com/ curl -H "Title: Nike Dunk 42" -H "Image: https://picsum.photos/800/450" -H "Click: https://example.com" -d "45 EUR" https://topicpush.com/ curl -H "content-type: application/json" -d '{"title":"Hello","message":"It works","image":"https://…","click":"https://…","priority":"high"}' https://topicpush.com/ curl "https://topicpush.com//publish?title=Hello&message=From+a+link" Options (query string, header, or X- header): title|t, message|m, image|attach|a, click|url, priority|p (high, or low: no sound, Notification Center only), actions, detail (a line shown only when the notification is expanded). Buttons (up to 4), ntfy-style. "http" calls the URL from the phone without opening the app; "view" opens it. On iPhone, an "http" button pressed in the expanded notification shows the answer there: the JSON "message" field, or the first line of a text answer. Such a request carries the header X-TopicPush-Inline: 1, so your server can skip a separate result notification. curl -H "Actions: http, Open door, https://example.com/door, method=POST, icon=lock.open; view, Camera, https://example.com/cam" -d "Someone rang" https://topicpush.com/ JSON: "actions":[{"action":"http","label":"Open door","url":"https://…","method":"POST","headers":{"Authorization":"…"},"body":"…","icon":"lock.open"}] icon: an SF Symbol name. input: the button asks for a line of text first, which replaces {input} in the URL or body, or is sent as the body (a GET button must put {input} in its URL): JSON: {"action":"http","label":"Reply","url":"https://…","input":{"placeholder":"Your answer","button":"Send"}} header: input.placeholder=Your answer Photo carousel (iPhone: long-press the notification and swipe), up to 10: curl -H "Images: https://…/1.jpg,https://…/2.jpg" -d "3 photos" https://topicpush.com/ JSON: "images":["https://…","https://…"] Any other JSON body is delivered as the message text. Read a topic: GET https://topicpush.com//json?since=&limit=100 (comma-separate several topics) Public page with subscribe link and QR code: https://topicpush.com/ A topic name is its own password: anyone who knows it can publish and read. Use a long random one. Channels (read by anyone, published by you only): curl -X POST -H "content-type: application/json" -d '{"title":"My drops","description":"…"}' https://topicpush.com//claim → returns a key, shown once curl -H "Authorization: Bearer " -d "New drop" https://topicpush.com/ (or ?key= on a link) curl -X PATCH -H "Authorization: Bearer " -d '{"title":"…"}' https://topicpush.com//info curl -X POST -H "Authorization: Bearer " https://topicpush.com//key → new key, the old one stops working Topic names: letters, digits, - and _, up to 64 characters. Messages are kept 30 days.