41554 blogs · [ { "id": "01a0b68b-4ccc-726b-b009-4827fb34980a", "title": "alistairshepherd.uk", "url": "https://alistairshepherd.uk", "published_at": "2026-09-07T05:20:44+00:00" }, { "id": "01a08725-6253-731a-a14d-5655597b4be6", "title": "Edinburgh Festivals 2026", "url": "https://www.alistairshepherd.uk/writing/edinburgh-festivals-26/", "published_at": "2026-09-04T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-5655595b69c5", "title": "16 months with Loop Switch 2 earplugs", "url": "https://www.alistairshepherd.uk/writing/16-months-with-loop-switch-2-earplugs/", "published_at": "2026-03-25T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565558a54393", "title": "Simple website analytics with Goatcounter", "url": "https://www.alistairshepherd.uk/writing/simple-website-analytics-with-goatcounter/", "published_at": "2026-03-24T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-5655580d2257", "title": "I displayed an open graph image and had to pay how much?!", "url": "https://www.alistairshepherd.uk/writing/open-graph-licensing/", "published_at": "2025-07-22T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565557de42fe", "title": "Device notifications via HTTP with ntfy", "url": "https://www.alistairshepherd.uk/writing/ntfy/", "published_at": "2025-05-13T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565557b1d3e3", "title": "The Blog Questions Challenge", "url": "https://www.alistairshepherd.uk/writing/blog-questions-challenge/", "published_at": "2025-03-12T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56555766f802", "title": "HTMHell Advent Calendar — Preloading fonts for web performance with link rel=”preload”", "url": "https://www.alistairshepherd.uk/writing/htmhell-advent-calendar-24/", "published_at": "2024-12-25T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565556c77fe9", "title": "My anti-overlay client letter", "url": "https://www.alistairshepherd.uk/writing/accessibility-overlays-email/", "published_at": "2024-11-06T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56555686f373", "title": "Spring and Summer 2024 — Life, links and lmedia", "url": "https://www.alistairshepherd.uk/writing/spring-summer-2024/", "published_at": "2024-09-22T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-5655565af2d4", "title": "My day at State of the Browser 2024", "url": "https://www.alistairshepherd.uk/writing/state-of-the-browser-2024/", "published_at": "2024-09-19T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-5655557f0852", "title": "Selling a small front-end web project — what I learned", "url": "https://www.alistairshepherd.uk/writing/selling-web-project/", "published_at": "2024-09-16T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-5655549d0ce4", "title": "My response to UK CMA's potential remedies for mobile browser competition", "url": "https://www.alistairshepherd.uk/writing/cma-mobile-browsers-remedies/", "published_at": "2024-08-24T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565553f99e68", "title": "Proxying an Image CDN with Cloudflare workers", "url": "https://www.alistairshepherd.uk/writing/cloudflare-worker-image-proxy/", "published_at": "2024-08-03T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565553f01b8c", "title": "JS library compilation to browser, esm and cjs using esbuild", "url": "https://www.alistairshepherd.uk/writing/js-library-bundling-esbuild/", "published_at": "2024-07-19T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565553d6ce02", "title": "Simple, fast build tooling with live reload for a non-framework website", "url": "https://www.alistairshepherd.uk/writing/simple-build-tooling/", "published_at": "2024-07-14T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565553160465", "title": "My 2023 round-up", "url": "https://www.alistairshepherd.uk/writing/2023-roundup/", "published_at": "2024-01-24T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-5655516c2085", "title": "HTMHell Advent Calendar — Getting started with Web Performance", "url": "https://www.alistairshepherd.uk/writing/htmhell-advent-calendar-23/", "published_at": "2023-12-14T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-5655523903af", "title": "Web Performance Calendar — Ten optimisation tips for an initial web performance audit", "url": "https://www.alistairshepherd.uk/writing/web-performance-calendar-23/", "published_at": "2023-12-14T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565550daa483", "title": "Interop Priority Game 2024", "url": "https://www.alistairshepherd.uk/writing/interop-priority-game/", "published_at": "2023-11-17T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554fe5c602", "title": "Alternative text for \"I'm a Luddite (and So Can You!)\"", "url": "https://www.alistairshepherd.uk/writing/im-a-luddite-alt-text/", "published_at": "2023-08-02T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554efd806c", "title": "Bone conduction earphones revolution — Aftershokz Aeropex review", "url": "https://www.alistairshepherd.uk/writing/aeropex-review/", "published_at": "2023-07-30T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554e020146", "title": "Simple, cheap GeoIP API using Netlify Edge functions", "url": "https://www.alistairshepherd.uk/writing/netlify-geoip/", "published_at": "2023-05-01T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554dbc02cb", "title": "Simple, cheap GeoIP API using Vercel Edge functions", "url": "https://www.alistairshepherd.uk/writing/vercel-geoip/", "published_at": "2023-04-30T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554d29c197", "title": "Searching for a Mastodon app for Android", "url": "https://www.alistairshepherd.uk/writing/mastodon-android/", "published_at": "2023-03-26T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554c6a134d", "title": "Displaying Hillwalking routes on the web with GPX files and Leaflet", "url": "https://www.alistairshepherd.uk/writing/hillwalking-maps-with-leaflet/", "published_at": "2023-01-23T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554bff24ad", "title": "GrapheneOS as my daily-driver mobile OS", "url": "https://www.alistairshepherd.uk/writing/grapheneos/", "published_at": "2023-01-15T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554ba80955", "title": "My 2022 round-up", "url": "https://www.alistairshepherd.uk/writing/2022-roundup/", "published_at": "2022-12-30T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554b807679", "title": "My comments to Competition and Markets Authority on mobile browser competition", "url": "https://www.alistairshepherd.uk/writing/cma-mobile-browsers-mir/", "published_at": "2022-07-18T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554a2b995e", "title": "Async Alpine — Asynchronous Alpine component loading", "url": "https://www.alistairshepherd.uk/writing/async-alpine/", "published_at": "2022-05-30T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554aeb0683", "title": "Code Splitting in Alpine.js", "url": "https://www.alistairshepherd.uk/writing/code-splitting-alpine/", "published_at": "2022-05-30T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565549773104", "title": "SVG generative mountain ridge dividers", "url": "https://www.alistairshepherd.uk/writing/svg-generative-ridges/", "published_at": "2022-04-21T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565548c71450", "title": "Managing tracking consent with Cead Consent", "url": "https://www.alistairshepherd.uk/writing/cead-consent/", "published_at": "2022-04-10T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-5655487a8e2d", "title": "Personal site stack for alistairshepherd.uk", "url": "https://www.alistairshepherd.uk/writing/personal-site-stack/", "published_at": "2021-12-23T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-5655479ecca0", "title": "Web Nostalgia and Lost In Translation", "url": "https://www.alistairshepherd.uk/writing/lost-in-translation-and-nostalgia/", "published_at": "2021-08-30T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565547066e70", "title": "Front End Web Development Feeds and Newsletters", "url": "https://www.alistairshepherd.uk/writing/frontend-feeds-newsletters/", "published_at": "2021-07-15T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-56554624f669", "title": "Conditionally loading a native image lazyload polyfill/library", "url": "https://www.alistairshepherd.uk/writing/image-lazyload-conditional-polyfill/", "published_at": "2021-06-11T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565546063dea", "title": "Conditionally loading a polyfill for :focus-visible", "url": "https://www.alistairshepherd.uk/writing/focus-visible-conditional-polyfill/", "published_at": "2021-05-21T00:00:00+00:00" }, { "id": "01a0e2c2-97ba-7174-9b3d-5d7da8771e5d", "title": "alistairshepherd.uk", "url": "https://alistairshepherd.uk/", "published_at": "2021-02-20T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-5655451b7f58", "title": "SVG Landscape with live colour theming - new site part 2", "url": "https://www.alistairshepherd.uk/writing/parallax-svg-landscape-2/", "published_at": "2021-02-17T00:00:00+00:00" }, { "id": "01a08725-6253-731a-a14d-565544317d5d", "title": "Making a Parallax SVG Landscape - new site part 1", "url": "https://www.alistairshepherd.uk/writing/parallax-svg-landscape-1/", "published_at": "2021-01-29T00:00:00+00:00" }, { "id": "01a08725-6252-70ca-9ad9-e1f477369775", "title": "Fixes for Koken Problems", "url": "https://www.alistairshepherd.uk/writing/fixes-for-koken-problems/", "published_at": "2020-09-17T00:00:00+00:00" } ] posts Claim your blog
Back to Alistair Shepherd - Front-end Web Developer
Blog · corpus.blog/blogs/alistairshepherd.uk/posts

Alistair Shepherd - Front-end Web Developer

alistairshepherd.uk

2026

2025

2024

2023

2022

2021

2020