Yesterday evening I threw together a landing page for a side project to my other side projects:

https://brrr.now

It’s a tiny and opinionated tool for sending push notifications. No sign up. No message history. No dashboard.

I like it. Would you? 😄

brrr

Push notifications for yourself. iOS and macOS.

brrr
brrr’s onboarding flow is virtually nonexistent because I don’t think it needs to be any more complicated than this.
brrr is so simple. Its killer feature is everything that’s not there.
Come on, Apple. Let's get this on TestFlight.
One down, one to go.
Two for two.

If I am to release brrr, then I’ll need to come up with a pricing strategy. Even if it’s a simple app, I’ll need to ensure that I cover my costs and ideally earn just a little. Choosing a strategy is difficult, though.

Current ideas include:

- First N pushes are free, then $X for 1,000 pushes.
- First month is free, then $X/year.
- One device is free. $X/year for multiple devices.

A tip jar and one-time purchase seem risky for an app with hosting costs.

Honestly, I'm leaning towards the first month being free and then charging something like $6.99/year. No monthly option. It’s a pricing model that’s as simple as the app, and a price point where I think most people who’d use it won’t mind too much. Or so I hope.
A colleague convinced me that I needed to add an additional feature to brrr. Tapping a notification should show it in the app to prevent accidental taps and missing the notification.

When people try to send pushes without an active subscription, I could just return an error, but I feel like I should also do something more fun.

Like, I could send a push saying people need to start a subscription or scramble the text in the notification.

But I fear that any such notification might be sufficient for some users to deduce why they would have otherwise received the notification 😄

Maybe I should take a page out of Festivitas’ book and have people name a fair price, but this time use it for a subscription instead of a one-time IAP 🤔

Do you want to help me test brrr? 👇

https://testflight.apple.com/join/55qZ7dRn

Learn more about the project on https://brrr.now

Join the brrr • just push notifications beta

Available on iOS

Squashed a few bugs and did some improvements based on the amazing feedback I’ve already received. New builds coming later today or tomorrow. Thanks a lot for the reports, everyone. Keep ‘em coming 🫶
Sending your first push with brrr couldn’t be easier.
ROCKETS 🚀

brrr’s site has a little notification composer now. You can use it to send notifications to yourself.

It also shows the JSON and the cURL command that can be used to send the notification.

https://brrr.now/docs/#send-test-notification

@simonbs I sent a bug report via TestFlight, is that ok or do you want it here instead?
@j TestFlight is perfect, thanks! I’m checking there too 🤗
@simonbs 1. pull to refresh doesn’t actually work when you haven’t registered yet 2. would be very cool to have a button to trigger a test notification from the app, IMO

@kylebshr Huh, that’s odd. I’ll have a look.

Good idea with a button to trigger a notification!

@simonbs I don’t think it’s odd, it’s because I never registered the device/enabled push. Should say something similar to the card above
@kylebshr Ah, now I get it. Agreed. That could be better.
@simonbs I think ”Copy URL“ instead of ”Copy link“ would work a lot better here. It‘s not really a link, it‘s the URL part of the command. The wording confused me.
@simonbs And maybe even change the other button label to ”Copy Call“, to reinforce the naming introduced above (”using the API call below“)
@simonbs Can confirm… 😊
@simonbs Looks like I’m holding it wrong (escaping?) 😉
@rob Huh, interesting! I haven’t seen that. Can you share your request with me (without the secret in the URL!)

@simonbs Might be a HTTPBot (cURL import) issue; when manually entering raw JSON in the body the notification displays correct (spaces instead of escape codes).

Will check with Proxyman later today and report back.

@simonbs Confirmed: it was the curl importer of HTTPBot not handling your example correctly by trying to send the body as URL encoded…
@rob Thanks a lot for checking! I'm not sure I can do much about that, but it's unfortunate if this is a thing many people will try.
@simonbs the loading spinner on the “Welcome to brrr” screen took around 20s or more before seeing the example `curl`. Is that normal? I thought something was broken….
@mluisbrown There’s room for optimizations in that flow. Most of them will come from upgrading the plan on my hosting provider, I think.
@simonbs cool stuff
@Himalaya @simonbs Care to share action? 😊 thanks
Drafts Directory: Send brrr

Example actions and other extensions for Drafts, the quick-capture notes app.

@simonbs Works great on my phone using Shortcuts.
@simonbs what’s the character limit on this?
@Himalaya None, really, but Apple enforces a 4 KB limitation on the entire payload. brrr uses a tiny bit and then the rest can be distributed across your title, subtitle, and message.
@simonbs Happy to. Will give it a bash with some Uptime Kuma status messages via webhooks for starters.

@simonbs But first... command line:

PS C:\Users\pc> curl -X POST https://api.brrr.now/v1/br_usr_<redacted> \ -d 'Hello world!'
{"success":true}curl: (3) URL rejected: Bad hostname
PS C:\Users\pc>

Message was delivered successfully to target device (testing from Australia, executed from a Win11 device running a PowerShell terminal).

Possibly my network or firewall causing that URL rejected message in the curl response - will need to look when I have some time.

@twcau Hmm. Haven’t seen that before 🤔

@simonbs Also, interesting item when adding the Webhook to Uptime Kuma, and sending a test message from it (see screenshot below).

Again, not sure if you, or me and my firewall/adblocking services causing it without further investigation.

My Uptime Kuma instance is running as a Home Assistant app (some kind of quasi-Docker container I think). At some point, will migrate it to a standalone Docker container.

@twcau Hmm.. I wonder why it would disallow that certificate.

@simonbs Just confirmed - It tripped a Firewall rule at my end. Cloudflare has the domain classified as Parked domain (which I block), and the rule triggers line up with my test times.

I’ve just submitted a request to CF to have the parked classification removed, and switched to API.

@twcau Interesting! Thanks a lot for looking into this! I've no clue why Cloudflare would register it as parked. I even use them as DNS.

@simonbs Getting back to core, happy to report that I can't find any issues so far. Tested the core JSON body options.

Only possible thing I could find is how line breaks behave in the messages. I found that if I wanted part of the text in message: to appear on a new line, I needed to use \r\n, and not just \n alone.

Also no issue found using any combination of JSON fields regardless of order.

@twcau Thanks for testing so thoroughly! I’ll make sure that \n works.
@simonbs As for the parked domain question, the Domain intel tab that I have access to via my CF account doesn't give any clear indication as to when that was added and/or its change history.
@simonbs Impressively simple 😮

@simonbs
So I copied the url https://api.brrr.now/v1/br_usr_[MYKEY] from the app and pasted it in safari on my phone, and got {"error":"Not found"}

… perhaps I’m holding it wrong too?

@simonbs I can send you the full URL, including the key, if you want me to.

I will just need to work out how to send a private message using ivory first. :-)

@Brendan Opening the URL with Safari will do a GET request. You’ll want to do a POST request.
@simonbs oh dang - sorry! I’ll try a post. :-)
@simonbs yep, that worked better. :-)
@Brendan No worries! Glad you got it working 😃

@simonbs looks and works great! Was sending notifications within a minute of downloading. I think it’s a good balance of simplicity and customisability too. Nice work!

I like that you can tap on a notification and it shows you the content in the app, in case you missed the message on tap. It could be nice to see the last X notifications in the app, but I can also see that over complicating things too.

@aselford Thanks, glad you like it!

I don’t think I’ll add notification history. I think theres something to keeping it super simple.

@simonbs Not compatible with my iPad Pro 10.5” (iPadOS 17) 😢

Is there a technical reason for requiring iPadOS 26?

@rob Not really. I'd like to lower the target over the next few days. I was hoping to do iOS/iPadOS 18+ but I can check if I can lower it to 17 too.

@simonbs Build 12 works on my iPad with iPadOS 17 🎉

Thanks!

@simonbs It looks awesome! Probably not possible or way to complicated, but it would be cool if you could run your own backend :)
@hsl That would indeed be cool! It’s a little more complicated because CloudKit is part of the backend stack and that's tied heavily to the app, so you can't own that part without also distributing another app.
@simonbs The only other feature I typically look for in an app like this is a priority setting (eg low, med, high, or 1, 2, 3, etc.). I’d like to be able to bypass focus modes or not depending on priorities.