An EventMachine APN server & a Redis-backed library used in production at Zapkast to push iOS notifications
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
bin Merge branch 'master' of into mw… Jun 30, 2012
Rakefile version bump 0.1.1 Feb 21, 2012


Apn Server & Library for Ruby


I want:
- persistent connection to APN Servers (as Apple recommends)
- real-time notifications (no regular polling a la Resque)
- super easy to use in Ruby and any languages (as easy as enqueuing a serialized JSON hash in Redis)
- persist and queue messages when server is down
- horizontal scalability and out-of-the-box load-balancing
- fast daemons

So I built ApnMachine. We’re running it in production at and find it very reliable.

Remaining Tasks

  • Implement feedback service mechanism
  • Write real tests

ApnMachine Daemon

To start ApnMachine, tell it where is your redis server and the complete path to your PEM file.
That’s it.

Usage: apnmachined [options] --pem /full/path/to/pem
  --redis-host bind address (defaults to
    address of your redis server

  --redis-port port
    the port of your redis server (defaults to)

  --apn-host host
    APN Server host (defaults to
    Use 'sandbox' to connect to

  --apn-port port of the APN Server
    APN server port (defaults to 2195)

  --pem pem file path
    The PEM encoded private key and certificate.
    To export a PEM ecoded file execute
    # openssl pkcs12 -in cert.p12 -out cert.pem -nodes -clcerts

  --pem-passphrase passphrase
    The PEM passphrase to decode key.
    Default to nil

    usage message

  --daemon or -d
    Runs process as daemon, not available on Windows

Sending Notifications from Ruby

To send a notification, you just need a working Redis client that responds to rpush. It doesn’t matter if you’re
in an EventMachine program or a plain vanilla Rails app.

  ApnMachine::Config.redis = @any_redis_client
  ApnMachine::Config.logger = Rails.logger


  notification =
  notification.device_token = apns_token
  notification.alert = message
  notification.badge = 1
  notification.sound = 'default'


Apnserver is hosted on rubygems

  $ gem install apnmachine

Adding apnmachine to your Rails application

  gem 'apnmachine'


The MIT License – Copyright © 2012 Julien Nakache
Widely Inspired from groupme/em-apn and bpoweski/apnserver