I've written some scripts using AppleScript and PHP that sync Basecamp and OmniFocus. In my testing, they seem to work pretty well, but they have some limitations and probably need further refinement.
By "syncing" I don't mean the sort of true syncing you see in something like Mobile Me (when it works :rolleyes:). In true syncing, the software compares change logs between devices and asks the user to reconcile conflicts. Achieving true syncing would take more programming time than I've got. Instead, my syncing system basically simply consists of two scripts in Applescript: "Basecamp to Omnifocus" and "Omnifocus to Basecamp." As the names suggest, the "Basecamp to Omnifocus" script copies tasks from Basecamp to Omnifocus, while the "Omnifocus to Basecamp" script copies tasks the other way. Since each of these scripts is one-directional, the user has to be careful to avoid editing conflicts that would lead to overwriting information that they want to keep on the destination end.
My system is based on the recognition that there are some differences in information architecture between Basecamp and Omnifocus. For example, Omnifocus allows for "contexts" in keeping with the "Getting Things Done" model, but Basecamp doesn't. Also, Basecamp's to-do items are organized into a three-level hierarchy of "Projects / To-do lists / To-do items," whereas Omnifocus has a two-level-or-deeper hierarchy of "Folders / Tasks ( / subtask ...)" that isn't easily replicated in Basecamp. Another difference in the data model is that Basecamp now allows attaching threaded messages to its to-do items, which is impossible in Omnifocus. Finally, Basecamp is designed as a collaborative tool for groups, so to-do items can be assiged to designated individuals responsible parties, whereas Omnifocus is designed as a task-management tool for a single individual.
Due to these differences in data models (and some others that I won't bother to list here), perfect syncing between Basecamp and Omnifocus is impractical. I therefore wrote my scripts on the assumption that the main use case for syncing is to enable single individuals to automatically sync their personal to-do items (without the threaded messages), while ignoring to-do items that have been assigned to other people. I also assumed that syncing should enable people to maintain personal tasks in Omnifocus (i.e., "buy milk") that are NOT synced to Basecamp. My scripts therefore include a configuration setting which designates a single folder in Omnifocus. Items inside that folder get synced to Basecamp; other items don't.