---
title: "Blog Archive"
url: "https://alex.zappa.dev/blog/"
description: "Writing about systems, privacy, and software."
---

# Blog Archive

## 2026

*   06/23
    
    [Astro 7 dropped the day after I finished my Astro 6 migration](/blog/astro7-update/)
    
    The universe has a sense of humor. I published my migration story, went to sleep, and woke up to Astro 7. Here's what broke, what I fixed, and why I'm not even mad.
    
*   06/22
    
    [Why I migrated my stack from Eleventy to Astro 6](/blog/astro6-migration/)
    
    Two years on a DIY toolchain, an acquisition that changed the vibe, and why moving FreshJuice to Astro 6 felt like switching from Arch Linux to macOS.
    
*   03/10
    
    [HubSpot's Cookie Banner Loads Google Fonts - And Nobody Seems to Care](/blog/hubspot-cookie-banner-google-fonts-gdpr/)
    
    HubSpot's cookie consent banner secretly loads Google Fonts before you even consent, leaking your IP to Google. Here's how I fixed it with a JavaScript proxy hack.
    
*   01/11
    
    [Migrating from Cloudflare Pages to Workers (and cleaning up the mess)](/blog/cloudflare-pages-to-workers-migration/)
    
    My experience merging an 11ty static site and API into a single Cloudflare Worker, plus a bash script to delete old Pages deployments when the dashboard won't let you.
    
*   01/03
    
    [How I replaced my ISP router and extracted PPPoE credentials using a bridge sniffer](/blog/isp-router-replacement/)
    
    A guide to replacing your Digi España router with your own hardware by capturing PPPoE credentials through packet sniffing. Includes bridge setup, Wireshark analysis, and GL.iNet configuration.
    

## 2025

*   12/28
    
    [2025 year in review: a year of building, learning, and gratitude](/blog/year-in-review-2025/)
    
    Reflecting on a year filled with code, open-source contributions, and the amazing people who made it all worthwhile.
    
*   10/08
    
    [Guest post on Orange Marketing: AIEO is the new SEO](/blog/aieo-orange-guest/)
    
    The future of search isn't keywords, it's context. In my guest post for Orange Marketing, I explored how AI is reshaping SEO and how marketers and web developers can adapt.
    

## 2024

*   12/06
    
    [How to manage multiple SSH keys for multiple GitHub accounts on one computer](/blog/how-to-manage-multiple-ssh-keys-for-multiple-github-accounts-on-one-computer/)
    
    Learn how to set up and manage multiple SSH keys on a single computer to seamlessly work with multiple GitHub accounts. Step-by-step guide for developers.
    
*   12/01
    
    [webChronicle: your personal Wayback Machine](/blog/webchronicle/)
    
    A web archiving tool that allows you to capture and explore snapshots of webpages over time. Like the Wayback Machine, but as your own personal Time Machine.
    
*   06/23
    
    [Upgrading to Eleventy v3](/blog/upgrading-to-eleventy-v3/)
    
    I took some time this week to upgrade my site to the newest version of Eleventy. Here's what I learned.
    
*   04/09
    
    [Custom user avatars for WordPress](/blog/custom-user-avatars-for-wordpress/)
    
    Adding custom avatar functionality to your WordPress site. Simple and quick solutions to make your website even more attractive to users!
    
*   01/07
    
    [How to use structured data (schema markup) in HubSpot to improve SEO](/blog/how-to-use-structured-data-schema-markup-in-hubspot-to-improve-seo/)
    
    How to use Structured Data, also referred to as Schema Markup, inside of HubSpot that is populated using HubL variables for use to improve SEO.
    

## 2023

*   08/20
    
    [The best free image placeholder for quick and easy content mockups](/blog/the-best-free-image-placeholder-for-quick-and-easy-content-mockups/)
    
    Find high-quality, visually appealing images for articles or blog posts with free image placeholders like Placehold.co, Lorem Picsum, Unsplash, and Pixabay Fillers. Customize size, background, text, and more. Streamline your content creation workflow and engage your audience.
    
*   08/13
    
    [Migrating from WordPress to 11ty: enhancing website performance and control](/blog/migrating-from-wordpress-to-11ty-enhancing-website-performance-and-control/)
    
    Discover the benefits of using 11ty for static website generation, including improved performance, simplicity, and control over your website. Take your online presence to new heights with 11ty.
    

## 2022

*   01/21
    
    [How to change App Store preferred Language 2022](/blog/how-to-change-app-store-preferred-language-2022/)
    
    Resolve your AppStore language issue on macOS! Despite numerous solutions, I discovered a simple fix for the problem. Change your VPN to UK location, log out of AppStore, force close it, and open again. After logging in, AppStore will switch to English.
    

## 2021

*   11/29
    
    [My favorite CSS hacks](/blog/my-favorite-css-hacks/)
    
    Discover CSS hacks and shortcuts, including using box-sizing, selection pseudo-class, caret color for input elements, displaying links when an element has no text value, fitting images to content, detecting dark system mode, hiding images on mobile, using CSS vendor prefixes for different browsers, and utilizing Autoprefixer. Learn these tips and improve your CSS coding skills.
    
*   11/21
    
    [Detect dark or light system mode](/blog/detect-dark-or-light-system-mode/)
    
    Learn how to use prefers-color-scheme CSS media feature to detect user color theme preferences. See examples using media query and JavaScript. Also, track color mode with Google Tag Manager and Google Analytics.
    
*   10/27
    
    [Mobile friendly Responsive images with CSS](/blog/mobile-friendly-responsive-images-with-css/)
    
    Learn how to make responsive images in HTML and CSS. Discover how to prevent images from going outside the container. Find solutions for WordPress and HubSpot.
    
*   10/22
    
    [Keep Track UTM parameters for HubSpot forms like Cookie Monster](/blog/keep-track-utm-parameters-for-hubspot-forms-like-cookie-monster/)
    
    Track UTMs and store them using cookies instead of sessionStorage. Use JavaScript Cookie library and add the code to the website footer.
    
*   10/16
    
    [Track UTM parameters for HubSpot forms like a BOSS](/blog/track-utm-parameters-for-hubspot-forms-like-a-boss/)
    
    Learn how to create and track marketing campaigns by using tracking URLs with HubSpot. Pass UTM parameters to hidden form fields using JavaScript. Store and feed form fields in sessionStorage. Install the code in the site footer of your HubSpot website.
    

## 2019

*   04/21
    
    [WP plugin Elementor Multidomain Support](/blog/wp-plugin-elementor-multidomain-support/)
    
    A plugin for Elementor Page Builder that adds multi-domain support for Multilanguage websites. Available on WordPress repository and GitHub.
    
*   04/14
    
    [How to block visitors by country with the NGINX GeoIP Module (Debian/Ubuntu)](/blog/how-to-block-visitors-by-country-with-the-nginx-geoip-module-debianubuntu/)
    
    Block visitors by country using NGINX and the GeoIP module. Install the module and database, configure the nginx.conf file, and test the configuration before restarting nginx. Instructions with examples provided.
    
*   04/10
    
    [How remove .DS\_Store files from a Git repository?](/blog/how-remove-dsstore-files-from-a-git-repository/)
    
    Learn how to remove .DS\_Store files from your Mac OS X repository. Use commands to find and remove the files. Update .gitignore for future prevention. Check gitignore.io for more configurations.
    
*   01/19
    
    [Campaign URL Builder Introducing the Shortcodes](/blog/campaign-url-builder-introducing-the-shortcodes/)
    
    Introducing the first release of shortcodes for Campaign URL Builder plugin. Shortcodes can be customized with various attributes and can generate forms on the front-end. Bitly API key is required. Shortcodes can be styled and have optional parameters. Examples provided for simple, advanced, and PHP usage.
    
*   01/19
    
    [How do I find my Bitly OAuth access token?](/blog/how-do-i-find-my-bitly-oauth-access-token/)
    
    Learn how to sign up for a Bitly account and generate an access token for the Bitly API. Follow these steps to get started.
    
*   01/14
    
    [Transitioning Google URL shortener to Bitly](/blog/transitioning-google-url-shortener-to-bitly/)
    
    Campaign URL Builder plugin is moving to Bitly API endpoint; support for goo.gl URL shortener will be turned down in March 2019. Previously created links will redirect.
    
*   01/01
    
    [WP plugin Campaign URL Builder](/blog/wp-plugin-campaign-url-builder/)
    
    Learn how to track Custom Campaigns in Google Analytics with this plugin. Easily create short links and share them on social networks. Get and install the plugin for WordPress from the repository or GitHub. Use the shortcode to generate shortlinks on any page. May the 4th be with you!
    

## 2018

*   11/09
    
    [GitKraken – cross-platform editor for git repos](/blog/gitkraken-cross-platform-editor-for-git-repos/)
    
    GitKraken is a cross-platform git interface written in electron and open libraries, offering merge conflict tools and a task-tracking system. Get a $20Off discount for a one-year subscription.
    

## 2016

*   11/08
    
    [Adding subscribers to a list using Mailchimp’s API v3](/blog/adding-subscribers-to-a-list-using-mailchimps-api-v3/)
    
    Learn how to add and update list members in MailChimp's API v3 using a PUT request. Includes code example and tips. May the 4th be with you!