writing prose and code.

With only a couple hours of sunshine

the things you do with your day become more important. Morning comes slowly, without a specific beginning or end; sometimes playing canvas for cosmic radiation from some far away exploded star; and you know you have to do all you can in less time than you're used to at home, 30° south of here.

cosmic radiation

“Growing up” is one of those societal constructs advertised to us from an early age. We saw it in the cartoons we watched, toys we played with, and the adult humans around us — all “grown up” themselves.

But growing up is a very abstract concept. If I look at my own life, I can point to some aspect and say I grew up at some point in time. I could look at another and say I'm still growing up there. (Am I doing it right?) But for most, this idea is grounded in the expectations others set upon you.

In the US, the doctor recommends you get a job, buy a house, find a spouse, have some kids, and retire. Our culture reinforces this through our TV shows, our ads, our news, our magazines. And each accomplishment along the way continues this reinforcement with a celebration. Bought your first house? Congratulations! Get engaged? Great! Each milestone makes you feel good, and is one step closer to realizing your full “grown up” self.

Of course, none of this inherently bad. Self-sustainability is always good, as in getting a paying job. But once you can cover your basic needs (food, water, shelter), I think it's safe to declare you've “grown up.” Because part of being grown up means getting to decide what being grown up means. Want a family? Go make it happen! Rather not? Cool! You're a grown up! Do what you want! The important thing about growing up isn't “growing up,” but forming your own expectations for yourself so you can personally gauge how well you're doing in life.

Some people (like me) romantically dream of throwing out all the unnecessary things we've accumulated over the years and going off to live in the woods, or live off the land; to have a peaceful environment, or even to toil a bit.

It's a nice dream. But many people don't do it. We've already adapted; we're busy reveling in modern life. We like our houses and our things; our conveniences and our connections to one another. Because through all our invention, mankind's greatest is that of complete and utter comfort. We don't have to hunt or gather. We get to enjoy a cool room on a scorching hot day. We get to travel long distances with little physical effort. And we have really comfortable seats. We rarely end up leaving because our desire for comfort outweighs our desire to discover new uncomfortable things.

And it's an important realization. Thoughts of going off to live in the woods, or to work on a farm somewhere across the ocean, can take up a lot of your time. You think about what it might be like, and how wonderful it would be — almost as if you're looking for that last reason you need to go do it. But you're never really committed to it, and you usually realize there's actually something else causing the thought in the first place. The sooner you realize what that something is, the sooner you can focus that longing on improving your current place in the world, instead.

It was a warm night in late 2014. My day job hadn't provided me with any value outside of paper money in several months, and I was getting the itch to build a completely new thing. In recent months I'd heard my boss talk about Go (golang for you search engines) and how nice it was. I knew PHP, but had recently found Node.js in my last product, LunchTable, unrewarding. So a new backend language to learn appealed to me.

I've also loved writing for a long time. I never planned to make Yet Another Text Editor, but around this time I'd noticed how many people were using to essentially blog. Medium was also the hotness du jour, so I thought, what if I made pastebin look good?


I went camping the other weekend with a couple friends and a few acquaintances. As we got through the day setting up camp, cracking open beers, and gathering things to burn, we all talked. We talked about the manatees we saw while paddling out to our campsite, and if it would rain, and where the bug spray was. We talked about future plans and past travel and current life.

By the end of the night we'd all gotten to know each other better. We learned about the places we'd all gone. We learned that two of us were from the same big city suburbs some 600 miles away. We talked about deeper things.

Interaction online is funny, especially in the “social” space. You get to tell people about yourself without caring if they want to hear it in the first place. Facebook is meant for dumping every detail about you into a permanent profile for anyone to read. You dump a list of friends and family on there. You dump your daily thoughts and your opinions on others' thoughts. You dump your taste in music and movies and books. You dump your political affiliations on there.

Once you've done that, anyone can stop by and read what you've dumped. They can quickly determine your character without you saying a word or ever looking at them. And you'd think that's the goal of software like that. Facebook is really a self-profile with commenting and “connecting” added on. Which brings me to my next point.

On a camping trip with people you know or don't, no one draws lines between the groups and says, “we're friends, you're acquaintances, you two are married, we're dating.” The environment provides some kind of commonality — you're all in the same space to do the same thing together. Then over time you learn about the people surrounding you.

On supermassive all-purpose social networks like Facebook, there is a vapid culture and no implied commonality built-in — except that you're all on Facebook at different times, liking and throwing out your two cents on things. There, human relationships are sliced and mechanically separated into billions of one-to-one connections to make it easier to display with the rest of your self-dump. It's like a city where a billion people live but everyone is invisible except your few reciprocating friends.

What does a “friend” or “follow” or “connect” mean on the web, anyway? When I follow someone on Twitter or Instagram, I'm usually doing so because I like their tweets or photos. But following someone also tells them something — maybe that I like their tweets. Maybe that I'm attracted to them. Above all, now they know I exist, and if they're bored maybe they can figure out who I am by visiting my feed — and instantly we are silent acquaintances. But what happens when we unexpectedly see each other in real life? Do I say, “Hey, @ilikebeans! I like your tweets! Really sorry about your cat, but I liked your blog post. Oh and great tip about that band!”

Maybe it's the initial connection context that makes things weird. In school or other times of high sociality, adding a “friend” on Facebook made sense. The kids in my school made up almost everyone I knew outside of my family. I saw them every day. Even the ones I wasn't as close to I could call my friends because we saw each other so often and at that point you couldn't go wrong by having loads of “friends.”

But “friend request” doesn't make as much sense when you get out of that. Now I have friends and acquaintances in different parts of the world, known in various contexts for various lengths of time. I barely have time to keep up with most of them. So the “friend request” is really a mutual human bookmark so that I can just silently follow people I've met at least once.

But I'm an optimist. Personally I look forward to the next one-click solution to this awkwardness. Whether it's gentle creepiness of the one-way follow or the ceremony of generously calling everyone “friend,” it's clear we still haven't arrived at a good substitute for human interaction yet. So maybe we go the full bot route, where we cut the crap and let artificial intelligence chat, tweet, and Facebook for us, freeing us to go meet our friends for lunch or (really) just download the next ground-breaking freemium game. Or perhaps we bring these online norms into reality, asking people if they'll be our friends or if we can follow them down the road and listen to everything they say, real-life retweeting and “liking” things along the way. Whichever route we take, I know humanity will be better off, and especially more social than we've ever been.

A lot of products need to move quickly to stay ahead of bigger competitors. They have an advantage over the slow-moving behemoths. They can decide they need a feature and see it come to fruition in a week. They can consistently wow customers with each small iteration that actually gives them 100% more value out of the product.

But this doesn't always fit the smallest products. And when you're building one that isn't focused on hyper growth or is in its early days, an abundance of time can be a luxury. It can give you the necessary time to consider how everything fits together. There will always be a gentle pressure to push forward, but here it's just a gentle hum enough to keep you going.

#minorthoughts #sketches #software

One of my favorite things about is the way users create accounts. I've always seen account creation as a major barrier to entry for any product, and sought out reducing it from the very beginning in my own.

But unlike many products that eschew a Sign up page for a multi-step process, actually functions well with varying degrees of information about a user. The pipeline goes a bit like this:

  1. Anonymous user (default). No cohesive account stored on the service.
  2. Reserved username. Account is created with nothing more than a username. Only the device the account was created on can access it.
  3. Authenticated account. Account has a second piece of information that allows a user to log in to that account from anywhere.

Once a user is at step 2, they can do everything a user can do — though only from that device. But to prevent losing access to their data, we prompt them to add authentication information on many backend pages, as well as prevent them from logging out until they add something that'll let them get into their account — whether that's an email address, password, or both.

After three months of users being able to register, we have some interesting stats. Out of all the accounts with authentication information:

  • 74% have set a password
  • 83% have set an email address

This shows how most new users add both an email and password, but overall, users' favorite authentication method seems to be via email, where they simply receive a one-time link to log in to their account. Many other online services have caught on to this too, like Slack and Medium. But for some switching to an inbox can be inconvenient, and for them there's always the trusty password.

#tech #ux #products

The world outside was slowly growing dimmer. I noticed a bright light somewhere out in the blue — far brighter than any far-away ship or building — that suddenly swelled to the size of a moon, down there, floating in the ocean off the coast of South Carolina. I couldn't believe what I was seeing.

The rest of the travelers in our flying bus napped or stared listlessly at a shiny slab in their lap and the staring yellow orb morphed into a full circle out in the blue. As we banked to the right — a nod to its awakening — it seemed to rest in acknowledgement, hanging for a moment on the invisible horizon.

This was the first time I'd seen the moon like this. All that time on the ground had me convinced such a view didn't exist. Yet here I was, awestruck and growing a kink in my neck.

As soon as it had appeared it was gone, only to emerge an hour later at a higher vantage point. In the black it shone like an astral locomotive coming head-on, but never approaching. It hung there, illuminating a lumpy landscape of clouds below, reminding me of some bright winter night in my past.

Below, tiny sparse clouds hovered above the cities, sparking to life like fireworks in a pillowcase. The world in this light entranced me until we touched down. Among the street lights and headlights I came to again, mesmerized now by the yellows, blues, and whites of the fluorescent city.


In late June / early July we experimented with pricing before releasing our more successful Casual plan at the beginning of August.

When I launched 2.0 I knew people would need to feel extra charitable if they were going to become a paying user. We provide most of our value gratis, largely in the name of a frictionless user experience*, and had added some new paid functionality that most people could live without. Still I launched the Pro plan to make sure everyone knew the product was meant to be self-sustaining and that the business model was finally in place.

In the short months since then I've stepped back from the product to reflect on what we were actually offering users. We have a great writing experience on nice, native mobile apps: great. We enable people to accomplish something without bogging them down in bullshit marketing goals: awesome. Those are very valuable things that people might pay for. But to start charging would be to give up the aspects that have helped grow organically for the past 18 months.

So I'm glad we've hit a price point that more people are happy paying today. Now that we've arrived at it, my focus is back on finishing our various apps/clients to complete the 2.0 update across the platform. Android is up next, and it's looking really good.

Until next time.

* And that experience, to be frank, trumps all design/business goals besides our privacy ones. Stay tuned to see if this becomes our downfall.

Today I checked off a long-standing task for self-hosting our fonts. Back in September, Ghostery started blocking Typekit/Google's Web Font Loader. But I also didn't want to depend on a third party for these key design components.

This is how I did it:

  1. Using google-webfonts-helper, I downloaded Lora and Open Sans — the font faces we use on — and added them to a new fonts folder.
  2. I added the CSS from that tool to a new CSS file on (fonts.css).
  3. I grabbed webfontloader.js from Typekit's GitHub.
  4. I changed two lines on pages where we loaded fonts:

In WebFontConfig:

google: { families: [ 'Lora:400,700:latin' ] }


custom: { 
    families: [ 'Lora:400,700:latin' ], 
    urls: [ '/css/fonts.css' ] 

In the loader code, wf.src = ... changed to wf.src = '/js/webfont.js';

And that's it!