TL;DR: Struggling to keep form validation and UI in sync in your React app? Here’s how I used Zod and React Hook Form together to define a single source of truth—driving both runtime validation and required field indicators in the UI. The Problem: When Validation Drifts from UI I’ve been writing forms for as long as I’ve been writing code—and …
About the Author

Recording & Communicating Time in Software
When I first started writing software to handle time, I went into it with a naive perspective that it couldn’t be that hard. After all, it’s just time, and I’ve understood how that worked since elementary school! It took my first daylight savings time transition to disabuse me of that notion. I began daydreaming that one day all systems would fully run on UTC and people would adapt to that as a standard.
No more writing code to handle time zones in different regions. No urgent time zone library updates to account for new government legislation around daylight savings time. Being able to add and subtract time without having to account for crossing time zones…
It sounded great to me at the time, and sometimes when I’m neck-deep in tricky code, I feel that way still. In calmer moments though, I’ve learned that’s not a philosophy that serves me. When I talk to people about my birthday, a holiday, or give vague time measurements like “twice a day” or “first thing tomorrow,” I’m not speaking to them about timestamps. I’m conveying an idea that just happens to involve time. Time isn’t just a number; it is communication that is tied to our days and nights and the lived human experience.
A good software product handles, records, and displays time accurately. A great piece of software captures, stores, and displays time and date information in a format that conveys the full idea to the intended recipients. Good software works; great software communicates.
Flutter Essentials: Strategies for Collapsible Text in Flutter
As a mobile developer, I have had to create a lot of listing pages. The content, styling, and layout may all differ, but structurally, they are the same. When I first started using Flutter, I was immediately impressed by how fast they are to stand up. Nearly out of the box, the ListView and the Card work extremely well and support a wide variety of devices and use cases with no additional styling – all while remaining extensible.
With this in mind, when I needed to create a listing page that displayed variable lengths of pre-generated text that could be expanded and collapsed, I was not particularly concerned about the complexity of the task. However, I very quickly realized that Flutter is less optimized for handling large blocks of text than it is for displaying lists. I quickly encountered unexpected complexities that I had to manually account for. In this post, I’ll walk through the basic structure and explore which components can be used for solving this problem and creating collapsible text in Flutter.
Automating Flutter Deployments: Part 3 – Configuring CircleCI
Recently, I’ve worked on automating some internal processes for building and releasing Flutter applications. Part of this effort included utilizing Fastlane with a Continuous Integration/Delivery platform to build and deploy the app. This blog post will outline the process I followed to run the build on CircleCI after I had configured Fastlane to build and deploy the application from my local machine.
Automating Flutter Deployments: Part 2 – Screenshots
Recently, I worked on automating some internal processes for building and releasing Flutter applications. Part of this work has involved integrating integration test runs and screenshots as part of the release and deployment process.
I wanted to be able to use the same set of tests to validate our code on Android and iOS devices without having to write large amounts of platform-specific code or configuration. These tests needed to be able to integrate with Fastlane, so they can be utilized by CI/CD. Specifically, this restricted setup runs using command line tools with no manual steps in Xcode or Android Studio, aside project level configuration.
This blog is Part 2 of a three-part series exploring automating Flutter CI/CD on CircleCI. Part 1 covered setting up Fastlane to build and deploy applications locally, this post outlines automating screenshot capture and test runs, and part 3 discusses configuring CircleCI to automate these processes.
- Page 1 of 2
- 1
- 2