Contents
Work keeps me busy with React, Spring Boot, and a healthy slice of AWS — but side projects are where I get to choose the problem. The work below involved standing up my own AWS and GCP accounts, registering domains, wiring up an Alexa skill, and generally learning by doing. More than once, something I built here found its way into a professional context.
Personal Projects
Root
Objectives
Every project needs a foundation. This one provisions my AWS environment — IAM users, permission boundaries, and the shared infrastructure everything else builds on. I started with Pulumi, which I genuinely liked, but once I adopted AWS SAM for Lambda work, I was already writing CloudFormation. Consolidating on one tool made more sense than maintaining two.
Each project gets its own IAM user with scoped credentials and permission boundaries, so a compromised key can't become a full account breach.
Lessons
Pulumi is excellent — expressive, well-documented, and a pleasure to use. CloudFormation is more verbose, but it covers everything I need and keeps the toolchain uniform. Either way, having infrastructure in version control is one of those practices that quickly becomes non-negotiable.
Source
Email Forwarding
Objectives
I wanted to move off GoDaddy — overpriced for what I needed — but one thing was in the way: an email alias I had set up for my parents that forwarded everything to both of them. Before I could migrate, I had to rebuild that. The upside was a reusable email-sending API that I could call from other projects down the road.
Technologies
AWS SES handles both inbound and outbound email. SQS buffers outgoing messages so delivery is decoupled from the trigger, and Node.js Lambdas via AWS SAMdo the actual work. Serverless is a natural fit here: traffic is bursty, latency requirements are relaxed, and there's nothing to keep warm between messages.
Lessons
Managing DNS properly — MX records, SPF, DKIM — turned out to be the most educational part. I also got comfortable with Route 53 for domain management, which came up again in every project that followed. The migration succeeded; I now have separate production and test domains, and my parents still get their forwarded emails.
Diagram

Source
Jokes
URL: https://jokes.dbowland.com
Objectives
This was my first project with a real UI. The domain was simple — a jokes app — which made it a good sandbox for settling on a frontend stack. I started with Gatsby, which is a easy way to get a simple site going, but eventually converted it to the more popular Next.js.
Technologies
All UI projects use Next.js, HeroUI for components, and Tailwind CSS for styling. A component library pulls its weight in accessibility and consistency; Tailwind handles everything the library leaves to you. Icons throughout come from Lucide.
Lessons
Designing consistent data-fetching patterns across DynamoDB records was worth the effort — those conventions carried forward into later projects. The real treat was building my first Alexa skill and wiring up AWS Polly for text-to-speech, which still makes me smile every time someone asks Alexa to tell them a joke.
Diagram

Source
Choosee
URL: https://choosee.dbowland.com
Objectives
A friend suggested this one: an app that helps a group decide where to eat by presenting restaurant options one at a time until everyone agrees. It drew on everything built before it — Lambda backends, React frontends, SMS messaging, and Cognito authentication — and pushed into new territory on top.
Lessons
Choosee was my first time working with Google Cloud Platform and the Places API. Setting up a GCP account, learning the billing model, and integrating a non-AWS service into an otherwise AWS-native stack was a useful exercise in not assuming everything lives in one cloud.
Diagram

Source
Other
URL: https://dbowland.com
Objectives
The catch-all for things that didn't fit neatly elsewhere: this site, an SMS messaging service, and a log subscriber that watches CloudWatch for errors and texts me when something goes wrong.
Lessons
AWS Pinpoint powers the SMS delivery, and CloudWatch subscription filters route log events to the alert Lambda in near-real time. Small projects, but they made observability feel real rather than theoretical.
Source