Thoughts on the Kindle Fire

I love Amazon, they’re one of the few companies who like Apple, understand that for a consumer product like a phone/tablet to succeed, it needs an ecosystem to back it, not just the hardware/software to run it. Amazon is also in a unique position of being in charge of one of the biggest ecosystems for media on the planet.

The Good

The focus of the Fire on media consumption through Amazon’s ecosystem is brilliant. The price point (my wild guess is that they’re selling it at a $1-200 loss per sale) is the razor-blade/printer equivalent of tablets. My assumption is that the play that Amazon is trying to earn most of the money on content sales rather than hardware. Assuming a 2 year lifetime, $1-200 is easy to spend on content (especially $10 books and $3-4 movie rentals).

They also cleverly designed the UI to play to the strengths of the Fire. As opposed to the iPad (whose strength is the Apple store) which features apps on the home screen, the Fire features content on the home screen. These sorts of UI decisions influence how people use and perceive the product, and Amazon wants people to know that this is a media consumption device.

The iPad 2 weighs 21.28 ounces, the Kindle Fire weighs 14.6 ounces, this will make a big difference when holding it up for elongated periods of time for reading. I just bought one of the new Kindles (the most basic one) for the sole intended purpose of reading. I’ve never been able to read books on my iPad. The combination of a backlight, the weight, and the screen resolution is a deal-breaker for me. I haven’t played with a Fire, so I don’t know whether or not it suffers from the same resolution/backlighting problems of the iPad for reading, but the weight will help a lot.

The Bad

The 7″ form-factor is an aspect which doesn’t sit well with me. One of the pleasures of using an iPad is the size of the display. Multi-touch gestures are extremely natural and comfortable on the iPad, web content designed for large computer displays feels natural at 10″. The Galaxy Tab 7″ is the only 7 inch tablet I’ve played with, and it felt smack-dab in the middle of being big enough to be comfortable, and small enough to be portable. The difference between the Tab and the Fire though is the same as the difference between the iPad and the Fire: The Fire is intended for serving a smaller subset of use-cases which are less interactive: Reading books, watching movies, listening to music, etc. so it may be less of an issue.

Overall, I think it is a well-rounded product with a string backing ecosystem, I can’t see why this product won’t be a runaway hit. However, I don’t think anyone seriously considering an iPad would opt for a Kindle Fire instead. My hypothesis is that people who were on the edge about spending $500 on a tablet will be much more inclined to buy a Kindle Tablet, which will increase the size of the market, but won’t cannibalize the sales of the iPad.

Web or Native? A SXSW Panel Proposal

If you’ve taken interest in this blog, chances are you’re at least intrigued by the mobile web and its possibilities and how it fits into our ecosystem. We’re still in the nascent days of the mobile web, and it’s still establishing itself as a powerful application development environment. As a result, a lot of companies and developers find themselves wondering whether a new project they’re starting ought to be built on top of ubiquitous web platform, or the performant native one.

In order to answer some of these questions, and to engage in a level-headed conversation, Tom DaleBuzz AndersonNeven MrganLia Napolitano and I have submitted a SXSW panel proposal trying to address the “Web or Native?” question from a UI, UX, and engineering perspective.

Some of the questions we will answer:

  • What advantages do native apps have over web apps, and vice versa?
  • How does good mobile web design differ from good native app design?
  • How does the native development process differ from the web?
  • Which kinds of applications are best suited to mobile web, and which are best suited to native?
  • Can both mobile web and native apps have a place in your mobile product strategy?

Please vote for our panel proposal here.

We hope to see you in Austin!

Design for the Mobile Web’s Ubiquity

A Lengthy Introduction

I was casually browsing my Twitter stream the other day, and someone posted a link to a blog post on which when loaded, made me realize another downside to imitate native UIs in the mobile web.

I should make it clear first, that I don’t intend to pick on doctyper or its developer, it just happens to be popular enough that I stumbled upon it. Everything I say here is general enough to apply to almost all native-imitation-style mobile web apps.

Here’s what I saw when the page finished loading:

My first problem with this came up when the content started rendering and I tried to scroll. Because doctyper uses custom, Javascript-based scrolling (A topic I discuss in more detail here) and because the javascript hadn’t finished parsing and executing, my touches weren’t captured. Instead, the page scrolled as-is and the top and bottom black site bars along with the content all static and moving together. I released my finger, tried again, and it finally kicked in.

Not a problem native developers have to deal with.

The second problem came up when I started scrolling. I don’t know about you, but I don’t like small, confined spaces. And on this site, I felt very claustrophobic. To see what I mean, let’s deconstruct the screenshot into its various elements. Labels on the left represent the component that drew them, and the labels on the right show their pixel height:

Of the 960 pixels of real estate, 520 were used for content. In other words, 46% of the space was information and visual clutter that had nothing to do with the content.

Sometimes web developers seem to be more concerned with the frame than the painting. Haven’t we learned anything from Microsoft?

  Image courtesy of
Image courtesy of

The Assumption

My assumption is that people who design and develop these native-imitation style mobile web apps are doing so in the void of MobileSafari, ignoring the ubiquity of the web. The whole point of building a web app is to leverage its strengths. One the main strengths is the web’s ubiquity.

The ubiquity of the web means you can’t guess where and how people will be using your web app. The best you can do is come up with a flexible design language that will adapt to screen sizes, form factors, and input mechanisms. Unless you’re building a hybrid app – combining web views within native wrappers – where you can presume the dimensions and access points, designing for a specific form-factor/use-case will indubitably lead to situations like the one discussed earlier.

The Addendum

Having said all that, some of you may be wondering why you would build an app-like experience on the mobile web at all. I did just spend 400 words telling you why it was a bad idea afterall. Well, let me tell you about another experience I recently had with the mobile web.

  A screenshot of the mobile Twitter app, running inside of Campfire.
A screenshot of the mobile Twitter app, running inside of Campfire.

John Gruber, being the fan of @counternotions that he is, linked to one of his tweets recently. As I was browsing the feed, the mobile Twitter app loaded and I was pleasantly surprised. 1 I was expecting the basic HTML page to load that showed the tweet, the person’s avatar, and a couple of buttons. Instead, a rich UI was loaded which let me fave the tweet, see the conversation leading to it, and quickly switch over to my main timeline. 15 minutes later, I realized that I was still in the embedded web view of Reeder, lost in a sea of poop jokes and kittens.

The takeaway is, I was under-promised and over-delivered, and that’s what we ought to aim for. Mobile web apps should delight our users, not frustrate them.

The Fallacy of Modern Web Development

Please note that I’m writing this without any proof-reading. This is pure stream-of-consciousness. was just announced. That’s pretty awesome: iCloud’s web apps include some pretty amazing interactions. If you haven’t seen them, get a developer account and log in. You should do that now, the rest of this blog post assumes you’ve seen them. iCloud is pretty fuckin’ amazing: The animations are incredible, the interactions are buttery, and the UI is polished as possibly could be. Having praised the iCloud suite of applications, one thing worth noting is: They prove that a buttery-smooth UI is not impossible to build on the web.

iCloud is tangential the the point of this blog, but it highlights a point I want to make: People are surprised and impressed that the web stack is capable of implementing the interactions which iCloud implements. We as web developers ought to be embarrassed about that. It shouldn’t be a magical surprised that a good, no-compromise UX is possible on the web.

Everyone expects Apple to release software that is far and beyond the level of sophistication and polish that we are accustomed to, but we shouldn’t be surprised that a technical achievement is possible which we previously thought wasn’t. My hypothesis is that we as web developers are so entrenched in our trees, we can’t see the forest. Every javascript developer is developing their own hot little javascript micro-framework or even fully-developer mature framework to one part of the web development story or another. I call bullshit. As far as I’m concerned, we’re all chasing our tails trying to solve the same damned problem over and over again. People are somehow susceptible to false benefits which are easy to preach, but hard to verify. I say: Stop worrying about kilobytes, and start worrying about web developers being oblivious to the capabilities of the web.

I could spend an entire blog post outlining the fallacies of micro-frameworks and niche solutions, but I feel like Apple has already proven many of my points: Take a look at the iPod. Not only has the iPod achieved market dominance in its segment, it has also maintained that dominance long enough for the entire market segment to become irrelevant. There are many reasons for the iPod’s success, but the one I think is worth highlighting in this conversation is its ecosystem. An iPod without iTunes is like a human body without blood. Why don’t we Web Developers learn this lesson?

There are more MVC based frameworks than I can count. Since SproutCore 2.0 has started establishing its namesake with bindings support and the observer layer, it seems like every single new javascript framework ships with the same live-updating support. This isn’t an apologetic SproutCore blog post though, I could spend an entire blog post telling you why all these framework developers are wasting their time and chasing their own tails, but the point is: The people developing these clones are really smart, but they’re not building anything worthwhile.

It shouldn’t be a surprise to people what you can do with CSS 3D Transformations. At this point, that’s well understood and well documented. It’s like somebody being surprised that mixing peanut-butter and jelly with some bread creates a tasty combination. What should be a surprise is what happens when you build a fully-integrated solution on top of it. Instead of developing more redundant MVCframeworks, we need to coalesce our energy on a few proven solutions.

Native developers don’t have this problem. You never hear of widespread news when a native developer finds out that if you call methods on UIImagePickerController then you magically get access to the device’s camera, but it’s common-place to find out that people exposing and using the intricacies of CSS3 transforms are creating incredible feats of UX.

We need to cut this shit out. I don’t care how small your microframework is. Bandwidth isn’t the problem. If you think a 5kb framework is preferable to a 7kb framework, your are bat-shit insane and patently wrong. There is no “maybe he has a point”. No, it’s black-and-white. File size isn’t the problem, code-size is. If you string-wrap your code, your OK. Don’t listen to people who tell you otherwise, they’re lying to you (though probably not intentionally).

A JavaScript-based MVC framework is only a small part of the solution, the same way an iPod is a small part of the digital music solution. A proper, scalable backend along with all the services and add-ons that make up a server stack are required to create an ecosystem. But that still doesn’t quite cover the whole story: The stack not only has to exist (Nokia, RIM, Microsoft), but it also has to be tightly integrated and seamless (Apple).

Partly as a disclaimer, and partly as supporting evidence, I should make it clear that I work at Strobe Inc. We’re the first people to really build an end-to-end solution for web development. Lots of other developers are working on solving certain problems in the domain, but none are providing a full-stack, integrated solution like we are. Strobe is sponsoring projects like bpm, sproutcore, and the strobe platform to once-and-for-all solve the problem of developing web application from the ground up. I strongly believe in what we’re doing, which is why I’m spending time to make sure we do it, but the point is that the rest of us should stop wasting time and start moving our platform together.

We have a gem on our hands: Let’s stop arguing about who has the better hammer and let’s start chiseling it into a beautiful piece of jewelry.

Building the Next Generation of Mobile Web Applications

All mobile web apps today suck. Some mobile web apps come close to being good, like Gmail and Twitter, while some come really close, likeThe Financial Times and Basecamp. But all the examples fall short one way or another: Gmail’s scrolling is unnatural, Twitter hides the browser’s location bar, Financial Times is riddled with flashing/jittering/scrolling bugs, and Basecamp jumps when you tap on an item. For every one of these examples, there are 10 worse offenders I can point to, but they all share the same essential mistake: They all use the browser as an emulator of native apps. Trying to replicate the native experience on the web is a fool’s errand, and leaves users confused. To move ahead, the web needs to play to its strengths.

First, I’ll highlight the overarching problems with the current fleet of mobile web apps, then I’ll lay a framework for building the next generation of amazing mobile web applications.

Problem: Double-chrome

Consider that screenshot from Google+: There are three back buttons. What do you think will happen if I click the browser’s back button? Will it take me “Home”? or will it take me to the previous app? What will happen if I click the “Nearby” button? What about the “Home” button? Now let’s say I clicked on the “Incoming” link at the top right. What do the buttons do now? The answer is, the browser’s Back button will take me to the previous website, while the “Home” back button will take me to the main Google+ page, and the “Nearby” button will take you nearby. Once you click on a post, the browser’s back button and the button that will replace the “Home” button will do the same thing, but the “Nearby” button won’t. This lack of consistency and predictability is endemic of mobile web apps. This is a problem that native applications don’t usually have to deal with.

The counter-argument goes: If you make the user believe they’re in a native application, they will expect to have a back button in the top-left. Most of the time, this means having a navigation bar that is fixed to the top of the viewport. In reality, that argument makes the assumption that people are using the web app on iOS (navigation bars don’t exist on Android), and that they forget they’re in a web browser. Even assuming the argument is correct, it implies that the cost of learning the back gesture the first time outweighs the cost of having to make a decision on which back button to tap on every single subsequent page.

Solution: Browsers provide a persistent back button at all times that is impossible to get rid of. They also provide a title bar – which admittedly, isn’t persistent – but also provides a reliable way of telling your users where they are. Mobile web apps today suffer from platform-specific, ambiguous elements. Give the user their 50 pixels back.

Problem: Chasing your own tail

iOS has not had support for overflow-auto nor position:fixed until iOS 5. Instead, people resort to elaborate hacks to achieve the same fixed-bar-at-the-top UI of navigation controllers and tab controllers on native iOS apps described in the earlier section. If you’re ever used a web app that used that UI, you’ve probably noticed very quickly how unusual and weird the scrolling behavior is.

Scrollability is the best of the bunch, but it’s still not perfect, and it never will be perfect. The proper solution is the browser’s solution. You obviously couldn’t have used that feature before iOS 5, but my point is that web applications shouldn’t have a fixed bar along the top anyway, obviating the need for a scrolling hack (except on iPad for multi-pane UIs. That’s a technical limitation Scrollability is a good solution for). Moreover, for the scrolling hack to work, the scrollable area had to capture touches, which means when user scrolls to the top of the page, they get the scroll-bounce instead of getting access the address bar. For example, if you go to twitter’s mobile web app, you have to know to tap the title bar to scroll to the top of the page and reveal the address bar. 1My uncle Bob doesn’t know that tapping on the title bar scrolls his view to the top, so he’s essentially stuck in the app.

The fundamental problem is that people are trying to emulate as best they can what a bunch of engineers did at Apple 4 years ago. Apple can change interactions, behavior, and widgets between versions, and everyone who’s trying to emulate them, has to continue playing an endless game of catch-up.

Solution: Once you eliminate the double-chrome problem and the fixed-navigation-bar problem, you eliminate a lot of the issues that make mobile web apps terrible.

Problem: Forgetting what the web is about

Mobile web app developers seem to have forgotten that the web is inherently cross-platform. That’s the whole point of the web: Ubiquitous access to information. What’s the point of building a mobile web app if you’re only targeting iOS users? If you are targeting multiple platforms, why are you forcing the iOS UI on non iOS users? The navigation bar with a back button does not exist on Android, users won’t be expecting it, so save yourself the 50 pixels of screen real estate.

Solution: Build a UI and UX that is platform-agnostic.

Now that we’ve outlined some of the problems of the existing fleet of mobile web apps, let’s analyze how to build the next generation.

Build a mobile web app when it makes sense

Not every app is a suitable candidate for the mobile web. It’s important to analyze the strengths of the web and see if your application stands to benefit from them:

  • No installation: The barrier to entry for a new user to your app is essentially zero. As soon as a user has expressed interest (by clicking on a link), they have instant access to it. This quality is essential for certain classes of applications that require either an impulsive action, or a trial. If your app needs to get viral, it needs to be a mobile web app. There are counter examples: Instagram, Angry Birds, etc. However, instagram still needs to build a scaled back web page to share with people, and in the case of Angry Birds, they had to build different versions for every platform (and ultimately, the web). I’m using Angry Birds here as an example for the virality argument, clearly, I don’t think Angry Birds should ship as a mobile web app today.
  • URLs: This one goes hand-in-hand with the previous benefit. The fact that you have a URL to an application means you can a) encode the current state in theURL, and b) send that application in its current state to anyone in the world, on any device or platform. If your app stands to benefit from share-ability, it needs to be a mobile web app.
  • Auto update: Mobile web app users are always using the latest version of your application. You can ensure 100% penetration of new features and bug fixes almost instantly (allowing time for caches to expire). If your application needs timely security fixes or a/b testing or iterative user feedback, it needs to be a mobile web app.
  • Cross-Platform: Most people aren’t on iOS. Nor are they on a Mac. Those users represent real people, with real jobs, real bank accounts, and real user needs. The web is the only example of a wildly successful, healthy cross device and form-factor platform. If you app needs to reach a wide audience, it needs to be a mobile web app.

Notice how I didn’t mention performance. Performance on the web needs to only be good enough to deliver a great UX, it doesn’t need to be infinite. If you were instead building an oscilloscope app for the iPhone that needs to analyze large amounts of data quickly, please don’t build it as a mobile web app.

Uncanny Valley

Bill Higgins wrote in May 2007:

So I’d recommend that if you’re considering or actively building Ajax/RIAapplications, you should consider the Uncanny Valley of user interface design and recognize that when you build a “desktop in the web browser”-style application, you’re violating users’ unwritten expectations of how a web application should look and behave. This choice may have significant negative impact on learnability, pleasantness of use, and adoption. The fact that you can create web applications that resemble desktop applications does not imply that you should; it only means that you have one more option and subsequent set of trade-offs to consider when making design decisions.

Rasmus Lerdorf, the creator of PHP, once gave a talk to us at The University of Michigan where he was talking about performance. He gave us an anecdote from his time at Yahoo! where they asked users to use Yahoo! Mail and Gmail and asked them to rate which one was faster and which was slower. Although Yahoo! Mail was faster at a technical level, the users said Gmail was faster. His hypothesis was that users compared gmail’s performance to Hotmail, but Yahoo Mail’s performance to Outlook/ The takeaway is, by copying a different platform’s UX, the users had a mental model that did not match what they were using. I don’t know the accuracy of the anecdote (I’m recalling it from two years ago), but I think the point holds true today.

Web developers today use iOS as a starting point for every mobile web initiative. It’s a great platform, I don’t blame them, but iOS is only one of the platforms the web supports. On Android/WebOS, most of iOS’s interactions don’t make sense, on iOS, if they’re slightly off, they’ll break the illusion to the user. It’s a no-win situation. The Web has achieved cross-platform dominance by not imposing a platform-specific UI on multiple platforms.

The Financial Times web app does a very good job of this. It doesn’t feel like an iOS-specific app, and scales well to multiple platforms.

  Image courtesy of
Image courtesy of

This view may seem contradictory to you if you’re familiar with my work. I’ve been involved with the SproutCore project for some time now first building desktop-like web apps, and now building a new UI layer for mobile devices. SproutCore’s mission has been (until the recent 2.0 release) to build desktop-like applications on the web. That argument makes a bit more sense on the desktop: Most desktop computers share a keyboard, mouse, and across the different operating systems, most interactions will map from one to another. On mobile platforms, that’s not the case, the variety between platforms is huge, and sometimes, input devices exist that don’t on other platforms (trackball, physical keyboard, hardware-based gestures, etc.) Furthermore, desktop browsers are much, much more capable than their mobile counterparts. That’s not to say that in a couple of years when mobile browsers get fast, that uncanny valley will no longer be an issue. After all, although SproutCore (and Cappuccino) delivered very strong solutions, neither nor developers flocked to use them.


The web platform on the desktop is much more capable than its mobile counterpart. For a while now, we’ve been able to build incredibly complex, compelling UIs on the web with no compromises. Desktop browsers are much better today at compatibility than they were before, and we have much better debugging tools.

On the other hand, developing mobile web applications today is akin to developing a web application on the desktop in 2004. The saving grace is that the pace of progress on today’s mobile devices is far, far faster than it was on the desktop. iOS 5 on an iPad 2/iPhone 4 is ready for the mobile web, Android isn’t (but that’s a topic for another post). The next generation of mobile devices (and worst-case scenario, the one after) will catch up to iPad 2/iPhone 4 and the mobile web will be ready to kick some ass.

1 position:fixed in iOS 5 behaves correctly: When you reach the top of the scrollable area, the fixed bar moves down to reveal the address bar

Why I Joined Strobe

“One should not pursue goals that are easily achieved. One must develop an instinct for what one can just barely achieve through one’s greatest efforts.”
– Einstein

Three weeks ago I quit my job at Apple and joined Strobe Inc. as a full-time engineer. My job is to start work on a new project under the SproutCore 2.0 umbrella called SproutCore UI. The goal of the project is to provide a UI layer for building complex, app-like experiences on the web.

When I was trying to decide which company to join, I had the mother of all first-world-problems: I had to choose between multiple amazing offers from amazing companies with amazing people. During the process of deciding where to go, Einstein’s quote played a part in shaping my decision. Of all the choices, I decided to join Strobe for its combination of ambition, people, and focus. All qualities I think are essential for a company’s success.


Strobe is attempting to provide a platform for web developers to build, deploy, and maintain amazing web apps. It’s no small task and involves multiple moving parts coming together, but the promise is great. If Strobe succeeds, the web will be a better place. The task isn’t simply to build the “Heroku for ____”, rather, it’s to change the way people think about architecting and building applications, and to set the tone for how the mobile web will evolve.

I never want to question the impact of what I’m working on. I never want to feel like I’ve settled for something, nor that I’m content with my current situation. I found a company trying to achieve the improbable in Strobe. When I told people about what Strobe was trying to do, I was faced with skepticism regarding the challenges it faced. That skepticism served as a validation to me: Don’t try to do the doable, try do the impossible.


I work with some brilliant people at Strobe. Not only is everyone accomplished, but they are also humble, approachable, and friendly. I knew most of the people in the engineering team before I joined, so I knew what I was getting myself into. Regardless, it’s much different in the trenches. Nobody at Strobe eats lunch alone. No uncertainties go unquestioned, no statements go unheard, and no ideas go un-vetted.

There are a few reasons why that played a role in my decision to join Strobe: Firstly, it allows me to absorb an immense amount of technical knowledge from people much smarter than I am. Secondly, it provides me with unprecedented access to the web community. To affect change at scale, I believe you need to not only have the will, but also the means. At Strobe, I believe that we have the means to change things for the better. Finally, I believe that the type of people you work with can have a dramatic effect on the happiness and the quality of work I produce, and I’m confident that my coworkers at Strobe will bring out the best in me.


The most important lesson I learned from my time at Apple is focus. I’ve seen large companies flail and waste their time and energy in vain, I’ve seen teams break apart because of a lack of direction, and I’ve seen driven people grow complacent because of a lack of vision.

Late last year, I got a chance to spend a day working at etsy’s offices in Brooklyn. I was taken aback by the focus of their team, and the do-or-die attitude that I sensed in their office. I had the same sense talking to the different people at Strobe, and it has turned out to be very true.

At Strobe, everyone knows what we’re building, why we’re building it, and who we’re building it for. This laser-like focus ensures that talent isn’t wasted, and resources are put to good use.


I’m writing this at 11 PM on a Thursday. The office is full, and everyone is excited. There’s a sense of urgency in the air, and everyone is working towards a single end-goal. I live for moments like this. Everyone on the engineering team understands what’s at stake, and believes that we are in a position to deliver the best solution.

I don’t know how everything will play out, but what I do know is that everyone involved will work their butts off and whatever we do produce will have an impact. There’s no way for it not to.

Gruber recently linked to a quote that rang very true to me:

“Make no little plans. They have no magic to stir men’s blood and probably themselves will not be realized. Make big plans; aim high in hope and work, remembering that a noble, logical diagram once recorded will never die, but long after we are gone will be a living thing, asserting itself with ever-growing insistency. Remember that our sons and grandsons are going to do things that would stagger us. Let your watchword be order and your beacon beauty. Think big.”
– Daniel Burnham

I can’t wait to come to work tomorrow.

Google Chrome – Epilogue and Reader Feedback

I got a lot of great feedback from my previous post higlighting why I hated using Chrome yet continued doing so. The feedback ranged from the dismissive to the supportive. In the process, some readers highlighted good and bad things about Chrome I missed that I wanted to highlight in this follow-up post.

Before I get into the feedback though, there were a couple of points I wanted to expand on:

On the status bar

When I wrote the blog post, my complaint about the status bar mirrored that of the search bar: It overlayed the contents of the page. That presented other problems, which had to have their own solutions. When it comes to the status bar, my suggestion wasn’t to go the Safari route by making it a permanent bar (which in my opinion is inferior), but that the status bar as a whole is a useless relic from the olden browsers.

Having had a bit of time to think about it, I think a solution would be to remove the status bar altogether and instead place the hovered-url in the address bar itself. The address bar (or omnibox, as it’s called in Chrome parlance), provides the context of the current and future location of the page.

The assumption I’m making is that people use the status bubble to see what URL a link will take them to. By placing the hovered-url in the address bar, you also eliminate a mental step the user has to go through: Instead of hover, look at the bottom left, click, and then look up at the address bar, you just hover, look at the address bar, and click to commit the action. Moreover, you eliminate a confusing element from your browser!

On the search bar’s behavior

There seemed to be a bit of confusion regarding what I was suggesting when I complained about Chrome’s search bar. My complaint was that it overlays the contents of the website, not that it was inlined to the window. In contrast, Safari’s Search-in-Page UI is far superior in my opinion, since it is still inlined to the page, but it shifts the contents of the page down as it reveals itself. The separate window for searching the contents of a page was a terrible idea and I’m glad it’s largely history at this point.

On Chrome Develepor Tools’ non-native toolbar

Wes Campaigne wrote to highlight a bug he filed over a year ago

The reason I decided to include this comment here because it highlights an aspect of Chrome which I think is the root cause of a lot of issues. Specifically:

It is not as easy as it might seem – we are talking about dragging native window by the tabcontents content. I think in Safari, toolbar is transparent and we are dragging by the window itself.

Chrome is a cross-platform browser and shares a lot of code between its Windows, Linux, and Mac variants. To achieve that goal, they have to fake a lot of native behavior in their cross-platform components. What’s interesting about this though, is that I checked out the Chrome codebase and as far as I can tell, Chromium (the open-source codebase for Chrome) uses a shared component but the UI layer is built specifically for each platform.

Chrome’s open-tab behavior

Chris Karalus writes to highlight Chrome’s new-tab behavior. If you open a new tab, Chrome intelligently places that new tab adjacent to the current one. This creates a natural grouping of related tabs with no explicit user action. This is UX at its best: Interpret the user’s intent, and let the UI adapt to it.

On the download bar

callahad on Hacker News wrote :

Actually, in OS X, the Chrome icon in the dock has a small pie chart overlay during downloads that indicates both the number of pending downloads as well as the aggregate progress of all downloads. If your dock is hidden, you can quickly and easily check the progress by hitting Cmd-Tab. In Windows 7, the “tile” in the Windows “Dock” fills from left to right, like a progress bar, to show the aggregate status of downloads. You can also click on the in-progress download, dismiss the dialog, and the file will open once the download completes.

On the preferences pane

callahad again from Hacker News :

you can actually link to specific pages and panels. Though this doesn’t help you find a preference in the first place, it does make communicating the location of known preferences much simpler.

On integration with OS X

Kurt Landrus writes:

The one feature missing in Chrome and Firefox that keeps me in Safari, is the ability to drag or copy Rich Text from the browser to another app like text edit or MacJournal, Chrome and Firefox only copy plain text. I use this all the time for research.


The response I’ve received seems to suggest that a lot of people weren’t aware of any of these issues. The post also seems to have generated a healthy debate regarding the merits of my arguments and their objectivity. Whether you agree with my complaints or not, I think it’s important to take a critical look at the software we use every day.

On a separate note, it seems like the Chrome team has taken notice of the complaints and there are been bugs submitted to track those issues. Hopefully some good will come out of my ranting!

Google Chrome – Why I Hate It And Continue To Use It

Update: striked-through a reference to the search bar overlapping search results. It doesn’t do that. (thanks to everyone who let me know).

This is the third time I have tried to use Chrome. The first two attempts lasted two days before I uninstalled it and went back to the comfort of Safari. Every time I use it, I end upventing my frustrations on twitter and face the inevitable backlash from my Chrome-loving followers. My problems with Chrome always revolved around its UI and UX, and this post will highlight the reasons I reached my conclusions.

First, I’ll highlight the things that Chrome gets right. Credit where credit’s due, and all that.

The Good

My current attempt to use Chrome as my default browser is much more successful than the previous ones. I’ve been using it for just over a week now and have finally gotten over the initial hump of disappointment. My hypothesis is that every time I try to use Chrome, I end up interacting with the browser itself for two days and not really using it to browse the internet. Once I got past the UI issues, I found Chrome to be a fine browser.

Unified search/location fields

By far, my favorite feature of Chrome is its unification of the search bar and the location bar:

This combination eliminates a decision every time I search/go somewhere. Not only that, sometimes I find myself switching between a search query and a URL mid-way through typing it!

Tab closing behavior

This one should already be familiar to you.

Tab exposé

This is an opt-in feature of the Canary builds which you can enable in about:flags

When I first found out about this feature, I thought it was a gimmicky but I found it works great especially with the trackpad (swipe three fingers down to activate).

Recently Closed / Restore session

These two go hand-in-hand, basically, being able to restore a session or re-open a recently-closed tab has saved my butt a few times and I appreciated the feature.

Developer Tools

The Chrome team has added some amazing debugging and inspecting tools to the webkit inspector (and they broke a bunch more, but we’ll get to that later). I find myself much more productive when debugging my web apps in Chrome vs. Safari.

The Update Process

…or lack thereof. The fact that Chrome sends you tiny diffs and updates its binary is amazing on a technical and UX level. It completely blurs the line between native and web app and I strong-heartedly stand behind this. More apps should do this and someone should release a framework that simplifies it.

The Bad

This is a list of what bugs me about Chrome. I will admit that on their own, a lot of these are tiny issues, but in aggregate, they form a sloppy browser. Death by a thousand cuts.

Lack of RGB Anti-Aliasing

Take a look at this zoomed-in screenshot of the New Tab page:

Notice how it’s using Black & White anti-aliasing? My guess is that they have

the text on a hardware-accelerated layer and not setting a background color on it, which causes the text to lose the anti-aliasing.

Look what happens when I give it a background-color: white;

Why this is something the Google engineers don’t do is beyond me. This happens in multiple places throughout the UI, not just the New Tab page.

Terrible PDF font-rendering

Chrome uses a non-native PDF viewer. That isn’t an inherently bad thing, you can be better than the native alternative, but this is anything but. Compare the text in the picture below between Safari’s PDF viewer and Chrome’s PDF viewer.

The Downloads Page

This one is a double-whammy. In Chrome, the downloads page opens in a separate tab, as opposed to a separate window (like Safari, Firefox, etc. all do).

Here’s my problem with this: Because the downloads window is a tab within the same Chrome window, they needed to add extra UI to show you the progress of your downloads are you browse. The way they do this is using the Downloads bar:

This bar eats up 43px of screen real-estate in the browser. If you wanted to reclaim your space, you can’t monitor the status of your downloads. If you don’t hide it, it stays visible long after all the downloads are done.

This is a solution to a problem that shouldn’t exist. By making the downloads manager a separate window, you can monitor it while you browse. Not only that, but you can view individual progress of your downloads vs. the aggregate.

You could tear-off the downloads tab and treat it as a separate window, but not only does that require user action, the UI isn’t designed to be compact, so you still can’t make the window small and get meaningful information.

The Title Bar

Because the tabs live in the title bar, and because the rest of the chrome (note the lowercase c) is not-draggable, the effective draggable area in Chrome is a thin 10px strip at the top of the window.

I’ve highlighted the section of the window which you can drag. It’s tiny!

The second problem with the tab bar being in the title bar is that when you have many tabs open, you have to rely on a tooltip to figure out what the title of the tab is.

Massive Preference List

When I first started using Chrome, I thought the preferences-as-a-tab was a heinous crime against humanity, however, after using it for a week, I’ve come to the conclusion that it doesn’t inherently present a UX problem. What does present a UX problem however, is the massive number of preferences Chrome exposes to the user:

I recognize that most people won’t peek “Under the Hood” but for most people, the large number of options makes finding what you want hard, even with the search feature.

Favicons Everywhere

I hesitated at first to list this, thinking it was too subjective. However, upon further consideration, I feel like I can lay out an argument for why it is actually bad.

Consider this site. I’ve put a lot of work into making sure that this website is as simple as possible, allowing you to, the reader, to focus as much as possible on the content without any distractions. However, in a typical session in Chrome, you’re innundated with favicons in the location bar, in the tab bar, and in the bookmarks bar. This not only clutters and cheapens the chrome of the browser itself, but it also distracts from the aesthetics of the article and impacts the motif I’ve built.

Another problem is that favicons are duplicated on the tab bar and on the bookmarks bar. However, the address bar doesn’t include them (just has that globe icon). This means that you end up seeing the same favicon multiple times unnecessarily, adding to the clutter.

While we’re on the topic of bookmarks. Notice that “Other Bookmarks” button? It’s empty. there’s the “»” button next to it, that shows me the “other bookmarks” which I can’t see because they don’t fit, but “Other Bookmarks” apparently means something else. I assume it means regular bookmarks (not on the bookmarks bar), but I couldn’t figure out how to add a page to that list.

Search Field

The search field covers the content of the site, if you were searching and a match was under the field, or you wanted to click a link/button under the search field, you’re out of luck.

In the case of a web app with a toolbar (This screenshot shows MobileMe, but the same UI model exists in most web apps), the search field actually covers the main parts of the UI, you have to dismiss it before you can use the app!

Status Bar

The status bar can be in one of three states: Bottom left, hanging off the window if it fits, or on the bottom-right. As you move your mouse in the bottom left corner, the status bar will move and jump around erratically.

The New Tab Page

The list of tabs is horizontal, instead of vertical, there’s not enough space to read the title, and it’s hard to quickly and visually see what page is what.

Note: In the Canary builds, there’s an option in about:flags to enable an experimental Tab Page which is much better.

The Tab Bar

Again, because the tab bar is in the title bar, if you have a lot of tabs open, you end up having to hunt for the tab you want, and you can’t read the title of the tab you’re on.

Loading UI

When a new page/tab is loading, the only indication is a small spinner in the tab. I continuously find myself wondering whether or not Chrome is doing something or not.

Can you tell at a glance whether this site is loading or not? (By glancing at the chrome, most sites don’t have a giant “Loading” UI in the middle of the page.)

Lack of Attention-to-Detail throughout

Everywhere you look, things are mis-aligned, and broken. Here are a couple of examples:

 Not only is this using ugly and non-standard menus, but the first item remains curiously selected.
Not only is this using ugly and non-standard menus, but the first item remains curiously selected.
  Broken gradient in the toolbar of the Developer Tools
Broken gradient in the toolbar of the Developer Tools
 There is a highlighted item in this menu, can you find it? Neither can I.
There is a highlighted item in this menu, can you find it? Neither can I.
  When you open a new tab and go to a page with a scrollbar, it overlaps the resize handler.
When you open a new tab and go to a page with a scrollbar, it overlaps the resize handler.
 Notice how the error icon overlaps filter list in the Network tab of the inspector.
Notice how the error icon overlaps filter list in the Network tab of the inspector.
  To change the sorting, you have to click on a header of a column (no indication that it’s clickable), and then select from a drop down. Who came up with this one?
To change the sorting, you have to click on a header of a column (no indication that it’s clickable), and then select from a drop down. Who came up with this one?

I’ve counted three different menu styles in Chrome. The bookmark bar menu, the contextual menu in the bookmarks manager, and the customized native one in the Tools menu. This creates a confusion among users as the three menus behave slightly differently.

The Network Tab

The Network Tab is an addition to the webkit inspector that still hasn’t made sense to me. Before it was introduced, The Resources tab was where you go to browse the…resources (js, css, html, xhr, etc) of your page and inspect the response/request headers. Now, you can access the same information in both the Resources tab and the Network tab in different UIs. The Resources tab doesn’t require a refresh, but the Network tab does.

The Network tab is also one of three ways you can view the contents of a file. Imagine an email app that has three different places to show you the list of emails in your inbox, in the same exact format, in three different places of the app.

To add insult to injury, the Network tab is the only place you can view the size/time statistics of your application, but you can’t view aggregate data. If someone could explain to me why the Network tab exists, I would be grateful.

Non-native behavior, Native look

Go to the developer tools, notice how it looks like it has a unified toolbar? Funny thing about that is, you can’t actually drag anywhere other than the title bar. Again, I’ve highlighted the area of the toolbar that’s clickable.


It’s been just over a week by now, and I continue to use Chrome. It may seem hypocritical, but the combination of search and address bar and the rate of iteration keep me hooked. I think it’s a bit like gambling, I keep using it with the hope that tomorrow all these problems will be fixed. As an anecdote, Google announces things like memory inspection that keep my interest in Chrome high. I feel like there’s a lesson here for other projects, maybe it deserves its own blog post.

As I said previously, a lot of these issues are small, but they add up to a broken experience and lots of little frustrations. I expect a lot of people to tell me that they don’t mind a lot of these problems, or that a lot of these problems are not in fact, problems. Finally, I also realize some of the problems tend to be subjective, but you came looking for my opinion, and I opined 🙂

What I Learned From Releasing My First Open Source Program

Yesterday was a roller coaster ride. I woke up in the morning, fleshed out a quick README file, took a screenshot and a screencast, and launched my very first open source project. The project is called Waldonow, but it released under the name “VimAck”, and it was under that name that it hit the front page of Hacker News.

In the meantime, The repository has 105 watchers, I’ve merged three pull requests, I’ve implemented 2 new features, and also released two new versions. All in the span of 20 hours. Like I said, roller coaster ride.

I’ve had some time to think about my experience overnight, and I’ve already had to learn a bunch of lessons I thought I’d share with you.

Be your own QA department

When I released version 0.1, the search button was labeled “Button”. I had shown the app to 3 friends before releasing it, but everyone assumed I would change it before release. I even took a screenshot/cast with it and even published it live! I wouldn’t have even noticed had it not been for a friend on twitter. Basically, what happened was that I assumed it worked for the simple case I was developing it with and was so focused on getting it to work I forgot to actually change the label.

I’ve gotten better at with version 0.3. Before release, I go through both the installation, setup, and usage process, as well as the upgrade and usage process. The only person you can trust is yourself and that’s the only way you can ensure everything is running smoothly.

Something I do want to work on though, is automated testing. This is my first real Cocoa project and I’m not familiar with how testing is done, and it’s something I have to learn.

Takeaway: Rely on your own tests to ensure that things are running, and do it all before each release.

Choose a name wisely, and stick to it

VimAck, the name I released under, was chosen as a working title, and I was so involved in building the first version and caught up in the feedback it released, I forgot to change it.

It’s a terrible name. I couldn’t ever remember whether it was VimAck or AckVim, there was already a similar vim plugin called ack.vim, and it just sounded bad.

But here’s the problem with renaming a released project: People have already forked the old repository, links all over are pointing to the old repository, and Sparkle has problems updating to a different app name!

I’ve decided to take the hit early, after all, there were only 7 forker and 80 watchers at the time, and it’s better to do it soon rather than get stuck with a terrible name in the long run.

Takeaway: Changing the project’s name is costly, consider and reconsider your project’s name before launch.

Lower the barrier to contribution

In my opinion, one of the most rewarding aspects of open source software is receiving contributions from the community. A pull request is both a validation that you have created something of value to other people, and that you have created an ecosystem that encourages other developers to pitch in.

For example, zef came up with the great idea of auto-installing the vim plugin on launch. That was something I hadn’t thought of myself.ashchan did the work to make Waldo show up as a status menu item. That is something I had wanted to do, but didn’t know how.

However, you can’t expect people to come up with contribution ideas themselves, which is why I added a “Roadmap” section to the READMEon Waldo and outlined the upcoming features. I also commented the most code-heavy files in the project and outlined to people how they can contribute.

Takeaway: Do as much work as you can to streamline the contribution process to your users.

Your first release should be a full package

The first release was really only for me to show off my weekend project. What I didn’t anticipate was 100 people to watch it, and 120 people to download it. The problem with releasing what was essentially a demo, is that it wasn’t a full package. What I mean by package, is that it not only has support for the core set of features, but it also has a mechanism to update, an icon, a web presence, a way for people to contribute, and a way for people to file bugs.

Github takes care of most of those problems. Github is truly one of the best things to happen to open source software. I don’t think it’s hyperbolic to say that the world of open source would look a lot different without it. What I didn’t do, however, was include support forSparkle.framework which meant that for people who wanted to upgrade to VimAck 0.2, they have to know that there’s a new version, and they have to manually download it.

To add insult to injury, the renaming of the project from VimAck to Waldo meant that the upgrade mechanism doesn’t work. Hopefully nobody will face these issues anymore and everything will be smooth sailing from here on forth.

It still doesn’t have an icon, but that’s because I haven’t come up with a good idea for one, but would love to have someone contribute one for me.

Takeaway: Provide a complete package to your users, not just a demo.

Be upfront with your users

The problems with Sparkle and with the renaming caused a lot of headache. For one, a pull requests was broken and was tough to merge, people who forked had bad remote URLs, and people had to upgrade manually from 0.1 to 0.2. As a user, this experience sucks, and there’s no way around it. As the care-taker of the repo, I felt like my trust with the contributors was broken. To amend it, I messaged everyone who submitted a pull request and told them what happened, and I also set up a placeholder README on the old VimAck repo with instructions to people who forked on how to update their repository.

I felt like the communication is especially important in the open source space and it helped people figure out what was happening with the project. Communication is essential since you have people in different parts of the world trying to touch the same codebase and having a clear narrative is essential.

Takeaway: When you make a mistake, ’fess up to it, and provide remedies.


The project is only a day old, and I continue to learn a lot about project management, community building, and communication in general. I hope you can take away a thing or two from my experience with open source. It is incredibly satisfying to see people appreciate and use your software and I thank everyone who helped fork/contribute and those who downloaded!

Reflexions on my 23rd Year

Hey Majd, this is your 23 year old self. Let me tell you about this year just in case you need a refresher. Hopefully you’ll have done this every birthday and if you don’t, what the fuck is wrong with you? This shit will come in handy when you write an autobiography about yourself.

22 was a good year. Following up the best summer of my life (Apple class of 2009 representin’!), I crammed 3 semesters into 2 so I can get the fuck out of school, graduate, and start my life. Winter 2010 was a busy semester, but it was also the semester I started drawing again, founded the iPhone Developers Club, was president of CSE Scholars, and took some awesome courses. Mostly, I spent most of the semester waiting for graduation. May 1st came, Obama spoke, and I walked.

After graduation, I started waiting to start my job. The team was so much fun last summer and I learned so much, I couldn’t wait to start. May 18th came along, and I head off to Cupertino. Two days later, I found a room in a house in the Castro and decided to move into it. I wonder what this experience will seem like to you in hindsight.

I’m 7 months into my job now and it’s a blast. My coworkers are my best friends and my managers are incredible. The work is challenging, frustrating, fun, and unpredictable, just the way I like it. I’m half way through losing 80 pounds (at 45 right now), and it has already begun to change my life.

So to recap: When I was 22, I graduated, moved to San Francisco, lost 45 pounds, released some of my best code yet. Like I said, it was a good year.

Now that the “what” is covered, I’ll dig deeper. Here are things that I’m thinking about right now.

Wait, before I start. I want you to remember this:

Here’s to the crazy ones. 
The misfits. The rebels. The troublemakers. 
The round pegs in the square holes. 
The ones who see things differently. 
They’re not fond of rules. 
And they have no respect for the status quo. 
You can quote them, disagree with them, glorify or vilify them. 
About the only thing you can’t do is ignore them. 
Because they change things.
They push the human race forward. 
And while some may see them as the crazy ones, we see genius. 
Because the people who are crazy enough to think they can change the world, 
are the ones who do.

School. What it meant, what came of it.

Was school a waste of time? I haven’t decided yet. On the one hand, I know for a fact that had I not gone to school, I would’ve accomplished a lot more professionally. On the other, I really value the friendships I built during school, and wouldn’t trade them for anything. Besides, I didn’t end up in a bad place, so maybe it all turned out for the better. The thought of having left Michigan 4 years earlier than I did sounds amazing though.

Current Thoughts

What is going through my mind right now? Work, weight-loss, and girls, in that order.

Professionally speaking, work is going great, but I’m trying to figure out what my next move is. I’m happy where I am right now, but I realize it’s not a permanent gig. The more time I spend in the industry, the more I realize how much shit there is out there. Not just that, but how much people don’t care. I’m not the most technically impressive engineer, nor do I claim to be. What I am (or, think I am), is a craftsman. In terms of money and success, I’m starting to realized that I’m not really after “the big exit”. I want to be successful, to be sure. I want my income to satisfy my ridiculous lifestyle and then some, but that doesn’t require a hundred-million dollar bank account. The reason I say that is because I feel like given a more bounded business, I can focus on making products in a life where money is not a limiting factor. I might be an idiot for thinking that, and I may change my opinion. I want to build products, and sell them.

When I’m not working, I’m primarily thinking about weight-loss. I’ve lost 45 pounds so far, and I want to lose 35 more. I just started reading The Hacker’s Diet and it seems to align itself perfectly with my approach to dieting. I’m thinking of starting some kind of blog where I keep track of my stats and write about how I’m doing, hoping to influence someone else.

Thanks to my coworkers who first got me running in the morning before work and biking with them after work, I unintentionally lost 20 pounds, and when I saw the improvements, I kept going. Now that I’ve gone from shirts XL to Medium, and pants from size 40 to 34, I see the profound ways in which being fit and healthy can affect my life. Biking down a mountain, hiking up a mountain, running in races, these are all new experiences for me. These are all things I couldn’t have done no matter how hard I tried 7 months ago. When I go shopping now, I don’t leave depressed, when I go to the gym, I don’t have to keep holding the towel up as I go to the shower. It’s the little things. Things that to other people seems completely benign, are completely new experiences for me. Majd, if you gained back the weight, then FUCK YOU! You should first be ashamed, then on a diet.

Girls. Girls girls girls….There aren’t a lot of Christian Arab girls around here, at least not that I can tell. I guess American girls are cool too, just not the crazy variety. Are you single still? lower your god damned standards! Right now I’m not “looking” to find someone. I’m waiting to lose the rest of my weight.


Majd, you always look forward, never backwards. When you moved from Sayyidet Al-Farah to IISA, you learned to speak fluent English. When you moved from IISA to Livonia, you picked up web development. When you moved from Livonia to Ann Arbor, you got a job at Apple. When you moved to Apple…well I’m still here, I don’t know what you did but whatever it is, it better be a step up. Always look ahead.

Closing Quote

Heed these words, Majd.

There’s work, and there’s your life’s work.
The kind of work that has your fingerprints all over it.
The kind of work that you’d never compromise on.
That you’d sacrifice a weekend for.
You can do that work here.
People don’t come here to play it safe.
They come here to swim in the deep end.
They want their work to add up to something.
Something big. Something that couldn’t happen anywhere else.

Swim in the deep end. Always.