# Blog — SuperGeekery

- [Change and adaptation](https://supergeekery.com/blog/change-and-adaptation.md): AI makes building software faster than ever, but does it make good software less valuable? Reflections on AI coding, UX, and the changing role of developers.
- [Good UX takes using the app](https://supergeekery.com/blog/good-ux-takes-using-the-app.md): Good UX comes from using your own app. See how dogfooding Alias TTS led to smarter audio navigation and easier editing for long-form narration.
- [Alias TTS: the audio was never the hard part](https://supergeekery.com/blog/alias-tts-the-audio-was-never-the-hard-part.md): The story of Alias TTS, a self-hosted text-to-speech studio on the open Chatterbox model: good audio was easy; making it trustworthy was the real work.
- [Designing Better Markdown for LLMs](https://supergeekery.com/blog/designing-better-markdown-for-llms.md): The LLM Ready plugin turns Craft CMS pages into clean Markdown for AI, no second set of templates required.
- [Why the Images on My Blog Look Like That](https://supergeekery.com/blog/why-the-images-on-my-blog-look-like-that.md): Why the images on my blog look like halftones and old Technicolor prints, and the case for keeping a public playground where weird, half-formed ideas can ship...
- [Goodbye Puppeteer, Hello Beasties: Simpler Critical CSS for Craft CMS](https://supergeekery.com/blog/critical-css-without-chrome-how-i-traded-puppeteer-for-beasties-craft-cms.md): Generate critical CSS for a Craft CMS + Vite site without Puppeteer or headless Chrome. How I replaced rollup-plugin-critical with Beasties for a simpler local...
- [Upgrading Your Local Gemma Setup](https://supergeekery.com/blog/upgrading-your-local-gemma-setup.md): Take your local Gemma 4 setup to the next level with live streaming, Glow markdown rendering, conversation history, PDF support, and @filename references — all...
- [Running Google’s Gemma 4 Locally on macOS with Ollama](https://supergeekery.com/blog/running-googles-gemma-4-locally-on-macos-with-ollama.md): Learn how to run Google’s Gemma 4 locally on macOS with Ollama. No API keys, no usage limits, no data leaving your laptop. Full setup in under five minutes.
- [LLM Ready: The Craft CMS plugin I never imagined I'd make](https://supergeekery.com/blog/llm-ready-the-craft-cms-plugin-i-never-imagined-id-make.md): Take control of how AI sees your Craft CMS site. LLM Ready automatically serves clean Markdown to AI crawlers, generates your llms.txt, and requires zero...
- [Bespoken 5.3.0: Long-Form Audio, Credit Tracking, and Multisite Support](https://supergeekery.com/blog/bespoken-530-long-form-audio-credit-tracking-and-multisite-support.md): Bespoken 5.3 adds automatic text chunking for long-form content, ElevenLabs credit tracking with cost estimates, multisite support, and smarter progress...
- [What happens when the "Good, Fast, Cheap" rule breaks?](https://supergeekery.com/blog/good-fast-cheap-and-what-happens-when-the-rule-breaks.md): Has AI broken the “Good, Fast, Cheap” rule? A look at how AI coding amplifies creativity and reshapes how I build apps and ideas.
- [Login Lockdown: an AI-created Craft CMS plugin](https://supergeekery.com/blog/login-lockdown-an-ai-created-craft-cms-plugin.md): An AI-built Craft CMS plugin that locks down failed login attempts—and a look at how AI is reshaping real-world development workflows.
- [Unlocking real-time reactive search in Craft CMS with Datastar](https://supergeekery.com/blog/unlocking-real-time-reactive-search-in-craft-cms-with-datastar.md): This blog post showcases creating a reactive search page in Craft CMS using the Datastar plugin. Datastar, a lightweight JavaScript framework, provides...
- [Tips on getting great voice clones from ElevenLabs](https://supergeekery.com/blog/tips-on-getting-great-voice-clones-from-elevenlabs.md): Learn how to create a natural-sounding ElevenLabs voice clone using your own writing. Get better TTS results with this simple, effective recording tip.
- [Text-a-Mess: A one-day app build challenge](https://supergeekery.com/blog/text-a-mess-a-one-day-app-build-challenge.md): Text-a-Mess was a vibe-coding app test built with AI using React 12. The challenge tested the viability of making an app with limited time and knowledge of the...
- [Create mathematically generated CSS color schemes with OKLCh.](https://supergeekery.com/blog/create-mathematically-generated-css-color-schemes-with-oklch.md): Learn how to generate dynamic, daily color palettes using CSS OKLCh color space and JavaScript, creating vibrant, accessible designs with modern techniques.
- [Reset the forge sudo password in Laravel Forge](https://supergeekery.com/blog/reset-the-forge-sudo-password-in-laravel-forge.md): Use a recipe in Laravel Forge to reset the sudo password for any user.
- [Craft CMS and chat-oriented programming, CHOP](https://supergeekery.com/blog/craft-cms-and-chat-oriented-programming-chop.md): Discover CHOP (Chat-Oriented Programming) and its impact on Craft CMS development. See how AI boosts productivity by assisting in plugin creation and...
- [End of the Twitter party](https://supergeekery.com/blog/end-of-the-twitter-party.md): A reflection on Twitter's post-Musk decline and an exploration of alternatives like Mastodon, Threads, and BlueSky.
- [Set Up Redis Caching in Craft CMS with DDEV: A Step-by-Step Guide](https://supergeekery.com/blog/set-up-redis-for-local-development-with-craft-cms.md): This step-by-step guide teaches you how to integrate Redis caching into your Craft CMS project using DDEV.
- [Never mistake your production, staging and local environments with Craft CMS](https://supergeekery.com/blog/never-mistake-your-production-staging-and-local-environments-with-craft-cms.md): Have you ever acci­den­tal­ly changed some­thing in your stag­ing envi­ron­ment when you meant to do it on pro­duc­tion? A few tweaks and this will never...
- [Customizing the CKEditor in Craft CMS](https://supergeekery.com/blog/customizing-the-ckeditor-in-craft-cms.md): Learn how to customize CKEditor in Craft CMS with this step-by-step guide. From configuring fonts and sizes to enabling video embeds and link options,...
- [Fixing a SQL database to have only one type of collation, a Craft CMS story](https://supergeekery.com/blog/fixing-a-sql-file-to-have-only-one-type-of-collation.md): Guide to changing collation type in Craft CMS database. Ensure a smooth upgrade from Craft CMS 4 to 5 with practical solutions and essential tools.
- [Deter Clickjacking When You Can't Set Security Headers By Using Javascript](https://supergeekery.com/blog/deter-clickjacking-when-you-cant-access-headers-iframe-javascript.md): Learn what clickjacking is, how the X-Frame-Options and Content-Security-Policy headers stop it, and a JavaScript fallback to deter iframe embedding when you...
- [Dark patterns by example. The inability to cancel the StatusCake service.](https://supergeekery.com/blog/dark-patterns-by-example-the-inability-to-cancel-a-service-statuscake.md): Analysis of deceptive UX design, specifically focusing on the difficult cancellation process of StatusCake, exemplifying common dark patterns in user...
- [Sound like an audio professional with AI using Adobe Enhance Audio.](https://supergeekery.com/blog/sound-like-an-audio-pro-with-ai-using-adobe-enhance-audio.md): Take an average audio recording and use AI to enhance the speech to professional quality.
- [Run your own uptime service: Uptime Kuma with Traefik on Laravel Forge](https://supergeekery.com/blog/uptime-kuma-with-traefik-on-laravel-forge.md): Install Uptime Kuma using Traefik for routing on a server configured with Laravel Forge, Ploi or ServerPilot.
- [AI and your content. How to opt to opt-out.](https://supergeekery.com/blog/ai-and-your-content-how-to-opt-to-opt-out.md): How to opt out of AI scrapers like OpenAI's GPTBot, ChatGPT-User, Google-Extended, and CCBot using robots.txt, plus why the old value exchange between creators...
- [Analytics a different way. Plausible Analytics on Laravel Forge with Traefik and Docker.](https://supergeekery.com/blog/plausible-analytics-on-laravel-forge-with-traefik-and-docker.md): Install a self-hosted instance of Plausible Analytics in a Docker container with routing by Traefik Proxy.
- [Entry Editor Links, a new Craft CMS plugin](https://supergeekery.com/blog/entry-editor-links-a-new-craft-cms-plugin.md): The "Entry Editor Links" plugin streamlines content editing in Craft CMS. The plugin lets authorized users quickly access an entry's editing page in the...
- [Learning the FileMaker Data API by trial and error.](https://supergeekery.com/blog/learning-the-filemaker-data-api-by-trial-and-error.md): Learn from one developer’s experience learning the FileMaker Data API through trial and error. Use PHP and a proxy to integrate FileMaker with other systems.
- [Make Javascript module creation easier with Vite and automated GitHub Pages and npm publishing](https://supergeekery.com/blog/make-javascript-module-creation-easier-with-vite-and-automated-github-pages-and-npm-publishing.md): Discover an efficient workflow template for JavaScript module creation with Vite Module Builder, automated GitHub Pages, and npm publishing.
- [Remaking Twitter thoughts](https://supergeekery.com/blog/remaking-twitter-thoughts.md): Reflections on Elon Musk's takeover of Twitter, the cruelty of his rebuild, and why a great product people genuinely like is in the strongest position to...
- [Stable Diffusion: Exploring trained models and unique tokens for more accurate text-to-image results](https://supergeekery.com/blog/stable-diffusion-prompts-and-model-exploration.md): Exploring Stable Diffusion, DALL-E, DreamBooth-trained models, and unique style tokens to show how both your prompt and your chosen model shape text-to-image...
- [RSS feeds and unbound prefix errors](https://supergeekery.com/blog/rss-feed-and-an-unbound-prefix-error.md): The unbound prefix error can occur when adding media to an RSS feed without the correct declaration line.
- [npm in a box: Containerizing package managers for security.](https://supergeekery.com/blog/containerizing-npm-and-package-managers-for-security.md): Use Docker containers to harden the security of your development environment when using npm and other package managers.
- [Containerizing a workflow: using Docker to “Build A Banner”](https://supergeekery.com/blog/containerizing-a-workflow-using-docker-to-build-a-banner.md): How we use a Docker image to containerize an animation-creation workflow we use at JMX2.
- [Configuring Craft CMS with Redis for use on Heroku](https://supergeekery.com/blog/heroku-redis-sll-configuration.md): How to configure Craft CMS to work with Heroku Redis using an SSL connection. We'll also discuss a debugging issue when using Heroku ps:exec and environmental...
- [Build a basic Docker image](https://supergeekery.com/blog/making-a-basic-docker-image.md): A detailed overview of building a simple Docker image from a Dockerfile, including passing arguments, listing Docker images, updating the default cmd, and more.
- [OneTrust blocking video playback due to privacy setting](https://supergeekery.com/blog/onetrust-blocking-video-playback-privacy-tracking.md): OneTrust will block video playback automatically depending on how it's set up. This post discusses how to handle privacy settings on a tag-level basis when...
- [Video with transparency in Chrome, Edge, Firefox, Safari, iOS and Android, circa 2022 (updated in late 2024)](https://supergeekery.com/blog/transparent-video-in-chrome-edge-firefox-and-safari-circa-2022.md): Create a cross-browser video tag with transparency. Using webm and mp4 + the H.265 codec, video plays in all major browsers, on desktop and mobile.
- [Tweaking site performance and configuring AWS](https://supergeekery.com/blog/tweaking-site-performance-amazon-aws.md): How I raised a Craft CMS site's PageSpeed score into the high 90s with WebP images, Vite, critical CSS, and AWS CloudFront caching, plus a WAF rule to stop...
- [The HTML email template in Craft CMS](https://supergeekery.com/blog/craftcms-html-email-template-missing-documenation.md): A review of the options for the HTML Email Tem­plate in Craft CMS, including Twig variables, conditionals, MJML, and debugging errors.
- [Docker, Craft, Forge, Arcustech, and Heroku](https://supergeekery.com/blog/docker-craftcms-forge-arcustech-heroku.md): A journal of a transition to Docker for local development with Craft CMS. Includes deployment tips for Laravel Forge, Arcustech, and Heroku.
- [So long, Craft Link List, and hello again, Craft Link List](https://supergeekery.com/blog/craft-link-list.md): John Morton hands off Craft List list to the Craft CMS after 5 plus years of writing the newsletter.
- [Adding Date Validation Logic when Creating an Event in Craft CMS 3](https://supergeekery.com/blog/adding-date-validation-logic-when-creating-an-event-in-craft-cms-3.md): Validate event start and end dates in Craft CMS 3 with a custom module and the EVENT_BEFORE_SAVE event, plus a jQuery datepicker tweak to improve the authoring...
- [A critical error: Chromium revision is not downloaded.](https://supergeekery.com/blog/a-critical-error-chromium-revision-is-not-downloaded.md): How to fix the "Chromium revision is not downloaded" Puppeteer error when generating critical CSS with webpack, caused by skipped Docker and Chromium...
- [Installing Imagick in Valet](https://supergeekery.com/blog/installing-imagick-in-valet.md): Step-by-step instructions for installing and wiring up the Imagick PHP extension in Laravel Valet using Homebrew and PECL after upgrading to a new version of...
- [Fixing a MariaDB database that has a corrupted root user password.](https://supergeekery.com/blog/fixing-a-mariadb-database-that-has-a-corrupted-root-user-password.md): How to reset a corrupted MariaDB root password on macOS using mysqld_safe and mysqladmin, with the exact terminal commands that finally worked.
- [The Winding Down of Pic Puller](https://supergeekery.com/blog/the-winding-down-of-pic-puller.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Synology, Plex, ports and missing URLs](https://supergeekery.com/blog/synology-plex-port-and-url.md): Can't find the URL for Plex or other apps on your Synology? Use the hidden Main Menu shortcut and the netstat command to track down the ports and local URLs of...
- [Setting up Laravel Forge and DeployBot.](https://supergeekery.com/blog/laravel-forge-and-deploy-bot.md): A detailed walkthrough of setting up atomic deployments for a Craft CMS site with Laravel Forge and DeployBot, covering config files, symlinks, and post-deploy...
- [Yeoman generators, the file system and symlinks.](https://supergeekery.com/blog/yeoman-generator-locations.md): Understand where global and local Yeoman generators live in your file system, and how to use npm link and symlinks to develop a generator while still using it...
- [Removing Craft CMS plugins that you can't uninstall](https://supergeekery.com/blog/removing-craft-cms-plugins-that-you-cant-uninstall.md): How to remove a custom Craft CMS plugin that has no uninstall button in the control panel by using Composer to undo the original require command.
- [Using aliases on the command line.](https://supergeekery.com/blog/using-aliases-on-the-command-line.md): Speed up your terminal workflow with command line aliases on macOS: set up a .aliases file, add directory shortcuts, a reload command, and colorized file...
- [A Checklist for the Craft Plugin Store](https://supergeekery.com/blog/getting-into-the-craft-plugin-store.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [An S3 bucket policy to allow full-access for a single bucket.](https://supergeekery.com/blog/s3-bucket-policy.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Keeping up with the Instagram API](https://supergeekery.com/blog/keeping-up-with-the-instagram-api.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [A Checklist When Transitioning from MAMP to Valet](https://supergeekery.com/blog/from-mamp-to-valet.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Extracting a YouTube ID from a URL with Twig](https://supergeekery.com/blog/extracting-a-youtube-id-from-a-url-with-twig.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Detecting and debugging the Instagram in-app browser](https://supergeekery.com/blog/detecting-the-instagram-in-app-browser.md): How to debug in the Instagram in-app browser using an alert dialog box. In-app browsers don't offer a console so you have to use the tools at your disposal.
- [How to re-add Github key to a server](https://supergeekery.com/blog/how-to-re-add-github-key-to-a-server.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Craft CMS: A bigger “Plain Text” field.](https://supergeekery.com/blog/craft-cms-a-bigger-plain-text-field.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [How to use HandBrake's queue feature to convert multiple videos.](https://supergeekery.com/blog/how-to-use-handbrakes-queue-feature-to-convert-multiple-videos.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Tutorial: Using Gulp with htmlprocess and concatenate](https://supergeekery.com/blog/tutorial-using-gulp-with-htmlprocess-and-concatenate.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Automate daily database backups with crontab and SFTP and be the master your domain.](https://supergeekery.com/blog/automate-daily-database-backups-with-crontab-and-sftp-and-be-the-master-your-domain.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Google Analytics, Ghostery, and Event Tracking](https://supergeekery.com/blog/google-analytics-ghostery-and-event-tracking.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Use a cookie to iterate between visits with PHP.](https://supergeekery.com/blog/use-a-cookie-to-iterate-between-visits-with-php.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [MAMP and Navicat and Character Set Hell.](https://supergeekery.com/blog/mamp-and-navicat-and-character-set-hell.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Auto Print an HTML Page](https://supergeekery.com/blog/auto-print-an-html-pag.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Untangling MX: Setting up DNS records for a web site with different mail server.](https://supergeekery.com/blog/untangling-mx-setting-up-dns-records-for-a-web-site-with-different-mail-server.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [A Quick Way To Password Protect a Web Page.](https://supergeekery.com/blog/a-quick-way-to-password-protect-a-web-page.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [The Passing of Michael Jackon and Mass Media.](https://supergeekery.com/blog/the-passing-of-michael-jackon-and-mass-media.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Being a Geek on Election Night](https://supergeekery.com/blog/being-a-geek-on-election-night.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Digital Evangelists Roundtable, Round 1](https://supergeekery.com/blog/digital-evangelists-roundtable-round-1.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [Found Home Movie from 1976](https://supergeekery.com/blog/found-home-movie-from-1976.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [The YouTubified Election of 2008](https://supergeekery.com/blog/the-youtubified-election-of-2008.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [The Latest Object of Desire: iPhone.](https://supergeekery.com/blog/the-latest-object-of-desire-iphone.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [No Ticket Needed. But Where’s Your Ticket?](https://supergeekery.com/blog/no-ticket-needed-but-wheres-your-ticket.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [All Badged Up And Ready To Go](https://supergeekery.com/blog/all-badged-up-and-ready-to-go.md): SuperGeekery is a blog of interest only to nerds by John Morton.
- [CES 2007](https://supergeekery.com/blog/ces-2007.md): SuperGeekery is a blog of interest only to nerds by John Morton.
