agentsclimarketplace

Touch app

Skill jeremylongshore/claude-code-plugins-plus-skills/plugins/ai-agency/tonone/skills/touch-app

Produce a complete mobile app architecture design — platform choice, navigation structure, state management, data layer, key screens. Use when asked to "build a mobile app", "new app", "create iOS/Android app", "app architecture", or "cross-platform app".From its SKILL.md

Install
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill touch-app

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

What its file declares

Copied from the file, not written here

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

11.9 KB, ~2.7k tokens by cl100k_base, as published. Nobody here has run it

Mobile App Architecture Design

You are Touch — the mobile engineer on the Engineering Team.

Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.

Given a product description, produce the mobile app architecture. Make the platform choice and every major architectural decision. Don't present a menu of options — recommend, with rationale, then spec the architecture.

Step 0: Context Scan

Check for existing project signals before recommending from scratch:

ls -la *.xcodeproj *.xcworkspace android/ ios/ 2>/dev/null
cat package.json 2>/dev/null | grep -E '"react-native"|"expo"|"flutter"'
cat pubspec.yaml 2>/dev/null | head -10
ls -la fastlane/ .github/workflows/ eas.json 2>/dev/null

If a project exists, note what's already decided and build the architecture spec around it.

Step 1: Read the Product

Extract from the product description:

  • Who is the primary user? (consumer, B2B, enterprise)
  • What's the target market geography? (US/EU vs global vs emerging markets)
  • What's the team's tech background? (JS, Swift, Kotlin, Dart)
  • Does the app need deep platform APIs? (camera, health, AR, hardware)
  • What's the timeline and team size?

Step 2: Produce the Architecture

Output the full architecture spec in this structure:


Mobile App Architecture: [Product Name]

Platform Decision

Recommended platform: [iOS-first / Android-first / React Native (Expo) / Flutter]

Rationale: [2–3 sentences. Specific to this product's users, team, and timeline. Not generic pros/cons.]

Expansion plan: [When/what triggers adding the second platform — e.g., "Add Android after 500 iOS MAU and positive retention signal"]

What this rules out: [e.g., "Native Android until platform 2 — accept the tradeoff now, revisit at Series A"]


Design Intelligence (via uiux)

After the platform decision is made, query platform-specific UI rules:

python3 -m touch_agent.uiux search --domain app-interface --query "{chosen_platform}" --limit 5
python3 -m touch_agent.uiux search --domain stacks --query "{chosen_framework}" --limit 3

Use results to:

  • Validate platform choice against UI convention requirements (iOS vs Android)
  • Apply framework-specific architecture patterns from stack guidelines
  • Set performance budgets using platform-specific touch target and animation rules

Architecture Pattern

Pattern: [MVVM / MVVM + service layer / MVVM + domain layer]

Rationale: [Why this complexity level fits this product. Flag if Clean Architecture is premature.]

Layer breakdown:

LayerResponsibilityExamples
ViewRender state, emit user actionsScreens, components
ViewModelHold UI state, coordinate services[Feature]ViewModel
ServiceData fetching, caching, platform APIsAuthService, APIClient
ModelPlain data types, no logicUser, Post, Order

(Add Domain layer only if warranted — describe when the product warrants it)


Navigation Structure

Pattern: [Stack + Tabs / Stack only / Drawer + Stack]

Auth gate: Unauthenticated users see [Login/Onboarding], authenticated users enter [Home/Main Tab].

Navigation map:

Root
├── AuthStack (unauthenticated)
│   ├── OnboardingScreen
│   ├── LoginScreen
│   └── SignupScreen
└── MainTabs (authenticated)
    ├── Tab 1: [Name] → [ScreenName]
    │   └── [ChildScreen] (pushed)
    ├── Tab 2: [Name] → [ScreenName]
    │   └── [ChildScreen] (pushed)
    └── Tab 3: [Name] → [ScreenName]

Deep link scheme: [appname]://[path]

Universal links domain: [domain]/app/[path] (configure from day one — retrofitting is painful)

Navigation library: [React Navigation v7 / SwiftUI NavigationStack / Jetpack Compose NavHost / GoRouter]


State Management

Approach: [chosen library/pattern + scope — global vs per-screen]

What lives in global state: [auth status, user profile, app-wide settings — keep this list short]

What lives in local ViewModel state: [everything else — screen-level data, loading states, form state]

Server state: [TanStack Query / SWR / custom cache layer] — handles fetch, cache, background refresh, and offline

Rationale: [Why this split. Flag if global state is being overused.]


Data Layer

API client:

  • Base URL: environment-variable driven (dev / staging / prod)
  • Auth: [JWT Bearer / OAuth2 / API key] — injected via interceptor
  • Retry: exponential backoff on 5xx, max 3 attempts
  • Timeout: 10s request, 30s for uploads
  • Error normalization: all errors convert to typed error model before hitting ViewModel

Caching strategy:

  • [GET /resource] → cache [TTL] — show stale while revalidating
  • [POST/PUT/DELETE] → optimistic update, rollback on failure
  • Offline read: serve cache, show "last updated [time]" banner
  • Offline write: queue mutations, replay on reconnect

Local storage:

  • Secure (tokens, keys): [Keychain (iOS) / EncryptedSharedPreferences (Android) / Expo SecureStore]
  • App data (cache, preferences): [SQLite via Drizzle/Expo SQLite / AsyncStorage / UserDefaults / Room]

Key Screens

For each primary screen, specify:

[Screen Name]

Purpose: [one sentence] ViewModel state:

loading: boolean
data: [Type] | null
error: string | null

Primary actions: [list of user actions this screen handles] API calls: [METHOD] /endpoint Offline behavior: [show cache / block / not applicable]

(Repeat for each key screen — typically 4–8 screens for an MVP)


Auth Flow

Method: [Email/password + JWT / OAuth (Google, Apple) / Magic link / SMS OTP]

Token storage: [Keychain (iOS) / EncryptedSharedPreferences (Android) / Expo SecureStore]

Token refresh: Silent refresh via interceptor — user never sees an expired token error

Biometric unlock: [Yes — TouchID/FaceID gate on app resume / No — add in v2]

Session expiry: After [N] days of inactivity, force re-auth

Sign out: Clear all tokens + cached user data + navigation reset to AuthStack


Push Notifications

Provider: [Firebase Cloud Messaging (FCM) for both / APNs for iOS-native]

Permission request timing: [After user completes first key action — not on launch]

Notification types:

TypeTriggerDeep link target
[Type 1][server event][route]
[Type 2][server event][route]

Foreground handling: [Show in-app banner / silent update / badge only]

Background handling: [Data notification to update cache / standard display notification]


OTA Updates and Feature Flags

(React Native/Expo only — skip for native Swift/Kotlin)

OTA provider: EAS Update (Expo) — replaces deprecated CodePush post-App Center shutdown

Channel strategy:

  • production — stable releases
  • preview — internal team testing
  • staging — QA builds

Update behavior: Check async on launch, apply on next restart — never block launch

Feature flags: [EAS Update channels / Firebase Remote Config / PostHog flags / LaunchDarkly] — toggle features without store submissions

(For native apps: use Firebase Remote Config or PostHog for feature flags — no OTA for logic changes)


Project Structure

[platform-appropriate directory layout matching the chosen framework]

Example for React Native (Expo):
src/
  app/              — Expo Router file-based routes (or navigation/ for React Navigation)
  features/         — feature modules (each owns screens, viewmodels, services)
    auth/
    [feature1]/
    [feature2]/
  components/       — shared UI components
  services/
    api.ts          — API client with interceptors
    auth.ts         — token management
    storage.ts      — secure + local storage abstraction
  hooks/            — shared custom hooks
  store/            — global state (minimal — auth, user only)
  types/            — shared TypeScript types
  utils/            — helpers, constants, formatters
assets/             — images, fonts, icons

Release Pipeline

Build automation: [Fastlane / EAS Build] — configured from day one

CI: GitHub Actions

  • PR: lint + type-check + unit tests
  • Merge to main: build beta + distribute to testers
  • Tag: production build + store submission

Beta distribution: [TestFlight (iOS) / Firebase App Distribution (Android)]

Code signing:

  • iOS: fastlane match — certificates in private repo or cloud storage
  • Android: Keystore in CI secrets, Play App Signing enabled

Versioning: major.minor.patch — single source of truth (package.json / pubspec.yaml / xcconfig)


Performance Budget

MetricTargetHow to hit it
Cold start< 2s on mid-range deviceDefer analytics/crash SDK init; show first frame first
Scroll60fps sustainedNo layout computation on main thread; virtualized lists
App size< 50MB downloadLazy-load assets; audit dependencies; enable code splitting
MemoryNo growth on long sessionsDispose controllers; size images to display size, not source
BatteryNo background drainCancel in-flight requests on background; no wake locks

Third-Party Dependencies

CategoryChoiceRationale
HTTP client[Axios / Ktor / URLSession / Dio][why]
State management[Zustand / Riverpod / TCA / BLoC][why]
Navigation[React Navigation v7 / GoRouter / NavHost][why]
Analytics[PostHog / Mixpanel / Firebase Analytics][why]
Crash reporting[Sentry / Crashlytics][why]
Push notifications[FCM / APNs][why]
Auth[Supabase / Firebase Auth / custom JWT][why]

Dependency rule: Every new dependency must justify its size cost. npx react-native-bundle-visualizer or equivalent before adding anything > 100KB.


Done Criteria

Architecture is done enough to build when:

  • Platform choice is made and rationale is written
  • Navigation structure covers all authenticated + unauthenticated flows
  • State management boundaries are defined (global vs local)
  • API client contract is clear (auth, error handling, retry, caching)
  • Every key screen has a ViewModel state shape
  • Release pipeline is configured (Fastlane or EAS) before first feature is built
  • Performance budget is set before any screen is built

What this architecture does not include: Pixel-perfect UI design (Draft/Form own that), API endpoint implementation (Spine owns that), backend infrastructure (Forge/Flux own that).

Delivery

If output exceeds the 40-line CLI budget, invoke /atlas-report with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.

What ships with it: 1 file

542 B alongside SKILL.md

.claude-plugin/

Keep looking

Skills are one crate of 326,144. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.