Brad Dominy

Selected Work

The following are projects I have written and designed, most of which are based on Cocoa for MacOSX. I have also written AppleScripts and used other languages like Python, PHP, Perl, C, and Java.

Smartr Contacts for iPhone

Smartr Contacts for iPhone is an automagic address book I helped write with a team of people at Xobni. It works with Xobni's cloud services to provide a comprehensive list of contacts you have interacted with via email or social networks and current insights for those most important to you.


Our VOIP system works with Cisco IP phones to illuminate a Message Waiting Indicator (MWI) light on the phones whenever a user has a new voicemail. It also allows for the delivery of those voicemails as wav attachments in emails. The only problem was that the system did not know when voicemails had been read and the Message Waiting Indicator (MWI) remained on all the time. This proved to be a distraction for people as they never could trust whether the light meant they really had new voicemail or not.

LightSwitch is a mail bundle which listens for the changing of the message read flag on delivered voicemails and then toggles the MWI light on or off to match. It is deceptively simple. First, mail bundles are not officially allowed by Apple and using them is an at your own risk proposition. However, gaining access to the guts of the Mail app was necessary in order to tie into the system. Second, our VOIP system let you toggle the MWI but only with a telnet session. Finally, the requirements were that it work in the background with zero setup, so it was a pretty tall order.

LightSwitch uses the account information for the voicemail IMAP account to lookup from LDAP a user's phone extension. It uses a technique called "swizzling" to replace a method with one of it's own in the objective-c runtime. This lets you listen in to the signals Mail normally sends internally, including the one when a message read flag is updated. Whenever a voicemail message is read, LightSwitch checks to see how many unread messages there are and if there are none, it starts a telnet session to our VOIP system to turn the MWI light off for that user's extension. It can also turn the light on if you mark a voicemail as unread. It all happens within a couple of seconds so user's are no longer worried about the system getting out of sync.

It installs by just being dropped into a user's Library/Mail/Bundles folder and by updating Mail's preferences to allow for bundles. Lately, Apple has been adding a couple of extra layers of protection to make sure that mail bundles are compatible, so while they are still not officially sanctioned, it looks like they are going to tolerate them for the foreseeable future.


A difficult task within any organization is the backing up of client machines. We have over 300 macs which need daily backups, so I created Backup to address this problem. Essentially, it is a front end to rsync, but it handles the scheduling, authenticating, selection of items to backup, and reporting in a way that a simple script could not.

The Backup System Preference sets which folders in a user's home directory get backed up and when the daily backup occurs. The destination is any server on which the user has an ssh account, which in our environment is a XServe for their floor or office. The Advanced button brings down a panel which lets you configure login information for the destination server, options passed to rsync or other unix tools, exclusions, message formats, and logging. The user's password is stored in the user's KeyChain to provide protection. It also provides realtime viewing of the backup log file while a backup is running and displays status messages to the user letting them know when the last successful backup occurred or if there were any errors.

The command line tool lives inside the Backup System Preference so the whole thing can be installed by just dragging and dropping. The command line tool uses the expect command to pass along the user's password fetched from their KeyChain and to add the server to the client machine's known_host file. This avoids having to use public key authentication between the client machines and the servers. The command line tool monitors the output from the rsync process and collects information that is sent to a Backup Status Server when the backup completes. Backup log files are automatically rotated and additional messages are logged to the system log.

Overall, Backup allows for easy setup with not much more than a server, username and password, but it allows for lots of customization and provides feedback to both the user and to the central support personnel.


Before moving to iPhones, we used Treos with the SprintPCS network as our mobile phone platform. One feature of the Treos was tethering to a laptop to give network access while out of the office. The only problem was that the connection would time out quickly and have to be re-established taking several minutes each time. Our CIO got so fed up with this annoying problem that he asked me to come up with a solution.

So, I wrote pppalive which uses the SystemConfiguration framework to monitor the state of ppp connections. When connected to SprintPCS it would either send out a ICMP ping packet or request a web page from our corporate website, which gave us the added benefit of monitoring usage. We used launchd to keep the pppalive process running automatically. Best of all, there was no interaction needed for it to work so all a user had to do was start their connection and it would continue for as long as they wanted.

Chapman PDE

Law firms go thru lots of paper which costs a small fortune every year. I was asked to write a Printer Dialog Extension for the MacOSX printing system to let users specify a matter number that would be passed to our high volume printers and then processed by the billing department to help recoup printing costs. It works by registering a view to be displayed in the print dialog. The view has a simple combo box for entering a matter number, but it also uses the low level preferences system to store the most recent matter numbers. When a matter number is entered, it is passed to the CUPS system in a print ticket where another custom filter, written in C, extracts the matter number and then injects it into the raw postscript.

Our high volume printers would process the print jobs and the inserted postscript with the matter number would cause the printer to log that print job along with other information like number of pages printed, document name, and requesting user to a log file. The billing department would then fetch those print logs and process them for billing nightly. I also wrote the scripts for fetching the printer log files.

This was a pretty good solution and allowed the law firm to recoup quite a bit.

About me

Brad Dominy


By Language

By Frameworks