Software for Mac OS X Users

Keyword Assistant for iPhoto

Keyword Assistant is a plugin for iPhoto to make keyword management easier. The main feature, pictured at right, is an auto-completing text field for assigning keywords. This is much faster than using the built-in keyword panel.

For more information, including why either keywords or Keyword Assistant are a good thing, take a look at the ReadMe.

This version requires iPhoto 4.0.3 - iPhoto 6.0.6 and Mac OS X 10.4. It runs natively on Intel- and PowerPC-based computers. See the changelog for what's new.

Keyword Assistant does not support iPhoto '08 and I have no plans to support it in the future. In iPhoto '08, the native keyword interface is good enough that Keyword Assistant is not necessary! Yay!

Keyword Assistant is currently localized for English, Danish, Dutch, French, German, Italian, Spanish, Swedish and Russian. Send me an email if you'd like to help with a localization.

Mail Type Select
Mail Type Select adds Finder-like keyboard navigation to the list of messages in Mail. When the list of messages has focus,
when the message list has focus, selected rows are highlighted in color
Source for this plugin is available further down the page.

Note: Upgrading from Mac OS X 10.4 to Mac OS X 10.4.1 will disable this and all other Mail plugins. To reenable Mail Type Select, follow the directions in the ReadMe.

Gmail's Contact Import interface (June 18, 2004).
AddressBookToCSV is a one trick pony whose purpose in (artificial) life is to export contacts from the Mac OS X Address Book to a form gmail can import. That form is called CSV, a comma separated value format. If you want anything more from it, well, you've got the source (or you can ask me).


PadCaster is a command line tool that converts MacPAD application description files to RSS 2.0 feeds. A MacPAD file describes one application; it contains the same information as is found in a versiontracker posting. Thus, the feed PadCaster produces provides RSS software update notifications. Fraser Speirs coined the term Appcast for such feed.

For developers, this is a convenient way to offer an RSS update feed for your software. For users, this lets you create and subscribe to RSS feeds for applications that support MacPAD. This requires an aggregator that can use scripts as feeds, such as the excellent NetNewsWire 2.

See the readme for details.

Software for Mac OS X Developers

KFAppleScript Handler Additions
Makes it easy to call subroutines (with arguments) of compiled AppleScript scripts. Certain simple argument types and returns are translated. Here's an (artificial) example:
NSArray *numberObjects; numberObjects = [iTunesControllerScpt executeHandler:@"num_albums_by_artists" withParameters:@"Artist1", @"Artist2", nil];

Version 2 is greatly expanded in scope from version 1. We now translate all types that cocoa scripting knows how to handle (though independently of the unexposed built in functions). Also, the mechanism is now extensible. You can fairly easily set up your own objects (or other ObjC/AS objects) for automatic translation to and from applescript.

A subclass of NSTableView that adds Finder-like keyboard navigation. When the table has keyboard focus, This is the class that powers the MailTypeSelect plugin, and the project includes the source for that plugin. There are a few other example targets, including one that adds type-select to all table views system-wide. BSD license.

A subclass of NSSplitView with a few extra features: This class might also be of interest because it is pretty much a complete re-implementation of NSSplitView with an open source license. It's a good place to start if you're looking to add some functionality to NSSplitView and you're having a hard time getting it by subclassing Apple's class.

The latest version has better position saving, fixes a few bugs and tiles subviews more accurately than NSSplitView. See the changelog for details.

KFDecorator can produce, at runtime, a wrapper object that modifies the behavior of an underlying base object. Methods like -[KFDecorator setBlock:forSelector:] allow the user to provide FScript blocks to execute in response to messages. Messages without a specified FScript block are passed on to the base object. This can also be used to build an object up from scratch as an assemblage of FScript blocks.

This is extremely useful during the exploration and debugging stages of development. By building or modifying objects dynamically, it's possible to avoid the compilation stage until you have a decent idea of what code you'd like to implement.

The header file contains documentation and examples.

KFDecorator requires
FScript and is released under a modified BSD license.

F-Script Anywhere, old Input Manager based version
The F-Script project contains within it an application called F-Script Anywhere. This application allows one to add the F-Script framework into any Cocoa application without altering the application itself, along with enough UI to be able to create an interpreter or object browser within the running application. This is extremely useful as a development tool when used with one's own application, or as an educational tool for exploring the makeup of any Cocoa application.

F-Script Anywhere was not always part of the standard F-Script distribution. It was originally written by Nicholas Riley, and unfortunately the original method used for injection into a running app stopped working in Mac OS X 10.3. I wrote a quick and dirty temporary fork, called F-Script Anywhere SIMBL, that worked well on 10.3 and 10.4 while Nicholas was working on a reimplementation of the original to use mach_star as the mechanism for injection.

Since Nicholas (and Robert Chin) finished their good works and the application has been added to main F-Script project, this distribution is no longer necessary. But! For anyone who wants it, it's still here. I'm no longer maintaining it - I recommend the official distribution.

This version casts F-Script Anywhere as a SIMBL module. To install it, That should get it installed, but it still won't load into any applications. To control which applications it loads into, you need to edit ~/Library/Application Support/SIMBL/Plugins/FScriptAnywhereSIMBL.bundle/Contents/Info.plist. At the bottom of the property list, you'll see an array with key SIMBLApplicationIdentifier which is currently empty. If you add application identifiers to the array then apps with those identifiers will load FScriptAnywhereSIMBL. For example, to load into iPhoto and Mail:
<key>SIMBLApplicationIdentifier</key> <array> <string></string> <string></string> </array>
Now restart the applications you're interested in. If you've succeeded in loading the bundle into an application, that application will have an FSA menu.

The * character is special, and if you use it as an entry in the SIMBLApplicationIdentifier array then the bundle will load into all cocoa applications.

For documentation not covered here, please see the F-Script project for information concerning F-Script and F-Script Anywhere, and SIMBL for information related to SIMBL. Also, be sure to check out the F-Script mailing list.

Have fun!