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.

Contractions Tracker

We attended birthing classes before our daughter was born and they gave us a little workbook with instructions on how to track contractions so that we would know when it was time to head for the hospital. Labor can take a while though, so in order to help me pass the time I wrote this application. I promise I was not sitting by writing code while my wife was in pain. She was actually pretty comfortable and never exceeding a 4 on the intensity scale.

This application is a great example of how CoreData can make things easy. Most of the hard work of handling data is done for me and all I needed to worry about was the logic of the app. On top of that, bindings lets you display your data in a straightforward way. Overall, I think I spent about 2 hours writing this application and then used it for about 6 hours before my wife's water broke.


Our IT department has a large wall mounted monitor that we use to keep tabs on various systems. Kiosk is a screen saver that uses plugins to generate views which are then displayed randomly or in round robin fashion. It uses some nice cross fade effects and lets you define how long each view is shown. Views are dynamically generated so they can be continuously updated with fresh information throughout the day.

We have plugins that show network status, the status or backup, and our department's calendar. It is a good way to alert people of a problem as anyone passing by may see an issue and can bring it to the right person's attention. It is also very stable and has run for well over a year without any intervention.


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.

Backup Status Server

Backup Status Server creates a central place to log the status of over 300 user's backups using my Backup system. It is basically a web server that listens for http requests and processes input as if from an html form. Each backup client sends along information like user information, backup destination, client information, backup size, duration, etc. The Backup Status Server uses CoreData to manage all of that data. When a report is made, a new user is automatically created if not found, so registering a user is very simple - just run a backup! From then on a record of each backup made for that user will be kept.

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

An important aspect of backup is detecting when a backup is not working. Backup Status Server checks nightly to see if any of the registered users have not reported in. If they have not been seen in 1 day, they are listed as overdue. If they have not been seen in more than 5 days, they are listed as missing. This creates a nice filter for the support personnel as they will only see support requests generated for backups with errors or those that are missing, and it is easy to determine whether there is a real problem or if the user is just out of the office. There are also settings to change what port the server uses and to adjust how long to keep backup records.

The Backup Status Server also responds to requests from a normal web browser. It will generate a table of all the current backups and their status or you can look at a specific user's backup history. I use this function to generate a graphical representation of the state of backup for our users which is displayed on a wall mounted monitor in our IT department as part of my Kiosk project.

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