Academy projects

Insert coin · iOS game

BomBocLat

Pass the bomb. Don’t hold it.

A pixel-art take on hot potato for iPhone. Two players, one ticking bomb, and a timer nobody can see — built at the Apple Developer Academy to get a room full of strangers laughing together.

Play a round Shipped to TestFlight
My role
Front-end developer · UX
Context
Apple Developer Academy, 2025
Platform
iOS · TestFlight
Stack
SwiftUI · SpriteKit · SwiftData

01Why a game

A new cohort is a room full of strangers. We turned the awkward part into a game.

The problem

Social friction.

At the start of an Apple Developer Academy cohort, learners find it hard to break the ice, start real conversations, or get to know each other beyond polite professional introductions.

The idea

A digital icebreaker.

An offline, local multiplayer game you play face to face — handing the phone back and forth in a high-stakes duel. The shared tension of the ticking bomb, and the pixel explosion that follows, do the rest.

02Play it here

One bomb. Two nerves.

The same rules as the game: a hidden fuse, a pass button that needs a moment to recharge, and three hearts each. Play the CPU, or grab a friend and share the keyboard.

Adrian
Round 1
Angel · CPU
Adrian, as a pixel character
Angel, as a pixel character

Press start

BomBocLat

A to pass · Space to start

A Adrian passesL Angel passes (2P)Space startSprites from the real game

03The manual

Simple rules. Sweaty palms.

01

The hidden fuse

Every round, the timer lands somewhere between 10 and 15 seconds — and nobody ever knows exactly when it will go off.

02

No spamming

A cooldown on the Pass button stops anyone mashing it. Passing becomes a question of timing and nerve.

03

1P or 2P

Practise against the CPU, or play the real thing: two people, one phone, face to face.

04

A cast you know

Custom pixel avatars of Academy members, the ArcadeClassic font, and animated GIF reactions for every close call.

04Under the hood

A state machine in a pixel coat.

Game logic lives in one view model — who holds the bomb, whose button is cooling down, who just lost a heart — so SwiftUI and SpriteKit only ever draw what it decides.

ready→ holding⇄ passed · cooldown→ exploded→ game over
ArchitectureMVVM — timers, health and turns kept apart from the UI.
Game logicGameLogicViewModel runs the state machine: ownership, cooldowns, win and loss.
InterfaceSwiftUI for navigation, onboarding and the HUD.
SceneSpriteKit (an SKScene inside SwiftUI via SpriteView) for the background and particles.
DataSwiftData and UserDefaults (TrophyManager) for wins and unlockable characters.
MediaAVFoundation for music and effects; animated GIFs through a WKWebView wrapper.
GameLogicViewModel.swift
@Observable
final class GameLogicViewModel {
    enum Phase { case ready, holding(Player), exploded(Player), over }

    private(set) var phase: Phase = .ready
    private(set) var hearts: [Player: Int] = [.one: 3, .two: 3]
    private var fuse: Task<Void, Never>?
    private var coolingDown: Set<Player> = []

    func startRound(holder: Player) {
        phase = .holding(holder)
        let seconds = Double.random(in: 10...15)   // never shown
        fuse = Task {
            try? await Task.sleep(for: .seconds(seconds))
            explode()
        }
    }

    func pass(from player: Player) {
        guard case .holding(player) = phase,
              !coolingDown.contains(player) else { return }
        phase = .holding(player.opponent)
        coolDown(player.opponent)   // no instant hand-backs
    }
}
Illustrative — the shape of the game loop, not the app’s source.

05The game

Four screens, one explosion.

Mode select with two pixel characters, Duos and Offline
Mode select
Character select showing Adrian as a pixel character
Character select
Gameplay: Angel holds the bomb at the bottom, Adrian waits upside down at the top, each with three hearts and a Pass button
The duel
The bomb explodes in a pixel mushroom cloud on Angel's side
Boom

06My role

What I built.

From the first idea to TestFlight — the concept, the flows, and the game’s main SwiftUI views.

  1. 01

    Idea & concept

    Co-developed the idea of a pixel-art social game, and championed using it as a tool against the Academy’s social isolation.

  2. 02

    UX & flows

    Designed the flow from onboarding to gameplay, with lo-fi wireframes to validate the navigation before anyone wrote code.

  3. 03

    The SwiftUI front end

    Built the main views — HomeView, GameView, CharacterSelectView — and reusable components like CircleButton, DynamicSquareButton and SeperatorView.

  4. 04

    Characters in motion

    Implemented the character carousel, and brought the pixel cast to life with animated GIFs wrapped in WKWebView.

  5. 05

    Shipping

    Managed the lifecycle from ideation to TestFlight deployment.

The BomBocLat team posing in front of a whiteboard at the Apple Developer Academy

07The team

Made by a cohort, for the next one.

A multicultural team at the Apple Developer Academy — and more than a few Academy faces ended up in the game, in pixel form.