Sign in

Alex MacArthur

@macarthur.me
29 followers 21 following 106 posts

Bossing around computers in made-up languages.

PostsRepliesMedia
Alex MacArthur @macarthur.me · 30/03/2026
In the midst of JamComments updates, I had the chance to experiment with a number of ways to preload images in JavaScript. Wrote 'em up here: macarthur.me/posts/preloa...
macarthur.me
Your options for preloading images with JavaScript
There are a number of ways to preload an image on demand with JavaScript — each with their own strengths & drawbacks. Let's explore them.
000
Alex MacArthur @macarthur.me · 11/11/2025
I wrote about DNS resolution from the POV of a browser, and how you can fine-tune the process to squeeze out some performance points. Check it: macarthur.me/posts/dns/
macarthur.me
DNS Resolution Adds Up
DNS resolution is cheap, but it ain't free. In scenarios when it counts, the `dns-prefetch` resource hint could give you a nice, slight edge in the front-end performance game.
000
Alex MacArthur @macarthur.me · 10/09/2025
Shame on you.
010
Alex MacArthur @macarthur.me · 10/09/2025
Shame on you.
000
Alex MacArthur @macarthur.me · 18/06/2025
Oh my
000
Alex MacArthur @macarthur.me · 18/06/2025
Further confirmation of my point. ✅
000
Alex MacArthur @macarthur.me · 18/06/2025
My point confirmed. ✅
000
Alex MacArthur @macarthur.me · 18/06/2025
He’s right. This place will continue to lose if it keeps operating like this.
000
Alex MacArthur @macarthur.me · 03/06/2025
much appreciated, @andrejnsimoes.com + @gregex.bsky.social!
010
Alex MacArthur @macarthur.me · 02/06/2025
I have learned first-hand that the document.currentScript can be useful. #javascript macarthur.me/posts/curren...
macarthur.me
`document.currentScript` is more useful than I thought.
After discovering and being unsure of its value, I just realized how useful `document.currentScript` can be in exposing configuration properties to `<script>` elements (and other things too).
020
Alex MacArthur @macarthur.me · 12/05/2025
I’ve been spending some dedicated time tinkering w/ iterators, iterables, & generators in #JavaScript. I’m still struggling a bit to find use cases in which it’s materially the best solution. But! I am liking the ergonomics more. Blog post: macarthur.me/posts/genera...
macarthur.me
I think the ergonomics of generators is growing on me.
I took a stab at getting more familiar with iterators, iterables, and generators. I think I'm starting to like the ergonomics.
031
Alex MacArthur @macarthur.me · 15/04/2025
- The lighter, resized images will be served for future page views. I've seen many, many examples of 3000px-wide images being used for a small 300px-wide card. Now you don't even need to think about it. Just plop a small, deferred, non-intrusive script pages with PP images. ⚡️
000
Alex MacArthur @macarthur.me · 15/04/2025
- Each image will be measured, using the rendered & natural widths to determine if it could be resized more effectively. - Eligible images will be asynchronously resized based on how they *actually* show on a large screen.
100
Alex MacArthur @macarthur.me · 15/04/2025
Sickkk new feature coming to PicPerf: automatic resizing. Here's how it'll work: - Behind the scenes, PP will headlessly render your page at a large desktop's screen dimensions.
100
Alex MacArthur @macarthur.me · 31/03/2025
I learned about “forbidden” request headers recently, which can’t be overridden by client-side JavaScript APIs. A subset also give some nice context about a request, like whether it came from someone directly navigating to a page. Useful stuff. Wrote more here: macarthur.me/posts/forbid...
macarthur.me
I guess some request headers are more trustworthy than others.
There's a subset of request headers that can't be modified by a spec-compliant user agent. Let's explore why they're useful for determining how and for what purpose a request was triggered.
000
Alex MacArthur @macarthur.me · 11/02/2025
I think we’re over-indexing on the importance of time-to-ship and the AI tooling that minimizes it. Shipping is easier, but committing to iterating on & growing a product is still hard. That’ll probably continue to be the differentiating factor between success & failure.
000
Alex MacArthur @macarthur.me · 10/02/2025
TIL about “forbidden” request headers. None of these can be set in the browser by JavaScript APIs like fetch() or XMLHttpRequest.
list of forbidden request headers
021
Reposted by Alex MacArthur
Barry Pollard @tunetheweb.com · 08/02/2025
Good post from @macarthur.me on the various ways to break up long tasks. macarthur.me/posts/long-t... I especially like nice summary at the bottom:
How Do I Choose?

The approaches we've covered here are not exhaustive, but I think they do a good job at representing the various trade-offs you should consider when breaking up long tasks. Still, depending on the need, I'd probably only reach for a subset of these myself.

If I can do the work off from the main thread, I'd choose a web worker, hands-down. They're very well supported across browsers, and their entire purpose is to offload work from the main thread. The only downside is their clunky API, but that's eased by tools like Workerize and Vite's built-in worker imports.

If I need a dead-simple way to break up tasks, I'd go for scheduler.yield(). I don't love how I'd also need to polyfill it for non-Chromium users, but the majority of people would benefit from it, so I'm up for that extra bit of baggage.

If I need very fine-grained control over how chunked work is prioritized, scheduler.postTask() would be my choice. It's impressive how deep you can go in tailoring that thing to your needs. Priority control, delays, cancelling tasks, and more are all included in this API, even if, like .yield(), it needs to be polyfilled for now.

If browser support and reliability are of the utmost importance, I'd just choose setTimeout(). It's a legend that's not going anywhere, even as flashy alternatives hit the scene.
1134
Alex MacArthur @macarthur.me · 08/02/2025
Thanks Barry!
010
Alex MacArthur @macarthur.me · 03/02/2025
macarthur.me/posts/long-t...
macarthur.me
There are a lot of ways to break up long tasks in JavaScript.
It's very common to intentionally break up long, expensive tasks over multiple ticks of the event loop. But there are sure are a lot of approaches to choose from. Let's explore them.
000
Alex MacArthur @macarthur.me · 03/02/2025
If you’ve ever needed to break up a long JavaScript task to keep the UI responsive, you’ve probably reached for setTimeout(). Turns out there are a boatload of other options at your disposal, like scheduler.yield(). I wrote about a handful & their tradeoffs:
scheduler.yield() example
131
Alex MacArthur @macarthur.me · 25/01/2025
Wrote about it more detail here: macarthur.me/posts/modern...
macarthur.me
We'll soon be able to slide open a `height: auto` box with native CSS.
Using JavaScript or other creative tricks to animate open a box with unknown contents will soon be a thing of the past. Let's tinker with two new approaches native to CSS.
010
Alex MacArthur @macarthur.me · 25/01/2025
Look at what you'll soon be able to do in native CSS (currently supported in Chromium browsers):
You can now opt into animating intrinsic size keywords by using "interpolate-size: allowed-keywords" on a parent element.
110
Alex MacArthur @macarthur.me · 18/01/2025
Short post about composing template literal types in TypeScript: macarthur.me/posts/templa...
macarthur.me
I didn't know you could compose template literal types in TypeScript.
TypeScript's string literal types are a lot more useful than I originally thought.
021
Alex MacArthur @macarthur.me · 14/01/2025
I wrote about using short-lived memoization bound to a single tick of the event loop in JavaScript. queueMicrotask() is awesome. Read: macarthur.me/posts/memoiz...
macarthur.me
Short-Lived, Tick-Bound Memoization in JavaScript
Sometimes, typical memoization function won't cut it when there are so many changing variables in play between ticks of the event loop. Let's explore how we might fine-tune it.
020
Alex MacArthur @macarthur.me · 06/01/2025
I blabbed a ton about forced DOM reflows, the event loop, and the browser’s repaint cycle, just to slide open a box with CSS transitions & JavaScript. Look: macarthur.me/posts/box
macarthur.me
Using Forced Reflows, the Event Loop, and the Repaint Cycle to Slide Open a Box
Triggering smooth, reliable CSS transitions with JavaScript can be weirdly more complicated than you expect. We're gonna explore it more.
010
Alex MacArthur @macarthur.me · 05/12/2024
Comment submissions for JamComments just got a big speed boost because I finally remembered to set Laravel’s QUEUE_CONNECTION to something other than “sync.” 🤦‍♂️
010
Alex MacArthur @macarthur.me · 02/12/2024
I’ve been learning about content security policies and have reached the following conclusion: They’re valuable even for simple blogs and very easy to set up. You should probably just get one. macarthur.me/posts/csp
macarthur.me
You Might As Well Use a Content Security Policy
Content Security Policies, even for simple, content-focused sites, offer good protection against rare but real vulnerabilities out there. You might as well just get one.
000
Alex MacArthur @macarthur.me · 02/12/2024
My first (personal) M series MacBook is coming this week. I’ve been doing all dev work on a 2015 MBP until now and I’m so ready to enter the future.
000
Alex MacArthur @macarthur.me · 01/12/2024
Simple demo for embedding JamComments client-side: - ~10 lines of code to configure - no custom styles necessary - ~2.6kb (gzipped) of JavaScript needed to load - ~3.6kb of HTML to load lazily load in after that And none of the grossness other comment tools throw in. jamcomments.com/demo/vanilla
010
Alex MacArthur @macarthur.me · 30/11/2024
My daughters are starting their first entrepreneurial endeavor. Introducing the Bin Buddies! binbuddies.pro
binbuddies.pro
Let the Bin Buddies roll out your bins for you!
We'll take out your trash & recycling bins for you every week, so you don't have to keep forgetting about it!
000
Alex MacArthur @macarthur.me · 29/11/2024
You can now embed comments on your website entirely client-side. Very similar to how some other services work, but with a waaaaaaaaaay smaller performance penalty and far less grossness. jamcomments.com/docs/integra...
jamcomments.com
Vanilla JavaScript
000
Alex MacArthur @macarthur.me · 24/11/2024
JamComments.com is about to become very CSP-friendly. And as a result, it’ll be very difficult to tell you’re using a third-party service, even by looking through the page source. 🥷
jamcomments.com
JamComments: A guilt-free comment service for your blog.
A blog comment service and Disqus alternative that won't leave you feeling like you missed a shower.
000
Alex MacArthur @macarthur.me · 22/11/2024
Crazy how we’ve all just forgotten about the fact that there’s a map on the back of the Declaration of Independence.
010
Alex MacArthur @macarthur.me · 22/11/2024
What a friggin week. Never touching a database again.
010
Alex MacArthur @macarthur.me · 22/11/2024
This is a good point. I think the problem arises when people start believing certain echo chambers aren’t allowed to exist and instead ought to be silenced altogether. That was the grossest part about old Twitter and I hope the same thing doesn’t repeat here.
000
Alex MacArthur @macarthur.me · 22/11/2024
Hard to not see connections to Genesis & Noah tbh.
000
Alex MacArthur @macarthur.me · 22/11/2024
Oh… yeah good point.
000
Alex MacArthur @macarthur.me · 22/11/2024
Wouldn’t exclusively using X’s “Following” tab have done the exact same thing?
100
Alex MacArthur @macarthur.me · 20/11/2024
Nah, he is most certainly a man.
000
Alex MacArthur @macarthur.me · 20/11/2024
Small blog post on running a Chrome extension's content scripts in a way that won't cause a review delay: picperf.io/posts/chrome...
picperf.io
Avoiding a "Host Permission" Review Delay When Publishing a Chrome Extension
Get a Chrome extension reviewed a smidge more quickly by more carefully executing its client-side scripts only when they're needed.
000
Alex MacArthur @macarthur.me · 18/11/2024
Of course.
000
Alex MacArthur @macarthur.me · 18/11/2024
Download it here: picperf.io/image-saver-...
picperf.io
Image Saver Chrome Extension | PicPerf
Use the Image Saver Chrome extension to downlo any WebP or AVIF image as a PNG, JPEG, or GIF with a single right click.
000
Alex MacArthur @macarthur.me · 18/11/2024
Early version of the PicPerf Image Saver extension is out. Plz try it! It lets you download any WebP or AVIF as a more useful JPEG, PNG, or GIF. Got it submitted to the Chrome Web Store, but you can install the unpacked version now.
100
Alex MacArthur @macarthur.me · 15/11/2024
I’m proud of how PicPerf’s page analyzer is built. It uses Bun, Puppeteer, and Laravel to collect *only* the images that’d be downloaded when a user scrolls down a page on a phone, before running an optimization analysis on each one. Wrote about wiring it up: picperf.io/posts/collec...
picperf.io
Collect All Requested Images on a Website Using Puppeteer
Walking through how I used Puppeteer to programmatically collect every image loaded when a page is viewed in the browser.
000
Alex MacArthur @macarthur.me · 11/11/2024
Jira tickets: Pagan: “As a user,” Saintly: “As a child of the Living God,”
000
Alex MacArthur @macarthur.me · 09/11/2024
Found out a few weeks ago that React's `dangerouslySetInnerHTML` prop is more dangerous than I thought — inline event handlers on injected HTML still fire! Easy enough to neutralize, though. A short post about it. #javascript #reactjs macarthur.me/posts/safer-...
macarthur.me
Make dangerouslySetInnerHTML Safer by Disabling Inline Event Handlers
Even though it won't run <script> tags, React's dangerouslySetInnerHTML still allows inline event handlers to execute. Here's how you might neutralize that threat.
030
Alex MacArthur @macarthur.me · 08/11/2024
macarthur.me/scraps/footp...
macarthur.me
Unseen Footprints
Sometimes I feel like I’ve been holding my breath for a long time and I'm not sure there will be any air to breathe when I finally let go. It’d be nice to know what God is doing in those moments rathe...
010
Alex MacArthur @macarthur.me · 31/10/2024
I've published a first version of my policy on AI for my website. It's likely shift a bit over time, but I don't see the spirit of it ever changing. macarthur.me/ai
macarthur.me
AI will not write for me.
Why I've committed to never allowing AI to articulate an idea on my behalf.
000
Alex MacArthur @macarthur.me · 31/10/2024
ChatGPT is the 4th most largest referrer to TypeIt’s site right now. Kinda crazy.
000