Historical Software Projects
These are some of the projects I've worked on over the years on the side.
You may also find various contributions I have made to others' projects, and other miscellania, on my GitHub.
Converge (iOS library; 2012 – 2016)
I originally created this iOS library while working at a former employer. It is a REST client to synchronize data on a web server to a Core Data store in iOS apps. Since my employer allowed me to open-source it, it is available for me or anyone else to use in other projects. I haven't worked on it recently, but I may do so again if the need arises.
Re-Search for Safari/Mac (Safari JS extension; 2014)
I maintained this for a while, but I did not have the time or the interest to rewrite it after Apple deprecated the original Safari extension API. Instead, I got in the habit of appending a !bang to the end of my search query in DDG to repeat the search in another engine.
Re-Search for iOS (iOS app; 2014)
This was a version of the above, which I made for iOS, for the same reasons. Unlike the Mac version, it uses the native iOS Extension API. I submitted it to the App Store, but Apple rejected it because they did not consider it useful.
Launchpad Editor (Mac app; 2011 – 2012)
When Apple introduced Launchpad in Mac OS X Lion, I was excited to try it as an alternative to keeping tons of icons in my Dock, or launching from several different Applications folders. However, when I started using Launchpad, its limitations quickly became clear: app icons were dumped apparently randomly into the UI, and reorganising them was a tedious affair due to the slow animations and originally touch-oriented UI design. I soon discovered that there was an SQLite database I could edit directly, and thought it would be a fun way to teach myself OS X programming, to make a simple editable list GUI on top of this. And so, that's exactly what I did with Launchpad Editor. I used it for a while myself, but eventually came to the conclusion that even with my slight improvement, Launchpad was still too slow and cumbersome for me personally to want to use it on a daily basis. I continue to hold out hope that Apple will improve its built-in functionality, but after many years without any changes or improvements from Apple, there seems to be little indication that this will happen.
ddg-safari (Ruby script; 2011)
Back in the day, I wanted some way to set my default Safari search engine to DuckDuckGo, but this was before Safari had that option available. I found a way by setting the default engine to Yahoo, but overriding Yahoo's DNS name to redirect it to my local web server in my /etc/hosts file, which would then redirect to DuckDuckGo. I emailed Gabriel Weinberg (the founder of DuckDuckGo) to tell him about this, and he set up an official server to do the same, making the local web server requirement unnecessary. (Gruber even wrote about this, which was exciting!)
However, the hosts file hack was still necessary. Thinking that this would be difficult for many users to accomplish, I created a Ruby script that could display a native-looking Mac UI with the help of Platypus and CocoaDialog (defunct?). This was before I knew how to make native Mac apps, but it did the job. The script would simply ask for superuser authorisation, then add an entry to your hosts file. Or if desired, it could 'uninstall' by removing an entry it had previously added.
Nowadays, of course, none of this is necessary; as of iOS 8 and Yosemite, you can simply set your default engine to DuckDuckGo in Safari preferences. But it sure impressed me a lot at the time, that the founder of DDG was so eager to go above and beyond for me and my fellow users.
Laundry Minder (iOS app; 2010 – 2015)
This was my first iOS app, a project I used to teach myself iOS native development (I had previously done mostly web development). It has a special place in my heart, not least of which because it helped me get my first iOS job; and also because I personally used it over the years, in order to time multiple loads of my laundry at the shared laundry facilities where I used to live, something the built-in Clock app was unable to do for me. I eventually moved away and no longer personally needed it, and did not have the time or interest to continue updating it for new framework versions and device models as required by Apple, so it is no longer available on the App Store. As of writing, Apple's built-in Clock app has existed for 12 years and 12 major operating system versions, and still cannot do multiple timers.
hnPhotoAlbumPlugin (PHP; 2009 – 2010)
On my personal web site, I used to have a section where I would post photos. Rather than hosting them myself (and this was long before Instagram), I found it convenient to host them on Google's now-defunct Picasa service. So I made this plugin for the Symfony framework (which my personal web site ran on at the time) that would use Google's official API to enumerate all the photo albums and photos and display them on my web site.
Redline Addons Updater (Bash script; 2006)
In the mid-2000s, Ambrosia Software (RIP) was one of the extremely few companies making original games for the Macintosh. (Ambrosia also happened to be based in my hometown of Rochester, NY - too bad I never got to work directly with them.) One such game was Redline, of which I was an enthusiastic supporter. The game was designed with moddability in mind (then referred to as 'add-ons'), and Ambrosia hosted an official FTP repository of fan-submitted content. I noticed that the authors of these add-ons would issue updates from time to time, and it was kind of a pain to have to keep track and download them individually. So I created this script, using Platypus to provide a very primitive, but still somewhat-Mac-like GUI. It was basically a wrapper around wget that grew with more logic to handle edge cases. It would mirror the entire FTP site to a local folder, which I think caused some mild perturbance at Ambrosia, but I don't recall them ever explicitly dissuading people from using my 'app', and it was somewhat popular in the community for a time. This was one of my earliest experiences with interacting with other people who were actually using my software.
Radiccio (PHP; 2005)
Two years before the iPhone existed, Sony's PlayStation Portable (or PSP) seemed like a miracle of technology. You had a Wi-Fi connected device in the palm of your hand! It had a web browser! It could also stream audio over RSS feeds, which I think was intended for listening to podcasts. Sure, you could copy some MP3s onto your Sony® MemoryStick™, but those things were expensive.
So instead, I came up with this PHP script, to run on a local web server on my PC. You could just point it at a folder of MP3 files, and it would generate a dynamic RSS feed. Then you could add the URL of your feed to the PSP, and stream your music... anywhere! Look, it was exciting in 2005, okay?
The name I came up with for this project was a little more clever than I think it deserved. I have long considered reusing the name for some other audio-related project in the future.
Sphere Break Solver (PHP; 2004)
In the video game Final Fantasy X-2, there is a minigame (a game within the game, for those not familiar) called 'Sphere Break'. In order to succeed at the overall objectives of FFX-2, one must at times play Sphere Break. I enjoyed playing FFX-2 for the most part, but I did not enjoy Sphere Break. So I made this program to play Sphere Break for me. Basically, you take the output of the game and use it as input into this program, which then calculates a good (not optimal, but close) move for to you to play. Following this process, I found I could win easily, and then more quickly get back to the part of FFX-2 that I actually did enjoy.
As a side note, in 2004, I don't think I could have imagined that Square Enix (the corporate successor to the original developer) would continue to be marketing and selling new versions of this game on modern platforms, 15 years later. Perhaps I or someone else will have need of this old program again.
- Other projects: I have been making software as a hobby since I was in 5th grade. Unfortunately, much of it has been lost along the way, due to the cruel natures of time and magnetic media...