Ka Wai CheungMaking things on the World Wide Web since the 1900s.

SoftwareProjectsEssaysBooksCareerHow I work
DextopDextopa new X for the desktop Aug 2026Designing for the first 5 minutes and the next 20 years Jul 2026AI slop is a novelty act Apr 2026The confounding dilemma of vibe coding small, contained things 37signals application, 202537signals application, 2025 Mar 2026Inertia vs. friction Feb 2026Satisfaction needs time to brew Optimistic response handling Jan 2026One small tweak can make it all make sense Oct 2025Masking the annoying detail in UX Sep 2025The best feeling The Developer's Code, 2012The Developer's Code, 2012 Sep 2025Here’s to the crafty web Sep 2025Building products with basically nothing Aug 2025I think mobile designs cause forgetfulness FlickFlicksports scores without the fluff or spoilers Jul 2025I’m feeling pretty good about writing Jul 202537signals? Almost. Jun 2025Holding on to the feeling of making Jun 2025A new word for simple Jan 2025The lost phenomenon of recurring creativity Jan 2025The joy of designing the dreadful parts of software Jan 2025Is the journey really the gift? Nov 2024Early thoughts on coding with AI Diagrams as documentation 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 We Are MammothWe are Mammoth (2006-2017) Apr 2024We shouldn’t be surprised that code gets that way PixPixcolor picker. chrome ext Apr 2024My 25-year career in web design through the eyes of the Wayback Machine Apr 2024Championing the doer Mar 2024Why I can’t bill time Mar 2024Professionals are often just sliver experts Mar 2024Most bugs live in the permutations Mar 2024It’s OK to want to work alone Jan 2024Old school workarounds: The interstitial state Jan 2024Encapsulation is a messy art Jan 2024Beware the blind faith of tests Jan 2024Avoiding fancy abstractions 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 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 Jun 2017What’s your weekly work pyramid? Apr 2017Where the software ends Apr 2017Sometimes, it’s life-work balance 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
The making of DoneDone13 essays, 2017The ridiculous thing we do every dayThe Big MigrationSix o’ clock in the morning, you’re the last to hear the warningProject BugSprayProcesslessnessOne vote of influenceLove hurtsHow an early feature was bornHindsight is…please don’t make me lookGeorge Washington’s axeEmailin’ ain’t easyCustomer #000001The glam of maintaining
Mar 2017Shining the spotlight on stage crew software Mar 2017A maker’s approach to managing projects How do you store the sort order of a Kanban board in a database? Using marker classes for 3rd-party integrations DoneDoneDoneDone (2009-2024) Nov 2016Why sports matter to some of us 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 Landing on a Great Name, 2020Landing on a Great Name, 2020 Sep 2016Finding comfort in the uncomfortable Sep 2016Building and maintaining a global search catalog using Lucene OneSpotOneSpota better new tab page. chrome ext Aug 2016There are rockstars and there are bands
We are Mammoth photoshootWe are Mammoth photoshoot (2007)
Aug 2016Remembering the rabbits: A fond farewell to Flash May 2016The unintended byproducts of refactoring code May 2016The mythical couch-lift Improving UX by omitting validations May 2016Sometimes archaic technology is the most effective kind May 2016Finding those “clear glue” moments Mar 2016Why I (still) write code Why stay small? A developer's perspective. Mar 2016How the evolution of baseball stadiums might inform the future of web design ShiftlistShiftlistkeyboard-friendly to-do list. gone. tutorial → Flash Application Design Solutions, 2006Flash Application Design Solutions, 2006 Jan 2016Hiring into boundaries Sep 2015Why it is hard to write about code The building of a small feature Sep 2015The psychological battle of big refactorings 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 RunKWCRunKWCtreadmill timer + run log Nov 2014Cut the problem in half Oct 2014The hard thing about testing Handcoded scoreboardsComiskey Park, 1978Comiskey Park, 1978 Discovering UX as you go Jul 2014The face on the other side Jul 2014Life imitates code: Three life lessons I’ve learned from programming DnsDigestDnsDigestDNS reports. retired jul 2025 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 Mar 2014Quiet please: The benefits of online chat in the workplace Feb 2014A fast code culture Aug 2013Thinking through your problem LogoNerdLogoNerdgallery of sporting event logos 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 Handcoded scoreboardsWrigley Field, 1941Wrigley Field, 1941 Jan 2013Write code to read it, not to bow to it Jan 2013Reaching programmer’s nirvana by letting go of perfection Jan 2013Keep working on the easy stuff Jan 2013Create your own sense of urgency Less words, more meaning. WhyTVWhyTVretro-fy YouTube TV. chrome ext Aug 2012Teach abstraction through concreteness 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 Dec 2010Time your details Oct 2010The benefits of the imperfect art of handwriting Mar 2010Selling the process with the product Mar 2010Recalibrating your senses Feb 2010Treat time as an ingredient, not a currency Jan 2010Being your own boss is about being your own employee Oct 2009Simple sells depending on who you’re selling it to 1X1Xone X post at a time. chrome ext 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 Take TwoTake Twodesigning existing things the way I would want them to exist Jan 2009How important are bad first impressions of software? Nov 2008Quality starts and a save: Starter-reliever development Aug 2007Make your product better in 2 ways everyday Oct 2006Abstracting your writing is as important as abstracting your code