Full-stack applications for Next Generation 911 (NG911) call routing
Day to day
Java and Kotlin, Spring Boot, React, REST APIs, PostgreSQL, AWS, Kubernetes
Education
B.S. in Computer Science, Villanova University
Good engineering starts with preparation.
Experience
Seven years, three very different engineering environments
Aug 2025 – Present
Sinch
Software Engineer II · Next Generation 911 (NG911)
Full-stack applications supporting NG911 call routing and emergency communication. I partner with stakeholders on requirements and UX, lead AI-assisted engineering initiatives, and troubleshoot production and environment-specific issues.
Java REST APIs and backend services for enterprise digital document systems, plus cloud infrastructure, configuration and deployment workflows. Temporary Scrum Master, coordinating engineering and business stakeholders.
Application Engineer I and II · Digital Advisor, Client Experience Digital Security Lab
Java RESTful APIs on AWS, accessibility improvements for customer-facing UIs, and production support including debugging and incident response. Subject Matter Expert for Splunk, PagerDuty and Honeycomb.
B.S. in Computer Science, Villanova University, 2019
Projects
Things I built to learn
Personal projects where I tried something new and learned from real problems. My professional work is under Experience.
Project 1 of 3
Featured · April 2025
Magic 8-Ball
It started as an experiment: a Magic 8-Ball that answers “Is Betsy your next great hire?” It became my crash course in connecting a frontend, a backend, a database and a deployed app.
React and TypeScript, a Spring Boot API, PostgreSQL
Real lessons in CORS, environment config and database migrations
Ask it whether Betsy is your next great hire, give it a shake, and a real API answers with a reason.
The first version, April 2025.
Why I built it
It started as an experiment. I wanted a portfolio that showed my personality as well as my experience, so I built it around a Magic 8-Ball. The ball was the fun part. The real work was everything behind it.
How it works
Frontend
React and TypeScript, built with Vite and hosted on Vercel. Each shake shows a playful answer, then asks the API for a reason.
API
Spring Boot on Java 21, deployed to Render with Docker. GET /api/reasons/random returns one approved reason, picked at random.
Data
PostgreSQL, with the schema managed by Flyway migrations.
Fallback
Since the 2026 update, the site shows a local reason if the API is slow or down.
What it taught me
Getting the pieces to talk to each other in production took longer than writing any one of them. The commits from those first ten days are mostly about integration: CORS rules so the deployed frontend could call the API from Vercel and the custom domain, a different API address for each environment, a database migration that needed a manual repair, and getting Maven to build on Render.
What I’d do differently today
Agree on the API contract first. The API sends the reason text as reason, but the frontend reads title.
Lock down the write endpoints before deploying anything.
Plan for the API being slow or unavailable from the start.
Add automated tests.
Play it
The Magic 8-Ball keeps its own page, its original look and its personality. It used to be the whole website; now it’s one project in the portfolio.
My first app built with Lovable, an AI-powered low-code app builder.
300+ people used it, including visitors from other countries, such as Egypt. The church promoted it to encourage volunteers to sign up for festival shifts.
Why I built it
I wanted to see how quickly I could build a useful application with AI-generated UI and code. My church’s festival needed volunteers at different stations, so I built the signup for it.
What it does
Volunteers register for shifts, with different stations and shift schedules.
Volunteers review the shifts they’ve signed up for, and families can review their shift registrations.
It collects shirt sizes, and later I added shirt inventory tracking.
A password-protected admin page is meant to keep registrants’ information private.
The problem that mattered
Some volunteers couldn’t sign up for more than one shift, because the app rejected any shifts whose times overlapped. But some overlaps were intentional: one shift ends while the next one starts, at the handover between stations.
Diagram, not a screenshot. Overlapping shifts at different stations should be allowed.
I investigated the signup logic myself and fixed it, so volunteers can register for overlapping shifts when the shifts are at different stations. The first generated version followed a sensible-sounding rule. The real requirement only became clear once people tried to use it.
What I learned
AI tools got me to a working application quickly. Real users then found requirements and edge cases the first version didn’t handle. Now I judge AI-generated UI and functionality by how people actually use it, not by how polished the first result looks.
What’s next
The biggest improvement identified after the festival: automated text-message reminders before each volunteer’s shift. It’s planned, not built.
Redesigning my portfolio as a documented engineering project, with Claude Code as a development partner.
How I’m working on it
Investigate first. Before changing any code, I had Claude Code assess the existing architecture and record what it found, including the 8-Ball’s known issues.
Write it down. An agent guide (CLAUDE.md), a design document (DESIGN.md) and dated research notes live in the repository, so people and coding agents work from the same context.
Decisions stay mine. Claude Code investigates, proposes and builds prototypes. I approve the decisions, and approved ones go into the design decision log.
Accessibility from the start. The target is WCAG 2.2 AA, and every prototype is checked at phone and desktop widths.
My own photography. The visual identity is built around photos from my kitchen, like the one beside this card.
Status
Live now
This recipe-box portfolio: HTML, CSS and JavaScript, built with Vite and hosted on Vercel
The Magic 8-Ball on its own page, in React and TypeScript, with keyboard support and fallback reasons
Spring Boot API and PostgreSQL on Render
In progress
Documentation-first workflow with Claude Code
Accessibility and responsive layouts
Ideas, not built
Agentic workflows for parts of the development process
Multi-agent systems, only once there’s a real use case for one
Lessons carried over
From the 8-Ball: agree on contracts and plan for failure before you deploy. From the festival signup: real use shows requirements a first draft misses. Here, that means investigating before building and verifying what AI produces against the real system.
AI output is a hypothesis until the real system verifies it.
At work
At Sinch I lead AI-assisted engineering initiatives using GitHub Copilot and Claude, covering UI development, repository guidance, team workflows and engineering automation opportunities.
What I’m exploring
Agentic workflows, and how coding agents can work from the same trusted context as the people on the team. This site’s v2 redesign is planned that way, with an agent guide, a design document and dated research notes kept in the repository.
About
Engineering is a big part of me. It isn’t all of me.
I zoom out before I zoom in.
Before I start changing code, I want to understand the user, the system around the change, and how we will know the solution is actually working.
Outside work I cook and bake for the people around me, from weeknight meal prep to batches of tamales and bake-sale flan and tres leches. It’s the same habit: prepare, work in steps, and check as you go.