Paperclip started out as an entry in the 20MacApps promotion (more on this later). It was developed in response to my own desires in an application. I like the concept of Stickies but (1) they were limited to an application or the Dashboard layer when they screamed to be associated with documents and (2) I really hate Marker Felt. With that in mind, I started working on Paperclip in the middle of December and finished it about a month and a half later.
The inspiration
Paperclip is one of those app ideas that I’ve been bouncing around for a while. It started way back with IronCoder 0. Peter Hosey released a hack that displayed Mardi Gras beads on windows. Combine that with my general disappointment that Stickies don’t really stick to anything. They’re just text windows. I always wanted a Stickies that would attach to windows. Well, when I saw Mr. Hosey’s hack, I knew it was possible. When I was asked to come up with a new app idea for 20MacApps, this was the first thing to come to my mind.
There are no kings in the land of Accessibility
The Accessibility framework looks a bit like an undervalued step-child. I started by messing around with the documentation and trying to figure out how it worked. I failed. So I copied Mr. Hosey’s IronCoder code into a new project and started to build around it. It worked fairly well but Mr. Hosey’s code didn’t retrieve all of the information I needed and it required polling. The polling wasn’t a game-breaker but it did mean that the app ran around 3% CPU activity at all times on my Mac. Bleh. I could do better.
Aside: This isn’t to say Mr. Hosey’s work was bad. It was a hack put together in a weekend for a contest. The documentation even notes that polling isn’t the most efficient method of getting data. It was great code, and I had the time so I improved where I could.
When I delved deeper into figuring out Accessibility, I found out that there were a lot of caveats. I figured out how to retrieve information from notifications instead of polling (goodbye constant CPU usage) and a few other things. I also found out that Accessibility information is implemented very spottily. Some applications are really good about it, others are downright bad. Pretty soon, I had made enough changes and workarounds that my code resembled Mr. Hosey’s original code only in that we both used the same framework. I also found out from online mailing list databases ($DIETY bless them) that some things in Accessibility are just the way they are. I never felt like anyone had any confidence with using the Accessibility tools. I know I never did.
Core Animation. Or, how I sold my soul to the Delicious Generation
I have to admit that Paperclip uses more custom controls than all of my other applications combined. Actually, I haven’t counted, but it wouldn’t surprise me in the least.
The main note windows are completely custom, obviously. But that meant that I needed custom scrollers and a custom resizing widget. It also meant that I found a documentation error for NSScrollers.
More to the point, once I started, I couldn’t stop. At first, I had color preferences based on a color picker. It offered lots of options but, frankly, looked horrible. I decided to use Apple’s Stickies widget-style color controls. Then came the Note Viewer. I really went into that with this idea of “what if”. I started using Core Animation. It really is quite easy to implement some very simple yet eye-catching animations.
I haven’t sold out yet. I still believe in function over form and I won’t implement something just because it looks good. I still believe that using the standard widgets is preferable but I’ll admit to having fun working on the NoteViewer. I also think it’s fun to use.
Nu to you
Early in development, I realized that I’d have a particular problem. Since Paperclip works system-wide with many different apps and utilizes a not-quite-everything-I-need framework, I knew I’d need hacks to make it work properly with certain applications. With the wide range of applications on OS X, there could be dozens of app-specific schemas to retrieve the information I needed. Hard-coding these schemas into Paperclip is possible but maintenance would be a major chore. I wanted some way to break it up.
At first, I thought I could leverage OS X 10.5’s built-in PyObjC support. That didn’t work so well. I found out that using threads (concurrently running tasks within an application) would crash Python when ending a session. Since I assumed that the ScriptingBridge would be a significant help and importing the ScriptingBridge into Python would start some threads, I couldn’t use it. This is my fault as PyObjC works properly everywhere else. I just didn’t know how to call Python files inside an interpreter embedded in an app.
I tried to figure out how to stop those crashes when using Python but eventually gave up. The Nu language/framework has been developing nicely. I was already a big fan and decided to go with it. I’d like Paperclip to be known the first commercially shipping application to actively make use of Nu, but I don’t know if it’ll have that distinction. I’m happy to use it and support it in any way that I can.
In retrospect, I had the option of debugging my problems with Python, using Lua, learning to use the included Ruby framework, or going with Nu. I also have my Javascript bridge from SiteTagger and my templating code from Share could be modified to act as an interpreted scripting language. I also could have used F-Script or an Applescript-based solution. We Mac developers have a wealth of options when it comes to stuff like this.
The registration window
I just want to take a moment to explain the registration window. I’m really surprised that developers don’t put a bit more thought into it. Open up any given application and look at its registration window (if possible). You are more than likely looking at two (or three) text fields and a couple of buttons. It’s bland, uninteresting, and uninviting. I dislike it.
Rogue Amoeba has the right idea. The registration window to Audio Hijack shows a beautiful certificate when you’ve registered. I love it. It’s a nice little “thank you” to me. I want my users to know that I appreciate it when they register an application. Registration windows are not an after-thought that’s added after everything else is done. It’s something that I take as seriously as every other part of my application. So I did something a little different.
20MacApps
This is probably the most interesting bit about Paperclip. I’ve mentioned before that it was developed for 20MacApps but it wasn’t released there. I want to say up front here that I don’t hold any ill will towards the people behind 20MacApps. I’ve received a bunch of emails asking me about it and a lot of complaints but I’ve tried not to say anything negative. I think the promotion was pretty cool. 20 brand new Mac applications in 1 year still sounds awesome to me. I sincerely hope that the promoters get their stuff together and start making good on the offer. I was happy to participate and I’m happy to give out registration codes to anyone who sends proof of their participation.
That said, I’ve been out of contact for several weeks with the guy(s) behind 20MacApps. Paperclip was supposed to be released in January but then it was pushed back to February (not by me) and then the forums at 20MacApps went down and then I started getting emails from customers asking me what was happening and… Well, I just decided to release Paperclip and hope 20MacApps caught up.
Very basically, the timeline was that I was contacted a week or two into December and asked to participate. I said I would if I could find something worth doing. I came up with the idea of Paperclip and prototyped it in about a week. I agreed to the promotion and started working hard on Paperclip. I had something that worked reasonably well by the end of December. There was supposed to be a beta program that was part of the 20MacApps promotion. The reports I received were sporadic and always a few releases behind what I was working on. Usually, I had squashed bugs before they were reported to me. I also didn’t have direct access to my beta testers and I couldn’t run my own beta program.
I was eventually told that Paperclip would be the first app released. I was a bit shocked but I rolled with it. I tried to get as much done on Paperclip as I could but, with only about a month and a half of development time, there were a few things that didn’t quite make it. There are also some bugs that were a result of not having access to my own beta program and from the unusually short development period.
To be clear, I haven’t received any remuneration from 20MacApps (yet) and, for the time being, I don’t expect to. I know a lot of 20MacApps customers have requested refunds and I don’t know if the promotion will continue. Like I said, I was excited by the concept and I hope everything will get resolved. There were only two (I think) apps revealed by the time the forums went down so I’m more than a bit curious what other developers were involved and what information they have.
2 comments on “Paperclip post-partem”
Regarding NameNetwork | Mac Recon :: an operative mac blog:
April 23rd, 2008 at 8:05 am
[…] People lost money on 20MacApps, if not before. I lost money, too. I wish to extend my sincere apologies for those who got involved with Mark Howson because of something that was written in this website. I made the mistake of being part of the blogs that gave him the much-needed publicity he needed to get his locomotive going — he just never bothered to set the tracks for it. Additional reading: -Mark’s final words -MacHeist forum thread against Mark Howson -Second MacHeist forum thread against Mark Howson -Grayson’s first blog entry on 20MacApps -Grayson’s second entry on 20MacApps […]
mac.newsly.com » Blog Archive » Regarding NameNetwork:
May 6th, 2008 at 10:42 am
[…] People lost money on 20MacApps, if not before. I lost money, too. I wish to extend my sincere apologies for those who got involved with Mark Howson because of something that was written in this website. I made the mistake of being part of the blogs that gave him the much-needed publicity he needed to get his locomotive going — he just never bothered to set the tracks for it. Additional reading: -Mark’s final words -MacHeist forum thread against Mark Howson -Second MacHeist forum thread against Mark Howson -Grayson’s first blog entry on 20MacApps -Grayson’s second entry on 20MacApps […]
Leave a Reply