Just drank my first one of these and man is it good. Highly recommend it if you’re a coffee person.

Multiple Lines of Tabs in Atom

This week I’ve been using Atom as my primary IDE, instead of PHPStorm. One of the crucial things that Atom doesn’t come out of the box with is the ability to have multiple lines of tabs. What’s amazing though is that since Atom is mostly a glorified browser, everything about it is customizable through CSS. Here’s the CSS I’m using to have multiple lines of tabs.

.tab-bar {
  height: auto;
  flex-wrap: wrap;
  .tab, {
    flex: 1 0 auto;
    height: 30px;
    line-height: 27px;
  .tab .title, .title {
    padding-right: 5px;
    position: relative;
    top: 1px;

To use this, just paste it in Atom -> Stylesheet... in the menu bar. It’s is a modified copy and paste from this GitHub issue. The only thing I changed was the line height. Probably the core CSS for Atom has changed since then, because that line height made the close buttons look really bad.

The ability to just customize your IDE directly via CSS like this is so amazing.

Policy Change, or Miscommunication? 

John Gruber, regarding the Commission Update from Apple:

This policy change is good news though.

Maybe it’s just me, but this doesn’t sound like a policy change. Instead, this sounds like confusion inside the company. Miscommunication that had to be fixed. I don’t think reducing commissions on paid iOS apps was ever something Phil Schiller wanted.

Flexbox in GIFs 

For the longest, Flexbox has been a black box of confusing magic to me. It’s slowly coming together and making more sense. This article helps a lot with that.

Release Notes for Slack for iOS 3.1.8 

Slack’s release notes on iTunes:

What’s New in Version 3.18

  • A new and improved message input is being rolled out that helps you quickly attach photos and files, access slash commands, and @-mention teammates. Fewer taps > greater taps. Or, more accurately, Greater and also fewer taps > lesser but more numerous taps. tl;dr Tap less: Do more.
  • Updates to the Custom Status feature (though not to yours, that’s yours alone to update).
  • Fixed: The last word is now autocorrected when tapping the send message button. Hopefully to something that is correct.
  • Fixed: Improved push notification handling for Enterprise teams.
  • Fixed: Inviting someone to a channel no longer fails silently for users on Enterprise teams. Which is not to suggest it now fails loudly. It no longer fails, silently or loudly: IT JUST NO LONGER FAILS.

I’m loving this update to one of my favorite apps of all time. The new “Send” button is great, as well as the ability to open the compose box in a fullscreen.

Ryan Fait, 1986-2014 

Ryan Fait was a brilliant and innovative web designer who graced the lives of all who were privileged to know him before his untimely death.

Web design was so much his passion that he was happy to share his expertise online, free of charge, to anyone willing to learn.

He is deeply missed by his family, friends, and clients.

I never knew Ryan Fait in person. I never talked to him. But I knew of him very well, for many years. This was the I knew (the .com domain now redirects to a .net obituary). I used to spend a lot of time pouring over the small site, admiring every detail of it. His sticky footer was invaluable. “Ryan Fait sticky footer” was something I’d google at least a couple of times per year. I’m using Ryan’s sticky footer here on Drinking Caffeine. It was so clean and it just worked.

I know he’s been dead for more than two years now but it feels like he just now died. I had no idea.

The Essential Need for a Competitor to

I’m envisioning the presumably impending ability to aggregate RSS into a community in a similar fashion to git or email. The underpinning concept is as follows:

Git, email, and microblogging should all require minimal pain for the end user to switch from one service to another (e.g. from BitBucket to Github, from email to Google Apps for Business email). The migration might take a few hours but the workflow once resumed won’t change from what it was, and you shouldn’t have to retrain or migrate a community.1 However, while the end user migration is trivial, the infrastructure required to support a given implementation of the spec is non-trivial, and that’s ok. Analogously, it’s easy to understand and use the basics of git, but the code behind GitHub is very complex.

You can intercommunicate between differing email platforms. Someone on email can communicate with someone using Google Apps email. This should also work with Microblogging. Let’s say there is a competitor to Your friend is on this competitor platform. You both own your own data. So you could be having a conversation by posting to your blog and seeing the replies from your friend, while they post to their blog and see your replies on their preferred platform.

If Google Apps were the only implementation that existed for email, it would not be clear to the community whether what Google offered were any more transferrable than a locked down communication tool like Skype. In other words, the proof that a given system doesn’t “lock you in” a la Twitter can only come when you have two systems in place and demonstrate that migrating from one to the other is a relatively trivial task for the end user, and that it does not noticeably affect the day-to-day workflow of that end user’s social sphere. needs a friendly competitor. In a way that nothing else could, a competitor would make it clear that has accomplished what it set out to do.

  1. In the case of git, it’s true that you’d have to get your company to create accounts on the new git platform. But you wouldn’t have to get the entire software ecosystem to change. You could move to BitBucket and continue to rely on third party packages that are hosted on GitHub. It’s next to impossible to get 100% of your friends to switch from Twitter to (now defunct, but that proves my point). It is possible to get your company moved from one git platform to another, however. ↩︎

Bear Writer 

Bear Writer is the best note taking app that I have ever used in my life. It’s better than, Vesper, Standard Notes, and Simplenote. I’ve been using it for two full workweeks and it’s the only one I’ll use now. So many great features that all come down to one thing: its design is impeccable. Truly tasteful. Check it out.

Should Facebook and Google Actually Do Anything about Fake News? 

Ben Thompson, quoting himself from last fall at Stratechery:

I get why top-down solutions are tempting: fake news and filter bubbles are in front of our faces, and wouldn’t it be better if Facebook fixed them? The problem is the assumption that whoever wields that top-down power will just so happen to have the same views I do.

The tendency among those advocating for tech companies to interfere with algorithms and feeds is to forget that everyone is biased and has a specific viewpoint. We all like to think we’re the standard objective but we aren’t. The moment tech companies trifle with the playing field, they’re going down a slippery slope. I’m in full agreement with Ben here.

Ben goes on:

I noted above that deciding how to respond to fake news is a trade-off; in the case of Facebook, the fact that fake news is largely surfaced to readers already inclined to believe it means I see the harm as being less than Facebook actively taking an editorial position on news stores.


The Accounts Begin 

Brent Simmons:

I’m on Manton‘s cool new microblogs system. Here’s where you can follow me, once you’re on the system:

The design of is going to be key to its success.1 It’s not very refined (yet?) but I do appreciate how minimal it is. Avenir as a font choice is great (though San Francisco would be my preferred choice). Also would love to see the avatars left aligned on mobile.

And here’s my microblog: (Which you can read using RSS, whether you’re on the system or not.)

Not loving Helvetica here. Looks like some bad ideas from Twitter have crept in here. Sans-serif fonts have to be smaller than serif fonts. You get them too big and they just don’t look right.

I wrote about three-quarters of my own single-user microblog system — and then stopped because I didn’t feel like running a server and because Manton’s service is so good.

I’m confused about this part. What all is involved here? My understanding is that you just have to provide an RSS feed with the appropriate specs. If you’re using WordPress or Jekyll or most any content management system, that’s really eassy. Was Brent trying to get fancy or what? It’ll be more clear as the public beta rolls out to more people. I just can’t wait to set my account up. Now I’m wishing I’d backed the project on Kickstarter, just so I could get in early.

  1. Or at the very least, key to whether or not I enjoy using it. ↩︎

A Reminder of the Volatility of Startups 

Nick Statt, writing for The Verge:

Yik Yak, an anonymous messaging app for college students, announced today that it would finally be shutting down. The app first launched back in 2014 as a way to discretely communicate with others nearby, and it took off quickly for its gossip-centric role in American universities. Along the way, the team scooped up $73.5 million in venture capital funding. With today’s closure and an accompanying SEC filing issued last week, we’ve learned that mobile payments company Square looted Yik Yak for its engineering talent and some minor intellectual property to the tune of just $1 million. At one point, investors valued Yik Yak at $400 million.

Easy come, easy go. It’s one thing to write software and get funding for that software. It’s another thing to scale into a sustainable longterm business. That part is incredibly hard.

A Git Riddle

Today’s puzzle would make a great job interview question. It’s a question that I would’ve failed before today. Are you ready? Here it goes.

Consider the git branch feature-1, which is based on master. Is there a situation where merging the latest master into feature-1 before then merging feature-1 into master would result in a different software state than if you simply merged feature-1 directly into master? If so, describe how this could occur.

The answer is yes, surprisingly. There are probably more elegant ways to arrive at a proof, but here’s how this is possible. I’ll mostly just let you read through the logs, with an explanation at the two critical sections.

$ mkdir git-test
$ cd git-test
$ git init
Initialized empty Git repository in /Users/martynchamberlin/Desktop/git-test/.git/
$ touch
$ git add .
$ git commit -m "First master commit"
[master (root-commit) 6bb6304] First master commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644
$ git checkout -b feature-1
Switched to a new branch 'feature-1'
$ touch
$ git add .
$ git commit -m "feature 1 first commit"
[feature-1 17339cb] feature 1 first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644
$ git checkout master; git checkout -b feature-2;
Switched to branch 'master'
Switched to a new branch 'feature-2'
$ touch
$ git add .
$ git commit -m "Feature 2 first commit"
[feature-2 0b3cb11] Feature 2 first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644
$ git checkout master
Switched to branch 'master'
$ touch
$ git add .
$ git commit -m "Master second commit"
[master 321e0e5] Master second commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644
$ git merge feature-2
Merge made by the 'recursive' strategy. | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644

Here’s where things go wonky. The developer working on feature-1 hasn’t fetched the latest origin, and attempts to apply the latest changes that are in his latest local master manually.

$ git checkout feature-1
Switched to branch 'feature-1'
$ touch
$ git add .
$ git commit -m "Manually add feature-2 on feature-1"
[feature-1 9335baf] Manually add feature-2 on feature-1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644
$ git merge master
Merge made by the 'recursive' strategy. | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644
$ git checkout master
Switched to branch 'master'
$ git revert -m 1 65a6f49 # top commit of `git log`
[master 151c8d7] Revert "Merge branch 'feature-2'"
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644
$ git checkout feature-1
Switched to branch 'feature-1'
$ git merge master
Merge made by the 'recursive' strategy. | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644
$ ls

At this point, if we were to merge feature-1 into master, we would not have the file. However, what if we had not merged the master branch into the feature-1 branch before merging the feature-1 branch into master? In that case, we would have the file. I’ll prove it:

$ git revert -m 1 91bd90a # top commit of `git log`
[feature-1 4c713c6] Revert "Merge branch 'master' into feature-1"
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644
$ ls
$ git checkout master
Switched to branch 'master'
$ git merge feature-1
Updating 151c8d7..4c713c6
Fast-forward | 0 | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644
 create mode 100644
$ ls

The takeaway, of course, is to never fetch changes from external branches in a way that causes git to think that those changes occurred in the current branch as new code.

External Keyboard Shortcuts for iOS 

I’m typing this on a Bluetooth keyboard in Editorial for iPhone. More later on my setup. The question is whether or not this will eventually become the future: whether we can get iOS apps deep enough to replace macOS. It’s too early to tell, but the past 24 hours are the first time that I’ve realized that it might be possible. What you can do with Editorial is truly remarkable.

Meanwhile, here’s the list of keyboard shortcuts that are accessible to a Bluetooth keyboard. It’s a decent list, although we’re going to need many, many more until it feels like you can fly on an iOS device like you can on a Mac. Basically we’re going to need keyboard shortcuts to mimic what you can do with a mouse on macOS.

“The idea might suck too, but we'll never be able to tell.”

Yesterday, Scott Adams announced a hackathon for 3 different contests surrounding his WhenHub app.

A goal-oriented startup would have a specific customer and a specific product in mind. If that doesn’t work out, the startup might have enough cash left over for a pivot, or maybe two, to try again. But in each case, there is a specific goal. And the way startups work, the odds of any particular startup hitting its goal is dismal. That’s why WhenHub was designed from the ground-up to be a systems business model instead of a goal-focused model. The idea is to get something like a portfolio effect to increase the odds of at least one of the things we’re doing becoming a profitable line of business.


Now we’re taking it up a notch by running an online hackathon for our WhenHub platform.

Being systems-oriented sounds good in theory and it works in certain situations - evidently it worked for Donald Trump - but when it comes to a product, it doesn’t work. What Adams needs is a very clear product and value proposition while simultaneously being willing to pivot by listening to what the market tells him. Instead, he has an ambiguous product that he’s attempting to crowdsource into existence. What does WhenHub do, and why do I need it? That question needs to be asked and answered succinctly and satisfactorily. The fact that it can’t be is worrisome.

This morning I cloned the WhenHub/mycomposer repo and played around with it some. Going through that process was buggy. I had to re-clone the repo several times before the system dynamically populated my instance’s manifest.json variables to my own data. And even then, because it wasn’t bulletproofed to handle repo deletion and re-cloning (despite it prompting for this), the css and js folders didn’t exist, so I had to manually copy them from a zip version of the original.

Once I was finally working - it took me over an hour, and I consider myself decently well versed in how to set up front-end environments - I got to looking at the actual JS code. It’s all in ES5, not ES6. This tells me right away that the developers aren’t living on the edge. They aren’t hustling. Scott’s not surrounding himself with a Class A team. Now admittedly, doing that is tricky when you’re not a developer yourself and don’t know what to look for. But man. I went from thinking, It’d be fun to take a stab at one of those $4,000 prizes, to thinking, I could spend the same amount of time elsewhere on a guaranteed gig, make the same amount of money, and actually get to work with a code base that I’m not cringing over.

So we’ve got:

  • A product that’s a non-product, one that glories in the fact that it doesn’t know what it is yet.
  • An interface that’s as bloated as Microsoft Word.1
  • A code base that’s full of holes and lives in the past.

I’m going to leave this hackathon to others. It’s fundamentally flawed in ways that I can’t help it. I’m reminded of a comment that a Dilbert Blog reader left about it.

There is an idea behind it, it’s the execution and presentation that sucks, something that [Steve] Jobs would eat the developers alive for.

The idea might suck too, but we’ll never be able to tell.

Yeah, pretty much.

  1. Not actually that bloated. But definitely too busy and way too many borders and box shadows. ↩︎

Publishing to Jekyll from an iPhone 

With coming out soon - the invite-only beta is already available - having the ability to publish to a Jekyll powered site from an iOS device is a must. Kirby Turner has put together a good resource here on how to publish to a Jekyll site directly from an iPhone. I’ve sort of wanted the ability to do this in the past, but with the imminent launching of, this is soon going to become a must. The idea is that you need to be able to publish something to your site - which gets syndicated to - as easily, or almost as easily, as opening Tweetbot and posting a tweet. Until we get to that point, this isn’t going to take off.

I’m not going to rest until I’ve got a similar setup going on over here.

Minifying HTML in Jekyll 

I’m reading Web Performance in Action by Jeremy Wagner and one of the things he introduces is NPM’s html-minify module. The performance benefits are undeniable plus it just looks better having the source all consolidated. Here’s how to do that in Jekyll, which you’ll notice I’m now doing on this site.

On Command Clicking Finder Arrows in macOS Sierra

It used to be the case that if you ⌘click Finder arrows in macOS, it would be the equivalent of ⌘click Safari arrows. In other words, it would perform the same action as a regular click - going forwards or backwards in history - but it would load the new view in a new tab.1 That’s no longer the case, and I think macOS 10.12.4 is the first version in which this is true. It’s possible the change was introduced earlier, but I didn’t notice until 10.12.4. For a while I thought this was a bug but today I realized that it’s intended to be a feature. Going forward, when you ⌘click the Finder arrows, you trigger an ability to rearrange / remove the customizable items in the Finder bar.

I’m not happy about this change for two reasons:

  1. It creates ambiguity about what ⌘click does on arrow buttons. It’s no longer consistent across the apps. Finder and Safari (and all other browsers) are now disjointed.
  2. It’s much more common to need to open a Finder history in an enclosing window than it is to rearrange or remove the items in the Finder bar. Once you’ve got your Finder bar items set the way you want them, you’re done. That’s a once-every-six-months sort of thing. Navigating through history on the other hand is a daily task for some people.

The new ⌘click functionality in Finder is not limited to the arrow keys. It’s available on any customizable item in the Finder bar. In asking for Apple to restore ⌘click on arrows to their former functionality - that of opening in an enclosing window - I’m aware that I’m asking for ⌘click to do different things in the Finder bar depending on what you click on. I’m ok with that. ⌘click on the title in the Finder bar already does something different anyway: it shows a dropdown menu of items, each of which is a shortcut to the previous item’s parent directory, starting with the current directory and traversing past Macintosh HD all the way to the very root (i.e. “Devices”).

If performing the same action (⌘click) on different looking things (e.g. Finder arrow buttons and Finder search) in the same area (Finder bar) results in different outcomes, that’s not inconsistency. If performing the same action on similar looking things in different areas results in different outcomes, that is inconsistency.

The Problem with Apple’s Rumored Premium 2017 iPhone

For quite some time, it’s been rumored that this year’s iPhone is going to have two tiers with noticeably different industrial designs. From Mac Rumors:

Japanese site Mac Otakara believes the iPhone 8 might actually be called the “iPhone Edition,” after the higher-end Apple Watch Edition models. Such a name would reportedly reinforce its position as a high end iPhone that’s meant to be sold alongside two standard iPhone models.

And then this morning from The Verge:

2017 marks the iPhone’s 10th anniversary, and the rumors are that Apple will be releasing three new models to celebrate: two handsets with incremental improvements, and a third, radically redesigned “premium” iPhone.

Here’s what bothers me about this. If Apple does this, then it’s essentially saying that a full screen iPhone isn’t for everyone. It’s only for the people who really want it, who are willing to splurge. That might be ok, except that the Galaxy S8 has this premium screen, and the Galaxy S8 isn’t a “premium” or “luxury” SKU. It’s the de facto in the Galaxy lineup.

In other words, Apple is saying this: what our competition views as essential, we view as a splurge only for those who want to pay us even more exorbitant amounts than they’re already used to paying. That really rubs me the wrong way.

If Apple’s baseline 2017 iPhone had everything the Galaxy S8 had to offer and then its premium iPhone had even more, that’d be one thing. But that’s not what I’m hearing through the grapevine. Instead it sounds like if you want an industrial design that’s visually similar to the Android competition, you’re going to need to go all the way to the top of Apple’s pricing tier. You shouldn’t have to do that. The subliminal message that Apple is emitting in its rumored decision here is unsavory.

Twitter’s CEO Weighs in on the Shadowbanning Allegations 

Scott Adams:

Earlier this week, Twitter CEO Jack Dorsey contacted me to discuss my ongoing public observations that Twitter appears to be “shadowbanning” me because of my writings about Trump. Jack introduced me via Direct Message to Del Harvey, Twitter’s Head of Trust & Safety, for the official answer.

The official answer is that no one, including me, is shadowbanned on Twitter. It has never happened.

There are about four possible explanations at this point.

  • Twitter is outright lying. I find this extremely unlikely. I’m leaning towards taking Twitter’s statement at face value.
  • Or employees lower down the food chain are monkeying with tweet visibility and their superiors are blissfully unaware. This sort of thing is farfetched, practically unheard of, and can cost a developer his job, so I think we can rule this one out.
  • Or there’s a conveniently partisan bug in Twitter’s software.
  • Or this is a clear example of confirmation bias, and Scott is living in a delusional world.

Something strange is afoot. The last option seems the most likely, but there’ve been an awful lot of incidents that are hard to explain away to pure chance.

Apple’s 5GB iCloud Storage Is a Disgrace

When you sign up for Dropbox, you get 2GB of space. If you want more than that, you can earn it by referring other at 500MB per referral. That’s not much space, however, so more than likely you’re going to need to upgrade to Dropbox Premium which starts at 1T.

This is a sensible business model because it Dropbox’s only source of revenue. Selling storage is what Dropbox does.

But why does Apple think it needs to charge for its premium storage in iCloud? You cannot have more than 5GB with a free plan. From Apple Support:

When you sign up for iCloud, you automatically get 5GB of storage. You can use that storage for backups, iCloud Photo Library, iCloud Drive, Mail, and more.

It’s possible to sign up for iCloud without owning any Apple devices, but how many people do that? I’m going to say that number is small - very small. The overwhelming majority of people who own an iCloud account have spent many hundreds if not thousands of dollars on Apple products. They should have more storage than 5GB in iCloud.

When you buy an Apple Device, you should get as much iCloud storage as that device can contain. The pain and annoyance of not having this is much more tarnishing to Apple’s brand than the revenue that Apple would lose from having it. This is the exact argument I made for the Mac Pro. Not selling a Mac Pro is more of a financial problem in the long run for Apple than losing money1 by developing and selling a Mac Pro.

I was reminded of this frustration today because my iPhone cannot back up to iCloud unless I upgrade to premium. It wouldn’t hurt me to pay the $11.88/year, but it’s the principle of the thing. You spend $2,000 on a MacBook Pro and then Apple tells you to spend 99¢ per month with them so you can store 50GB of that data in the cloud. That’s disgraceful and insulting. It’s the equivalent of being at a high end steakhouse and the waiter telling you that bringing a wet towel at the end is going to be an extra 99¢, please confirm. The price of that towel should not be something you’re aware of. It should be bundled in the overall price of the meal. The overall experience. Of course hosting data in the cloud costs money. Apple’s users should still have to pay for it. But that method of payment should be bundled in the cost of the devices, which are arguably marked up enough to not need a price bump just to include this.

And then for the iCloud users who don’t have activated Apple devices, well, let them pay. Or make it mandatory that you own an activated Apple device to use iCloud storage.

  1. That’s relatively speaking, from an opportunity cost standpoint, compared to investing that money in the iPhone. If Apple actually runs at an operational loss on the Mac Pro then something’s badly wrong. ↩︎

Slack’s ‘Setting Your Status’ Feature 

From the Slack blog:

Let’s say you’re stepping away from Slack for a bit — maybe you’re grabbing some lunch, taking a week off, or even just focusing on a task for a few hours. Now you can set a custom status in Slack to share what you’re up to, when you’ll be back, whom to contact in your place, or anything else that helps your team know when they can expect to hear from you.

I actually fully expect Slack to dial this back at some point. The concept is great but the implementation is too busy. When you set a status update, it appears in the following places:

  • In the sidebar.
  • In the text box that people see when they message you.
  • In your profile header.
  • At the end of your name, everywhere you write messages.

The idea of a status is a great idea in one or two places, but having it in these four places is just too much. Even if only 1/3 of the people in your Slack channel implement this feature, it has the result of getting way too busy. The overall UI looks more like a child’s toy than a serious application for professional communicating.

Every maturing company fights against bloat. Some more than others. Some companies fight tooth and nail at the expense of not looking like they’re innovating. Others fight so little that you get the feeling that the place is turning into a cluttered junk yard. Finding that balance is hard.

Everyone Working on the Mac Pro Should Listen to This Episode 

I just finished listening to Thermal Corner, the first ATP episode that came out after the new Mac Pro was announced. Everyone at Apple should listen to this episode, particularly the word of caution at the end. For Apple to continue to update this new Mac Pro, people are going to need to buy it. But in order for them to buy it, they’re going to need confidence that it’s a product that Apple is truly invested in and won’t abandon. And Apple must prove that by issuing new updates to it every year. That’s the only way Apple’s going to restore the confidence and trust that was broken with the 2013 model.