Release notes

Solar Puzzles 1.3.0: the black hole wakes up

July 31, 2026 · UpFlyDev engineering

solarpuzzlesreleaseengineering

Solar Puzzles 1.3.0 is now live on both stores — Android since July 20, iOS since July 30, the day after version 1.0 finally cleared App Review. Same features on both: every change below was written into the SwiftUI app and its Kotlin twin at the same time, and only the iOS release was waiting.

What's new

  • Cosmic Marbles: the black hole comes alive. As the marble chain reaches the last quarter of the track, a soft red vignette pulses at the edges of the screen, a glow ring lights up the hole's rim, and the swirl inside it winds up from a lazy drift to a frenzy.
  • A mercy brake. Inside that danger zone the chain sheds a quarter of its speed — a real last chance for a young astronaut, not a formality.
  • Planet Blocks: instant meteor burns. A meteor that completes a line now burns it immediately, with the full animation, scoring and cascade, instead of waiting for the next move. A lucky meteor can save a run.
  • Sound, music and vibration on the pause screen. All three mutes are one tap away without leaving the game, sharing the same settings as the Settings screen.
  • The screen stays awake while you play. A child can study the board without touching it; leaving a game restores normal auto-lock.
  • Plus: shots are throttled to one marble every 0.3 s so frantic tapping can't flood the board, and the Android app gained hand-drawn vector icons, iOS-style sliding screen transitions and right-sized decoding of the bundled NASA photos.
Cosmic Marbles in Solar Puzzles: a chain of planet marbles rolling along a track toward the black hole
Cosmic Marbles: the chain rolls toward the black hole at the end of the track.

Danger you can see, not difficulty you can't

The end of a Cosmic Marbles round is decided in the last quarter of the track, and until now the only signal was the chain visibly getting closer to the hole. Six-year-olds miss it. They're aiming at a colour match somewhere in the middle of the chain, and the round ends without them ever having felt it coming.

The tempting fix is to make the ending harder to reach. We did the opposite: make the danger legible, then make it slightly more survivable. Crossing into the last quarter shifts the whole screen into alert mode — the vignette and the rim glow both scale with how close the lead marble is, so the room gets redder as things get worse. The swirl inside the hole spins by the same measure, from about 5°/s while the chain is far away to roughly 400°/s at the brink. The hole itself never changes size: growing it would change the actual playfield, and the point is to communicate the stakes, not to move them.

The spin is integrated in the engine, per tick, rather than driven by a fixed animation — so the speed can change continuously without the swirl ever jumping, and the hole freezes with everything else when the game is paused. The mercy brake works the same way: 25% off the chain's speed, reaching full strength a third of the way into the danger zone, tunable as one number in the shared balance file. It's noticeable without feeling like the game went into slow motion.

The halo that inflated the black hole

The first iOS build of the alert had an odd bug: switching the glow on made the black hole visibly grow. Nothing in the code touched its radius.

It was a SwiftUI layout quirk. The hole is a ZStack of circles, and the new halo went in as another sibling in that stack. A ZStack proposes its own size to flexible children, and the halo — deliberately much larger than the hole, since it's a soft outer glow — became the child that decided that size. Every circle in the stack dutifully resized to match. The fix was to stop letting decoration participate in layout: the halo moved into a .background, which is sized by its owner instead of sizing it.

The general lesson, relearned: in SwiftUI, a sibling is a participant. If a view exists only to be looked at, put it in .background or .overlay so it can't vote on the layout.

Version numbers that had quietly lied

While preparing the release we opened the Settings screen and found it claiming version 1.0 on iOS and 1.0.6 on Android. Both were hand-typed strings, and both had stopped being updated months earlier — on Android at versionCode 16 the app was calling itself 1.0.6.

Nobody had complained, which is exactly why it's worth mentioning: a string that duplicates a fact the build system already knows will drift, and the only person who ever notices is a tester trying to work out which build is on the phone. Both platforms now read it from the bundle — CFBundleShortVersionString and BuildConfig.VERSION_NAME — and debug builds append the build number, so a test install is instantly distinguishable from a store one.

Emoji are not an icon set

The Android twin had been using emoji as glyphs — speaker, note and buzz for the audio toggles, a padlock, a tick and a star on the level-select cells. It's a quick way to get a shape on screen, and it's a trap: emoji are rendered by the device's font, so the icons changed shape, weight and alignment between vendors, and sat visibly off next to the same screen on iOS with its SF Symbols. In 1.3.0 all of them are hand-drawn vectors mirroring the iOS symbols. The same catching-up work gave Android the horizontal push transitions between the menu, the level selects and the games.

That's the standing cost of two native codebases, and we knew we were signing up for it: the games behave identically because the engines are ported line for line, but the chrome has to be brought level deliberately, screen by screen.

Two stores, one version number

A footnote on release management. Android shipped these features as 1.3.0 on July 20 while the iOS build was still sitting in App Review — not for the features, but because a first Kids-Category submission comes with a data questionnaire that took a round trip to answer. Approval landed on July 29.

At that point iOS could have gone out as 1.0.1. Instead it jumped straight from 1.0 to 1.3.0: the App Store allows skipping versions, and having one marketing version mean the same thing on both stores is worth more than a tidy per-platform history. Build numbers stay per-platform and keep counting on their own. From here on, a release is one version number in two places.

Get Solar Puzzles — free, works fully offline, no ads and nothing collected. On both stores.

Learn more about Solar Puzzles → Read the launch story →