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.


Having up to date contact information for employees is essential for any large company. Apple has focused on Microsoft's Active Directory and their own Open Directory as a solution for this, but, in our case, these were not options. We also wanted to have more control over how the information was presented with custom labels and to show relationships between employees like having an attorney's secretary listed on their card. To bridge this gap, I created ABSync - essentially a one way sync client.

The first challenge was to clean up our LDAP server and bring it into compliance with Apple's LDAP schema. Our employee list had been designed to be accessed via a browser on our intranet. This meant a lot of the information was spread out in different databases with different owners, and the data was accessed directly thru cgis. We had a LDAP server as a part of our email server, but it had never been utilized for much more than holding email addresses. Once we loaded the Apple LDAP schema, we were able to begin populating it with data from all those different sources, including phone numbers, addresses, map information, photos, dates, and relationships.

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

The second challenge was to bring that information into Address Book. In our environment, we needed a way to let people sync this information when they are working on our internal network. It had to be relatively quick and work in the background and be pretty much bullet proof as losing contact information to an attorney is a serious offense. Sync Services is a framework that lets you build a sync client and handles a lot of the heavy lifting normally associated with syncing data. You register for various types of sync data, including contact information, and when the client connects, the sync server tells the client what kind of sync to perform and handles passing whatever data has changed since the last sync.

ABSync is a command line application that acts as a one way Sync Services client since the source of our data is read only. ABSync talks to our LDAP server to determine what changes have been made on the server and then generates the appropriate sync changes. I had to run the sync as part of a cycle where any changes made to an employees card was first accepted, and then in a follow up sync returned to the state on the LDAP server. It is not exactly what the Sync Services engineers had in mind, but it actually works pretty well.

The result is an Address Book with an "Office List" group that always contains a list of our active employees. If you make any changes to the data we control (i.e. modifies or deletes of the group, group membership, or information on an employee's card) it is automatically reverted. Any additional information you add like notes is not affected.

QuickMail Conversion Tool

One of my first projects as a consultant writing a Cocoa application for MacOSX. I was approached by Chapman and Cutler, LLP because a friend of mine who was the manager of the Applications Development group had seen some articles I had written for oreilly.com on adding scriptability to Cocoa applications. (The articles are here, here, and here, if you are interested)

Chapman was a law firm that had been using macs for years, but they were about to transition from the classic MacOS to MacOSX. They used QuickMail Pro, a nice email application that also managed contacts, but it was not going to be available under MacOSX. Apple had their own Mail and Address Book applications that came with the new OS, but there was no easy way to export contacts from QuickMail Pro and import them into Address Book. So they faced the prospect of having to spend thousands of man hours moving contacts from the old system to the new one.

They hired me as a consultant to write a utility that would read in the exported contacts from QuickMail Pro, but this was still a laborious process. So, I reverse engineered the binary data files that QuickMail Pro used to store contacts and was able to create a conversion utility that automatically scanned a directory looking for those files and then added those found groups and contacts to Address Book directly using the new Address Book APIs. What used to take well over an hour and take many steps had been reduced to a single step and only a few minutes.

About me

Brad Dominy


By Language

By Frameworks