Blog
Here is where I document things that I learn and workarounds that I find in my daily work as a web developer.
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