Solitaire Dark
The ad-supported edition of our Classic Solitaire. The same Unity code and server, a black table by default, banner and rewarded ads through LevelPlay, and a Premium subscription that turns them off.


2
apps, Classic and Dark, from one codebase
2
ad formats: banner and rewarded video
20
languages, shared with Classic
0
ads for Premium subscribers
- Product
- Our own game
- Stores
- Google Play, App Store
- Platforms
- Android and iOS
- Model
- Free with ads; Premium removes them
- Our part
- Game, server, ads and releases
The brief.
Context
Solitaire Dark is the second app built from the Classic Solitaire repository. It opens on a black table, shows ads from the start and sells Premium to remove them. Everything else is shared: the shop, daily challenge, leaderboards, online duels, player accounts and the server behind them.
Challenge
Classic is for players who would rather pay than watch ads, so its ads stay off until the player asks for them. Some players want the opposite: a free game paid for by ads. A second app for them had to cost almost nothing to keep up, so a fork that drifts away from Classic was ruled out.
Approach
Dark is a build variant, not a fork. One build flag picks the default theme, switches ads on by default, and points the app at its own store listings and ad placements. The ads code itself is the same LevelPlay service Classic uses, so a feature built once ships in both apps.
A black table you can restyle.
Dark starts on its own black theme with gold accents. The rest of the shop is the same as in Classic: themes, backgrounds, card backs, court-card characters, suits and win celebrations, each tried on a real deal before buying. Items sit on shelves, and a shelf opens once something on the one below is bought.




Klondike, Spider and a daily deal.
Klondike comes with Draw 1, Draw 3, Vegas scoring and Time Attack. Spider is a game mode sold in the shop. The daily challenge gives everyone the same deal each day and puts a medal in a monthly calendar for each win.
- Medals pay 100, 200 and 300 coins at 10, 20 and a full month.
- Premium players can open past days of the month.



A duel against a real player.
Online Duel matches two players on the same deal for five minutes. The server relays every move, so the opponent's foundations, moves and score sit above your own piles. It settles the result and pays coins for the win, for taking part and for each card placed.




Reasons to come back tomorrow.
A daily bonus grows from 10 to 150 coins over six days in a row. Leaderboards rank coins, wins, score, time, moves, medals and streaks, with the player's own panel pinned at the bottom. The profile keeps statistics and everything collected, and one account carries them across devices.



Ads pay for the free game.
Dark runs LevelPlay mediation with two formats: a banner and a rewarded video for coins. Ads are on by default here, while Classic keeps the same service switched off until the player opts in. Placements and timings come from Remote Config, per platform and per app.
Banner
A standard banner in portrait, kept clear of the safe area and hidden in landscape.
Rewarded video
Coins for a finished video, offered in the coins menu.
Consent first
Google UMP consent runs before any ad request; declined consent means non-personalised ads.
Not on day one
Ads start after a number of sessions set in Remote Config.
Premium
A Premium subscription removes ads in Dark.
Own placements
Dark has its own app keys and placements, so its revenue reads apart from Classic.
A table for the season.
Seasonal collections arrive from the admin, with no app update. For Halloween, backgrounds, card backs and bonus effects carry a pumpkin badge in the shop, and some are for Premium only. Premium also doubles the daily bonus and opens Premium items in the shop.


One repository, two apps.
Classic and Dark come from the same repository and the same CI workflow. A release builds either app or both, runs the tests first and uploads each build to its own store listing.
Build flag
DARK_APP picks the default theme, the ads default and the store links.
Config
YAML build configs set the product name, package and Firebase project.
Tests
EditMode and PlayMode suites shared by both apps.
Android
A signed bundle for Google Play.
iOS
An Xcode build through Fastlane for the App Store.
What we built.
Our part
- Edition design: defaults, theme and ads per build flag
- LevelPlay banner and rewarded ads
- Consent flow before any ad request
- Shop, duels and leaderboards shared with Classic
- Store listings and CI releases for both apps
Stack
- Game
- Unity 6
- C#
- Addressables
- Server
- NestJS
- TypeScript
- Firestore
- Firebase Realtime Database
- Ads and payments
- LevelPlay
- Google UMP
- RevenueCat
- Unity IAP
- Live ops
- FireCMS
- Firebase Remote Config
- Google Analytics 4
- Release
- GitHub Actions
- Fastlane
- Google Play
- App Store
Want a second app without a second codebase?
Let's build it together.
We split editions with build flags and remote config, so each one keeps its own store, model and look while features ship once.



