Self-hosting ntfy on Coolify, from install to your first alert
Run your own ntfy server on Coolify: deploy the one-click template, lock it down, create accounts and topics, subscribe from your phone, and point Butters at it.
Product updates, guides, and the occasional opinion — 11 articles so far.
Run your own ntfy server on Coolify: deploy the one-click template, lock it down, create accounts and topics, subscribe from your phone, and point Butters at it.
Some numbers don't need a chart or a BI tool. They need to be somewhere you'll see them. Here is how insight cards work in Butters, how to keep them current from cron, and how to tell whether a number belongs on a card, in the feed, or in an analytics tool.
Butters can send a notified event as a native push, to an ntfy topic, or to a Slack or Discord channel, all at once. Here is how the three differ, and which one to use for whom.
Forms, routers, CI and payment tools can all call a URL when something happens. Here is how to point them at a Butters incoming webhook, why pasting the URL straight into Stripe gives you a doorbell rather than an event, and the recipes that work instead.
Not everything can hold an API key, and not everyone lives in ntfy. Incoming webhooks turn any URL call into an event, and outgoing webhooks and web push send the events that matter to Slack, Discord, your own backend, or your phone.
An outgoing webhook lets anyone point our server at any URL. Here is how Butters signs JSON deliveries so your receiver can trust them, how to verify one in Node or Python, and why the delivery code refuses private addresses and never follows a redirect.
Backups, Makefiles and cron jobs will never import an SDK. The butters CLI sends events, metadata and KPI numbers to Butters from anywhere you can run a command.
A notification you ignore is worse than none, because it teaches you to ignore the next one. Here is how the notify flag and ntfy destinations work in Butters, and a simple rule for which events deserve to reach your phone.
Operational failures don't announce themselves. A backup exits with code 1 at 3am and the only record is a log file that gets rotated away. Here is how to put deploys and scheduled jobs in the same feed as everything else.
The temptation is to track everything. The useful move is to track the handful of things that happen to your revenue: signups, payments, failures, cancellations. Here is how to pick them, name them, and wire them in without making a mess.
Before you need a dedicated error tracker, you need to know something broke. Here is how to send every unhandled error to Butters with one small function, what goes in tags versus metadata, and where this approach stops being enough.