Aug 2026Designing for the first 5 minutes and the next 20 years
Ka Wai CheungMaking things on the World Wide Web since the 1900s.

SoftwareProjectsEssaysBooksCareerHow I work
Jul 2026AI slop is a novelty act Apr 2026The confounding dilemma of vibe coding small, contained things RunKWCRunKWCtreadmill timer + run log Mar 2026Inertia vs. friction Feb 2026Satisfaction needs time to brew Why stay small? A developer's perspective. Jan 2026One small tweak can make it all make sense Oct 2025Masking the annoying detail in UX Sep 2025The best feeling Sep 2025Here’s to the crafty web Sep 2025Building products with basically nothing Aug 2025I think mobile designs cause forgetfulness Jul 2025I’m feeling pretty good about writing Jul 202537signals? Almost. How do you store the sort order of a Kanban board in a database? Jun 2025Holding on to the feeling of making Jun 2025A new word for simple
We Are MammothWe are Mammoth (2006-2017)
Jan 2025The lost phenomenon of recurring creativity Jan 2025The joy of designing the dreadful parts of software Jan 2025Is the journey really the gift?
We are Mammoth photoshootWe are Mammoth photoshoot (2007)
Nov 2024Early thoughts on coding with AI Aug 2024What is code readability, really? Jul 2024The one-person product: Throwing the AI train in reverse May 2024Old school workarounds: Keeping the screen up to date Apr 2024We shouldn’t be surprised that code gets that way Using marker classes for 3rd-party integrations Apr 2024My 25-year career in web design through the eyes of the Wayback MachineRemembering the excitement of a new medium, coming to terms with its ephemerality, and rediscovering some embarrassing little treasures.Staff pick on Medium → Apr 2024Championing the doer 1X1Xone X post at a time. chrome ext Mar 2024Why I can’t bill time Mar 2024Professionals are often just sliver experts
DoneDoneDoneDone (2009-2024)
Mar 2024Most bugs live in the permutations Mar 2024It’s OK to want to work alone Jan 2024Old school workarounds: The interstitial state Less words, more meaning. Jan 2024Encapsulation is a messy art Jan 2024Beware the blind faith of tests Jan 2024Avoiding fancy abstractions DextopDextopa new X for the desktop Dec 2023Why it is hard to write about code Dec 2023Why cache invalidation is hard Dec 2023Using CSS classes as markers Dec 2023The thing to think about with feature gating Dec 2023The small pleasure of info tables Dec 2023The nth impression Wrigley Field, 1941Wrigley Field, 1941 Dec 2023Starting design with space Dec 2023On transitioning from software writing to just writing Dec 2023It’s the end…and I feel fine Dec 2023How I build software (like a musician) Dec 2023Code as the design medium Optimistic response handling Jun 2017What’s your weekly work pyramid? Apr 2017Where the software ends Apr 2017Sometimes, it’s life-work balance The Developer's Code, 2012The Developer's Code, 2012 Apr 2017Finding big passions in small things Apr 2017Being brief Mar 2017When I first learned about the impact of design Mar 2017The life changing magic of tidying up your codebase Mar 2017Shining the spotlight on stage crew software OneSpotOneSpota better new tab page. chrome ext Mar 2017A maker’s approach to managing projects Nov 2016Why sports matter to some of us Improving UX by omitting validations Nov 2016What’s the greatest piece of advice you’ve ever received? Nov 2016How about a refactorthon? Oct 2016Camaraderie and recognition inside the development team Sep 2016Make good decisions Sep 2016Finding comfort in the uncomfortable Sep 2016Building and maintaining a global search catalog using Lucene Landing on a Great Name, 2020Landing on a Great Name, 2020 Aug 2016There are rockstars and there are bands Aug 2016Remembering the rabbits: A fond farewell to Flash May 2016The unintended byproducts of refactoring code Discovering UX as you go May 2016The mythical couch-lift May 2016Sometimes archaic technology is the most effective kind May 2016Finding those “clear glue” moments Mar 2016Why I (still) write code WhyTVWhyTVretro-fy YouTube TV. chrome ext Mar 2016How the evolution of baseball stadiums might inform the future of web design Jan 2016Hiring into boundaries Sep 2015Why it is hard to write about code Sep 2015The psychological battle of big refactorings The building of a small feature Aug 2015An homage to strict coding Jul 2015A primer on delivering a good presentation Jun 2015The personal lessons I’ve learned in business Jun 2015The overlooked benefits of making yourself busy May 2015Building the optimal user database model for your application Apr 2015Where automated testing should (and shouldn’t) fit in your strategy Apr 2015Do what you love (but know what love is) — DoneDone Feb 2015Why programmers should be a part of the design process — DoneDone Jan 2015Give away the punchline Nov 2014Cut the problem in half DnsDigestDnsDigestDNS reports. retired jul 2025 Oct 2014The hard thing about testing Jul 2014The face on the other side Flash Application Design Solutions, 2006Flash Application Design Solutions, 2006 Jul 2014Life imitates code: Three life lessons I’ve learned from programming Jun 2014A remote-first approach to the workplace May 2014The least you can do Apr 2014Want fewer bugs? Test these five cases Mar 2014The redesign, the wait, and the response — DoneDone LogoNerdLogoNerdgallery of sporting event logos Mar 2014Quiet please: The benefits of online chat in the workplace How we use DoneDone...at DoneDoneDoneDone intro video Feb 2014A fast code culture
Aug 2013Thinking through your problem Apr 2013The by-products are everywhere Mar 2013Humility is at the heart of every problem solver Feb 2013Why there will never be a programmer in the White House Feb 2013The golden rule on creating rules Jan 2013Write code to read it, not to bow to it ShiftlistShiftlistkeyboard-friendly to-do list. gone. tutorial → Jan 2013Reaching programmer’s nirvana by letting go of perfection Jan 2013Keep working on the easy stuff Jan 2013Create your own sense of urgency Aug 2012Teach abstraction through concreteness Comiskey Park, 1978Comiskey Park, 1978 Aug 2012Legacy code is good for your business culture Apr 2012Who is the new business programmer? May 2011Thank goodness I usually don’t have a strong opinion Mar 2011Why you should (and shouldn’t) track time Feb 2011The importance of familiarity within a team Take TwoTake Twodesigning existing things the way I would want them to exist Dec 2010Time your details Oct 2010The benefits of the imperfect art of handwriting Mar 2010Selling the process with the product Mar 2010Recalibrating your senses Diagrams as documentation Feb 2010Treat time as an ingredient, not a currency Jan 2010Being your own boss is about being your own employee PixPixcolor picker. chrome ext Oct 2009Simple sells depending on who you’re selling it to 37signals application, 202537signals application, 2025 Sep 2009Fixing software problems after the fact Aug 2009Building an ISV on top of a client business Aug 2009.NET MVC/LINQ/jQuery let you care about the details later Mar 2009Use what you design Mar 2009Breaking old habits: Delete your crusty old code Feb 2009Make less interface when you can Jan 2009How important are bad first impressions of software? Nov 2008Quality starts and a save: Starter-reliever development FlickFlicksports scores without the fluff or spoilers Aug 2007Make your product better in 2 ways everyday Oct 2006Abstracting your writing is as important as abstracting your code