Case Study 03 · Rails mobile · Coding agents

From a separate Flutter codebase to two Hotwire Native betas.

Over six months, Claude Code and Cursor wrote the Swift, Kotlin, and test code for two mobile applications. I designed the context, architecture, tasks, and validation loop that made that work usable.

Discuss your Rails mobile architecture →Ruby on Rails · Hotwire Native · Swift · Kotlin · Claude Code · Cursor
Abstract bridge connecting a Rails web product with iOS and Android clients

The client already had a mature Rails product and a separate Flutter application. The goal was not to reproduce every screen in another isolated client. It was to test a web-first mobile architecture in which Rails could continue to carry product behavior while iOS and Android supplied native navigation and selected device capabilities.

Confidentiality note: the client and product are anonymized. The architecture, working process, and delivered beta scope come from a real engagement; identifying details and private materials have been removed.

2 beta apps

iOS and Android built as separate native clients

1 expert

Context, architecture, validation, and delivery ownership

6 months

From product reconstruction to beta handoff

A separate mobile implementation creates a second product path

A cross-platform client can be the right choice, but in this product it meant that behavior already present in Rails had to be understood and reproduced in a separate application. Authentication paths, navigation rules, and product changes gained another implementation surface.

The migration explored a different boundary: keep web-suitable product behavior close to Rails and add native code only where the mobile experience required it.

Why Hotwire Native fit a Rails product

Hotwire Native renders server-provided HTML inside a native shell and turns link navigation into platform-native screen transitions. Bridge Components connect Stimulus controllers in Rails with Swift or Kotlin counterparts.

This made the migration incremental: a screen could remain web-first, gain native controls through a bridge, or become fully native when fidelity or a device API required it.

One product, explicit web-to-native boundaries
01

Product layer

Rails views, product behavior, and Stimulus controllers

02

Shared contract

Bridge events and data exchanged with native counterparts

03

Swift · iOS

Native navigation, device integrations, and platform behavior

04

Kotlin · Android

Native navigation, device integrations, and platform behavior

The agents wrote the code; context made the code possible

Claude Code and Cursor inspected the existing Flutter behavior, implemented the Swift and Kotlin clients, and wrote tests. I supplied the product model they needed: the old application, Rails behavior, client-provided Figma references, technical constraints, bounded tasks, and acceptance criteria.

I then built each version, tested it, compared the interface with Figma, and fed concrete findings into the next iteration. The useful unit was not a prompt. It was a controlled loop from evidence to implementation to validation.

The agentic delivery loop
  1. 01 · Reconstruct

    Read the Flutter app, Rails behavior, and approved Figma screens.

  2. 02 · Context

    Turn findings into durable product knowledge and constraints.

  3. 03 · Scope

    Define a bounded task and explicit acceptance criteria.

  4. 04 · Implement

    Claude Code and Cursor write application code and tests.

  5. 05 · Validate

    Build, run, compare, and test on the target platform.

  6. 06 · Iterate

    Return observed failures and product feedback to the next cycle.

From onboarding to authentication, navigation, and notifications

The applications grew in vertical slices covering the complete path from first launch and authentication to daily navigation, notifications, and selected native interactions. The work had to preserve the product behavior users already knew while moving responsibility toward the Rails application where that boundary made sense.

The Rails team supplied the web side of the Bridge Components while I directed and validated their native counterparts on iOS and Android. This collaboration kept product decisions close to Rails without reducing the mobile clients to generic web containers.

Building while the ecosystem was still moving

The engagement took place while Hotwire Native and its Bridge Component ecosystem were evolving quickly. That increased the value of small experiments, source-level research, explicit contracts between the web and native sides, and direct verification on both platforms.

Framework examples were a starting point, not proof that a product-specific integration worked.

Generated code was accepted only after it worked

Both applications included automated tests, and I personally built and exercised the flows on iOS and Android. Visual behavior was compared with client-provided Figma screens, while members of the client team also tested product flows.

Authentication, navigation, session, WebView, and notification paths were iterated from observed behavior. Agent output remained an implementation candidate until builds, tests, design comparison, and product feedback supported it.

Two credible betas, without rewriting the ending

Both native clients reached beta. The iOS application was distributed through TestFlight, went through substantial testing, and was close to release readiness; Android remained in beta.

The decision to publish belonged to the client, and no final reason for not releasing either application was communicated. The result claimed here is the delivered mobile capability and repeatable delivery method, not a production launch.

What a Rails CTO can reuse

01

Context before code

Give agents product behavior, constraints, examples, and acceptance criteria before implementation.

02

Narrow bridge contracts

Keep the Rails-to-native boundary explicit and small enough to test on both platforms.

03

Validate on devices

Treat generated code as provisional until it builds and behaves correctly in its real environment.

04

Compare against evidence

Use existing behavior and approved designs as acceptance inputs, not memory alone.

05

Preserve human ownership

Agents can write code and tests; architecture, acceptance, and delivery still need an owner.

Agentic delivery

Want coding agents to deliver working software instead of isolated code?

I help teams build the context, task boundaries, validation loops, and ownership model required for dependable agentic development.

Explore CAAO

Chief AI Agents Officer

Let us start withone process.

Briefly describe what currently takes time or blocks the work. I will tell you whether there is a strong entry point for an AI agent and suggest the next step.

No tool pitch and no obligation. Your details are used only to respond to this request.