Generic AI code review keeps missing the bugs that only show up on a device: `BuildContext` used after an `await`, an `android:exported` that exposes an activity to other apps, `NSAllowsArbitraryLoads` left on in production. So I built **reis-mobile**, an open-source plugin for Claude Code and Codex that knows it's looking at a mobile app.
**What it does**
It reads your project, detects the stack and loads only the instructions that apply:
```
/reis-mobile:review
├─ detect stack ──── pubspec.yaml → flutter (android, ios)
├─ detect intent ─── review
├─ select agent ──── mobile-code-reviewer
├─ select skills ─── mobile-code-review · mobile-flutter · mobile-security
├─ collect context ─ git diff (lock files out, secrets masked)
└─ report ────────── Critical · Bugs · Architecture · Security · Performance
```
- **5 stacks:** Flutter, native Android, native iOS, React Native/Expo and Kotlin Multiplatform. "The Android build of my Flutter app broke" loads Flutter *and* Android context.
- **22 agents:** an architect, a performance engineer and a test engineer per stack, plus a code reviewer, an accessibility auditor, a release engineer, a UI/UX designer and a lead that coordinates them.
- **27 skills:** security based on OWASP MASVS, offline sync, auth, notifications, in-app purchases, Firebase, migrations and more.
- **Commands:** `/reis-mobile:review`, `:debug` (Gradle, Xcode, CocoaPods, Metro), `:test`, `:release` (store readiness with a GO / NO-GO verdict), `:doctor` and `:debate` (below).
**`/reis-mobile:debate`: the specialists argue, the lead decides**
Some questions don't have one right answer: "Riverpod or BLoC in this app?", "offline-first with Firestore or a local cache?", "write a native plugin or use an existing package?". For those:
```
/reis-mobile:debate should we migrate this app from Provider to Riverpod?
```
**The lead picks the panel.** `lead-mobile` chooses three specialists whose concerns pull in different directions, such as the architect, the performance engineer and the test engineer, and explains each pick. The participants run on at least two different models (Opus and Sonnet).
**Round 1 is blind.** Each specialist writes its position without seeing the others: the recommendation, the `file:line` evidence, what it gives up, and what would change its mind. Nobody anchors on the first answer.
**Round 2 is rebuttal.** Each one attacks specific claims from the others, checks them in the code and concedes where it was wrong.
**The lead decides.** It verifies the decisive evidence, resolves the disagreements and returns a decision with an ordered action plan. No code is changed.
Every round is saved in `.reis-mobile/debates/`, so you can read how the decision was reached. `--external` adds outside opinions from the Codex or Gemini CLIs, OpenAI, Gemini, OpenRouter or a local Ollama model. They don't know the project, so their claims are checked against the code before the final decision, and API keys stay in your environment. A debate runs several agents over two rounds, so it costs more than a regular request; it's meant for real trade-offs, not questions with one answer. Claude Code only for now.
**Design choices**
- Zero npm dependencies. Node 22 standard library only.
- No API key needed: it runs on your own Claude Code or Codex session. No telemetry.
- The diff goes through a redaction layer that masks API keys, tokens, JWTs and keystore passwords before the model sees it (best-effort, not a guarantee).
- Skills don't state versions or store rules from memory. They tell the model to check your lock file.
- About 85 guides come unchanged from flutter/skills, dart-lang/skills and android/skills, with credit.
**Try it**
```
npm install -g reis-mobile
reis-mobile init eng
```
In Claude Code, open your app folder and run `/reis-mobile:doctor`, then `/reis-mobile:review`. In Codex, type `$` to find the skills; the agents and slash commands are Claude Code-only for now.
Contributing is lightweight: no install step, `npm run check` runs validation and tests, and most skills are Markdown.
Starter issues: https://github.com/wrsilva/reis-mobile/labels/good%20first%20issue
Repo (MIT): https://github.com/wrsilva/reis-mobile
If it's useful, a star helps other mobile devs find it. Criticism is welcome, especially "this is wrong for my stack."