Today I have the pleasure of joining the 40-Something’s Club. I couldn’t be happier to be here.
A year ago, I was in the worst shape of my life. I was inching uncomfortably close to 300 pounds; I was being prescribed blood pressure medication, and my Apple Watch had opinions about my fitness level.
I decided to make 39 the year I turned things around.
The initial goal was simple: by the time I turned 40, I wanted to feel like things were heading in the right direction. Marginally better than before. On a sustainable path to betterment.
I did not expect to be fit, by any stretch of the imagination. And yet, that’s sortof what happened.
I started taking my dog on daily walks, which led to faster/longer walks, which eventually led to runs. Plus bike rides. Plus spin classes on the Peloton. Plus strength training at the gym and with Peloton.
By the numbers:
I’ve lost about 55 pounds (25kg).
My VO2 Max (according to my Apple Watch) has gone from low 30’s (Very Low) to low 50’s (Very High).
My fitness level (according to Withings) is now better than 90% of other men near my age.
Critically, this did not involve a significant change to diet. Just a few subtle changes. Less French fries; more salads. Less sugary mixers; more club soda. No less pizza, or burgers, or alcohol. I’m sure a better version of me would contest that, but I’ve done that dance before, and it’s just not sustainable for me. I know I can lose a bunch of weight quickly with a strict diet, but then I take that first bite of a juicy burger and the next thing I know, I’m right back where I started (or worse).
Anyway, today I’m enering my 40’s in what feels like the best shape of my life. This morning I celebrated by runnig a 10K along the Deschutes River Trail for the first time—by far the most strenuous run I’ve ever done with some decent elevation gains—and it felt extremely great. I’ll probably start doing that weekely (weather-permitting).
There are a few people that I owe a huge thanks to:
My dog Jude. I couldn’t ask for a better walking/running-mate.
Lindsey of Capacity Performance Therapy, who has helped me overcome a knee injury I thought had screwed me over for life.
Thanks to you all, I’m feeling better than ever, with a strong sense of accomplishment, and I know this is something I can (and will) keep going. Daily runs feel good. Skipping a day feels bad. So I’m pretty optimistic this will only get better and better.
To celebrate, I drank a shit-ton over the weekend, and tonight I’m going out for pizza.
In February, right as I was working to launch this site, this post by Bill Hunt crossed my timeline:
Folks keep talking about decentralization away from mainstream platforms but a reminder that the Fediverse is still nothing more than a collection of instances each subject to a (hopefully) benevolent dictator.
As one of those dictators, I would strongly encourage folks to start looking at TRUE decentralization away from the unscalable ActivityPub protocol and towards the more reliable IndieWeb world of RSS+Webmentions, etc.
Being generally annoyed at the state of social media (part of the reason I decided to have a blog again), I found that a little inspiring.
I had a rough idea of what Webmentions are – basically a more modern version of trackbacks/pingbacks. But I’d never looked into them before, or knew what was involved to get them working.
Webmentions are designed to be nice and simple from an authoring perspective. You link to something, and if that something is accepting Webmentions, it will magically end up displaying your post in a comments/mentions section.
All of the grunt work is done automatically behind the scenes: your CMS scans your content for links and sends out requests to their Webmention Endpoints; their CMS receives the Webmention, validates it, and stores some info about your post and its author (you).
So while it’s simple for authors, there’s a fair bit of work needed to get a CMS to fully support Webmentions. Especially when you factor in how messy (other people’s) HTML can be!
Thankfully, there’s a Craft plugin for that: Webmention by Matthias Ott. The only problem was, it was written for Craft 2, and hadn’t been updated for v3+. No big deal, I happen to know a thing or two about updating plugins. So I got to work on that.
Once the port was ready, I handed it over to Matthias, and he immediately ran with it. We’ve continued collaborating on it since, introducing a few stability and performance improvements.
A couple weeks ago, I finally got around to actually adding Webmentions to this site, including integrating with Brid.gy, a service that sends Webmentions for social media interactions. When I post to Mastodon/Bluesky with a link to this site, Brid.gy will watch for any likes/replies to that post, and pass those interactions off as Webmentions to the linked URL. Pretty neat.
I had the culinary pleasure of being a contestant on Leet Heat, CodeTV’s new game show for web nerds. I was up against Marcy Sutton Todd, a brilliant engineer local to the Pacific Northwest.
I’ll admit to bit of imposter syndrome going into it. And meeting Marcy the night before didn’t help! The more we chatted, the more I knew I was in for a challenge. But the whole experience was super fun, and the spicy nugs were, honestly, delicious. Props to Jason, Mark, and Annie for being amazing hosts, and creating something that is truly hilarious and wonderful.
Midway through 2009, I decided to quit my dream job.
I’d wanted to work at Apple – specifically apple.com – since high school. At the time, Apple was growing cooler by the day, with the iPod, iTMS, OS X, and Steve. As a budding web designer/developer and Apple fanboy, to whatever small extent I saw myself working on the Web professionally after school, apple.com was it.
Beyond that very specific pipe dream, I had no idea what I wanted to do with my life. The Web was too new to be taken seriously as a college subject, and I enjoyed it too much to mentally associate it with a “career”. So I went to a community college with no specific major in mind.
While there, my friend got a design internship at a local “digital communications agency” called Design Reactor. He told me they had another open internship for an engineer, and encouraged me to apply. So I did.
During the interview, my soon-to-be boss told me I was overqualified for the internship. He offered me a real, full-time engineering job instead. So I took it.
Not getting the hint the universe was trying to give me, I kept going to school for another semester, and even took a career counseling class to get ideas for what I could do with my life. It wasn’t until I received my first promotion and a salary bump that it finally clicked: I’m good at this, I enjoy this, and this could also be a career.
Two years later, a couple close colleagues and I left Design Reactor for another agency, Level Studios, which just happened to be the agency of record for apple.com. During my interview I made it Very Clear that I’d like to be on the Apple team, and that’s exactly where I ended up. They even assigned me a desk in Apple’s marketing building, right alongside the rest of Apple’s web team!
I got to work on a little bit of everything: marketing pages for iPhones and iPods; a page promoting custom font faces in Safari; a JS-based QuickTime VR polyfill (used for those draggable 360° product viewers they used to have); you name it. And I got to work with some extremely smart, talented, and wonderful people. I loved every minute of it.
Shortly after taking the job at Level, I was contracted to make some improvements to “Playa”, an ExpressionEngine plugin I had written while at Design Reactor. I wasn’t really involved with EE anymore, but it was a “name your price” sort of offer, and I got to keep all the IP, so it was too good to pass up.
Playa 1.0 was just a clone of another plugin (Mark Huot’s “MH Multi-Rel”) with a nicer UI inspired by Django’s many-to-many relationship field. By the end of the contract, it was something else entirely, and it felt worthy of going commercial. I built a quick licensing mechanism and released Playa 2.0 for $69 (nice).
It was an instant success. So I got to work on a second commercial plugin: a CKEditor integration called “Wygwam”.
Before long, those two plugins were generating more revenue than I was making at my day job. But with more revenue came more support. It became increasingly difficult to balance working at Apple with working on the plugins. Eventually I had to choose one.
As much as I loved working at Apple, I’d always liked the idea of running my own business, and this was my chance to give it a shot. So I chose the plugins. I was incredibly torn over the decision though. I gave Level a six month notice, hoping I could maybe work something out before then. Six months passed and the situation hadn’t miraculously improved, so on December 31, 2009, I said my goodbyes.
The next seven weeks were total chaos. I designed and built a website for Pixel & Tonic – a name I’d come up with a few months prior, after a night of gin & tonics – including a new checkout flow and licensing system. I also prepared updates for each of my plugins, and decided to launch “FF Matrix” as a standalone commercial plugin. (It was part of a free field type bundle up until that point.)
And then, on February 23, 2010 – 15 years ago today – Pixel & Tonic officially launched.
The Wygwam landing page on pixelandtonic.com, captured by The Internet Archive on March 1st, 2010.
The work paid off: plugin revenue literally doubled overnight, and P&T quickly became a household name in the ExpressionEngine community.
Within a couple months, I had enough consistent revenue to convince Brad(’s wife) to quit his cushy Nvidia job and join P&T. Brad and I met at Design Reactor, and we both left around the same time. We wanted to build an online booking application together – like Calendly (which didn’t exist yet) – and hiring him was going to accelerate that.
About a year into it, we realized that the biggest challenge we faced wasn’t technical; it was sales and marketing. The effort to win any one customer just wasn’t going to be worth it in the short term. We were going to need to raise some capital if we wanted to stay afloat, which wasn’t a path we especially wanted to take.
So we cut our losses, and decided to do something more in our wheelhouse: build a new CMS.
I want to expand. Not just in that I want to do this full time. I mean grow the business. Employ other people, and find new ways to better service the EE/web communities.
I knew vaguely what I wanted: for P&T to be a “real” business, so my little side gig could become a “real” job in turn. But my experience with real jobs was so slim at the time, I didn’t really comprehend what that meant. I’d never actually stuck with a job for more than two years. I sure as hell didn’t expect this one to last 15.
It’s been a wild ride. If you’re reading this, I probably have you to thank for it. So thank you for helping make the ultimate dream job a reality. (See what I did there?)
Yii 2.0.52 was released last week, which includes a little PR that I submitted making it possible for console controllers to accept variadic arguments.
public function actionMyAction(string ...$args): int
{
// $args is an array of strings!
}
Thanks to that, we can now ship an improvement to the fields/merge command: the ability to specify an arbitrary number of field handles as arguments.
It’s been a while since I had one of these things. The last one died so unceremoniously I don’t even remember letting it go. I probably let the domain expire at some point. Maybe the site is still out there on some old Media Temple server, endlessly serving 404s to /wp-admin bot requests from the preview URL.
According to the Internet Archive, my last post was on August 3, 2010: Custom Fields and the Death of the Field Group. I was advocating for a content modeling change in ExpressionEngine, complete with a mockup of a field layout designer not too different from what we have in Craft.
I think I stopped blogging after that because that was right around the time I met Lisa, started a family, and started building a CMS. Life got pretty intense, pretty quickly.
Life isn’t any simpler now, but I’ve been itching to write again. As a creative outlet, and maybe as a way to process some existential dread. We’ll see where it goes.