Inspiration

I've always been drawn to the idea of developing what I like to call “subway games”: casual games you can play for one round or ten, with no opponents and no timers. Games where you're essentially playing against yourself, and you can be as demanding — or as relaxed — as you want.

I decided to build a binary puzzle, or Takuzu, because it fits that philosophy perfectly. It's entertaining and intellectually stimulating without relying on time limits, competition, or opponents. With Paws & Pairs, I wanted to take that mechanic and turn it into a warmer, friendlier, and more approachable experience.

The goal was to build a puzzle game that is easy to understand at a glance, while still providing that satisfying feeling of overcoming an intellectual challenge as you progress through the game.

What it does

Paws & Pairs is a logic puzzle game where players complete grids with cats and dogs by following a small set of rules.

Every puzzle can — and should — be solved entirely through logic and deduction, without guessing.

The game includes a progression of carefully curated puzzles, hints for when players get stuck, daily rewards, player statistics, and a token-based currency system. The game can be played for free with ads, while a one-time purchase removes ads and eliminates the need to spend tokens to access hints.

How I built it

Paws & Pairs was developed as a cross-platform mobile game using Kotlin Multiplatform, with Jetpack Compose and SwiftUI providing a native experience on Android and iOS respectively.

The application logic, puzzle engine, progression and hint systems, rewards, and statistics all live in the shared layer, providing a single source of truth across both platforms.

For monetization, I use AdMob for ad mediation and RevenueCat to manage the in-app purchase on both platforms through its multiplatform SDK.

AI-assisted development has also been an important part of my workflow. I used tools such as Codex and Junie throughout the project for implementation, iteration, and debugging, as well as for exploring ideas and assisting with the creation of the GDD and UI design.

The game's music was created using Suno AI, while the sound effects come from CC0-licensed assets by Kenney.nl.

Challenges

The biggest challenge was puzzle generation. I needed to build a system capable of generating puzzles that not only have a valid solution, but can also be solved entirely through logic while providing enough depth to remain intellectually stimulating.

To achieve this, I started with the fundamental rules of the game, expanded them to cover their different edge cases, and used them as the foundation for the puzzle generation and solving system. Each puzzle is then assigned a difficulty level based on the rules and solving techniques required to reach its solution.

Most of the work on the project has gone into precisely this part of the game, even though it is almost completely invisible to the player: making sure every board is solvable, interesting, and appropriately challenging.

Cross-platform development, on the other hand, turned out to be less complicated than I expected thanks to the strict separation between logic and UI, as well as the assistance of AI development tools. Kotlin Multiplatform has proven to be a very solid development environment. Personally, even for single-platform projects, I find the architecture it encourages valuable because it pushes you toward a clear separation of responsibilities.

I had worked with RevenueCat before, but this was my first project using its multiplatform SDK directly instead of relying on the Paywalls feature. This gave me greater control over how purchases are integrated into the game's own UI and systems.

What I learned

This was my first time developing a puzzle game and also the first time I created a complete Game Design Document (GDD) for a project.

My biggest takeaway was discovering that much of the difficulty in developing a puzzle game doesn't come from implementing its basic rules, but from generating content and properly balancing its difficulty.

The player never sees the generator, the solver, or the internal rules used to classify a board. They simply see a puzzle that needs to feel fair, interesting, and appropriately challenging. Making that happen consistently has probably been the most important part of the entire development process.

I also learned that a well-structured cross-platform architecture doesn't have to mean sacrificing a native experience. Sharing the systems and logic that genuinely belong in a common layer while keeping the UI platform-specific has proven to be a particularly effective combination for this project.

Built With

Share this project:

Updates

Submission history