Eight complete puzzle games. One Flutter codebase. No backend.
PuzzlePack is a production-ready Flutter game bundle: jigsaw, sudoku, nonogram, word search, sliding tile, memory match, 2048 and minesweeper — all in one codebase, building for Android and iOS from the same source, running fully offline with no server and no recurring cost.
The games are not the product. The progression layer is. One coin wallet is spendable in every mode, so coins earned in 2048 buy a nonogram hint. A daily challenge produces the same puzzle for every player on every device, forever, with no server. Streaks, 30 achievements, cross-mode stats and one theme system sit on top of all eight games. That is what separates this from eight games in a folder — and it is why players come back tomorrow.
Try it before you buy
- Download the demo APK: PuzzlePack demo build — installs on any Android 7.0+ device
- ️ Screenshots: see the preview images above — every one is a real screen, not a mockup
No login, no signup, no demo account. PuzzlePack is a fully offline single-player app — there is no server, no user account and no credentials to hand out. Install the APK and play. The demo build ships with the “used app” seed enabled, so you land on a live 12-day streak, 47 solved puzzles and a month of daily-challenge history rather than an empty install.
There is deliberately no browser demo. Photo import needs durable file storage a browser cannot provide, so the project targets Android and iOS only — and an unhosted web build in the zip would be a liability, not an asset. The APK is the try-before-you-buy.
The eight games
- ️ Jigsaw — bezier tab/blank piece geometry, 12 to 192 pieces, drag with pointer-offset correction, connected pieces merge into a rigid group. Peek-at-original, edge-pieces-first filter, and custom photo import from gallery or camera with crop, so the content never runs out.
- Sudoku — randomised backtracking fills a valid grid, then clues are removed one at a time with a solution-counting solver rejecting any removal that breaks uniqueness. Every puzzle has exactly one solution, and a test proves it across 1,000 seeds. Pencil marks, conflict highlighting, mistake limit, justified hints.
- ⬛ Nonogram (Picross) — generated at a target fill density, then verified solvable by a line-by-line constraint propagator and regenerated on failure, so no puzzle ever requires guessing. 5×5 to 20×20, auto-cross, clue dimming.
- Word search — eight-direction placement with backtracking on collision. Filler letters are weighted to English letter frequency so the grid does not look obviously random. 20 themed lists as editable JSON. Drag-to-select with directional snapping.
- Sliding tile — 15-puzzle mechanics at 3×3, 4×4 and 5×5. Every shuffle is checked for solvability by inversion-count parity plus the blank-row rule, so an impossible board can never be dealt. Numbered or image tiles, coin-priced undo.
- Memory match — 4×3 to 6×6, four icon sets, flip animation, mismatch delay tuned per difficulty, peek-all hint, move and time scoring.
- 2️⃣ 2048 — 4×4 and a 5×5 variant, swipe input, tile-spawn animation, single-step undo, best-score tracking, continue-after-2048, proper no-moves-left detection.
- Minesweeper — first-click-safe generation places mines after the opening tap, excluding it and its neighbours. Beginner, intermediate, expert and custom. Flood-fill reveal, chording, a flag-mode toggle for accessibility, pinch-zoom for wide boards.
The shared progression layer
- One coin wallet — a single balance across all eight modes. Earn from completions, the daily challenge, streak milestones, achievements and rewarded ads; spend on hints, undo, an extra sudoku life and theme unlocks. Every number lives in one config file.
- Daily challenge — a calendar date maps to a deterministic seed, so the same date yields the same puzzle for every player on every device, forever, with no server. The mode rotates by day of week and the seed function is unbounded — it never runs out of content.
- Streaks — consecutive days with a completed daily, with one automatic grace day per calendar month shown as “streak saved”.
- Stats — per mode: plays, completions, completion rate, best and average time by difficulty, total moves. Global: puzzles solved, play time, favourite mode, lifetime coins. Rendered with fl_chart sparklines.
- ️ 30 achievements across four families — per-mode mastery, cross-mode, streak and economy — with progress bars on partial ones and a coin grant on unlock.
- Theme system — light, dark and system, six accent palettes (three free, three coin-unlocked) and eight per-mode inks, so every game is identifiable at a glance in a screenshot.
Monetisation, already wired
- AdMob — banner, interstitial, rewarded and app-open, shipped on Google’s official test units so ads work the moment you run it. Swap the IDs in one config file plus the two native manifests and you are earning.
- Placement that respects the player — banners never appear during gameplay, interstitials fire only after the completion sheet is dismissed and never after a daily challenge, and banner slots reserve their height so a late-loading ad never shifts a board.
- Frequency caps — 3 completions and 120 seconds between interstitials, 4 hours between app-open ads. All tunable.
- UMP consent SDK integrated for GDPR. Most competing bundles omit this, and it is a real cause of store rejection.
- Remove-ads in-app purchase as a non-consumable through StoreKit and Play Billing, with the restore control Apple requires already implemented.
⚙️ Built to be modified
You bought source code, so the source is what got the attention.
- One-file rebrand. Five files in
lib/config/ hold every tunable value — app name, bundle id, palettes, coin economy, ad IDs, mode toggles. No screen or call site holds a price, a colour or an ad unit. - Ship fewer than eight games. Flip a mode to
false in modes_config.dart and it leaves the home grid, its route redirects home, and the daily rotation skips it. No dead links, no crash — and there is a test for it, including the case where every mode is disabled. Perfect for a white-label client build. - Extract a single game. No game mode imports another game mode — cross-mode traffic goes through
lib/core/services/. One feature folder lifts out into its own app. This is enforced by test/architecture_test.dart, not by discipline. - Every generator is pure Dart with zero Flutter imports, so the solvers are unit-testable without a widget harness. Also enforced by a test.
- No game engine. No Flame, no second framework. Every board is plain widgets and
CustomPainter. If you can read Flutter, you can read this. - Icon and splash regenerate from one PNG. The generation pipeline ships, not just its output.
️ Tech stack
- Flutter 3.x — Android and iOS from one codebase
- Riverpod (code generation) for state
- GoRouter for routing, with deep-linkable modes
- freezed + json_serializable for immutable models
- Hive CE for persistence — offline, survives app kill, no native setup
- CustomPainter for every board — no engine dependency
- google_mobile_ads + in_app_purchase for monetisation
- fl_chart for the stats sparklines
- Optional Firebase leaderboard — off by default, and not even a dependency until you turn it on
What you get
- Full Dart source — 149 files, all eight modes plus the shared layer, no obfuscation
- Configured Android and iOS projects — archive-ready, with R8, resource shrinking and a real signing config
- 696 tests in 48 files, including generator verification across 1,000 seeds per mode
- 40 original jigsaw images at three resolutions
- 20 themed word lists as editable JSON
- 8 original sound effects
- 30 achievements with a rule evaluator that scores them from real stats
- Branding pipeline — icon and splash from one source image
- Demo seed behind a single build flag, for your store screenshots
- Firebase leaderboard appendix — copy-paste implementation with security rules
- HTML documentation — a full guide plus a quick-start page, including a beginner “Getting started” walkthrough that assumes no Flutter experience and diagrams of how the shared progression layer and the coin wallet connect the eight modes
- 6 months of item support
No licensed third-party content. The artwork, the sound effects and the app icon are original and included — nothing requires attribution, and there is no content you have to re-license before you ship.
Setup in three commands
flutter pub get flutter run
That is genuinely all of it. No backend to provision, no .env file, no API key, no third-party account is required to build and run. The generated *.g.dart and *.freezed.dart files ship with the source, so the project builds straight from the unzipped folder without running a code generator first.
To see the progression layer immediately rather than starting empty:
flutter run --dart-define=DEMO_MODE=true
⚠️ Third-party services — please read before buying
PuzzlePack itself needs no account, no server and no API key. All eight games, the wallet, the daily challenge, streaks, stats and achievements run fully offline on the device. You can build it and play it without signing up for anything.
AdMob and Firebase are external services operated by Google, and they are not part of this item. If you choose to use them, each requires your own Google account and brings its own setup, terms, policies and potential costs, all set by Google and outside our control:
- Google AdMob (only if you want to earn from ads) — your own AdMob account, subject to the AdMob and Google Publisher policies. Google controls app approval, the payment threshold, verification and tax steps, and can limit or suspend accounts for policy breaches such as invalid traffic. Until you set this up, the app runs on Google’s public test ad units, which show placeholder ads and earn nothing.
- Firebase / Cloud Firestore (only for the optional online leaderboard) — your own Firebase project. Firestore is metered: it bills for reads, writes, stored data and network egress beyond its free quota, so this feature can cost you money every month as your player count grows, and passing the free quota requires a billing account. This is why the leaderboard ships switched off and is not even a dependency.
- Google Play and the App Store (only if you publish) — paid developer accounts billed by Google and Apple at their published rates, their own review processes, and their billing systems and commission for in-app purchases.
None of these is required to build, run or modify the item, and you can ship with none of them: set enableAds = false and leave the leaderboard off, and no third-party integration remains. Pricing, quotas and policies belong to Google and Apple and change over time — check their current documentation rather than any figure quoted in an item description. Item support covers this codebase; it does not cover your Google, Apple or Firebase accounts.
✅ Requirements
- Flutter 3.38.1 or newer (stable) — developed and tested against 3.44.8
- Dart 3.10 or newer (ships with Flutter) — the
pubspec.yaml constraint is >=3.10.0 <4.0.0, which is the oldest SDK the AdMob, IAP, GoRouter, share and fonts packages resolve on - Android SDK with compileSdk 36 — minSdk 24 (Android 7.0), targetSdk 36
- JDK 17 — bundled with recent Android Studio
- Xcode 15 or newer for iOS builds — deployment target 17.0, macOS only
- An AdMob account only if you want to earn — the app runs on test units without one
Honest limitations
Stated up front so you know before you buy, not after.
- English only. The localisation scaffolding is wired and working —
flutter gen-l10n runs and the delegates are registered — but v1 ships English, with UI copy inline in the widgets. Adding a language means copying one .arb file and moving strings out as you go. There is no RTL pass. - Portrait only. Boards scale responsively to tablets, but there is no landscape layout and no bespoke tablet UI.
- Android and iOS only. No web or desktop target — photo import needs durable file storage a browser cannot provide.
- The leaderboard is an appendix, not a toggle. It is deliberately off, and off means
firebase_core and cloud_firestore are not dependencies at all — buyers who want zero configuration never carry the weight. Enabling it is a documented copy-paste step. - Sliding tile has coin-priced undo, not a solve-one-tile hint. A real hint needs a full layered solver; heuristic approaches solved none of a 30-board sample, so undo shipped instead — the same pattern as 2048.
- Expert minesweeper pans and pinch-zooms, without a minimap. 30 columns on a phone falls below the 40dp touch target floor, so the board renders at a usable size and pans.
- Some verification needs your hardware. Purchase restore against a live store account, iOS archiving with a real signing team, and sustained-framerate profiling all depend on accounts and devices that belong to you. The logic underneath each is covered by tests; the device leg is yours to run.
️ Roadmap
- Additional languages, starting with Spanish, Portuguese and Arabic (with RTL)
- Landscape and tablet-specific layouts
- A minimap for the expert minesweeper board
- Additional accent palettes and jigsaw image packs
Roadmap items are intentions, not commitments — buy the item for what it does today.
Support
Your purchase includes 6 months of item support per the CodeCanyon standard: bugs in the item, questions about the documentation, and help getting the project building.
Please include your Flutter version, your platform, and the full error output — it is the difference between a same-day answer and a week of back and forth.
Support covers the item. It does not include your AdMob, Play Console, App Store Connect or Firebase accounts, hosting, or custom feature development — we will walk you through the setup, but the accounts have to be yours.
Licensing
Sold under Envato’s standard licences. A Regular License covers one end product that is free for end users; an Extended License covers one end product that charges end users. Ads and a remove-ads in-app purchase in a free app fall under the Regular License — if you sell the app itself for money, take the Extended.
Changelog
Version 1.0.0 — 7 August 2026
- Initial release
- Eight puzzle games: jigsaw, sudoku, nonogram, word search, sliding tile, memory match, 2048, minesweeper
- Shared progression layer — one wallet, daily challenge, streaks, 30 achievements, cross-mode stats
- AdMob with UMP consent, and a remove-ads in-app purchase with restore
- Custom photo jigsaw import with crop, and a My Puzzles library
- Optional Firebase leaderboard as a copy-paste appendix
- 696 tests and zero
flutter analyze issues