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.


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.

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.

About me

Brad Dominy


By Language

By Frameworks