Inspiration

The team wanted to make the kind of game they would have loved carrying around as kids: a tiny living ocean that feels playful immediately but keeps revealing new creatures, caves, and decisions the deeper you swim.

The idea began with Nate, a worm at the end of a fishing line. He is supposed to be bait, but the player gives him a chance to explore instead. That simple reversal became the heart of the game. Every dive asks how far the player is willing to push into a dangerous ocean before protecting what they found.

What it does

Nate the Bait is a portrait-first native iOS arcade game. Players steer Nate through a continuously streamed pixel ocean, weave through caves, catch fish, collect pearls and hidden treasure, and decide whether to keep diving or secure the run.

The Ocean Dex contains 96 authored species with distinct silhouettes, palettes, depth ranges, movement, and catch behavior. Crabs crawl along cave surfaces. Treasure chests and pearls reward exploration. Sonar Pop, Bubble Shield, and Pearl Rush create different tactical options. Daily Expeditions, a seven-day reward chest, customization, four Game Center leaderboards, and twenty achievements give each return visit a clear purpose without ads or in-app purchases.

The main game works offline. Progress, collections, rewards, loadouts, and pending Game Center submissions are persisted locally.

How we built it

Nate the Bait was built using Swift 6. SwiftUI owns navigation, accessibility, the HUD, the Ocean Dex, rewards, the shop, and results. SpriteKit runs the fixed-step ocean simulation, streamed terrain, fish, cave collision, tether, currents, and pooled effects. GameKit provides optional leaderboards and achievements. Inferno and Vortex support bounded shader and particle presentation.

The world is deterministic by seed. Terrain generation, cave presentation, collision, encounter lanes, and minimap data share stable identities so streamed regions can be reproduced and tested. Fish assets are compiled into texture atlases, thumbnails, exact alpha masks, and a versioned manifest before launch. Fixed actor and node pools keep gameplay predictable as the ocean becomes denser.

How we used Codex and GPT-5.6

Nate the Bait was built through a close team collaboration with Codex powered by GPT-5.6. The team shaped the product direction, visual identity, device testing, and final acceptance decisions. Codex helped translate feedback into implementation plans and deterministic tests, write and refactor Swift, inspect screenshots, trace performance, audit release metadata, and support build and TestFlight verification workflows.

The most useful part of the collaboration was the feedback loop. The team could play a build on an iPhone, identify exactly what felt wrong, and turn that observation into a measurable contract. Cave contacts became escape-time tests. Empty water became fish-density tests. Surface glitches became continuity tests. Restart failures became a fifty-cycle Drop Again soak. Visual changes were constrained so they could not silently alter collision geometry or gameplay-frame allocation budgets.

AI output was never treated as automatically correct. The team verified each claim against the code, test results, simulator behavior, or TestFlight, and made the final product decisions together.

Challenges

The hardest problem was keeping a generated ocean expressive without making it unreliable. Concave cave contacts could trap Nate, terrain generations could swap while actors were moving, and decorative detail could accidentally reduce playable clearance. The team separated collision from presentation, added persistent safe-water recovery, and locked cave geometry behind deterministic route and signature tests.

Streaming fish introduced a different problem. A technically populated pool could still look empty, clustered, or stuck at a region boundary. The final system keeps a bounded catchable population, preserves stable spawn identity across streaming, and validates visible density without reintroducing background-only fish.

The water surface was also deceptively difficult. Camera motion, world depth, sky composition, terrain streaming, and the fishing tether all had to cross zero depth without a snap or blank row. Unifying them behind one authoritative surface state made ascending and descending use the same continuous motion.

Accomplishments

  • A deterministic, continuously streamed native pixel ocean
  • 96 authored and catchable species with a persistent Ocean Dex
  • Cave-crawling crabs, hidden chests, pearls, powers, daily rewards, and expeditions
  • Four Game Center leaderboards and twenty achievements with offline recovery
  • Accessibility support for VoiceOver, Reduce Motion, increased contrast, transparency, and Dynamic Type
  • Build 29 delivered to TestFlight Internal QA
  • 1,040 core, unit, and integration tests across 87 suites, plus 40 UI tests, in the Build 29 release gate

What we learned

The team learned that polish is a systems problem. A cave can look beautiful and still ruin the game if its collision is unfair. More fish can make the ocean feel less alive if they spawn as a pile. A smooth animation can still feel broken if it is driven by a different clock than the simulation.

The team also learned how valuable AI collaboration becomes when feedback is concrete. GPT-5.6 was strongest when it received real screenshots, device behavior, performance gates, and a clear visual opinion. The work improved fastest when taste, code, and verification stayed in the same loop.

What's next

The next step is a focused physical-device pass on the external TestFlight build, followed by continued work on biome identity, fish personality, and long-session balance. The team wants every depth zone to feel recognizable at a glance while keeping the game fast, readable, and fair on the oldest supported iPhone.

Built With

Share this project:

Updates