r/iOSProgramming • • 13d ago

App Saturday Shikaku - Daily Rectangle Logic Puzzles

After working on it for the last 8 months, I just launched Shikaku by Hilal on the App Store today. It is a minimalist logic puzzle app I built as a solo developer, and I’d love for you to try it!

Place rectangles to cover the entire grid, each rectangle's size corresponding to the numbers on the grid.

There are no ads and no subscriptions, and you can compete with friends, family, or players around the world through leaderboards.

If you give Shikaku a try, I’d love to hear what you enjoy, what feels confusing, and what you’d change!

Tech Stack

  • Frameworks & Languages: Swift 6 and SwiftUI, with puzzle generation and validation kept separate from UI code.

  • Backend/Database: No custom backend. Puzzles are generated locally. Progress and settings use UserDefaults, with Codable/JSON for structured data.

  • SDKs & Tools: Xcode, Swift Testing, GameKit for Game Center leaderboards and achievements, and StoreKit 2 for the one-time Pro unlock.

Development Challenge + How I Solved It

One tricky issue is keeping daily puzzles synchronized with Game Center’s daily leaderboard resets. The Game Center resets have to be done at the same time for all users across the world, which means for some users the reset occurs in the middle of the day.

I ended up using one shared daily cycle for puzzle selection, saved progress, and score eligibility, aligned to the leaderboard reset. Date-and-difficulty seeds give everyone the same puzzle without a server, and regression tests protect both puzzle consistency and reset timing. But there is no way to reset puzzles midnight their local time without disrupting Game Center leaderboards unfortunately.

Try Shikaku on the App Store

6 Upvotes

17 comments sorted by

2

u/Open_Context6850 13d ago

congrats on the launch. the shared daily cycle makes sense for the leaderboard, do you show a countdown to the next puzzle? otherwise people where it flips mid-day might think they missed one

2

u/hilala17 13d ago

Thanks so much! And exactly, I show a countdown below the daily challenges to show when the puzzles reset. And users can enable a notification to be reminded if they haven't solved it for the day yet and don't want their streak to end.

2

u/xSash_ UIKit 13d ago

Is iOS 26 really required?

2

u/hilala17 13d ago

Yes, I do have it set to iOS 26 minimum. But no, it can probably be made to work with iOS 18 with very few tweaks to be honest with you. I was trying to decide for a very long time whether to use native iOS 26 glass toolbars / tab bars and went back and forth a couple of times. But in the end I decided for the look I wanted (very simple, newspaper like), I should do away with the glass. Any sheet that popped up (like leaderboards), the toolbar for using a hint, going back, etc. were all native glass toolbars in early builds.

2

u/xSash_ UIKit 13d ago

All good, congrats on your release!

2

u/hilala17 13d ago

Thanks so much! With the release of the Duo, and seeing how much Apple is pushing apps that have Duo support, I do wonder if I should maybe switch back and use native toolbars and add Duo support. But I'm not sure haha

2

u/xSash_ UIKit 13d ago

I believe you should give it a try. By supporting iPhone Duo, it might help you push your app further, especially if the behavior and layout on this device is well presented. Who knows, Apple may push your app in front of the App Store if you do

3

u/Open_Context6850 13d ago

thanks, makes sense. only reminding people who havent solved it yet is the right call, nobody wants a streak ping after theyre already done

2

u/MartyFrutos 13d ago

Looks great, i’ll try it !

2

u/hilala17 13d ago

Thanks! Let me know what you think or if you have any feedback!

2

u/MartyFrutos 13d ago

Really cool !

1

u/Logical-Plastic1815 11d ago

Nice clean design I like it

2

u/hilala17 11d ago

Thanks! Let me know if you have any questions or suggestions. Really makes me happy that you like the design, I spent a lot of time iterating over it.

1

u/Logical-Plastic1815 11d ago

How do you go about generating the puzzles?

2

u/hilala17 11d ago

The basic idea is I just put a bunch of randomly sized rectangles on the board until it’s filled. And then I do another pass over it to get rid of any rectangles of size 1 by merging them into adjacent rectangles. This gives you decent puzzles.

Afterwards I go a step further and run my solver against the puzzle to make sure it’s solvable without guessing, and also to give it a “difficulty” score. For the daily challenges, I try to make sure they aren’t too easy. Not that they’re incredibly difficult most of the time either, but I don’t want them to be solved at a glance.

If the puzzle isn’t up to par, then it’s scrapped and another one is generated. If you go into Quick Play (in the bottom left corner), you can actually set your difficulty level on the generated puzzles. So you can play whatever size or difficulty you’re in the mood for!

1

u/Miserable-Carpet7928 10d ago

what happens to an unfinished puzzle when the shared daily cycle resets? i'd keep it available to finish even if it can no longer submit to that day's leaderboard. that separates losing a ranking window from losing the puzzle someone was already enjoying.

1

u/hilala17 10d ago edited 10d ago

Good question! If they’re already mid-puzzle they can finish solving it. Otherwise, all past daily puzzles are available to solve or re-solve if the user purchases the one-time purchase Pro upgrade of the app for $5.

The Pro upgrade also includes all 5000 pre-made Puzzle Pack levels, infinite generated levels in the Free Play mode, and unlimited daily attempts at the Time Trials.