JekyllHello world, I’m Jekyll
RandomUse Photoshop’s checkered canvas for loading images
JekyllAn introduction to Jekyll
AdobeLetterpressed InDesign icons
2011
LifeThe tech behind our wedding
WorkWorking on TeuxDeux
WorkToday is my first day at Destroy Today LLC
AdobeToday is my last day at Adobe
RandomDepth of Field drawing in Instagram
RandomDouble tap to unlike in Instagram
2012
WorkBack on my own
WorkBuilding the Pencil Page with FiftyThree
A chance encounter with a former co-worker leads to a quick freelance gig that would define my style of work for years to come.
LifeBrooklyn Beta is people
RandomWashing the Dishes and Other Moments of Thought
A rock in my parents’ backyard, eight months of acupuncture, and a household chore share a common thread of being the catalyst for thought.
RandomThe perfect GIF workflow using Dropbox and Alfred
LifeQ&&A
WorkJoining Oak
RedesignRedesigning with rules
WorkLessons learned in a year on my own
Life2012 – A Year in Review
2013
CushionRestructuring the individual project page
CushionProject blocks
CushionRedesigning the homepage
CushionMultiple timelines
CushionArchiving and estimate differences
CushionMultiple financial goals
CushionZooming in on the timeline
CushionCurrency
CushionPreferences, accounts, and typeface change
CushionSending out the first email
CushionCurrency inputs, notifications, and invoice nets
CushionDots and lines
CushionCalculating in the database and revealing tendencies
WorkLessons learned on a 3-month sabbatical
CushionImproved form UX
CushionCushion is online
CushionSchedule timeline patterns
CushionA slimmer schedule timeline
CushionThe schedule timeline
CushionPlugging in real data for the first time
CushionTransitions and project lists
CushionDeath to modals
CushionThe individual project page
CushionEstimated incomes and talks with other freelancers
CushionStatuses to lists and the paid beta
CushionInvoice terminology
CushionThe timeline
CushionModal forms
CushionWiring the backend to the frontend
CushionBalancing design and dev
CushionTimecop, Monocle, and Vagrant
CushionGoing with Ruby and Sinatra
CushionDitching local-first and trying out Node.js
CushionSwitching to AngularJS
CushionBuilding the Table with Vue.js
CushionClients, Projects, and Invoices
WorkBuilding the Carousel website with Dropbox
I detail my experience working with Dropbox to build an adaptive website that provides a unique experience across mobile, tablet, and desktop.
LifeOn sabbatical
CushionIntroduction (to the Cushion journal)
CushionCushion
WorkBuilding the Mailbox website with Dropbox
Not one to turn down a challenge, I accept a freelance gig with an identical deadline to another job with the same client. Feel the burn-out.
TalkBook Covers, Model Airplanes, and My Dad
An extended transcription of my CreativeMornings talk about my dad, his work, and how he turned me into the maker I am today.
2014
CushionRetention through useful features
CushionThe onboarding checklist
CushionSpreading the word
CushionFrom beta to launch - the subdomain
CushionFrom beta to launch - sign up
CushionFrom beta to launch - messaging
CushionLaunch
CushionAuthenticating with 3rd party services
CushionIntro to integrations
CushionInspiration vs imitation
CushionThe emotional rollercoaster
CushionDesigning project blocks
CushionEverything in increments
CushionDeleting your account
CushionDesigning the subscription page
CushionRewriting the timeline
2015
CushionFunding Cushion
CushionHiring a team of freelancers
CushionTaking a real break from work
CushionSlack as a notification center
CushionDocument your features
Cushion300
CushionVacations
CushionOffering discounts
CushionWaves of traffic
CushionLess blogging, more journaling
WorkBuilding the Casper homepage
I collaborated with Casper to build the animations for their new homepage. In this post, I share the story from initial call to launch.
2016
CushionMy typical week as a founder
CushionBuilding components in a sandbox
CushionReactive time with Vue.js
CushionVisualizing daylight saving time
CushionRecording screencast GIFs
CushionWriting a job listing
CushionUsing feature flags to run betas
CushionOur first company lunch
CushionHow to embed Vue.js & Vuex inside an AngularJS app... wait what?
2017
CushionThe “Update Available” alert
CushionImproving readability with bigger fonts and higher contrast
CushionMy design workflow
CushionSimplifying our build process and SSL with Cloudfront
CushionRestructuring an evolving app
2018
RedesignLogo
Realizing that a redesign doesn’t mean I need to start from scratch with everything, I reclaim the logo from the previous design to use on the new site.
RedesignIntro
Eager to build more than the blog, I write about bringing a new content model to the site in the form of an intro on the homepage.
RedesignFavicon
Similar to the post itself, there’s not much to this description besides indicating that I replace the default favicon with my own.
RedesignRSS feed location
In this post, I second-guess the path to the site’s RSS feed and refactor it to support multiple feeds, which will most likely be overkill in the end.
RedesignTypeScript
Taking a break from visible progress, I implement TypeScript on the site as a way for me to finally learn what the big deal is all about.
RedesignSideways progress
Rather than moving the needle further, I spend a night going down a rabbit hole that does leave me without much to show, but I still consider it progress.
RedesignPagination
A dozen posts into writing for the new site, I recognize a need for pagination and write about implementing it in Contentful.
RedesignLinks
After referencing another post in the form of a link, I find myself needing to build a custom renderer in Contentful.
RedesignFootnotes
A friend pointed out a mistake in an earlier post I wrote, so I implemented footnotes to allow for corrections while still maintaining the original writing.
RedesignLine-height
In a move to improve readability, I adjust the leading on the site to provide more breathing room between lines of text.
RedesignMax-width
With the discovery of the ch unit type in CSS and guidance on the ideal character-based line width, I set out to enforce a max-width on the site’s body copy.
RedesignSyntax highlighting
With an increasing number of code snippets in my posts, I introduce Prism.js to the site for much improved syntax highlighting.
RedesignWebP fallback on Safari
After fetching WebP formatted images from Contentful’s image API, I realize that Safari doesn’t support WebP and requires a fallback PNG.
RedesignResponsive images
A forgotten CSS style prevents the images on the site from resizing for mobile, but a new discovery of Contentful’s image API leads to the perfect max-width.
RedesignDates
In order to maintain a chronologically aware blog, I add dates to posts and the RSS feed using the date-fns library.
RedesignImages
After realizing that Contentful’s rich text renderer doesn’t include a renderer for assets, I create my own using Contentful’s image API.
RedesignLighthouse, Now build env vars, and Nuxt manifest
To keep myself in check, I install a Lighthouse integration to score the site’s performance and accessibility.
RedesignTitle and article links
With a description as short as the post itself, I write about adding a site title and links to the article titles.
RedesignRSS feed
After being nudged by the elders of the web, I implement an RSS feed for those who are still sour about the demise of Google Reader—myself included.
RedesignContentful preview API hiccup
Neglecting to read the manual, I hit a snag and blame Contentful’s API before inevitably realizing that the problem exists between the keyboard and chair.
RedesignHello World
In this inaugural post, I set out on an adventure to redesign my site while documenting its process along the way.
LifeBurning Out and Finding Stability
After five years of running my own startup, I experience my first panic attack, which leads me to course correct my life in favor of good health and stability.
LifeFocusing on self improvement
2019
CushionThe new invoice page is live
With only days before the SCA deadline, I launch the new invoice page with to be SCA-ready while also paving the way for more improvements.
CushionIntegration testing the invoice page with Cypress
Wrapping up my work on the invoice page, I set up integration testing using Cypress to make sure that everything continues to work end-to-end.
CushionTidying up as you go
Continuing to make progress on the invoice page, I talk about some of the ways I’m improving the codebase along the way.
CushionA subsidized plan for 2021
A chat with a user leads me to consider a subsidized plan for the New Year to help folks through the pandemic.
CushionRedesigning the invoice page for SCA with Stripe Elements
I pause work on the account page to make sure Cushion’s invoice payment integration is ready for the SCA deadline.
CushionRethinking the pricing page
In needing to redesign the pricing page for the new account section, I decide to rethink the structure of Cushion’s existing plans.
CushionA dev’s troubleshooting journey
An innocent bug report unfolds into a roller coaster ride of a troubleshooting journey.
CushionScaffolding the account page
As I begin building Cushion’s new account page, I start by scaffolding a static version of it and building the components it requires.
CushionRedesigning the account section for SCA with Stripe Billing customer portal
With SCA regulation going into effect at the end of the year, I prioritize migrating to the Stripe customer portal, which means redesigning the account section.
CushionDesigning a new layout system
After years and years of incrementally tweaking the design of Cushion, I take a holistic look at the layout system.
CushionRedesigning the blog
After redesigning Cushion’s homepage, I take the next step in migrating to Contentful by rethinking the blog.
CushionAnimating the new homepage hero
To keep my mind busy while dealing with a tough time, I distract myself with Cushion’s new homepage animation.
CushionResponsive images for different layouts
While building Cushion’s new homepage, I go the extra mile to swap out better-fitting images for different breakpoints.
CushionA flexible way of using Nuxt.js with Contentful CMS
After migrating Cushion’s changelog to Contentful, I move onto the homepage, where I narrow in on an approach to compose pages entirely in the CMS.
CushionMigrating the changelog to the Contentful CMS
In my initial step towards migrating Cushion’s marketing site to Contentful, I start with the changelog.
CushionPromoting invoicing to the main nav
I reworked the main nav to include invoicing, which was met with a wave of thanks from users.
CushionThe next big rocks
After launching Cushion’s new onboarding, I detail the next few items on my to-do list, which for once are not new features.
CushionOnboarding is live
A weekend turned into a month, but Cushion’s new onboarding is finally live. Instead of focusing on the launch itself, I talk through my favorite part.
CushionComposable onboarding
To provide a more pleasant codebase for Future Jonnie to inherit, I restructure the onboarding to be composable and easily testable.
CushionWriting my own utility methods
I decide to write a few utility methods myself, rather than relying on 3rd party library, and I’m glad I do.
CushionUsing a utility library vs building my own
Torn between adding a dependency for a utility method or writing it myself, I talk through the pros and cons of both approaches.
CushionA reminder to write
Determined to launch thew onboarding flow, I forgot to write for a week and it shows.
CushionThe date picker component
Continuing my work on Cushion’s onboarding flow, I build a new and improved date picker component.
LifeMy eye
CushionBuilding components for the long run
With my recent work on Cushion’s new onboarding flow, I take a meandering walk through the new components I built for it that are all typed and tested.
CushionInvestigating inflection points
Stepping back to look at Cushion’s growth over its entire lifetime reveals a crystal clear moment when everything went south.
CushionRecalibrating my estimates
I start working on the new onboarding flow, but quickly realize it won’t be a weekend project.
CushionA friendly onboarding flow
As a first stab at onboarding, I design a flow that includes myself asking questions, which hopefully provides a friendly intro to the app.
CushionBringing back onboarding
In an attempt to ease people into the app rather than pushing them out of the airplane, I decide to bring back a proper onboarding flow.
CushionRough sketches
After feeling reluctant to reveal any design progress, I decide to bite the bullet and share a few rough sketches—no matter how uncomfortable it feels.
CushionFlattening the nav
Continuing the idea of the single click, I talk through a potential path to flattening the nav from multiple layers down to one.
CushionWell, this is embarrassing
Browsing through Cushion, I realize something strange. As I troubleshoot the anomaly, I discover an embarrassing truth.
CushionSending newsletters again
I sent my first Cushion newsletter in over a year and a half, which sounds crazy, but nonetheless, it feels great to send them again.
CushionValidating assumptions
Before diving into analytics, I decide to spend time writing database queries that could validate some of my assumptions using existing data.
CushionIntentional analytics
After building Cushion so far based purely on assumptions and intuition, I finally start to think about using analytics to help guide me.
CushionThis app has good bones
A thought-provoking conversation leads me to realize that Cushion is still solid and worth iterating on, instead of restarting from scratch.
CushionKeeping API requests simple
After establishing a new guiding principle to keep API requests simple, I describe how I could refactor a complex view that relies on a heavy API request.
RedesignContinue reading / Stay in the loop
While thinking through adding the ability for people to receive posts as emails, I took a detour and reworked the footer area for posts.
LifeMy week off
Nearing the end of my week off after the Stripe redesign launch, I reflect on what I ended up doing. Long story short, not much, and it was great.
CushionA single click
I discuss a pain point in the current Cushion involving the number of clicks it takes to get to where you need to go. What if it only took one?
CushionShaping Vuex through testing
CushionExcluding a folder from VSCode’s search (and disabling Jest’s generated coverage reports)
Random100vw and the horizontal overflow you probably didn’t know about
If you use 100vw and don’t check what your website looks like with scrollbars always visible, it most likely has a horizontal overflow issue.
RedesignPrefetch and better fetching
CushionRetaining state with the router in a single page application
CushionCustom focus rings using :focus-within
CushionTesting v-on="$listeners" in Vue.js
RedesignReply link in RSS feed posts
CushionVue + ESLint + Prettier conflicts
StripeThe new Stripe.com
CushionSpeeding up Jest tests with --runInBand
CushionMoving the Cushion Journal to my blog
RedesignFilter by category
CushionUpdating Sentry
RedesignShould I email my posts, too?
CushionUpdating Skylight and dealing with ActiveSupport
CushionReducing Heroku CI time by 35% for an extra penny
CushionThe build failed, but I swear it wasn’t me
CushionA hiccup with subdomain routing
CushionUpgrading to Ruby 2.7.1
CushionQA’ing pull requests using Heroku Review Apps
CushionSubdomain routing in Sinatra
CushionRedirecting the Heroku “Open app” button to a custom domain
CushionReloading Ruby with Sinatra::Reloader
CushionExploring a modern Cushion
RandomLearning Go
CushionMigrating the Cushion website to S3 to avoid dealing with SSL
RedesignContentful asset URLs
LifeThe Ace Hotel & Swim Club date shake
LifeRecurring dream
LifeLearning not to speedrun
LifeProduce for days
LifeChef Collective
LifeA new game
RandomCheckered pattern for loading images, revisited
Almost a decade after my post about using Photoshop’s checkered pattern for loading images, I revisit the code to refactor it for the modern web.
StripeOne year at Stripe
RedesignBlog index sticky nav
RedesignContentful mishaps
RedesignShort-form vs long-form posts
LifeRed Hook cat lot
LifeThe missed vacation
LifeThe virus’s ripples
LifeLearning Figma with a full stomach
LifeDepression, chili, and the bathroom sink
LifeHalf-gallon margaritas
LifeLaundry in the eleventh hour
LifeThe mirrorless webcam
LifeCooking from memory
LifeWorking from home for good
LifeDystopian grocery shopping
LifeA long walk through Red Hook
LifeOne week without Twitter and Instagram
After one week without Twitter and Instagram, I wrote about my experience so far, which has been so beneficial that I wonder if I’ll ever reinstall them.
LifeDeleting Twitter and Instagram from my phone
I feel unhealthy about how I use Twitter and Instagram, scrolling through them only to feel caught up, so I’m deleting both off my phone and taking a break.
RedesignCasper homepage section
While embedding the fixed-size Casper animation on the homepage, I face the technical challenge of gracefully scaling the animation on smaller viewports.
RedesignBlog index
With the goal of improving the UX of the blog’s index, I redesign the layout for easier skimming over the entirety of the blog and better organizing of posts.
RedesignStripe homepage section
Initially about the Stripe section of the homepage, this post quickly diverges into a tirade about frameworks and how vanilla JS is much more future-proof.
RedesignArticle pagination
After realizing that my articles lead to a dead end after reading, I describe how I added pagination in the form of links to adjacent articles.
RedesignContext-aware logo
This post describes the technical workings of the anchored DT logo, which changes color based on the homepage section being scrolled through.
RedesignHomepage concept
Once I had enough time to come down after launching the homepage, I write about the concept of embedding all of my scroll-based animations onto one page.
RedesignHomepage
Instead of accompanying the launch of the new homepage with a lengthy process post, I preferred to simply announce the page and enjoy it being out there.
RedesignMigrating
In preparation for the launch of the new redesign, I walk through migrating blog posts from the previous site and flipping the switch to the root domain.
RedesignCentered layout
This is a quick post about giving into the centered layout after months of enjoying the classic left-aligned layout.
RedesignContact links
After realizing the site didn’t include any way of reaching me, I add Twitter and mailto links to the header.
2020
CushionQuick launches after a big launch
After launching the Schedule timeline beta, I’m able to easily launch a handful of smaller releases to keep progress going.
CushionThe new Schedule timeline is in beta!
To get folks to start testing the new Schedule timeline early, I released the initial beta this weekend.
CushionZooming into the schedule timeline
With the schedule timeline nearing a beta launch, I take a couple more weeks to sneak zooming into the feature set.
CushionFlipping the schedule timeline
In an unexpected moment, I decide to try vertically flipping the new schedule timeline, so projects stack from the top.
CushionHandling timeline labels
Determined to always display labels on the new schedule timeline, I detail all the edge cases I’ve gotten myself into.
CushionVisualizing projects in the new schedule timeline
Now that I have a canvas for the new schedule timeline, I need to fill it with projects.
CushionA freeform scrolling timeline
After thinking through a modern schedule timeline, I start by enlarging the timeline to full-page and adding freeform scrolling.
CushionExploring a modern schedule timeline
Taking a break from the Clients section, I get a burst of inspiration thinking about scheduling.
CushionRevisiting the UX for client notes
Continuing work on the new Clients section, I revisit client notes, but with a few UX improvements.
CushionOverflow shadows using the Intersection Observer API
Improving a upon the overflow shadows in Cushion, I replace scroll events with the Intersection Observer API.
CushionAddressing beta feedback for the new Clients section
After rolling out the new Client section to a few dozen beta users, I start applying their feedback.
CushionUpgrading to Vue 3
While making forward progress with the new Clients section, I take a break to upgrade the new codebase to Vue 3.
CushionA Safari performance issue and other stresses
An already stressful time is made even more stressful by a Safari performance issue with nested grids.
CushionTime period filter and totals for the Clients section
With the Clients section beta up and running, I launch my first incremental update.
CushionA video call with a friend about marking projects as paid
A video call with a friend provides some interesting insight into a potential direction for restructuring the app.
CushionThe new Clients section is now in private beta
After a heads-down week, I managed to reach the first milestone in releasing the new Clients section—private beta.
CushionStabilizing PostgreSQL memory issues with pgbouncer
In an update of the database memory saga, I discover pgbouncer, which puts a stop to the constantly climbing memory woes.
CushionA top-level “Clients” section
With the sidebar navigation ready to deploy this weekend, I get an early start on the top-level “Clients” section.
CushionImproving the sidebar nav
After regretting, but living with, the skinny sidebar nav of obscure icons, I finally set a course to improve its UX.
CushionSending blog posts as emails - Part 2
Following up on the initial proof of concept, I build the complete system to send journal posts as emails.
CushionSending blog posts as emails
In an effort to grow readership, while also prototyping an idea, I start building a system to email my posts.
CushionSticky line item totals
Putting the final touches on the invoice form, I apply a sticky behavior to the line item totals.
CushionLittle details: Overflow shadows
I spend extra time getting a little detail right by tying shadows to whether the underlying content has overflow.
CushionRedesigning the flow for importing tracked time into invoices
With the last remaining to-do on my list for the new invoice form, I tackle the flow for importing tracked time.
Design TownTurning my IKEA desk into a motorized standing desk
After realizing standing desks are actually affordable now, I assemble my own using an IKEA countertop.
CushionA week of cleanup
With the inline forms behind me, I spend a week cleaning up the codebase with a focus on Cushion’s form states.
CushionBuilding the inline form system
After detailing how I planned to build inline forms in Cushion, I went ahead and built the first one for creating clients inline.
CushionInline forms and the weight of the next big task
In between big tasks, I distract myself with smaller tasks until I’m ready to finally face it—inline forms.
CushionDesigning a breadcrumbs component
Chopping away at the new invoice form, I designed and built a new component for breadcrumbs.
CushionThinking about a “test mode”
Aggravated by people signing up with no real intention to use Cushion leads me to consider a “test mode” where they can try the app without signing up.
CushionRedesigning the invoice line item footer
While redesigning the invoice form, I share the decision-making behind the design of the new line item footer.
CushionMigrating CI to GitHub Actions
Frustrated with Heroku, I start migrating away from it, beginning with continuous integration.
CushionTroubleshooting the database upgrade
Upgrading Cushion’s database leads to a week of troubleshooting performance issues.
CushionUpgrading the production database
After receiving an email from Heroku to upgrade Cushion’s database, I upgrade Cushion’s database.
Cushion7 years old
With Cushion reaching the 7-year mark, I reflect on its life and plot a course for its future.
CushionThinking through a new invoice form
At the fork in the road, I choose the invoice form as the next step in renovating Cushion, including a long-awaited list of improvements.
CushionThe calm after the sprint
With a couple big launches behind me, I think about what to tackle next or whether I need to pick a direction just yet.
CushionThe new account page is live
After launching Cushion’s new invoice page last week, I launch the new account page this week with a ton of other goodies.
2021
Cushion“Software” with a capital “S”
I hit a roadblock designing a UI that didn’t excite me, so I decide to take a step back and rethink a more personalized design.
CushionAdding hotkey labels to the UI
After taking a short break to collect myself, I eased back into work with a low-priority feature that I’ve been itching to add for a while.
CushionMoving & resizing workloads in the timeline
While building the drag & drop interaction for workloads, I accidentally created the coolest interaction I’ve ever made.
CushionEditing workloads in the timeline
After taking a couple weeks off to move into our new home, I’m back in the saddle with creating and editing workloads.
CushionVacations in the timeline
To continue reaching feature parity with the existing schedule view, I added vacations to the new timeline.
CushionNested modal drawers with parallax
Over the weekend, I ate the broccoli and built a nested drawer system, but ended up with a delightful parallax effect.
CushionThe evolution of a tooltip design
The full circle journey of designing a tooltip that’s both simple and useful.
CushionEstimated workloads in the schedule timeline
After visualizing tracked time, I jumped from the past and into the future to visualize estimated workloads.
CushionTotal tracked time in the schedule timeline
Now that Cushion can visualize tracked time, the next step is to combine tracked time and highlight when you overworked yourself.
CushionLazy loading tracked time in the schedule timeline
After being close to launching tracked time in the schedule timeline beta, I decide to spend an extra week adding lazy loading.
CushionVisualizing tracked time in the schedule timeline
Straying from the plan to bring the timeline to 1:1 feature parity with the existing timeline, I visualize tracked time.
CushionDuplicating an invoice
I take a short break from the timeline beta to launch the ability to duplicate an invoice. No big deal.
CushionGrouping and archiving projects in the schedule timeline
On the new path of pursuing a list-based layout, I group the projects by list and add an archive filter.
CushionOne step back, two steps forward
Foreseeing a problematic future with the stacking layout, I rethink the direction and end up down a better path.
CushionProject actions in the Schedule timeline beta
After adding the ability to add and edit projects in the Schedule timeline, I implement more detailed interactions with project actions.
CushionCreating a project via form in the schedule timeline
Back to working on the app, I take the leap into creating projects, but via form first instead of click & drag.
CushionNew year, new homepage
I spend my holiday break bringing more fun to the Cushion homepage with a new design, full of illustrations and animations.
2022
CushionBuilding a table for the nth time
Now that I have data to wire up, I set out to build a table component, but first I revisit past attempts.
CushionA return to tabbed navigation
With a focus on navigation, I return to the early days when Cushion had a simple tabbed nav.
CushionEnd-to-end testing with Playwright
With the stack picked out, I set up end-to-end testing from the start, so I can get in the habit of testing user flows without any excuses.
CushionVercel, Supabase, Vue, and Vite
As I rethink Cushion in the modern age, I detail my choices for platform, stack, and database.
CushionImagining Cushion circa 2016 in 2024
With Cushion’s 10-year anniversary approaching, a theory leads to an attempt at a modern upgrade, but with 2016’s feature set.
CushionA weekend marathon of an infrastructure upgrade
I spent a weekend upgrading Cushion’s Heroku stack and Ruby version, which sent me down a path of fixing hundreds of failing tests and removing a feature.
LifeA home, a kitchen, and a woodshop
I’ve been too precious about my writing, which has led to me not writing, so I took some time to write about a few big things in my life.
2023
CushionCleaning up the cobwebs
After years of side-eyeing an unreleased feature that has been nagging me while slowing down the app, I finally take the time to remove it from the app.
CushionBuilding a table for the nth time - Part 2
Following up on the initial post about building a table in Cushion, I actually detail my approach this time.
CushionHow to use Playwright with GitHub Actions for e2e testing of Vercel preview deployments
I spent way too long trying to find out how to set up e2e testing with Vercel preview deploys, so I wrote a quick post to save others.
2024
WorkAnimating Quines for Larva Labs
A collaboration with my friends, Matt Hall and John Watkinson, on their generative art project that blurs the line between its code and the art it produces.
WorkGoing independent again
I’m returning to independent life after a long stint cosplaying an employee in the full-time world.
2025
WorkBuilding the Open Standard website with Stripe
Reuniting with my friends at Stripe, I collaborate with them on the landing page for Open Standard.
CushionOverlooking the obvious
A user interview with a friend reveals an obviously missing piece of Cushion
CushionRemembering to have fun
After finding myself low on steam, I shift gears to another project to recharge my creativity while listening to a friend’s advice to have fun.
CushionEstablishing a weekly user interview routine
For the first time in years, I start performing user interviews again, and remember how valuable they can be.
CushionBuilding for myself and delighting others
After building a feature I’ve always wanted, I hear from users that they’ve always wanted it, too—they just didn’t think to ask for it.
CushionEating my own dogfood again
Now that I’m freelancing full-time, and using Cushion again, I’ve fallen in love with it all over again, but I also feel every rough spot.
2026