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.


We use Cisco IP phones which respond to xml commands, including one to initiate a dial, so I created Dial to better integrate the phones with our daily work flow. Bill back is a tough area, mostly because of users not taking the time to enter in the proper information. While our phone system had the capacity to do bill back, no one ever took the time to enter in a long string of digits in the proper format in order to charge a call to a client. Dial makes this process easy. It remembers the most recently used matter numbers and associates the last matter number used when dialing a phone number to automatically populate the matter number field. When you dial, it takes care of everything for you. Additionally, it maintains a call log so an attorney can review what calls they made recently if they need help accounting for their hours.

All names and personal info in the above images have been changed to protect the innocent

Dial works with the Address Book to show who's number is being dialed. As you put in a number, it searches for a match and if it finds one, it will show their picture and job information. Speed dial numbers let you keep numbers you need all the time handy and can be dialed quickly with just a double click. Adding a speed dial number is handled by dragging and dropping vCards onto Dial. Phone numbers can be entered directly or they can come in from any application that uses Services. So, if there is a phone number on a web page, you can just select it and using Services it will automatically launch Dial and enter it into the phone number field. This also works from other applications like Address Book, iCal, TextEdit, iChat, Mail, etc.

Office Location

Apple had a means of marking a person's office location in their LDAP schema by specifying a map image and then their coordinates. A utility called Directory in Leopard would show the map with the point marked with a pin, but it has since disappeared in Snow Leopard, probably because it was a little bit buggy. The whole setup seemed oriented towards smaller organizations running Open Directory, because it had a built in limitation of 500 entries and was quite slow when looking at our LDAP server. Still, it is a cool idea, so I decided to bring it to Address Book as a plug-in for our company employees.

All names and personal info in the above images have been changed to protect the innocent

The plugin works by first telling Address Book what kind of information it responds to and whether it is valid for that card. In this case, we let Office Location run if the user is looking at a Chapman employee's work address. For everything else, it is grayed out. When the user chooses the Show office location... from the popup menu, a new window is created and we fetch information from our LDAP server. This included some contact information, picture, which map to show, and their coordinates. Since we are running as a part of Address Book, it was important to not bog down the main thread, so this all happens in a background thread as a part of the new NSOperationQueue protocol.

When the fetch is done, it creates a PDF view with the office map and then an overlay with the image of the pin at the right location. This allows for easy zooming and centering without having to continually redraw the map. The window is a part of Address Book, so when the user quits out, the map window goes away as well.


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.

About me

Brad Dominy


By Language

By Frameworks