Inspiration

I wanted to build a puzzle game around a single, honest mechanic instead of a pile of shallow ones. Most timing games have you tap where something already is. Pulse Gate flips that: a pointer rotates continuously around a central core, and tapping locks in an anchor angle at that instant. A pulse then expands outward as a ring of light, and it only clears a gate if the gate is open, at the right angle, at the exact moment the pulse arrives. You're not reacting to where something is — you're committing to where it will be. That one primitive turned out to be deep enough to carry 200 levels.

What it does

Pulse Gate: Echo Shift is a native iOS puzzle game, one tap per move, no swipes, no combos. 200 hand-tuned levels across 20 chapters escalate from simple single-ring taps to multi-ring, shifting, blinking, and polarity-inverting gate combinations, plus an Endless mode with a Game Center leaderboard. The first 10 levels and Endless are free; a single $0.99 non-consumable unlocks the rest — no subscription, no ads, no in-game currency, no tracking.

How we built it

Fully native: Swift, SpriteKit for the game scene, SwiftUI for menus/settings/results, GameKit for leaderboards and achievements. No third-party game engine. Collision is resolved mathematically (angular distance against gate position at arrival time), not through a physics engine. Monetization runs on the RevenueCat Purchases SDK in Full Mode — Shipaton requires the purchase to go through RevenueCat rather than raw StoreKit, so PurchaseService reads the full_unlock entitlement off RevenueCat's customerInfoStream instead of talking to StoreKit's transaction stream directly. Every level is JSON, validated offline by a Python solver script that simulates each level across a time horizon and confirms at least one valid anchor angle exists.

First commit: July 6. App + In-App Purchase submitted to Apple review: August 6. 135 commits, solo.

Challenges we ran into

Three are worth naming because none of them were obvious from the symptom:

A silently wrong validator. The solver script compared level direction against 'counterClockwise' (camelCase); the level JSON and the game's own RingConfig used 'counterclockwise'. Every counter-clockwise ring was quietly simulated as clockwise for an entire balancing pass — the checker never failed, it just checked the wrong game. Once fixed, 20 of 60 levels turned out to be genuinely unsolvable and 26 more were off the intended difficulty curve. All 46 got rebalanced.

A visual desync that looked like a logic bug. A device tester reported the pulse "never makes it through the first ring" on certain levels. The engine's collision math was correct the whole time — the rendered pulse radius was accumulating per-frame dt, and any frame over 33ms (audio start, shader compile, thermal throttling — all real on-device, never in the Simulator) let the visible wave drift behind the logic clock. Fix: derive the radius directly from the scene clock (radius = (sceneTime - tapTime) * pulseSpeed) instead of integrating frame deltas, so rendering can't drift from the arrival-time math no matter how many frames get dropped.

Points vs. pixels. A 1024×1024px launch icon, dropped into only the imageset's 1x slot, rendered at 1024×1024 points — several times wider than any iPhone screen — because iOS reads an unscaled single-slot image's pixel dimensions as points.

Accomplishments that we're proud of

200/200 levels solver-verified after the balancing fix. The whole app — SwiftUI, SpriteKit, RevenueCat, GameKit, minimal Sentry crash reporting — has zero third-party game engine and a from-scratch collision system. App + IAP + 8 Game Center achievements submitted together to Apple review inside 31 days, solo.

What we learned

A validator that always returns green isn't evidence the thing it validates is correct — it's only evidence the validator ran. And when building any Apple image asset with only one scale slot filled, you're sizing in points, not pixels, no matter how big the source file looks in Preview.

What's next for Pulse Gate: Echo Shift

Ship, watch real player data on the difficulty curve past chapter 10, and keep the freemium model exactly as simple as it is today — one unlock, one price, forever.

Built With

Share this project:

Updates

Submission history