multi-app-structure
Skill1 starsChanged 9 days agoMITView on GitHub
Managing a portfolio of 20+ Android apps as a solo developer — repo strategy, shared code, keystore management, app tracker, and priority triage when policy changes arrive. Loaded when working across multiple apps.
In this repository5 other files it gives its agents.
- AGENTS.mdAGENTS.md
- gradle-best-practicesSkill
- keystore-conventionsSkill
- package-namingSkill
- release-workflowSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
17 rules. About 0 are common, 12 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈12
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 18
All apps in one repo under /apps/[appname]/
- Distinctive: line 29
Add as a dependency in each app
- Distinctive: line 33
Document which apps share the same version of the utility
- Distinctive: line 36
Keep shared module in a sibling directory
- Very specific: line 37
Use includeBuild("../shared-module") in settings.gradle.kts
- Distinctive: line 43
All keystores stored in the same secure, backed-up location outside any git repo
- Very specific: line 44
Use consistent password (from the DROIDFORGE_KEYSTORE_PASSWORD env var) for easier management
- Distinctive: line 45
All new apps enrolled in Play App Signing — Google holds the app signing key
- Distinctive: line 59
When Google announces a new requirement (e.g.
- Distinctive: line 61
Check Play Console for any policy warning banners across all apps
- Distinctive: line 63
Update high-revenue / high-install apps first
- Very specific: line 65
Use /droidforge:gradle-update to update SDK targets across apps
- Distinctive: line 69
Never release multiple apps on the same day — stagger by 24–48h to allow crash monitoring
- Distinctive: line 70
Keep a release queue: one app in review → next app being prepared
- Distinctive: line 71
Use staged rollout for all releases (start at 10–20%)
- Very specific: line 76
Every app needs a live privacy policy.
- Distinctive: line 81
Update policy pages when adding new permissions or SDK data collection changes
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Managing a Large Android App Portfolio as a Solo Developer
Repository strategy
Option A: One repo per app (recommended for public apps)
- Each app is its own GitHub repository
- Cleaner per-app CI/CD
- Easier to open-source individual apps
- Naming:
[GitHubUsername]/[AppName](PascalCase)
Option B: Monorepo (better for code sharing)
- All apps in one repo under
/apps/[appname]/ - Shared utilities in
/shared/module as a local library - Better for enforcing consistent dependencies across all apps
- Harder to open-source individual apps
Shared code strategy
For common utilities across apps (AdMob helper, in-app review wrapper, crash reporting, network client):
Option 1: Private GitHub Package (local Maven)
- Publish shared module as
.aarto GitHub Packages - Add as a dependency in each app
Option 2: Copy-paste for small utilities (acceptable for solo dev)
- Acceptable when the utility is < 200 lines and rarely changes
- Document which apps share the same version of the utility
Option 3: Local composite build
- Keep shared module in a sibling directory
- Use
includeBuild("../shared-module")insettings.gradle.kts - Best for active development — changes reflect immediately across apps
Keystore management
- One
.jksper app (alias = app name lowercase) - All keystores stored in the same secure, backed-up location outside any git repo
- Use consistent password (from the
DROIDFORGE_KEYSTORE_PASSWORDenv var) for easier management - All new apps enrolled in Play App Signing — Google holds the app signing key
App tracker (recommended spreadsheet columns)
| App Name | Package | versionCode | versionName | Last Release | Play Status | targetSdk | Notes |
Flag apps that:
- Have
targetSdkbelow Google's current minimum requirement - Have outstanding policy warnings in Play Console
- Haven't been updated in 12+ months (may receive policy emails)
Priority triage when a policy change or Android update arrives
When Google announces a new requirement (e.g. targetSdk deadline, new permission rules):
- Check Play Console for any policy warning banners across all apps
- Identify apps with the approaching deadline — check app tracker
- Update high-revenue / high-install apps first
- Batch-update utility / minor apps in a single session
- Use
/droidforge:gradle-updateto update SDK targets across apps
Release scheduling for 20+ apps
- Never release multiple apps on the same day — stagger by 24–48h to allow crash monitoring
- Keep a release queue: one app in review → next app being prepared
- Use staged rollout for all releases (start at 10–20%)
- Monitor ANR & crash rate in Play Console for 24–48h after each rollout increase
Privacy policy maintenance
Every app needs a live privacy policy. Pattern: {config.github_pages.privacy_policy_pattern}
For portfolio maintenance:
- Host all policies on GitHub Pages under one repository
- Each app gets its own policy page:
[appname]-privacy-policy/index.html - Update policy pages when adding new permissions or SDK data collection changes
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

