Skip to content
nicolas.perl

Mobile application · 2025

Bauernschnapsen

A Flutter adaptation of the Austrian four-player card game, designed around single-player matches with AI opponents and offline-first game state.

Role
Product design and development
Year
2025
Tools
Flutter, Dart, Drift, Supabase

Context

Bauernschnapsen, also known as Viererschnapsen, is a team-based Austrian trick-taking game played by four people with a 20-card deck. Each player receives five cards, and a team works towards 24 game points across a series of hands.

This project brings that strategic trick-taking fun straight to your device. The app was designed for single-player matches with AI opponents while retaining recognisable rules, calls and visual character.

The challenge

The difficulty was not simply displaying cards on a smaller screen. Bauernschnapsen combines team play, turn order, legal moves, scoring and special calls, creating a large number of state transitions that the interface and underlying logic both need to communicate clearly.

This being my first Flutter project, I also needed to learn the framework while building a reliable rules engine. I deliberately separated the game logic from the polished interface at the beginning so I could understand and test the rules before adding visual complexity. I designed and developed the project from its initial research and wireframes through the playable prototype. My work covered the game rules, state management, mobile interface, AI-controlled opponents, local persistence, remote synchronisation, login flow, sound and visual refinement.

01 — Research and wireframes

I began by documenting the gameplay and its variations, then comparing existing apps based on the two-player form of Schnapsen. This helped identify common interaction patterns and highlighted where a four-player, team-based version would require different information on screen.

The first hand-drawn wireframe established a landscape table with the player’s hand along the lower edge, partner and opponents arranged around the table, a central play area and persistent score information.

Hand-drawn landscape wireframe for the Bauernschnapsen game table

02 — Building the rules engine

I started development with a terminal-based version. That removed interface concerns and let me concentrate on turn progression, card rules, scoring, and the behaviour required for a complete round.

Once the normal game mode was working, I created an early Flutter interface guided by the wireframe. Two of the more involved areas were handling 20/40 pair calls and keeping the game state consistent as cards moved between each player’s hand, the table, and completed tricks.

Early Bauernschnapsen Flutter prototype with cards arranged around the table

03 — Offline-first persistence

The app used a local Drift database to preserve game state and player data when the device was offline. With a connection available, the same data could be synchronised to a remote Supabase database.

This local-first approach kept the core game playable without relying on network availability, while the login flow provided an entry point for remote player data.

Bauernschnapsen account login screen

04 — Refinement

Later iterations added a more distinctive visual treatment, music, and sound effects. The final prototype retained the compact landscape table while improving the card presentation and giving the app a character that felt appropriate to the traditional game.

Refined Bauernschnapsen table with an Austrian landscape backdrop

Final Bauernschnapsen mobile game shown across three devices

Outcome and lessons

The result was a playable Flutter prototype that brought together the normal game mode with AI opponents, local persistence, remote synchronisation, login, music and sound.

The project reinforced the value of separating rule-heavy domain logic from interface work. Beginning in the terminal made it easier to reason about gameplay before managing animation and presentation, while the local-first data model kept network availability from becoming a condition for play. A next iteration should validate the interface with players and add a German language option, before opting for an official release.