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

@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 love the idea, everyone can give as much as they want -- but can you even do that?
@ctietze I don’t know. I could with a one-time purchase but I dont know if Apple will allow it for subscriptions.
@simonbs send a notification every minute for an hour telling them they need to upgrade to get it to stop.
@simonbs For a potential free tier you could just let it say something like „New message. Click to show its content“ and then in app show the full message + an upgrade text + button. If the free tier limit is reached I would throw an error
@nmann That is exactly why I think it’s a good idea to send a notification even when the user isn’t subscribed: it’s a chance to get them onto a subscription.
@simonbs Only send it once every few times it’s supposed to go out so they can’t rely on it.
@simonbs Just out of curiosity, how would the web-hook be invoked/triggered here?
@billyadams For the agent to send a notification? I’m actually not sure. My colleague uses it like this but I don’t know how he set it up. I suppose it could just be part of AGENTS.md that it should make a curl command once it’s done with specific tasks.
@simonbs I would go as simple as possible. 1 month free then 7$/year. Simple
for you and simple for the users.
@simonbs Maybe gate the number of pushes over a time window (per day, per week)
@hoagie Yes, that’s an option too. I just fear it’s hard to structure in a way that’ll get enough people to pay. I mean, if people don’t put much load, I won’t have high costs, but I think people still need to pay a bit for the occasional push.

@simonbs @hoagie whatever you do make sure your costs are always covered.

Did you write the backend in Swift too?

@BrendanThompson @hoagie No, it’s written in TypeScript. I really like working in that language.

@simonbs I don't have a use for this right now, but I’d _like_ to have one!

For me I'd rather $X for N pushes. I assume you'd offer options of auto top-up or manual?

One device being free sounds dangerous, some people might be happy with that and end up costing you a bunch. (And also you could just open 5 free accounts for your 5 devices -- anything that can send one HTTP call can send five!)

@amyworrall Indeed. I’m not too happy allowing a single device for free either.

As for the automatic top pup, that’s why I don’t like that option either. It gets complicated.

@simonbs Maybe:

First N pushes are free, then tiered subscriptions based on usage level:

- $X/period for 1000 pushes per period
- $Y/period for 10000 pushes per period
- $Z/period for unlimited pushes

Maybe too complicated.

But most people hopefully understand subscriptions that also include actual server costs.

@somelinguist That could work. I’m just hoping for a pricing model that’s as simple as the app, so I’d prefer not to have tiers 😄
@simonbs any way I can get an invite?
@simonbs how would one get on a test flight beta 😂😂
@simonbs how do we sign up?

@simonbs Status: “Waiting for TestFlight invite”.

But seriously: I hope you do a public beta and will share an invite link here or on the landing page.