Last night I stayed up till 2:00am building a Ruby on Rails app that sends me a text message whenever John Gruber publishes a new post at DaringFireball. I built and deployed the app without paying a dime1, which is pretty incredible when you think about it.2 Every 10 minutes a cron job scans the DaringFireball RSS feed for new items, and if any are found, I get an SMS with the title and shortlink from a Philadelphia area code, which I’ve added as a contact to iCloud complete with avatar.
The requirements for such functionality were database persistence, Twilio API integration, a scheduler task, and deployment to an external machine other than my own so that it would reliably run 24/7.3 With minimal experience with either Ruby or Rails, I built the entire thing from start to finish in less than 5.5 hours.
This goes to show that once you’ve worked with a framework and have a good knowledge of how routes, models, controllers, and views work, you can pick up the fundamentals of a foreign framework fairly well if it’s been well built.4
RSS is dead, I can’t do Twitter, and while I wouldn’t want SMS interruptions on very many sites, DF is on the top of the list.
If you’re interested in peeking at the code for this, the repo is publicly accessible on GitHub. Sensitive strings like my Twilio API credentials are stored in environment variables, which are a breeze to set up both locally and on Heroku. This allows for simultaneous security and overall project availability to the developer community, the best of both worlds.
- If I want to avoid the restrictions of the free phone number changing every 45 days or the “Sent from your Twilio trial account” sentence that’s prepended to every sent message, I’ll need to upgrade to premium Twilio, but their pay-as-you-go model is very reasonable. ↩︎
- Imagine what it would have cost to pull this off 12 years ago. ↩︎
- Heroku’s free plan can only be active 18 hours due to its imposed Dyno Sleeping. My cron job only runs a rake task and apparently this doesn’t qualify as a “worker dyno” and thus this limit does not affect my app’s functionality in any way. I’m good with that. ↩︎
- Sorry for all the f’s. ↩︎