mvvm-architecture

star 597

Plan, review, and develop desktop and mobile app features following our MVVM architectural pattern. Applies to all new .ts and .tsx files within /apps/ledger-live-desktop or /apps/ledger-live-mobile

LedgerHQ By LedgerHQ schedule Updated 5/15/2026

name: mvvm-architecture description: Plan, review, and develop desktop and mobile app features following our MVVM architectural pattern. Applies to all new .ts and .tsx files within /apps/ledger-live-desktop or /apps/ledger-live-mobile

MVVM Architecture

The new standard for desktop and mobile apps

  • New code for ledger-live-desktop and ledger-live-mobile must go into src/mvvm/
  • Eventually no feature code within these apps will live outside of src/mvvm
  • New features, screens, components, hooks, and utilities belong in src/mvvm/
  • Code changes with src/mvvm must conform to these mvvm patterns
  • Code reviews enforce strict adherence

Folder Structure

src/mvvm/
├── features/
│   └── FeatureName/
│       ├── __integrations__/    ← mandatory integration tests
│       ├── components/          ← reusable UI across screens
│       ├── screens/             ← individual screen folders
│       ├── hooks/               ← feature-specific hooks
│       └── utils/               ← feature-scoped utilities
├── components/                  ← global shared UI
├── hooks/
└── utils/

Feature Folder Responsibilities

  • components/ gathers reusable UI elements across multiple screens.
  • screens/ contains individual screen folders and their private building blocks.
  • hooks/ contains feature-specific reusable hooks.
  • utils/ contains feature-scoped utilities.

Nesting Guidelines

  • Place elements inside the closest folder matching their reuse scope.
  • Screen-specific building blocks stay inside the screen folder.
  • Feature-level components belong to FeatureName/components/.
  • Global shared UI belongs to src/mvvm/components/.

Component & File Patterns

  • Each component in its own folder with index.tsx as entry.
  • ViewModel hooks always named use<ComponentName>ViewModel.ts.
  • Support files alongside: types.ts, styles.ts.
  • Use List / Detail naming for multi-view workflows.
  • Utilities stay in utils/, separate from component folders.

ViewModel Pattern

Components needing external logic use Container → ViewModel → View:

  • The ViewModel produces data and handlers.
  • The View receives everything via props — no direct hook calls to external systems.

Violation checklist — flag if any index.tsx View under screens/ or components/ within src/mvvm/:

  • Imports useSelector or useDispatch from react-redux
  • Imports useNavigation or useRoute from @react-navigation/*
  • Calls any RTK Query hook (useGet*Query, use*Mutation)
  • Has no corresponding use<Name>ViewModel.ts in the same directory
❌ screens/UserProfileScreen/
     index.tsx   ← imports useSelector, useNavigation directly

✅ screens/UserProfileScreen/
     index.tsx                         ← props only
     useUserProfileScreenViewModel.ts  ← useSelector, useNavigation, RTK Query

Import Rules

  • Keep relative imports shallow (within one directory level).
  • Use TypeScript path aliases for broader access.
  • Never import index.tsx explicitly — use folder alias exports.

Data Fetching

Use RTK Query (dada-client and cal-client are reference implementations). See rtk-query-api skill.

Design System

New UI in src/mvvm/ must use Lumen:

Testing

Every new feature under src/mvvm/ must have an integration test in __integrations__/ — create a minimal test when the folder is first added. See testing skill.

Install via CLI
npx skills add https://github.com/LedgerHQ/ledger-live --skill mvvm-architecture
Repository Details
star Stars 597
call_split Forks 474
navigation Branch main
article Path SKILL.md
More from Creator