Hello, my name is Andrew!
I'm a full-stack web developer.
I'd love to help you convert ideas into fast, functional, and user-friendly web applications.
Where I Shine
An Extensive Toolbelt
Front-End
Back-End
Where I Don't Shine
- 🖥️ Keeping my desktop tidy. Please ignore those 300 shortcuts.
- 📚 Finishing books. I've read about 75% of everything.
- 📝 Making lists. //TODO: finish this list.
Featured Projects

Take Space to Pause
takespacetopause.orgTake Space to Pause is a multi-lingual platform where teenagers can learn how to identify & reduce stress. It was built to comply WCAG 2.1 compliance standards.
The biggest challenge with this site was building the Plan Your Pause digital experience. The Plan Your Pause tool is a dynamically-branching quiz, built with Vuex. It guides users through a personalized journey based on their responses, across multiple thematic sections (Body, Thoughts, Connection). Within the quiz logic, each step is defined in a configurable steps array, and user inputs shape both the flow and the resulting plan. Behind the scenes, it:
- Tracks step progression and completion state
- Saves key decisions like mood, answers, and selected “plans”
- Dynamically calculates quiz progress and renders contextual components (e.g., questions, intros, results)
- Supports ~200 branching outcomes in both English and Spanish
Optimizations such as smooth, animated transitions and state-saving create a seamless experience.

ZBV Invitational Golf Tournament
Coming soon! (ETA June 2025)The Zeke Bondy-Villa Invitational Golf Tournament is a 501(c)(3) charity I do pro-bono work for. Over the last several months, I've undertaken a complete re-build of the site from the ground up. This includes a much faster front-end, built using Inertia.js and Vue.
Being a charity and a golf tournament, there are several important e-commerce aspects to this site as well. Using Laravel + Laravel Cashier + Stripe, I have built a full-fledged platform for managing donations, registering for tournaments, and managing sponsors.

Quit the Hit - Revitalizing a legacy codebase
I didn't build this project, but I was brought in to save it. Quit the Hit is a teen vaping cessation platform, that over the years, gradually exceeded its technical limitations, resulting in long (>60 second) loading times, and the occasional memory exhaustion crash.
The task was simple: make it usable again. The first step here was profiling & optimizing the least efficient queries to eliminate n+1 patterns. Next, I offloaded several expensive calculations from the front-end into Sequelize virtual columns, greatly improving performance. However, I didn't stop there. I rebuilt several front-end components from scratch, utilizing strategies such as lazy loading and pagination to seamlessly render views. Bloated datatables were replaced with high-performance, scalable tables, all while maintaining backwards-compatibility.
The result? Page loading times between 2 and 3.5 seconds and a few tears of joy from the admin who had to work in here on a day-to-day basis.

Flagle
andydeforest.github.io/flagleA simple (and hopefully addicting) flag geo-guessing game. A flag is shown to the user, who then gets 6 tries to guess which country it belongs to! If a wrong answer is guessed, the user is shown the distance between their guess and the correct answer, as well as the relative direction.
The game was built as a fun weekend project on Nuxt and deployed to GitHub Pages using GitHub Actions. Behind the scenes, it uses a custom JSON file with every country listed, as well as it's geographic center for distance calculations. It uses fuse.js for fuzzy searching, as well as Pinia for guess and statistics tracking. The Pinia instance persists using local storage so if the user inadvertently refreshes, or wants to come back later, their progress is saved.