There should be one VIPER module per cohesive portion of the app that makes sense to have strong internal cohesion with relatively little adhesion between VIPER modules (e.g., service interfaces to each other). Telecom software architecture has for decades had such separate modules/subsystems that would each be its own VIPER module (if not broken down a internally into just a few VIPER modules, but let's skip that); it is called FCAPS: https://en.wikipedia.org/wiki/FCAPS which shows the drastically different purposes of a large software system broken down into distinct modules of:
- Fault isolation via dependency directed acyclic graph to drive inferences of which anomalous symptoms indicate what is wrong
- Configuration-settings of how the system is configured properly (rejecting prohibited configuration-settings) by it various tunable parameters
- Accounting-billing of how the operation of the system commences, assures continuity of, and retires billable events for revenue generation
- Performance of how the operation of the system can forecast trends approaching systemic duress or individual component failure (e.g., a member of a pool of resources)
- Security of how unauthorized or unauthenticated or unfunded usage of the system is prohibited
This isn't the only conceivable way of demarcating the most-macroscopic VIPER modules, but it is a well-thought-out demarcation of modules/subsystems that eventually nearly every large software system/app needs that is orthogonal as management duties to whatever the main purpose of the system/app is, which of course would be its own 1 or more VIPER modules, one for each major broad technical achievement topic of the system/app—whatever the most-macroscopic collection of use-cases are (e.g., creation of new stuff as 1 VIPER module, retention of a retrievable archive of a history of old stuff as another VIPER module, deleting cruft out of the archive as another VIPER module, and so forth, of which each of these might have quite a few use-cases under those broad umbrellas).