Articles
You'll find technical posts here. I write about Life, the Universe, and STEAM over on Substack.
Create an “I’m feeling lucky” command in Obsidian
Create a button to fetch a random note from your Obsidian vault for review.February 26, 20252 min readPlaywright, useActionState, and bound server functions
Playwright not updating form state when using bound functions for useActionStateFebruary 19, 20252 min readTesting with Next.js 15, Playwright, MSW, and Supabase
Setting up testing with mocked requests and authentication in Next.js and Supabase using Playwright and MSW.February 14, 20257 min readToast Notification Components and Dialog Exit Animations in WeWeb
Animating dialog close or component hide events in WeWeb with CSS and workflows.January 29, 20253 min readMigrate Repositories from Bitbucket to GitHub
How to migrate or import a repository from Bitbucket to GitHub on easy mode.January 28, 20252 min readCore Auth Workflows with WeWeb and Xano
A walkthrough for setting up registration, login, magic links, and forgot password flows in WeWeb with Xano.January 20, 202514 min readRSS to JSON with Make
Fetch RSS as JSON using webhooks and Make (formerly Integromat).September 10, 20244 min readPrevent scroll preservation on jump links in Next.js
Allow jump links to scroll to the correct position in Next.js.July 10, 20241 min readTest thrown errors in Next.js 14 with Storybook
Throw errors in Next.js components and make them testable in Storybook interaction testsJune 16, 20241 min readTesting Next.js 14 and Supabase
Pro tips for getting testing up and running with Next.js 14.May 29, 20242 min readTransfer assets between Meta Business Portfolios
The art of social-media management with Meta is apparently a convoluted one.May 15, 20242 min readNext.js ForwardRef Error in Storybook
Getting around interesting quirks with dynamically loading components in Next.jsMay 7, 20241 min readSlugify headings for filenames in Obsidian
I was mildly inconvenienced in my quest for improved publishing workflows, so I figured out how to write an Obsidian plugin to slugify filenames from headings.December 31, 20233 min readConvert Gist Links in Markdown to Embeds in Next.js
Convert unadorned gist links in markdown to React-compatible embeds in Next.js.December 24, 20231 min readGenerate QOTD in Obsidian templates
Programmatically insert quotes into Obsidian templates with TemplaterDecember 20, 20232 min readShare sessions across subdomains with Supabase
Quick snippet for sharing cookies across subdomains using Supabase auth.October 5, 20231 min readMigrate WordPress to Eleventy with Colocated Images
How I migrated old WordPress blogs to Eleventy with colocated image support.September 23, 20236 min readAccessing pathname in Next.js generateMetadata
An annoying hack to get access to the current pathname in Next.js 13 app router generateMetadata function.September 10, 20231 min readRecently, in workflow optimisation
An revision of tools for improved productivity and workflow management.August 28, 20235 min readConvert DeepGram to Descript transcript format
Use DeepGram transcripts in your Descript projects.January 1, 20231 min readProgrammatically Post to Mastodon with Make
Use web requests to automate or programmatically post to Mastodon with Make.January 1, 20232 min readColocated images with MDX and Next.js
An inelegant workaround to use colocated images with MDX on Next.js.November 8, 20223 min readConvert DeepGram to autoEdit transcript format
Use DeepGram as your Speech-to-Text (STT) engine in autoEdit 3.November 2, 20221 min readDeploy sharp with Next.js on Netlify
Troubleshooting sharp errors on Netlify.October 23, 20222 min readBuggy Font Display on MacOS
Workarounds for letters displaying with cutouts on MacOS.September 5, 20221 min readProxy Redirect Netlify Sites
Proxy redirect parts of one Netlify site to another.August 22, 20222 min readImprove DaVinci Resolve Audio Export Quality
Reduce artefacts in audio exports from DaVinci Resolve.August 5, 20223 min readContentful Embedded Content in Gatsby
Integration and rendering of Contentful embedded assets and entries.March 18, 20221 min readBookmark everything (Raindrop.io to Tumblr with Zapier)
Automatically post Raindrop.io bookmarks to Tumblr.February 6, 20222 min readClean-up Extraneous Paragraph Tags and Table Whitespace in MDX on GatsbyJS
MDX wraps components with paragraph tags and can add extra whitespace in tables which produce invalid HTML. This GatsbyJS plugin cleans up the markup.October 9, 20211 min readBake-in SRT Captions into Videos Using ffmpeg
How to create baked-in captions in videos using srt files and ffmpeg.October 1, 20211 min readBatch Export Timelines
Exporting multiple timelines at one in DaVinci Resolve.March 10, 20211 min readConfigure audio over Xrdp on CentOS
Configuring Xrdp on CentOS for use over Microsoft Remote Desktop.December 23, 20202 min readGenerate SRT files with Google Cloud Services
Using Google Cloud Services Speech to Text to generate SRT files from short videos.December 4, 20201 min readCreate Group Permissions with Migrations in Django
How to create permissions on groups in Django in a migration.November 6, 20201 min readFairlight Audio Clean-Up
The technical details behind the creation of STEAM Powered.October 1, 20204 min readConvert DaVinci Resolve Markers to YouTube-Compatible Timelines
Use DaVinci Resolve marker EDLs to create timelines that can be used in show notes and YouTube timelines.July 29, 20201 min readCopying Fairlight settings between timelines
Replicate Fairlight settings when using the same track on multiple timelines.July 26, 20201 min read