My First Open Source Project: Classic Finder

I created a clone/re-creation of the Classic Mac OS Finder in modern Cocoa and Objective-C. I attempted to make it as pixel perfect and to-scale as possible by referencing screenshots I found around on the web and a tangerine iBook running Mac OS 9. This Finder clone is functional. It will really (probably poorly) perform Finder operations on your computer’s file system.

Screenshot of classic mac finder with finder windows open

Why Did I Do This?

At what now seems like the height of criticism regarding flat design infiltrating modern user interface design (...paging @eli_schiff), I realized that we basically have already done flat design before, and did it well, in the 1980’s and 1990’s. Back then, this style was used more out of necessity, in contrast to why it is used now. Even the most top-end machines were outputting like 256 colors on a good day. The glistening photorealistic appearance that was done up so well in Mac OS X 10.0 through 10.9 was simply beyond the technology of those earlier days.

So, we had efficient and utilitarian flat user interfaces, generated by 2D graphics APIs, which were used to output crude collections of lines, squares and rectangles, in order to denote clickable buttons and widgets and controls on-screen.

It was about 2015 when I had this idea that it would be funny to see the older, truer flat design again, and see it run natively on a modern computer operating system. Mac OS Yosemite had been released, which replaced all of the photorealistic user interface bits and pieces with stark flat user interface bits and pieces. It was mostly just a cosmetic overhaul, as the organization and flow of the user interface didn’t really change all that much.

But to me, the new UI appearance looked hyper and muddy, and the UX had all sorts of rough-edges and oversights in operation. I kind of resented it. Sure, it was cleaned up, but all of the attention to detail and whimsical and delightful design that Mac OS used to champion had been scrubbed, along with the reliability of the yesteryears. This resentment sort of led me into a mode of thinking about this new design in a juvenile way. I wanted to make a mockery of modern flat design by super-imposing the original, "pure" flat design on top or in place of it.

The classic Mac OS interface, I realized, could be easily (if not tediously) reconstructed on modern Mac OS. I wouldn’t even have to drop lower than the Cocoa drawing APIs (to Core Graphics) to draw it!

A smaller, more secondary reason for creating this was to sort of observe how a Classic-era app might run on today’s hardware. As our hardware gets beefier, it seems like our software gets chunkier. If we could port yesterday’s software to run natively on today’s hardware, how might it perform? Very fast, I’d imagine. Likely so much so that we wouldn’t need a 2.0+ GHz machine to do what now seem like common computing tasks. Discussion on this could (and maybe should be another post).

A Long Journey

When I started this project, I first tested drawing the controls using HTML5 canvas. It worked wonderfully. I created a few controls, got a bit of interaction going, and decided that I could really, truly and honestly port this to native to create an application of some sort.

This project was always sort of a side project, and I wanted to make something for the true Mac-heads who might get nostalgic about this kind of a thing. No one else would care. It’s taken me about two years to get this project to a point where I feel okay about showing it to the world. It has been an on-and-off development effort, fraught with delays due to lapses in my own knowledge and skill, internal conflict over architecture decisions and competing priorities outside of work.

Further delaying this project was my attempt to use Swift. Swift was newish. I was curious. Even though I had a somewhat proficiency in Objective-C, I wanted to learn the new thing. So, I created all of the initial classic UI controls in Swift playgrounds. I subclassed NSControl, then added them as subviews and got off and running.

I made a lot of progress in this initial round of work, but got dragged away to other things for a time. When I returned to this project, a new version of Swift had been released and caused parts of all of the earlier work I had done to break.

I tried refactoring the code using Xcode’s tools, but it mangled things and made a mess. I had to revert the changes in source control. And then I decided to port everything I had done from Swift to Objective-C.

I certainly have my gripes with Swift, as do others (all I wanted was a better Objective-C, not a new language), but for this project, one where I’d be sporadically working on and off on it over what turned out to be a few years, the stability of Objective-C actually allowed me to ship this damn thing without giving up on it because of my existing Swift code breaking again and again.

File Managers Aren’t Cool

I first set out to create a realistic clone of the old “About This Mac…” dialog from classic Mac OS. I got somewhat far with this, but at some point, I kind of just stalled out. Yes, it’d be geeky and nostalgic, but I eventually decided to put About This Mac on hold and switch to creating a clone of the classic Finder. For some insane reason, I thought it would be an easier project.

For my target audience, I mean these are the people who get file managers and file systems. They LIKE file managers and file systems. They are likely lamenting the poor support of these tools in newer “futuristic” platforms like iOS.

People living in the future don’t like file systems, the internet tells me. People who use iOS are living in the future, the internet tells me. Quit living in the past, the internet tells me. Quit being so damn anachronistic you old-cranky-aging-luddite, the internet tells me. (I’m 27 y/o, BTW.)

What could possibly be a better way to completely and publicly cement in my resentment about the general direction of modern computing, than by making a replica clone of a file manager done up in classic Mac OS chrome?

Our Modern User Interfaces are Gigantic

I’ve learned many things throughout this journey. One of them is that modern user interfaces are absolutely gigantic compared to the user interfaces of the earlier days.

I mean, I guess it kind of has to be that way, in the age of high DPI monitors and bad eye sight, but WOW. Run Classic Finder just once and you’ll see what I mean. We could all fit more data on our screens if we scaled these interfaces down a bit, especially since we’ve already decided to volunteerly degrade our user interfaces embrace flat design again.

In Usage

Classic Finder actually works like the original Finder did, with the same spatial window behaviors as before. There are a lot of features that are yet to be implemented, but for what currently does work, it's sufficient enough for a stroll down memory lane. You could really use this as a file browser and launcher day to day. However, going back to the feature set of the original Finder feels a bit constricting after using the modern, NeXT-derived Finder that we have today, with it's sidebars, toolbars and the browser metaphor (back/forward) available. I'd have a difficult time trying to use Classic Finder on a full-time basis, I think.

My First Open Source Project

I am making this project open source. It is my first open source project. I really don’t know what anyone is going to do with it, outside of a select few of us who can appreciate this kind of a thing, but I want it to be malleable and maybe something fun for other people to play around with.

I would hardly call this project finished. There’s a lot of missing functionality and edge cases to be filled in and addressed, so I’ll be adding to it in my off-time, when I can. The goal was and still is to create a completely functional recreation of the classic Mac OS Finder. I’d love to get pointers and commentary from seasoned Cocoa programmers.

Also. This is not my best code or application architecture work. I’d never send code like this to a client or ship it into a production environment. Don’t judge me too harshly (yet).

I am licensing this project under GPLv3. I want this project to stay free and open for everyone, for posterity, as an archive of a collection of ideas, design and language that has sort of been forgotten in time. If you would like to use bits and pieces of any of this code in a project or usage that GPLv3 doesn’t really work well with (iOS/macOS App Stores, etc, etc…), get in touch.

Special Thanks

Resources

References