A silent failure looks exactly like a feature you never built
Your system has memory. Your user is typing into someone else's chat box. That gap is the whole problem, and it is not a retrieval problem. The plac…
Tech news from the best sources
Your system has memory. Your user is typing into someone else's chat box. That gap is the whole problem, and it is not a retrieval problem. The plac…
Firefox Extension Icons: Sizes, Formats, and SVG vs PNG The icon is the first thing users see in AMO search results and the add-ons bar. Getting it…
AMO Review Process: What Happens After You Submit a Firefox Extension Submitting a Firefox extension to addons.mozilla.org (AMO) is the end of devel…
Internationalizing a Firefox Extension: i18n Without a Library Firefox extensions have a built-in i18n system that covers most use cases without any…
Keyboard Shortcuts in Firefox Extensions: A Complete Guide Good keyboard support separates a great extension from a mediocre one. Here's everything…
Search Bar in a Firefox New Tab Extension: Which Engine, How to Handle Adding a search bar to a new tab extension sounds simple — it's just a text i…
Dark Mode in Firefox Extensions: Respecting System Preferences Firefox users who prefer dark mode shouldn't have to manually toggle it in every exte…
Responsive Grid Layouts for Browser Extension New Tab Pages When building the Weather & Clock Dashboard Firefox extension, one of the tricky cha…
Auto-Detecting Location Without Asking for GPS For the Weather & Clock Dashboard Firefox extension, I needed the user's city without requiring t…
Making a Firefox Extension Work Offline — Service Workers vs. Cache API A common question when building browser extensions: how do you handle offlin…
When I built Weather & Clock Dashboard for Firefox, I made a decision early on: no analytics, no accounts, no external calls except weather data…
Your browser opens dozens of times per day. Each time, you see the new tab page for a split second — maybe less. That's hundreds of micro-moments th…