Blog
Here is where I document things that I learn and workarounds that I find in my daily work as a web developer.
2025
2024
- Deploying Laravel with SQLite on Dokku
October 1 2024
 - Toasts are Bad UX
July 17 2024
 - GitHub: How to get Notifications from Work Repositories to your Work Email
April 19 2024
 - React Breakpoint Props: How Simple Components Become Complicated due to Server-Side Rendering
April 12 2024
 - VS Code: 3 Ways to Navigate Long Test Files
March 29 2024
 - Dokku: How to host Puppeteer + Node.js apps
March 22 2024
 - Next.js: How to Mock Server-Side Requests Using Playwright
March 15 2024
 - Next.js: How to add a Contact Form (App Router)
March 7 2024
 - Next.js: How to add a Contact Form (Pages Router)
March 1 2024
 - Next.js, Sanity & TypeScript: A Setup That Works
February 23 2024
 - Sanity: How to Edit Documents as JSON
February 16 2024
 
2023
- How Plausible Analytics Keeps a Tiny (< 1KB) Tracking Script
October 26 2023
 - How to fix Sanity Error: Uncaught error - Could not resolve jsonType of undefined. No parent type found
October 25 2023
 - Next.js: The Easiest Way to Create an API Proxy (2023)
September 27 2023
 - Contentful: How to Find Unused Types
August 17 2023
 - Next.js: How to Get and Set Cookies (2023)
July 11 2023
 - A Free Remote Pair Programming Solution
May 24 2023
 - Next.js: How to Show the 404 Page (App Router)
May 16 2023
 - Next.js: Integrating Contentful and TypeScript (App Router)
May 14 2023
 - useControlledProps: Make any React Component Controlled/Uncontrolled
March 23 2023
 - Behind the Scenes of my new Personal Site
March 22 2023
 - Next.js: Page Transitions with Framer Motion
March 2 2023
 - Building a Responsive Website Tester with Iframes and React
February 28 2023
 - Next.js: Using HTTP-Only Cookies for Secure Authentication (2023)
February 28 2023
 - Next.js: How to Set Meta Tags
February 27 2023
 
2022
- 8 Tools to Run a Freelance Web Development Business
December 19 2022
 - Extending Playwright's Built-In Test Method for Super-Clean Test Setups
December 18 2022
 - React: How to Create an Autogrowing Textarea
December 18 2022
 - Making the Cakedesk App Icon
July 27 2022
 - Introducing Cakedesk: A Desktop Application to Manage your Freelance Clients, Invoices and Proposals
July 17 2022
 - Error reporting with Rollbar and Next.js
March 29 2022
 - React: Making a Juicy SVG-Powered Like Animation
February 18 2022
 - React: Preventing Layout Shifts When Body Becomes Scrollable
February 15 2022
 - React Leaflet: Opening Popups Programmatically
February 13 2022
 
2021
- Padding Strings in JavaScript: padLeft & padRight
September 5 2021
 - React: Implementing Material Design's Floating Labels
September 4 2021
 - React: Using Refs in Loops
August 17 2021
 - Node.js: Validating Shopify Webhooks with Express
July 16 2021
 - Git: Using Patch Files to Share Code Changes Without Branches or Commits
July 16 2021
 - Creating React Components that can be Controlled and Uncontrolled
July 15 2021
 - macOS: How to get your Local IP Address
March 28 2021
 - How to open a localhost website on iPhone / iOS
March 28 2021
 - How I Create Client Invoices from the Command Line using Node.js and Airtable
March 18 2021
 
2020
- Mongoose: Instantiate Document from Schema
November 30 2020
 - Cypress: How to interact with a database during your tests
October 27 2020
 - Cypress: Writing and organizing test setups with cypress-routines
October 25 2020
 - How to close all tmux panes at once
October 20 2020
 - How to speed up your development workflow with tmux scripts
October 20 2020
 - Next.js: How to Redirect from getInitialProps
October 1 2020
 - 5 Qualities to look for when hiring a freelance web developer
September 30 2020
 - Next.js: How to show the default 404 page
September 18 2020
 - How to deploy Sanity from GitHub Actions
August 20 2020
 - UI Detail: Highlighting the last active item in a list
August 20 2020
 - Bold active-states without layout jumps
August 15 2020
 - XML RSS feeds with Node.js
June 10 2020
 - Deeply nested subcommands in Node CLIs with Commander.js
June 7 2020
 - How to generate a sitemap.xml with Node.js the simple way
June 1 2020
 - How to use an SSH key inside GitHub actions
May 17 2020
 
2019
- How to fix "Error: spawn node ENOENT" when using child_process in Node.js
July 17 2019
 - Writing a static site generator with MDX & Webpack
July 15 2019
 - CSS: Watch out for 100vh height in mobile browsers
July 5 2019
 - Testing mobile, tablet and desktop devices with Cypress
July 1 2019
 - Local subdomains on macOS with Dnsmasq and Caddy
April 8 2019
 - How to deploy a Next.js app to Dokku
January 20 2019
 
2018
2015
- When sourcing `.bashrc` in a Vagrant provisioning script doesn't work
July 27 2015
 - How to create an object from an array in JavaScript
July 16 2015
 - How to persist folders and files with dokku and docker-options
July 10 2015
 - Getting missing duplicate columns in Knex.js
July 3 2015
 - How to write your gulpfile using ES6
July 1 2015
 - Compiling your ES6 command line apps to work with node.js
April 26 2015
 - Making your io.js command line apps compatible with node.js
April 25 2015
 - How to add an Istanbul code coverage badge to your GitHub repository
April 24 2015
 
2014
- Using Angular and AngularUI with Browserify
May 29 2014
 - 5 must-have Atom packages / plugins
May 8 2014
 - Tutorial: Gulp and Browserify without the gulp-browserify plugin
May 7 2014
 - Tutorial: CSRF for Express 4.x
April 30 2014
 - How to make an object inherit from a class in JavaScript
April 10 2014
 - node.js FTP error: ECONNREFUSED
April 4 2014
 - gulp.js Tutorial: SASS, Browserify, jade and workflow optimization
March 27 2014
 - From Wordpress to Octopress to DocPad
March 13 2014
 - gulp-watch and watching new files
February 27 2014
 - Testing Web Workers with Jasmine and gulp
February 5 2014
 - Prevent gulp.js from crashing on error
January 22 2014
 
2013
- setInterval / setTimeout slows down on TAB change
November 28 2013
 - How to Inherit Events from Backbone Views
October 28 2013
 - pozzle: A minimalistic Puzzle Game that changes the Way you think
October 5 2013
 - jQuery Component for Crafty
August 27 2013
 - How to determine the width and height of SVG-text before rendering with Raphaël
July 3 2013