Delivering real-time content to your iPhone

Should I remove Push4 from the appstore, or continue supporting it?

Let’s push some history about the app you’re currently using: Push4, which I started coding in 2009.

The server side uses Rails 2.3, Event Machine, Redis, MySQL, Resque and a lot of specs. It’s efficient, it was efficient at the time and still is. Some numbers everyone like: I deliver 400,000 pushes per day to 8,500 devices (or 5,100 active users, as users have more than a single device these days). I do 70,000 requests per hour to Twitter, fetch 7,000 RSS feeds every 20 minutes, pull pushes real time for 2,500 twitter accounts through their realtime API (I was within the first to use their feature, even before being released beta for more developers). I generate 47,000 requests to Facebook per hour. I process about 1,000 emails per hour. All this happen on 2 servers only, and those are busy doing other things too (I use them for other projects like heritage or liker).

Please be aware those are happening every single day of the year, all the time. I’m the only developer on this, and the servers run on their own. Numbers might look small, but they’re big enough when you have to do the whole project yourself, backend and frontend, support and so on. You don’t have a day off, mostly when it’s all about being pushed instantly. Get a 10 minutes system delay for everyone and you already got 20 angry emails from active users. Better not fuck it up :)

The iOS side uses Three20 (the worst choice I’ve made in my iOS developer lifetime), and is already a rewrite of the original Notification app which was my first real iPhone application. It includes a lot of bug, the Three20 lib isn’t supported anymore, and any new bug I get with new iOS release are giving me huge headaches. Adding feature or fixing bugs in my current app has became a big problem.

But a lot of things happened since 2009. We now have Celluloid, Rails 3.2, Mongo, Sidekiq, Ruby 1.9 and so on. We now have automatic iOS on the air update, and you can basically code for iOS v6.0 from today, and never code for something older than one or two iOS releases old. We have retina screens, multiple devices, nice StoryBoard (well not so nice sometimes but whatever).

The current application and server require very little support from me, else I’d have pulled the app from the appstore already, as I have no time and it doesn’t generate any revenue, barely enough for paying for the server cost. However I do have 8,000 devices live, and a total 60,000 users overall (including non active users), so there might be a market for my app anyway. I didn’t do much marketing so far, spams I mean emails, and so on but if I did try to push getting more users, I could get more.

However there is a bigger issue on that whole project, an issue I tried to tackle in many ways (in app purchases for new features, credits for receiving pushes, etc) but never succeeding in the end. Today you’re paying once for the app, but I then have to indefinitely pay the hosting and manage the servers. I also have to indefinitely work on the app itself to add features you guys want to see, UI improvements and so on. Other app developers have to do the same thing (and only a few complain) but they either have no server cost, have a smaller app, or have a bigger market share so selling new applications is enough to pay for the current work. They might have other magic going on than I’m not aware of, and I’d be pleased to hear about.

One thing I’ve recently thought about, is asking for the app current cost ($5) once a year to every active user. You still use the app a year later? You’d need to pay again for using it for a year and so on. Users were angry at such options in 2009, but the Push application landscape has changed a lot since (boxcar being dead in the water, should never have had that success anyway, and other smaller push apps also disappearing), and I feel users now understand it’s better to pay a low fee for a working application, getting an always up to date iOS application, than not paying and getting the application disappear from the AppStore like many similar applications did. What’s your feedback about that price/cost issue? I’m very interested about my current user feedback, and haven’t decided yet.

I’m the first user of my own application, I have 5 twitter accounts, over 550 feeds (you read right, but I deactivated sound for rss feeds…), so I am in need of a new version of my own application. The next version of Push (codenamed “Donkey” as the official name isn’t public) will be a complete rewrite. The server side, as well as the iOS one. This work will probably take one or two months full time work, it’s a lot of money but I’ll learn new technology on the way, and I already know I’ll never get that cost back through new sales but most my life I did things because I wanted to, not because they were interesting money wise.

What would you like to see in a next version of the app, what would you like not to see disappear from the current app, and what’s your thought about the pricing issue I’m running into since day one? Replying on Twitter is ok: @appnotification.


iPhone5 update on the appstore

The version 4.1 on the appstore has been approved a few days ago, it includes support for iOS6/iPhone5 (full screen), and fixes a few Twitter related bugs (they changed url endpoints and it broke my app).

An upcoming update will fix more bugs:

  • the rotation is currently broken
  • the urls are broken in your notifications, and pushes are too short when reading them

Another very annoying bug is having to restart the application regularly to be able to load new notifications. Believe me this is as annoying to me than you, as I use my app to receive hundreds of notifications per day. Sadly I have big troubles reproducing the problem, and it’s somewhere in the Three20 library (not my code, I swear!). The version of the library I use is so old than I found no fix for it, and I can’t just update it and make it work as it would take days of work (if no longer) and I’d prefer to spend that time rewriting the app from the ground.


PushLite has been shutdown

PushLite was pulled out from the AppStore months ago, it has now been shutdown completely. You can upgrade at using the same credentials, and your configuration will be kept the same way.

It will help me focusing on one app.


Notifications length, or why do I receive truncated Tweets

I recently had some questions from different users about tweets being shrunk. I always worked on my app in a way than the amount of text you receive would be as long as possible.

Notifications sent to Apple are 255 char max (as a JSON payload), enough for a 140 char Tweet you’d think. Yes, but that notification has to include other data like the sound being played, badge number, and application specific data. For Push4 I also send the Twitter client URL scheme, so Push4 opens the Twitter client right away without fetching anything from my server (else you’d have to wait a few seconds every time), and the notification id from my database for knowing what to fetch from my server for displaying the push.

Delivering a 140 char Tweet to myself the JSON payload sent to Apple looks like this:

{“aps”:{“badge”:3,”sound”:”37.caf”,”alert”:{“body”:”@fabientest: @fabienpenso ok this is a 140char tweets which I’m typing from my computer with the official Twitter client on my Mac, from my desk and n5ke”},”id”:”95796”}

As you can see it includes the full length of the Tweet, a badge number, a sound, the alert, the notification id (on my database). Full text will be shown in my notification center.

Now let’s see another user, who configured TweetList as a Twitter client, sending a similar 140 char Tweet. The JSON payload sent to Apple looks like this:

{“c”:”tweetlist://”,”aps”:{“badge”:3,”sound”:”37.caf”,”alert”:{“body”:”@fabienpenso: @CarmeloBen ok this is a 140char tweets which I’m typing from my computer with the official Twitter client on my Mac, from m”,”action-loc-key”:”TweetList”}},”id”:”95796”}

The JSON payload being over 255 char, the alert had to be truncated. The reason is @CarmeloBen did set Tweetlist as a Twitter client, and I include more data: The Twitter client URL Scheme (tweetlist://) so my app knows what to launch, and the action key so you see on your iPhone lock screen which Twitter client will open.

The current solution is not to set any Twitter Client, a long term solution could be to find a way to not include the twitter URL scheme (replacing tweetlist:// with 1, and making sure the App knows the Twitter client ‘1’ is tweetlist:// would save a few char). But that includes a lot of changes.


Sparrow support

I now support Sparrow as a mail client, one step configuration:

  1. Visit and select “Open Sparrow”

Enjoy, and let your friends know.


Top 10 Feed & RSS Technologies of 2011: Push4

Push4 / AppNotifications just got in the top 10 geeky RSS technology application from readwriteweb :

Fabien Penso’s fabulous iPhone push notification app released a 3.0 version this year, but it’s just the nice clean basics that make this one a winner. Input any feed, or many other sources of information, and Penso’s app will push it to your phone in real time. It works really, really well and is better than ever with the introduction of the Apple Notification Center in iOS5. A double digit percentage of the stories I reported on this year came from feeds I consumed in this app.

Thank you ReadWriteWeb!


More problems : more explaination

You recently had issues with Twitter, as our connection to the sitestreams API (real time) wasn’t working. I was using a beta url for it, which recently stopped working. I also had a user having 4000 pushes per hour, which generated a slowness issue.

A few hours work fixed it, and your tweet should now be pretty instant, I expect them as instant as the official Twitter app, maybe more.

I also had a problem with Apache dying last night, which meant you could not view notifications anymore, neither login. I restarted it and it seems fine, and I’ll find a way to automatically restart it soon.


Downtime the last day: explanation

Yesterday I found out our slave was not responding, I’ve rebooted it remotely but it went out of sync generating issues like new data being inserted in the DB (so receiving notifications) but not being able to be read (like opening the app would not show the data).

Problem is I’m currently in India, on a Edge connection through a USB Vodafone key, and yesterday just when needing it, this thing wasn’t !$% working !

Getting 30 seconds of connection, I’ve removed the slave from my configuration so all went smooth again, except for emails. Forgot postfix was using the slave, and you guys had no email notifications since. I’ve now fixed email notifications but MTAs are currently sending loads of emails to my server so it might take a few hours (including the backlog you will receive). I will fix this for next time having postfix looking for both DB.

I still need to resync the slave and put it back.

This is the down part of having an application requiring a server, the day the servers go offline, the app won’t work anymore. There is sadly no way for me to go around that, and I’m actually the only developer doing all the work on the iPhone part, and on the server part. I’m 100% committed to add features (some good stuff coming in later release) but even having lots of users, it doesn’t pay for a the amount of work I’ve put in this project so far.

Oh but I don’t care if it doesn’t pay, I enjoy doing it.


Foursquare notifications & Foursquare Hackathon

I’ve added Foursquare pushes for your friends, only around a specific radius. I was tired to receive notifications for people checkin in on the other side of my city, I only wanted checkins for people around me (less than a kilometer). See this gist, and my Foursquare Hackathon submission, I would appreciate you voting for me once open.

Push Notifications for your friends only within a specific radius ?

1. Install or on your iPhone, run the app

2. Visit and connect your foursquare account, select the desired radius.

3. Done

Note: Step 2 will be embedded in the iPhone app in the next update.


Website update, Push Lite, new feature

I’ve never really be happy with the way you could create application to deliver push to other users, it lacked documentation of course but most of all, the authorization scheme was non standard (you had to use an api_key and pass_key, you would get a remote_id to tell which user you wanted to deliver to, etc). This is now history, you now have oauth to deliver Apple push notifications, and the developer website has been updated accordingly. Authenticating as a user to deliver push notification is now super simple : see this gist. To my knowledge, this is the first time OAuth allows you to deliver Apple Push Notification, and I’m happy to be the first.

It means anyone can deliver push notifications to any of my users. However you might not want to tell your users to buy my application, so you now have Push Lite, a free version of my popular application, full featured but including advertisements.

The main website has also been updated, thanks to Twitter Bootstrap, and I will add more features to it soon.