corpus.blog
Most cited
Talked about
Blogs
41554 blogs · [ { "id": "01a07df3-ea10-71b9-a44f-cfbc2bc46671", "title": "Your options for preloading images with JavaScript", "url": "https://macarthur.me/posts/preloading-images", "published_at": "2026-03-30T10:34:04+00:00" }, { "id": "01a07df3-ea10-71b9-a44f-cfbc2beca8e0", "title": "I used a generator to build a replenishable queue.", "url": "https://macarthur.me/posts/queue", "published_at": "2026-01-12T03:45:24+00:00" }, { "id": "01a07df3-ea10-71b9-a44f-cfbc2c22fd08", "title": "DNS Resolution Adds Up", "url": "https://macarthur.me/posts/dns", "published_at": "2025-11-11T02:21:22+00:00" }, { "id": "01a07df3-ea10-71b9-a44f-cfbc2cbbe8c2", "title": "`document.currentScript` is more useful than I thought.", "url": "https://macarthur.me/posts/current-script", "published_at": "2025-06-02T11:00:13+00:00" }, { "id": "01a07df3-ea10-71b9-a44f-cfbc2ce11263", "title": "I think the ergonomics of generators is growing on me.", "url": "https://macarthur.me/posts/generators", "published_at": "2025-05-12T10:00:39+00:00" }, { "id": "01a07df3-ea10-71b9-a44f-cfbc2cf466a5", "title": "I guess some request headers are more trustworthy than others.", "url": "https://macarthur.me/posts/forbidden-request-headers", "published_at": "2025-03-31T16:29:10+00:00" }, { "id": "01a07df3-ea10-71b9-a44f-cfbc2df117f4", "title": "There are a lot of ways to break up long tasks in JavaScript.", "url": "https://macarthur.me/posts/long-tasks", "published_at": "2025-02-03T03:11:10+00:00" }, { "id": "01a07df3-ea10-71b9-a44f-cfbc2e40d765", "title": "We'll soon be able to slide open a `height: auto` box with native CSS.", "url": "https://macarthur.me/posts/modern-box-sliding", "published_at": "2025-01-25T13:45:15+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ec532eb10", "title": "I didn't know you could compose template literal types in TypeScript.", "url": "https://macarthur.me/posts/template-literal-types", "published_at": "2025-01-17T22:30:10+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ec61b1387", "title": "Short-Lived, Tick-Bound Memoization in JavaScript", "url": "https://macarthur.me/posts/memoization", "published_at": "2025-01-14T00:02:08+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ec6aa31c0", "title": "Using Forced Reflows and the Event Loop to Slide Open a Box", "url": "https://macarthur.me/posts/box", "published_at": "2025-01-06T04:58:35+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ec77060ea", "title": "You Might As Well Use a Content Security Policy", "url": "https://macarthur.me/posts/csp", "published_at": "2024-12-02T18:18:55+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ec8310bea", "title": "Avoiding a \"Host Permission\" Review Delay When Publishing a Chrome Extension", "url": "https://macarthur.me/posts/chrome-extension-host-permission", "published_at": "2024-11-20T01:08:03+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ec8a48351", "title": "Collect All Requested Images on a Website Using Puppeteer", "url": "https://macarthur.me/posts/collect-images-with-puppeteer", "published_at": "2024-11-14T01:21:56+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ec952ba18", "title": "TIL: inline event handlers still fire when passed to React's dangerouslySetInnerHTML", "url": "https://macarthur.me/posts/safer-dangerouslysetinnerhtml", "published_at": "2024-11-09T19:44:11+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ec9bc6ec9", "title": "Streaming Text Like an LLM with TypeIt (and React)", "url": "https://macarthur.me/posts/streaming-text-with-typeit", "published_at": "2024-10-25T01:07:57+00:00" }, { "id": "01a07df3-ea11-732e-8566-384eca03f4ea", "title": "I didn't know you could use sibling parameters as default values in functions.", "url": "https://macarthur.me/posts/sibling-parameters", "published_at": "2024-10-12T15:42:12+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ecae7e2f8", "title": "Empty Building", "url": "https://macarthur.me/posts/build", "published_at": "2024-10-02T16:46:03+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ecaf038c6", "title": "JamComments Now Offers AI-Powered Moderation", "url": "https://macarthur.me/posts/ai-moderation", "published_at": "2024-08-25T03:30:36+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ecb4cff11", "title": "It Might Be Worth Converting that GIF to an Animated WebP", "url": "https://macarthur.me/posts/gif-to-webp", "published_at": "2024-08-22T23:26:24+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ecc198961", "title": "Exploring the Possibilities of Native JavaScript Decorators", "url": "https://macarthur.me/posts/approaches-to-memoizing-javascript-getters", "published_at": "2024-08-09T20:43:43+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ecc1f9598", "title": "How to Back Up Self-Hosted Plausible Analytics Data to an R2 or S3 Bucket", "url": "https://macarthur.me/posts/back-up-plausible-to-bucket", "published_at": "2024-07-29T00:40:47+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ecd090efb", "title": "On Building Structured Data with Client-Side JavaScript", "url": "https://macarthur.me/posts/structured-data-with-javascript", "published_at": "2024-07-27T02:52:03+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ecdcc4616", "title": "Control JavaScript Promises from Anywhere Using Promise.withResolvers()", "url": "https://macarthur.me/posts/promise-with-resolvers", "published_at": "2024-06-09T01:03:46+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ecea90652", "title": "Re-Enabling Emails for Ghost CMS Members", "url": "https://macarthur.me/posts/disabled-emails-in-ghost", "published_at": "2024-05-22T03:11:07+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ecf25ee4c", "title": "Adding Structured Data in Astro's Starlight Documentation Framework", "url": "https://macarthur.me/posts/structured-data-with-starlight", "published_at": "2024-05-21T02:46:35+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed0140c7a", "title": "It’s Probably Only Getting More Important to Use (Good) Structured Data", "url": "https://macarthur.me/posts/structured-data", "published_at": "2024-05-11T04:43:55+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed06097c8", "title": "Helpful Guidelines for Posting on LinkedIn", "url": "https://macarthur.me/posts/linkedin", "published_at": "2024-04-13T20:13:59+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed08047e1", "title": "Looking Forward to (Hopefully) Not Needing Responsive Images One Day", "url": "https://macarthur.me/posts/distaste-for-responsive-images", "published_at": "2024-04-04T23:00:14+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed0ff5324", "title": "You Might Consider Using an Image Sitemap", "url": "https://macarthur.me/posts/image-sitemaps", "published_at": "2024-04-04T01:44:05+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed1a2ef15", "title": "The Architecture Might Not Be the Problem", "url": "https://macarthur.me/posts/architecture", "published_at": "2024-03-14T00:18:26+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed1cd81c1", "title": "Transform Image URLs with a Simple Cloudflare Worker", "url": "https://macarthur.me/posts/transform-images", "published_at": "2024-02-25T01:02:50+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed1d71a7e", "title": "Hold a Healthy Sense of Caution Whenever Running a curl|bash Command", "url": "https://macarthur.me/posts/curl-to-bash", "published_at": "2024-02-18T18:47:32+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed2516a78", "title": "It's Never Been Easier to Performantly Put Images on the Web", "url": "https://macarthur.me/posts/images", "published_at": "2024-02-09T00:57:37+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed25418b2", "title": "Why Am I Getting a 502 Bad Gateway After Turning on Plausible?", "url": "https://macarthur.me/posts/plausible-bad-gateway", "published_at": "2024-01-28T04:11:47+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed3494858", "title": "How to Back Up Your Self-Hosted Plausible Analytics Data", "url": "https://macarthur.me/posts/back-up-plausible", "published_at": "2024-01-28T03:13:45+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed3fc7656", "title": "Picking the Right Tool for Maneuvering JavaScript's Event Loop", "url": "https://macarthur.me/posts/navigating-the-event-loop", "published_at": "2024-01-19T17:49:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed4eacd5f", "title": "Raise the API Rate Limit for a Self-Hosted Instance of Plausible", "url": "https://macarthur.me/posts/increase-plausible-rate-limits", "published_at": "2024-01-02T06:12:56+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed51c7027", "title": "Let's Bring Back JavaScript's `with()` Statement", "url": "https://macarthur.me/posts/with", "published_at": "2023-12-29T18:03:32+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed52fa37c", "title": "Executing Dangerously Injected Scripts Inside React Components", "url": "https://macarthur.me/posts/script-tags-in-react", "published_at": "2023-12-16T05:06:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed5553876", "title": "\"Server-rendering your UI is expensive!\"", "url": "https://macarthur.me/posts/expensive-rendering", "published_at": "2023-12-15T04:40:18+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed62db0e0", "title": "You should still look at your site with JavaScript disabled.", "url": "https://macarthur.me/posts/disable-javascript", "published_at": "2023-12-11T06:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed6eeabeb", "title": "Strive for Being \"Feature-Complete\"", "url": "https://macarthur.me/posts/feature-complete", "published_at": "2023-12-08T04:44:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed73e678d", "title": "There Are a Lot of Ways to Hide Stuff in the Browser", "url": "https://macarthur.me/posts/hide-stuff-in-the-browser", "published_at": "2023-12-04T13:32:24+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed820f2f9", "title": "Lighthouse is Not Your User", "url": "https://macarthur.me/posts/lighthouse", "published_at": "2023-12-01T06:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed919602c", "title": "Deserializing Polymorphic Lists with Kotlin, Jackson, and Spring Boot", "url": "https://macarthur.me/posts/handling-polymorphic-lists", "published_at": "2023-11-25T05:05:20+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed9d34183", "title": "For Maximum Accessibility, Be Careful About Using a .dev Domain", "url": "https://macarthur.me/posts/dot-dev-problems", "published_at": "2023-10-30T05:28:17+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ed9d627ba", "title": "Don't Let Visitors Know Your Origin Server Exists", "url": "https://macarthur.me/posts/hidden-origin", "published_at": "2023-10-29T14:29:33+00:00" }, { "id": "01a07df3-ea11-732e-8566-384edacef4e1", "title": "PicPerf's Impact on Jane Ross Tutoring's Website", "url": "https://macarthur.me/posts/picperfs-impact-on-jane-ross-tutoring", "published_at": "2023-10-24T03:06:09+00:00" }, { "id": "01a07df3-ea11-732e-8566-384edb0551f8", "title": "TIL: A Link’s Download Attribute Won’t “Just Work” for Cross-Origin Resources", "url": "https://macarthur.me/posts/trigger-cross-origin-download", "published_at": "2023-09-27T04:05:22+00:00" }, { "id": "01a07df3-ea11-732e-8566-384edbd9323f", "title": "Get All That Network Activity Under Control with Priority Hints", "url": "https://macarthur.me/posts/priority-hints", "published_at": "2023-09-19T00:16:58+00:00" }, { "id": "01a07df3-ea11-732e-8566-384edca3e681", "title": "Your Cache Headers Could Probably be More Aggressive", "url": "https://macarthur.me/posts/more-aggressive-cache-headers", "published_at": "2023-09-10T23:47:20+00:00" }, { "id": "01a07df3-ea11-732e-8566-384edd2b6d39", "title": "Reviewing PicPerf's Impact on SongwriterCity.com", "url": "https://macarthur.me/posts/picperf-impact-on-songwriter-city", "published_at": "2023-08-21T04:30:25+00:00" }, { "id": "01a07df3-ea11-732e-8566-384eddd54fe2", "title": "Building a Two-Way Data Binding Hook for Form Inputs in React", "url": "https://macarthur.me/posts/binding-input-state-in-react", "published_at": "2023-08-10T14:29:35+00:00" }, { "id": "01a07df3-ea11-732e-8566-384edde5f6f5", "title": "Taking Variable Fonts for a Spin", "url": "https://macarthur.me/posts/variable-fonts", "published_at": "2023-07-24T04:42:11+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ede97da51", "title": "Run Puppeteer with Docker on Fly.io", "url": "https://macarthur.me/posts/puppeteer-with-docker", "published_at": "2023-07-09T03:45:24+00:00" }, { "id": "01a07df3-ea11-732e-8566-384edf5e2324", "title": "How to Better Leverage Browser Preloading", "url": "https://macarthur.me/posts/effective-preloading", "published_at": "2023-06-24T04:26:10+00:00" }, { "id": "01a07df3-ea11-732e-8566-384edfa42a16", "title": "Mount a Multi-Page SPA into an App with Server-Side Routing", "url": "https://macarthur.me/posts/combining-client-server-routing", "published_at": "2023-06-02T23:50:01+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee03c9222", "title": "Why I Moved from Notion to Ghost for My Headless CMS", "url": "https://macarthur.me/posts/ghost-as-headless-cms", "published_at": "2023-05-25T03:27:54+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee04476bc", "title": "Why Your Website Should Use Modern Image Formats", "url": "https://macarthur.me/posts/image-formats-matter", "published_at": "2023-05-02T02:45:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee1028354", "title": "Why I Like Using Maps (and WeakMaps) for Handling DOM Nodes", "url": "https://macarthur.me/posts/maps-for-dom-nodes", "published_at": "2023-04-29T18:06:54+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee1fdfedb", "title": "Elegant Memoization with Ruby’s .tap Method", "url": "https://macarthur.me/posts/memoization-with-tap-in-ruby", "published_at": "2023-04-17T22:23:25+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee2e78733", "title": "If Possible, Don't Run Prism.js in the Browser", "url": "https://macarthur.me/posts/run-prism-js-server-side", "published_at": "2023-03-19T05:55:56+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee32f1f8b", "title": "Consider Animating Your Canvas in a Web Worker", "url": "https://macarthur.me/posts/animate-canvas-in-a-worker", "published_at": "2023-03-11T16:38:21+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee4001acc", "title": "More Elegant Destructuring with JavaScript Generators", "url": "https://macarthur.me/posts/destructuring-with-generators", "published_at": "2023-02-25T05:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee4fe7b29", "title": "Use a MutationObserver to Handle DOM Nodes that Don’t Exist Yet", "url": "https://macarthur.me/posts/use-mutation-observer-to-handle-nodes-that-dont-exist-yet", "published_at": "2023-02-13T05:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee52139f7", "title": "You’ve Got Options for Removing Event Listeners", "url": "https://macarthur.me/posts/options-for-removing-event-listeners", "published_at": "2023-01-28T05:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee581ea96", "title": "Use the .matches() Method to Determine if a Selector Matches an Element", "url": "https://macarthur.me/posts/ways-to-check-if-element-matches-selector", "published_at": "2023-01-21T05:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee66838a9", "title": "What I Like About Astro", "url": "https://macarthur.me/posts/what-i-like-about-astro", "published_at": "2023-01-16T05:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee677e5e9", "title": "How to Lazy Load Disqus for Improved Site Performance", "url": "https://macarthur.me/posts/lazy-load-disqus", "published_at": "2023-01-14T05:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee6d20530", "title": "Keep Using Disqus if You Don’t Care About SEO, Performance, and User Privacy", "url": "https://macarthur.me/posts/keep-using-disqus-if-you-dont-care", "published_at": "2022-12-29T05:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee78b95dd", "title": "When I Actually Needed useLayoutEffect() in React", "url": "https://macarthur.me/posts/when-i-needed-uselayouteffect-in-react", "published_at": "2022-12-26T05:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee8664b46", "title": "Serving Notion Presigned Images with Cloudflare Workers", "url": "https://macarthur.me/posts/serving-notion-presigned-images-with-cloudflare", "published_at": "2022-12-12T05:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee89ce189", "title": "I’ve Boarded the SSG Train Again", "url": "https://macarthur.me/posts/boarded-the-ssg-train-again", "published_at": "2022-10-07T05:00:00+00:00" }, { "id": "01a07df3-ea11-732e-8566-384ee8acd6e1", "title": "Why Can’t You .forEach() Over Empty Array Items?", "url": "https://macarthur.me/posts/looping-over-empty-array-items", "published_at": "2022-09-08T05:00:00+00:00" } ] posts
Claim your blog
Back to Alex MacArthur Site
Blog · corpus.blog/blogs/macarthur.me/posts
Alex MacArthur Site
macarthur.me
2026
Your options for preloading images with JavaScript
original ↗
30 Mar 2026
I used a generator to build a replenishable queue.
original ↗
12 Jan 2026
2025
DNS Resolution Adds Up
original ↗
11 Nov 2025
`document.currentScript` is more useful than I thought.
original ↗
2 Jun 2025
I think the ergonomics of generators is growing on me.
original ↗
12 May 2025
I guess some request headers are more trustworthy than others.
original ↗
31 Mar 2025
There are a lot of ways to break up long tasks in JavaScript.
original ↗
3 Feb 2025
We'll soon be able to slide open a `height: auto` box with native CSS.
original ↗
25 Jan 2025
I didn't know you could compose template literal types in TypeScript.
original ↗
17 Jan 2025
Short-Lived, Tick-Bound Memoization in JavaScript
original ↗
14 Jan 2025
Using Forced Reflows and the Event Loop to Slide Open a Box
original ↗
6 Jan 2025
2024
You Might As Well Use a Content Security Policy
original ↗
2 Dec 2024
Avoiding a "Host Permission" Review Delay When Publishing a Chrome Extension
original ↗
20 Nov 2024
Collect All Requested Images on a Website Using Puppeteer
original ↗
14 Nov 2024
TIL: inline event handlers still fire when passed to React's dangerouslySetInnerHTML
original ↗
9 Nov 2024
Streaming Text Like an LLM with TypeIt (and React)
original ↗
25 Oct 2024
I didn't know you could use sibling parameters as default values in functions.
original ↗
12 Oct 2024
Empty Building
original ↗
2 Oct 2024
JamComments Now Offers AI-Powered Moderation
original ↗
25 Aug 2024
It Might Be Worth Converting that GIF to an Animated WebP
original ↗
22 Aug 2024
Exploring the Possibilities of Native JavaScript Decorators
original ↗
9 Aug 2024
How to Back Up Self-Hosted Plausible Analytics Data to an R2 or S3 Bucket
original ↗
29 Jul 2024
On Building Structured Data with Client-Side JavaScript
original ↗
27 Jul 2024
Control JavaScript Promises from Anywhere Using Promise.withResolvers()
original ↗
9 Jun 2024
Re-Enabling Emails for Ghost CMS Members
original ↗
22 May 2024
Adding Structured Data in Astro's Starlight Documentation Framework
original ↗
21 May 2024
It’s Probably Only Getting More Important to Use (Good) Structured Data
original ↗
11 May 2024
Helpful Guidelines for Posting on LinkedIn
original ↗
13 Apr 2024
Looking Forward to (Hopefully) Not Needing Responsive Images One Day
original ↗
4 Apr 2024
You Might Consider Using an Image Sitemap
original ↗
4 Apr 2024
The Architecture Might Not Be the Problem
original ↗
14 Mar 2024
Transform Image URLs with a Simple Cloudflare Worker
original ↗
25 Feb 2024
Hold a Healthy Sense of Caution Whenever Running a curl|bash Command
original ↗
18 Feb 2024
It's Never Been Easier to Performantly Put Images on the Web
original ↗
9 Feb 2024
Why Am I Getting a 502 Bad Gateway After Turning on Plausible?
original ↗
28 Jan 2024
How to Back Up Your Self-Hosted Plausible Analytics Data
original ↗
28 Jan 2024
Picking the Right Tool for Maneuvering JavaScript's Event Loop
original ↗
19 Jan 2024
Raise the API Rate Limit for a Self-Hosted Instance of Plausible
original ↗
2 Jan 2024
2023
Let's Bring Back JavaScript's `with()` Statement
original ↗
29 Dec 2023
Executing Dangerously Injected Scripts Inside React Components
original ↗
16 Dec 2023
"Server-rendering your UI is expensive!"
original ↗
15 Dec 2023
You should still look at your site with JavaScript disabled.
original ↗
11 Dec 2023
Strive for Being "Feature-Complete"
original ↗
8 Dec 2023
There Are a Lot of Ways to Hide Stuff in the Browser
original ↗
4 Dec 2023
Lighthouse is Not Your User
original ↗
1 Dec 2023
Deserializing Polymorphic Lists with Kotlin, Jackson, and Spring Boot
original ↗
25 Nov 2023
For Maximum Accessibility, Be Careful About Using a .dev Domain
original ↗
30 Oct 2023
Don't Let Visitors Know Your Origin Server Exists
original ↗
29 Oct 2023
PicPerf's Impact on Jane Ross Tutoring's Website
original ↗
24 Oct 2023
TIL: A Link’s Download Attribute Won’t “Just Work” for Cross-Origin Resources
original ↗
27 Sept 2023
Get All That Network Activity Under Control with Priority Hints
original ↗
19 Sept 2023
Your Cache Headers Could Probably be More Aggressive
original ↗
10 Sept 2023
Reviewing PicPerf's Impact on SongwriterCity.com
original ↗
21 Aug 2023
Building a Two-Way Data Binding Hook for Form Inputs in React
original ↗
10 Aug 2023
Taking Variable Fonts for a Spin
original ↗
24 Jul 2023
Run Puppeteer with Docker on Fly.io
original ↗
9 Jul 2023
How to Better Leverage Browser Preloading
original ↗
24 Jun 2023
Mount a Multi-Page SPA into an App with Server-Side Routing
original ↗
2 Jun 2023
Why I Moved from Notion to Ghost for My Headless CMS
original ↗
25 May 2023
Why Your Website Should Use Modern Image Formats
original ↗
2 May 2023
Why I Like Using Maps (and WeakMaps) for Handling DOM Nodes
original ↗
29 Apr 2023
Elegant Memoization with Ruby’s .tap Method
original ↗
17 Apr 2023
If Possible, Don't Run Prism.js in the Browser
original ↗
19 Mar 2023
Consider Animating Your Canvas in a Web Worker
original ↗
11 Mar 2023
More Elegant Destructuring with JavaScript Generators
original ↗
25 Feb 2023
Use a MutationObserver to Handle DOM Nodes that Don’t Exist Yet
original ↗
13 Feb 2023
You’ve Got Options for Removing Event Listeners
original ↗
28 Jan 2023
Use the .matches() Method to Determine if a Selector Matches an Element
original ↗
21 Jan 2023
What I Like About Astro
original ↗
16 Jan 2023
How to Lazy Load Disqus for Improved Site Performance
original ↗
14 Jan 2023
2022
Keep Using Disqus if You Don’t Care About SEO, Performance, and User Privacy
original ↗
29 Dec 2022
When I Actually Needed useLayoutEffect() in React
original ↗
26 Dec 2022
Serving Notion Presigned Images with Cloudflare Workers
original ↗
12 Dec 2022
I’ve Boarded the SSG Train Again
original ↗
7 Oct 2022
Why Can’t You .forEach() Over Empty Array Items?
original ↗
8 Sept 2022