Articles
You'll find technical posts here. I write about Life, the Universe, and STEAM and Ask me about my podcast over on Substack.
Create an "I'm feeling lucky" command in Obsidian
This makes use of the Templater plugin's Startup Templates functionality. The following gist can be created and placed in a location in your vault outside ...February 26, 20252 minsPlaywright, `useActionState`, and bound server functions
Playwright not updating form state when using bound functions for useActionStateFebruary 19, 20252 minsTesting 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, 20258 minsToast Notification Components and Dialog Exit Animations in WeWeb
Animating dialog close or component hide events in WeWeb with CSS and workflows.January 29, 20253 minsMigrate Repositories from Bitbucket to GitHub
How to migrate or import a repository from Bitbucket to GitHub on easy mode.January 28, 20252 minsCore 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, 202516 minsRSS to JSON with Make
Fetch RSS as JSON using webhooks and Make (formerly Integromat).September 10, 20244 minsPrevent scroll preservation on jump links in Next.js
Allow jump links to scroll to the correct position in Next.js.July 10, 20241 minsTest thrown errors in Next.js 14 with Storybook
Throw errors in Next.js components and make them testable in Storybook interaction testsJune 16, 20241 minsTesting Next.js 14 and Supabase
Pro tips for getting testing up and running with Next.js 14.May 29, 20242 minsTransfer assets between Meta Business Portfolios
The art of social-media management with Meta is apparently a convoluted one.May 15, 20242 minsNext.js ForwardRef Error in Storybook
Getting around interesting quirks with dynamically loading components in Next.jsMay 7, 20242 minsSlugify 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 minsConvert Gist Links in Markdown to Embeds in Next.js
Convert unadorned gist links in markdown to React-compatible embeds in Next.js.December 24, 20232 minsGenerate QOTD in Obsidian templates
Programmatically insert quotes into Obsidian templates with TemplaterDecember 20, 20231 minsShare sessions across subdomains with Supabase
Quick snippet for sharing cookies across subdomains using Supabase auth.October 5, 20231 minsMigrate WordPress to Eleventy with Colocated Images
How I migrated old WordPress blogs to Eleventy with colocated image support.September 23, 20236 minsAccessing 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 minsRecently, in workflow optimisation
An revision of tools for improved productivity and workflow management.August 28, 20235 minsConvert DeepGram to Descript transcript format
Use DeepGram transcripts in your Descript projects.January 1, 20231 minsProgrammatically Post to Mastodon with Make
Use web requests to automate or programmatically post to Mastodon with Make.January 1, 20233 minsColocated images with MDX and Next.js
An inelegant workaround to use colocated images with MDX on Next.js.November 8, 20223 minsConvert DeepGram to autoEdit transcript format
Use DeepGram as your Speech-to-Text (STT) engine in autoEdit 3.November 2, 20221 minsBuggy Font Display on MacOS
Workarounds for letters displaying with cutouts on MacOS.September 5, 20221 minsProxy Redirect Netlify Sites
Proxy redirect parts of one Netlify site to another.August 22, 20222 minsImprove DaVinci Resolve Audio Export Quality
Reduce artefacts in audio exports from DaVinci Resolve.August 5, 20223 minsContentful Embedded Content in Gatsby
Integration and rendering of Contentful embedded assets and entries.March 18, 20221 minsBookmark everything (Raindrop.io to Tumblr with Zapier)
Automatically post Raindrop.io bookmarks to Tumblr.February 6, 20222 minsClean-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 minsBake-in SRT Captions into Videos Using ffmpeg
How to create baked-in captions in videos using srt files and ffmpeg.October 1, 20211 minsConfigure audio over Xrdp on CentOS
Configuring Xrdp on CentOS for use over Microsoft Remote Desktop.December 23, 20203 minsGenerate SRT files with Google Cloud Services
Using Google Cloud Services Speech to Text to generate SRT files from short videos.December 4, 20202 minsCreate Group Permissions with Migrations in Django
How to create permissions on groups in Django in a migration.November 6, 20201 minsFairlight Audio Clean-Up
The technical details behind the creation of STEAM Powered.October 1, 20204 minsConvert 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 minsCopying Fairlight settings between timelines
Replicate Fairlight settings when using the same track on multiple timelines.July 26, 20201 mins