Hearts Score Tracker was built to solve the same core problem as Gin Score Tracker,
replacing pen-and-paper scoring, but for a game with very different rules and dynamics.
My goal was to create a focused, lightweight experience for tracking
scores across multiple players while keeping setup fast and the UI
frictionless during gameplay.



The Hearts app shares a large portion of its foundation with Gin Score Tracker.
I intentionally designed both apps around a shared component architecture, reusing core UI components such as score inputs, game summaries, layouts, and navigation patterns.
This approach significantly reduced development time and improved maintainability, allowing changes and improvements
to be made consistently across projects.
Like Gin, the app is built with React Native and Expo for a single cross-platform codebase, and styled with NativeWind to keep UI iteration fast and consistent.
The main challenge with Hearts Score Tracker wasn’t building from scratch — it was adapting an existing structure to fit a fundamentally different game.
Hearts introduces variable player counts, different scoring rules, and game-ending conditions that required rethinking the underlying logic while keeping the UI familiar.
Balancing code reuse with flexibility meant carefully separating shared components from game-specific logic, ensuring the app felt purpose-built rather than reused.
Building Hearts Score Tracker reinforced the value of reusable architecture and thoughtful abstraction.
Instead of copying and modifying code, I learned to design components and state logic that could adapt to different games with minimal friction.
This project helped solidify my confidence in scaling ideas beyond a single app — turning one successful project into a foundation for many.
It also showed me how small, focused products can compound over time when built with maintainability and iteration in mind.