The Rebrand Day
AyaEscape becomes Geo Climber. Aya becomes Inge, named after a real Danish seismologist. Plus a marketing website shipped in a single day, and the ranked-mode UX decision I'm still not sure about.
By the middle of the second week, the game had been called "AyaEscape" for two straight weeks. The name came from the satirical viral concept I talked about in post 1, a deliberately provocative parody hook that was funny in the car but had nothing to do with the game I actually wanted to ship.
This post is about the day I killed the old name. Thirteen commits across iOS, web, and backend. A rebrand, a marketing website, a Discord server, a ranked/unranked leaderboard split, and a character I named after a real Danish seismologist.
Accumulating feedback
The reason for the rebrand matters more than the mechanics.
The first week of the project was all about "can this work at all." Can I get a C++ game running on a Mac? Can I port it to iOS? Can I replace the engine with Swift + Metal at 60fps? Can I put it on TestFlight? Can I build a backend? By the end of week two, those questions were all answered yes. The infrastructure was solid. The game was playable. TestFlight was shipping to a small group of friends and family.
Which raised a different question: is this the game I actually want to be building?
The satirical viral concept was funny as a car brainstorm. It was less funny once I was imagining the actual trajectory: shipping to the App Store, showing it to people I don't know, answering "what's your game about" at social events, getting reviewed by gaming journalists. The concept didn't scale beyond the inside joke. It was meant to provoke, and provocation-as-a-brand is a tough business model for a family-friendly arcade game made by one guy with a TestFlight of ten friends.
Separately, the gameplay that was actually emerging from day-to-day work pointed somewhere completely different. The geological zones concept had started taking shape: a climb from the center of the Earth to the summit of Everest, through progressively higher layers: Inner Core, Outer Core, Lower Mantle, Upper Mantle, Magma Chambers, Deep Crust Caves, Ocean Floor, Deep Ocean, Shallow Ocean, Surface Lowlands, Mountain Range, Death Zone. That's a lot more interesting than the satirical framing ever was. It's also educational. Each zone is a real layer of the Earth with real physical properties, and the visual identity writes itself.
So the shift I made on day 13 wasn't a minor pivot. It was a 180-degree turn. From controversial and fringe to educational and family-friendly. From a satirical concept aimed at a narrow Twitter audience to a premise that could work for players of any age and background. The old name had to die for the new direction to live.
Or coins the name
I told Or about the geological zones concept. Or is the friend from the original car conversation, one of the people whose sanity checks and casual ideas I trust enough to run stuff by.
I described the climb-from-core-to-summit concept to him. He thought for a moment and said "Geo Climber."
I loved it immediately. I didn't test alternatives. I didn't workshop variants. I didn't bikeshed. "Geo Climber" was instantly right. Short, clear, descriptive, no trademark collisions, works in English and most other languages, no weird pronunciation gotchas. I rolled with it on the first go.
Small lesson: when a name lands immediately and someone you trust suggests it, commit. Don't workshop variants for three sessions. "Or said X, I said yes, let's move." Names that take twelve rounds of revision usually don't become better. They just become more expensive.
Inge Lehmann
The character's name was Aya. Obviously that was coming from the old satirical concept and wouldn't survive the rebrand. I needed a new name for the climbing character.
I wanted the name to mean something. A random placeholder like "Alex" or "Sam" would have been fine, but if the game was going to be about real geological layers, the character should feel connected to that. I asked Claude to suggest names of historical figures connected to the science of Earth's interior.
Claude came back with a list of geophysicists and seismologists. Most I'd never heard of. Most were names that would be hard to remember or pronounce. One stood out: Inge Lehmann.
Inge Lehmann was a Danish seismologist who, in 1936, discovered that the Earth's inner core is solid. Before her work, the inner core was thought to be a molten extension of the outer core. Lehmann proved, through careful analysis of earthquake wave patterns at different depths, that there was a sharp discontinuity deep inside the Earth where the material behavior changed from liquid to solid. That discontinuity is now called the Lehmann discontinuity, and every geology textbook references it.
Naming a character Inge, in a game about climbing from the center of the Earth through all the real layers, is not a random choice. It's a small gift to any player who happens to know the history. It's also a design constraint that keeps me honest: if I name the protagonist after a real scientist, I shouldn't cut corners on the scientific accuracy of the zones. (I still cut corners on scientific accuracy because I'm making an arcade game, not a documentary. But the bar is higher than it would have been for a purely fictional character.)
Inge Lehmann is cool. If you've never heard of her, take five minutes to read her Wikipedia page. She did the work that's now the basis of a character you might play in my game. That feels right.

The commit that touched everything
PR #24, merged at 23:50 on day 13:
Rebrand AyaTower to Geo Climber (AYA-113) — 94 files
Ninety-four files. Every single reference to "AyaEscape," "Aya," or the old satirical identity. All replaced. iOS project files. Marketing copy. Backend API route names. Config files. Asset filenames. Git repo settings. Everything.
A rebrand is a good stress test for a codebase because it forces you to touch every layer. If a rebrand is painful, your codebase has hidden couplings. If a rebrand is a single PR that lands cleanly, your codebase is well-factored. PR #24 was a single PR that landed cleanly, and that tells me the architecture decisions from days one through twelve were holding up.
(One small exception: the Linear project itself. I left the Linear project name as-is for a day because Linear's URL structure embeds the project name, and changing it would have broken every external link to existing issues. I cleaned that up later in the week. Small thing, worth mentioning as honest detail.)
Ten more PRs in the same day
PR #24 was the rebrand itself. It wasn't the only thing I shipped on day 13. I pushed twelve more commits across the stack:
- PR #18: marketing website. Full public landing page, email signup, responsive design, deployed to Cloud Run alongside the API. Built in Next.js. Shipped in one commit. Claude spits out Next.js one-pagers like it's nothing. If you need a landing page, you can have one running in production in an afternoon.
- PR #19: GCP hardening. Dedicated service account, VPC private networking, monitoring. This is the second-pass pattern I mentioned in the last post. The first-pass deployment had security gaps. Fixing them was a separate, deliberate pass. Not "come back later" as an intention. "Come back later" as an actual calendar event.
- PR #20: switch iOS API URL to
api.geoclimber.app. The client was hitting localhost or a staging URL; now it hits the real domain. Small commit, huge feeling. - PR #21: ranked/unranked mode split plus server-backed leaderboards. More on this below.
- PR #23: floating joystick replaces fixed joystick. Much better touch ergonomics. Players can start the joystick anywhere on the screen and it follows their finger instead of having to find a fixed circle.
- Discord server setup. Created the server, set up the initial channels, added the discord-poster agent that can post to announcements from
/ship. I did not overthink the channel structure. It felt correct, I moved on. - Onboarding email gets a TestFlight link and a Discord invite.
- Version bump to
0.0.2(build 28). Staying under 0.1.0 per the rule from post 5. No version inflation.
Thirteen commits across iOS, web, and backend. Ten of them were non-trivial. The velocity came from the architecture being stable and Claude Code being well-integrated into the workflow. Six days earlier, thirteen commits in a day would have been exhausting. On day 13 it felt sustainable.
Ranked mode: a UX decision I'm still not sure about
PR #21 introduced the ranked/unranked mode split and server-backed leaderboards. This is the first real UX decision the project made that still isn't fully resolved today.
The problem: the game has three difficulty modes (easy, normal, hard) that dramatically change platform sizes, camera speed, and player speed. They're not cosmetic. They're genuinely different games. A "high score" in easy mode isn't comparable to a high score in hard mode. The camera is slower, the platforms are bigger, the player moves faster relative to the challenge. Easy-mode runs look incredible on a leaderboard if you compare them naively to hard-mode runs, but they're also much cheaper to achieve.
Two options:
- Three separate leaderboards, one per difficulty. Fair comparisons within each difficulty. But the listing becomes fragmented: three "global best" panels on the home screen, confusion about which one to feature, UI real estate used up on variants of the same thing.
- Single leaderboard in "ranked mode." Ranked mode uses a fixed difficulty (normal). Unranked mode lets the player pick whatever difficulty they want. Scores from unranked runs don't count for the leaderboard. You opt into "ranked" when you want your run to count globally.
I picked option 2. It's cleaner UI, lower cognitive load, and matches the mental model of competitive game modes in other games (ranked vs casual).
But I'm not sure it's the right choice. To this day, some players get confused by the distinction. "Why didn't my score count?" "Wait, I was in the wrong mode?" The opt-in gate adds friction, and every point of friction loses some fraction of the potential engagement.
I might revisit this later. Maybe the right answer is three leaderboards after all. Maybe it's a single leaderboard with difficulty multipliers applied to scores (easy runs get a 0.5× multiplier, hard runs get a 1.3× multiplier). Maybe it's ranked mode but with a much clearer first-run explainer. I don't know yet.
It's okay to ship decisions like that when you're building a game from scratch. Not every UX decision has to be final on day 1. The POC of the server needed leaderboards to justify its existence (otherwise why did I build a backend in week two), so "ship ranked mode now, revisit when we have data" was the right call even though it wasn't the final answer.
This pattern, ship a good-enough v1 and commit to revisiting once there's feedback, is how solo projects survive. If you wait for the perfect design, you never ship. If you ship without knowing it's imperfect, you get stuck with your early decision. Ship, know it's imperfect, revisit. That's the loop.
This is post 8 of 18 in a series about building Geo Climber with Claude Code. The game has a new name and a character named after a real seismologist. Join the Discord and download Geo Climber on the App Store.