The pack · 08 / 14 →
Shepherd, the Watchdog Mobile dog
Mobile

Shepherd

the mobile dog. Android, iOS, Flutter and React Native: storage, pinning, deep links, WebViews and bridges.

claude · acme-appwatching
storage.dart
12Future<void> saveSession(String token) async {
13 final prefs = await SharedPreferences.getInstance();
14 await prefs.setString("token", token); await secure.write(key: "token", value: token);
15}
16 
HighToken in plain storage

ExploitAny backup or rooted phone exposes the session

FixSmallest change suggested

Shepherd is watching
$ /watchdog-go-mobile-app
0 found · 0 fixed
What it does

On duty while you build.

The mobile dog. A deep dive on Android, iOS, Flutter and React Native apps: storage, pinning, deep links, WebViews and native bridges.

The always-on lens watches Android, iOS, Flutter, React Native, AndroidManifest, Info.plist, WebView, deep links, mobile storage.

What it checks

7 things Shepherd looks for.

01

Local storage

tokens or PII in SharedPreferences/UserDefaults/AsyncStorage/Hive instead of Keystore/Keychain.

02

Transport

cleartext allowed, no certificate pinning on sensitive calls, debug trust anchors.

03

Deep links and intents

exported activities, unvalidated deep-link params reaching auth or WebViews, intent redirection.

04

WebViews

JavaScript bridges exposed to remote content, file access enabled, loading untrusted URLs.

05

Secrets in the binary

API keys, Firebase config with open rules, hardcoded endpoints.

06

Platform hardening

debuggable builds, backups allowed, no root/jailbreak or tamper response where the app needs it.

07

Cross-platform bridges

Flutter platform channels / RN native modules trusting JS/Dart input.

Commands

Send Shepherd out.

Runs these scanners when installed, then reads the code they can't understand:

  • mobsfscan
  • apktool
  • jadx
  • semgrep
  • frida

Android/iOS/Flutter/React Native: pinning, storage, deep links, WebViews, bridges

  • /watchdog-go-mobile
  • /watchdog-go-marketplace
  • /watchdog-go-all

Also runs in these bundles.

Benchmark

Tested, not promised.

Its test target holds a Flutter payments app (Dart, Kotlin bridge, AndroidManifest, Info.plist): 18 planted issues, 3 decoys and an answer key.

found
Haiku 5.518/18
Sonnet 5.518/18
Opus 5.518/18
Rules of engagement

What Shepherd will never do.

  1. 1

    Static review by default. Dynamic tooling only on builds the user owns and has put in written scope.

  2. 2

    Never print a secret's value — not keys, tokens or passwords, even weak defaults. Give file:line and the secret type only.

  3. 3

    End each review with: what you did not check, and the top risk the user must act on.

FAQ

Shepherd, answered.

What does Shepherd check for?

Shepherd is Watchdog's mobile dog for Claude Code. It looks for Local storage, Transport, Deep links and intents, WebViews, Secrets in the binary, Platform hardening and Cross-platform bridges. Each finding comes with the exact file and line, how it could be abused, and the smallest fix.

How do I run Shepherd in Claude Code?

Install Watchdog with /plugin marketplace add watchdoglab/watchdog and /plugin install watchdog@watchdog, then run /watchdog-go-mobile-app. Its lens also stays on while you code and flags risky lines as they're written.

Which tools does Shepherd use?

When they're installed, Shepherd runs mobsfscan, apktool, jadx, semgrep and frida, then reads the code those scanners can't understand. Anything it couldn't check is listed under Not checked in the report.

Is Shepherd safe to run on my project?

Yes. Its first rule: Static review by default. Dynamic tooling only on builds the user owns and has put in written scope. Secrets it finds are reported by location and type only, never printed. Watchdog is free and open source (MIT).

Shepherd comes with the pack.