Inspiration
Anyone who has spent August on the Italian coast knows the real sport there. It isn't swimming. It's the sunbed. Towels go down at dawn, people sprint when the gate opens, and a good spot in the shade is worth more than lunch.
I wanted a game that captures that little war. Short, funny, a bit mean, and fair.
What it does
Bagno Aurora, Liguria, nine in the morning. Forty sunbeds. Sixty people. The gates open in three seconds.
You sprint, shove and plant your towel. Lying on a bed you own earns Relax, which is your score. How much depends on the moment: shade, sea view, noisy neighbours, the tide, and the quality of the bed.
The beach never stands still:
- The sun moves. Your perfect shady spot turns into a frying pan.
- The tide comes in. The front row slowly drowns.
- The crowd has opinions. Sixty holidaymakers with their own personalities want your bed too.
The best bed right now is rarely the best bed in ninety seconds. Knowing when to move is the game.
A match is three rounds in about three minutes. Nobody gets hurt: rivals lose their cool, not their lives. Knock someone off a lettino and it's yours. Get pushed into the sea and you start over.
Modes
- Spiaggia del Dì (Daily Beach): one run a day on the same beach as everyone else. Same seed, same crowd, same tide. Your score goes on a Game Center leaderboard.
- Giornata: unlimited practice on a fresh beach every time. Not ranked, on purpose.
- La Scuola: a short hands-on tutorial.
The results screen shows your score broken down factor by factor. Tap a rival's name and you see their afternoon, so you learn exactly how Klaus beat you.
Three languages (Italian, English, German), 3 leaderboards and 33 achievements.
How we make money
The rule from day one: no pay-to-win. A leaderboard where money buys speed or better beds is worthless. So money buys looks and convenience, never power.
| Product | Type | What it does |
|---|---|---|
| Gettoni ×3 packs | Consumable | Beach tokens for towels, sunglasses, swimwear, parasol colours |
| Basta Pubblicità | Non-consumable | Removes ads forever |
| Tutto Incluso | Non-consumable | Every cosmetic and no ads |
| Tessera | Monthly subscription | Unlimited Daily Beach attempts, no ads, Gettoni every day |
Gettoni are also earned by playing. The one non-cosmetic thing they buy is an extra Daily Beach attempt, and its price doubles with every extra you buy that day (150, 300, 600, 1200…). It's the same beach and the same three minutes, so it can't buy a better score, and the doubling stops anyone grinding the board with tokens.
Free players see exactly one ad after a finished match, never during play, plus an optional rewarded video for a second daily attempt.
RevenueCat runs the purchases. The shop's rows and prices come from RevenueCat Offerings, so I can reorder, reprice and A/B test packages from the dashboard without shipping a build. Entitlements are the single source of truth for Tessera and Tutto Incluso, and that same check switches every ad off.
The game itself is structurally unable to see money. The simulation code doesn't reference the store, the wallet or entitlements at all, so "no pay-to-win" is enforced by the compiler, not by a promise.
How I built it
Swift 6 and SpriteKit, iOS 17+, portrait, one thumb.
- Every pixel and every sound is generated from code. Python tools draw all the art (3,600+ sprite frames) and synthesise the music and sound effects. There are no hand-drawn or third-party assets. The app icon is composited from the game's own sprites.
- Art rules are enforced by linters. Five-step colour ramps, one light source, no anti-aliasing. A palette and texture linter fails the build if a sprite breaks the rules. A written style guide didn't stop a magenta shadow shipping. A linter did.
- A deterministic simulation. Fixed 120 Hz timestep, seeded random streams per character, no hash-ordered iteration. That's what makes a fair shared daily seed possible.
- Crowd AI with pathing, personalities, utility scoring and a "drama director" that keeps the beach interesting.
- A headless fun gate. A script plays hundreds of seeds without rendering and checks the numbers that make a match feel good. If a change makes the game duller, the gate fails.
Challenges
- App Review. The first submission was rejected with two findings. One looked like an iPad bug. It was really the smallest iPhone screen, where the UI didn't fit. The other said the in-app purchases weren't submitted. They were ready, but they had never been attached to the review. Both fixed, and now automated.
- Performance. Unoptimised debug builds ran the simulation 18× slower and the game was unplayable. I measure every frame with a built-in profiler before changing anything.
- German is long. Every panel is measured against the longest translation, and a script checks that every string fits and that every character exists in the bitmap font.
What I learned
Rules that live in code survive. Rules that live in a document don't. Art direction, fairness and localisation all held up because a build fails when they break.
What's next
- Friend challenges on the Daily Beach seed
- Lockstep multiplayer (the deterministic sim is already built for it)
- More beaches, and new cosmetics every season
Built With
- game-center
- google-admob
- ios
- pixel-art
- procedural-generation
- python
- revenuecat
- sprite-kit
- storekit
- string-catalogs
- swift
- xcode
- xcode-cloud
- xcodegen
Log in or sign up for Devpost to join the conversation.