Release and Creation of Pinbook 1.0

I’m unbelievably excited to be officially announcing the release of an app I’ve been working on for a while now: Pinbook. Pinbook came out late last Thursday while I was at the Çingleton conference in Montreal, and has gotten some attention and great feedback already, so this post is a little delayed. If you haven’t heard about it, Pinbook is a client for one the services I use the most: Pinboard. If you’re not familiar, Pinboard’s self description is a “a fast, no-nonsense bookmarking site,” and that’s very apt. It lets you save bookmarks online, assign tags to them and find them later. It also has an interesting pricing model based on a one time fee that I find really appealing.

I use Pinboard all the time for saving links, but I’ve had trouble using as much as I’d like, because there hasn’t been a great way to use it from my iPhone. I’m unbelievably proud to say that as it stands, Pinbook is an app that I use every day and that lives on my home screen. If you’ve heard enough and want to go buy it in the App Store right now, I’m fully supportive of that instinct. But Pinbook has also been an outstanding chance to challenge myself in ways I never have before — so if you’d also like to hear about what went into making it, continue on.

The Making of Pinbook 1.0

For Pinbook 1.0, there was a lot I wanted to do with it, but I knew that I’d be better off focusing on a core set of features that make the app useful and allow me to build on it later by updating quickly. I also knew that even if I did try to build in every feature I had in mind, my potential users were going to have a thousand others I never considered. I decided the things that were most important to get right for 1.0 were:

  • A great interface.
  • Fast syncing.
  • Fast search.
  • Sharing to multiple services.

I also had to leave some features for a future update, like editing of existing bookmarks, tag browsing and supporting more read later services. Based on the people who’ve used it I think I made good choices, and now that it’s out I can start addressing the things I didn’t get to in 1.0. I’m really happy that I didn’t limit myself early on by making choices I can’t easily take back. Good design is about saying no, and it’s about focusing on doing less things better instead of more things worse.

Design and Aesthetics

I like to think of myself as pretty picky user when it comes to app aesthetics, and I wanted Pinbook to look like something I would be excited to use. My goal was to make an app that someone who had never heard of Pinboard before would see, and want to get both. I carry around a Field Notes book in my back pocket, and it’s what I use to store little pieces of information during the day. I had this idea that Pinbook could sort of be like a little notebook you keep in your pocket for links, and that thought helped guide the aesthetic of the app. With that aesthetic inspiration in mind, I tried to think of it as if were approaching making an iOS app with the same sense of style, instead of in a skeumorphic sort of way. My answer was: really simple, but a little bit funky (in a good way).

Around the time that I started working on Pinbook, my girlfriend was thrown off of her bike avoiding a car, and broke her arm in five places. The first sketches of what would become Pinbook were done while sitting by her hospital bed keeping her company. These came out looking something like this:

PinbookFirstSketch
The first few iterations I worked on didn’t involve any custom graphics, just tweaking colors using standard controls. I figured out a lot about the flow of things during this phase, and also which features didn’t really feel important.

PinbookEarlyScreenshot

Early on it became clear to me that I was going to need to start thinking about enhancing the visuals with graphics. I’ve never done that part myself before, but I decided to accept the challenge: it was time to start learning Photoshop. I’ve never understood the idea that everyone can or should only do one thing, and as I keep learning I’m determined to prove it wrong. The final look of 1.0 has come a long way, and I’m very proud of it.

Bookmarks Screenshot 640

The app icon itself also went through several iterations to finally land at a place I’m proud of. I didn’t make the icon by myself, but instead collaborated on it creation with the wonderful Spencer Clark. You might call it obsession, but to me it’s taking the time to get it right.

PinbookIcon-1.png
PinbookIcon 2
PinbookIcon 3
PinbookIcon 4
PinbookIcon 4
PinbookIcon 6
PinbookIcon 7
PinbookIcon 8
PinbookIcon 10
PinbookIcon 10
PinbookIcon 11
PinbookIcon 12
PinbookIcon 13
PinbookIcon 14
PinbookIcon 14
PinbookIcon 15
PinbookIcon 16
PinbookIcon 17
PinbookIcon 20

Making it Fast

There’s three words anyone who’s been around developers has heard: sync is hard. I actually think that hard is where it starts, and if the API you’re working with wasn’t made exactly for your use case, it’s actually a lot worse than that. In my case, to get what I wanted I was going to need to pull down all of the users bookmark info and figure out what had changed, been added or deleted, and sync it with what I had cached. Initially this didn’t seem like such a big issue, since I figured most people probably had a couple hundred bookmarks and it wouldn’t matter much. Instead, what I found out when I started looking for testers is that a lot of people actually had thousands or more. The app just wasn’t going to work this way, and if I was going to do it I needed a better plan.

I thought about a solution for a while, and eventually what ended up working was something I’d heard talked about by my friend Brent Simmons: use the libXML streaming SAX parser to download and simultaneously parse chunks of data. If you’re not familiar, libXML is a low level C API, and not too much like what a Cocoa developer is generally used to. I’m lucky, however, in that I’m a little bit crazy and love diving into new things I’ve never done before. It took a while to get everything working right with the downloading, and also a lot of tuning to not slow things down too much with how I use Core Data. I’ve spent a lot of time in Instruments and looking at code, and the results are great. I’m also really surprised how much people notice it being fast and comment on it.

I could write long posts about what went into making syncing and live search work for users with lots of bookmarks, but ultimately the point is that engineering is part of design. Pinbook could be the best looking app in the world, but if it didn’t work very well people would hate it and it wouldn’t matter.

Conclusion

Creating Pinbook has taught me a lot, and there’s lot more I could say about pricing, testing and other things. But right now I’m just so excited to work on future versions and to make sure it remains the best at what it does. If you’d like to try Pinbook for yourself, it’s available in the App Store.