Four years ago, I was in Nashville at a friend’s house, eating shrimp, drinking Bud Light. The election was called not long after we finished dinner. I remember thinking even Trump looked surprised.
Sam and I walked back to our house on the other side of 12th South. It was cold.
Two weeks later, I loaded my bed and Apple Cinema Display into a Penske truck and drove up I-65.
I first lived in Gold Coast, walking distance to The Loop in downtown Chicago. I went to Carmax to sell my car. I bought my first down coat. I started reading Vonnegut novels. I fell in love with riding the L.
Then I moved up to Lakeview. I got a tortilla press. I started a sourdough culture. We paid ourselves with money from Bottle for the first time.
Our apartment overlooked the Paulina Brown Line stop. I worked from my bedroom, but enjoyed watching people run from Starbucks with their coffees in hand, trying to catch the morning train.
Then I sold my Ikea bed and Ikea desk and Ikea chairs. I packed a 55L Osprey backpack. We left Chicago.
I stocked up on Rx Bars from the Midtown Atlanta Industrious. I didn’t know if I could trust China Southern’s inflight dinner.
I flew to Phnom Penh. We looked at all those temples near Siem Reap. We crossed the border into Laos, went backpacking in the jungle, ate noodles in Pai, crashed a motorbike, lived a yuppie month in Bali, slept out of a minivan at the bottom of Mt. Cook, spent the winter skiing in Sun Valley, and drove a Subaru from San Francisco to Bar Harbor, Maine.
Then we settled down again. We moved to San Francisco. We landed in SOMA before moving to Alama Square.
I went to Napa for the first time, got a coworking membership, and even bought an Arcteryx bag for run-commuting.
Then we quarantined. Then we bought a new Subaru. Then we left.
It’s a new election night. I can’t believe it’s been four years.
“I wanted Uber Eats because it was raining. But didn’t end up ordering because it was raining.” - Recent text from a friend
Paying for somebody to deliver burgers and fries usually feels fine. They could decline the gig if the price isn’t fair.
But when you’re sitting on a bench across from a mid-forties man rubbing his knee and popping Advil, or when a woman is standing outside the door, dripping wet, brown bag in hands, glancing at the gray Scandinavian couch and 65″ Sony on the wall, guilt creeps in.
Maybe Doordash and Instacart aren’t stealing the tips. Maybe they are. I don’t know. But I do know something feels weird about paying somebody to mask up and pluck items off the shelf while I sit on the couch. For only $8!
I’d order more often if I didn’t feel guilty.
But the gig economy is stuck in a prisoner’s dilemma. Doordash can’t raise prices to pay Dashers™ more. If they did, everyone would use Postmates or Uber or Amazon instead.
Game theory means it’s cutthroat prices and cutthroat wages. Game theory means inside every bag of hot food left on the doorstep, there’s a little feeling of shame. They could decline the gig if the price isn’t fair.
When price for delivery goes up, people order less often. Same in the other direction. But I wonder if the gig economy prisoner’s dilemma is suppressing overall demand for food and grocery delivery.
If seeing Palm Oil on an ingredients list didn’t make customers think about deforestation and global warming, then more products would have palm oil.
The same goes for delivery and labor practices.
I interrupt the highly irregular but continually aspirational drip of daily Second Breakfast prose to briefly act like one of those recruiters who scrapes your email off Github.
Bottle combines memberships + texting + order-ahead to fix retention for local businesses. Bottle merchants frictionlessly text with their customers, build followings, and remind members to order without forcing subscriptions. Drives higher weekly revenue.
We started Bottle in 2016. We’ve grown using the money our customers pay us every month. And now we’re building Bottle 2.01 with Rails and Vue.
We need a Rails developer to help us with the backend. This developer will work with me to plan the app’s logic and build necessary API endpoints. We use Heroku, Postgres, JSON:API, Pusher, Algolia, and coffee.
Perks: you get to laugh at all the mistakes we’ve made.
Cons: you have to cry at all the mistakes we’ve made.
My friend Jane and her cofounder Sabrina started a women’s health company called Pollie to improve the patient journey for PCOS, endometriosis, and other hormone imbalances. I love what they’re doing.
They’re hiring for a founding engineer role.
Hit me up or email will @ sendbottles if you’re interested in chatting about either.
Here’s the Bottle 2.0 checkout experience we’re building. Now we need to bring it to life:
Growing up, I remember “Save Public Radio” stickers all over the place. Beanie-wearing hipsters would sip lattes and bemoan the iPod’s war on radio. There were petitions for grants to keep WBHM’s lights on.
But radio is a tiny blip in the history of music. Ancient Rome had lyres and tubas and bagpipes. Everywhere we discover ruins, we discover instruments. For tens of thousands of years, we had to gather together in order to hear each other strum and hum.
Then, less than 150 years ago, we figured out how to mechanically record sounds. A few decades later, we started transmitting speeches over radio waves.
Radio was a century-long stopgap, a bandaid in-between the invention of recorded music and the invention of the Internet.
Radio’s reign was a four-generation blip.
We complain about losing lots of things as if they’re a part of civilization’s natural order. “People don’t get coffee with friends anymore.” “When’s the last time you called a friend to catch up?” “The dinner party is dead.” But coffee shops, long-distance phone networks, telephones, and McMansions are all recent inventions. 19th Century humans found happiness without them.
Similar to radio, the “death” of San Francisco is being widely reported. Who knows, maybe it’ll continue to be the heartbeat of software. Maybe it won’t.
But what bugs me is when people talk about SF as if it has always existed as some oasis, as if it has always been the center of the technology industry.
San Francisco did not exist as a city until 1850.1 In the 1960’s, San Francisco was a hippie town. Silicon Valley was exactly that - a valley - until Hewlett-Packard and Fairchild Semiconductor sprung up around Stanford. VC’s and entrepreneurs have migrated north to SF in only the past two decades.
SF’s reign has been a one-generation blip.
San Francisco could easily remain as the burning core of the software industry, but crazier things have happened. London is no longer the world’s biggest financial center. Milan is no longer the heartbeat of fashion.
The world keeps changing, yet we keep holding onto things that “once were” and onto how things “should be.”
Cities evolve. People move. We discover new physics equations.
Movies replaced live shows. Now binging habits on Netflix are destroying the movie as a medium.
Talk radio replaced Lincoln-Douglas debates. Now podcasts are replacing talk radio.
Office spaces, cities, cars, suburbs, drive-thrus, jet engines, restaurants, cheeseburgers, hotels, Airbnbs, trains, Zoom, colleges. All of these are cultural stopgaps, blips enjoyed by some number of generations until they’re replaced.
These things are not the natural state of civilization. I’m looking forward to what comes next.
Bloodhounds can smell whether or not a human has merely touched a Coke bottle.
When Richard Feynman discovered this fact in a Science article, he decided to try it himself. He handed his wife a six-pack and told her to handle one of the bottles for a couple minutes while he was out of the room.
When he came back in, he immediately picked the bottle she’d touched. “As soon as you put it up near your face, you could smell it was dampish.”1
He repeated the experiment with coworkers by telling them to take books off a shelf, open them, and put them back. He then proceeded to correctly guess which books they had touched based on smell alone. They were so surprised that they thought he was pulling a “confederate” magic trick.
Bloodhounds, of course, have a much better sense of smell than humans. They can easily follow the path a human has traveled across a carpet. When Feynman got down on all fours and tried to sniff his friend’s trail, he failed.
But bloodhounds having a good sense of smell doesn’t mean humans have a bad sense of smell.
My entire life I’ve been amazed whenever a dog has smelled my hand and then started barking because they knew I’d been cheating on them.2 But not once have I thought to hold my hands up to my nose to see if I, too, could smell the difference.
But I usually don’t get down on all fours and press my nose to the carpet. Maybe I should more often.
I started programming a decade ago. I’ve gone through four distinct coding phases.
In high school, I had an idea for a group texting app. I wanted to assign phone numbers to groups of friends, and then whenever anybody in the group texted the number, everybody else would get the text. “Twitter for friends,” I tried to explain.
Only one person in my high school - Robert - knew how to code. He put together a Twilio script and after a few weeks we could text each other via a shared number. Magic.
Then we went off to college.
I kept searching for somebody to work on the idea. One day, a friend added me to a GroupMe text thread. GroupMe? I googled the company. They’d launched just four months earlier. Fuck.
In 370 days, GroupMe went from launched to scaled to sold to Microsoft for $80 million.
The next time I have an idea, I’m going to build it myself, I thought.
I walked to Barnes & Noble and bought PHP for the World Wide Web. PHP is what Robert had used for our little texting script. And it’s what Zuckerberg built Facebook with. So it must be good!
My introduction to programming was lonely. I’d take my book to Central Library and work through the chapters. Learning how to assign values to $variables was a breakthrough. But how do I get the values to save permanently? I wondered.
The library closed at 1am. I’d walk back to my dorm, grab a Coke from the vending machine, plug my laptop in to my Cinema Display, and keep struggling.
I loved the ifs/thens. I loved the logic games. I loved the idea of building something from nothing. I was hooked.
My roommate was less hooked. “Dude, your monitor is so bright, you gotta turn it down.”
I launched at least a dozen websites and apps with PHP, including RageChill. All of them were spaghetti code. But I didn’t care. I felt powerful.
Senior year, instead of going to class, I’d put on a button-down and drive downtown to the Nashville Entrepreneur Center to work on Stadium Stock Exchange.
My love for programming was reaching fever pitch just as I discovered the Hartl Rails tutorial. I’d always heard about Object-Oriented Software, but I’d never seen it until I saw Rails.
Don’t worry, my Rails code was still spaghetti. But at least now I had Model spaghetti, View spaghetti, and Controller spaghetti.
The volume of spaghetti I cooked up was terrifying. Between February and August of 2013, I rebuilt RageChill, built an iPad app (Objective-C! Pre-ARC!) as a freelancer, and shipped both a Rails app and iOS app for Stadium Stock Exchange.
I didn’t mind spending hours tracking down bugs that pushed UILabels off the edges of UITableViewCells. I had lots of patience for refreshing Chrome over and over again, testing sign-up flows and fake stock trades.
CSS didn’t scare me. Nor did learning Swift or keeping up with Rails or dealing with App Store Submission Hell.
It was new territory. It was fun.
I’ve always loved the self-reliance ethos of the Rails community. The monolith really is majestic. Server-rendered HTML is zen-like. What Basecamp has done with HEY is genuinely inspirational.
But over the past two years, I’ve started to feel stuck.
I must be doing it all wrong because the idea of making even a few images move around a page in Rails stresses me out. I know there’s Stimulus and Turbolinks and remote calls and it’s probably easy to do it with some fancy new CSS animation. But my Rails views always end up as cluttered junk. I’m storing all sorts of crazy variables as attributes in the DOM.
Meanwhile, React and Vue feel like they’re one bridge too far. I’ve got to maintain another whole app? Setup authentication? Separate calls for every snippet of data I want to bring in? And I need to manage state? Like another database?
After nearly a decade of launching products, I could feel my creativity being drained. In an era of Heroku and Repl.it and AWS and Stack Overflow and Rails and React and Vue - the golden days of programming! - why did it feel so hard to launch anything online?
It’s because frontend development was sapping my energy. I was building web apps with Bootstrap. CSS gave me nightmares. The thought of building everything with JSON endpoints felt overwhelmingly heavy.
I cannot stress this enough: Tailwind has single-handedly returned my web creativity back to what it was in 2012.
When I started going through the Tailwind tutorials, I realized the painstakingly slow CSS iteration loop was what had been breaking my back.
Before, I’d create a div, invent a name, move over to a CSS file, paste the name, Google for CSS attributes, trial-and-error getting flex boxes to work in IE, hope the asset pipeline regenerates the CSS files properly each time.
Then, with Tailwind, I stopped inventing class names2 and stopped Googling obscure CSS rules.
Swapping from manually-crafted CSS in separate files to simple class-level styles has felt like being released from prehistoric amber. Building frontends feels fast again. And since it feels fast, it feels fun.
With CSS anxiety quelled, picking up Vue and React has been pleasant.
Thank you, Tailwind.3