Showcase
The removable Showcase tab and purchase-gated developer guides.
The Showcase tab is a removable demo catalog. It helps buyers inspect the starter's capabilities, but a shipping app can delete it and keep the core features.
What it provides
| Surface | Status | Implementation |
|---|---|---|
| Showcase tab | Removable demo | feature/showcase/ |
| Capability catalog | Removable demo | core/showcase/CapabilityCatalog.kt |
| Developer guides | Removable demo | feature/guide/ |
| Shell seams | Removable demo | Lines tagged removable leaf |
Dependency rule
The module rule from feature/showcase/README.md is:
Core may not name Showcase. Showcase may name core.In practice:
| Rule | Meaning |
|---|---|
core/ avoids Showcase imports | Core services, data, UI, and feature screens keep working after deletion |
core/showcase/ is part of the leaf | It holds catalog data and is deleted with the tab |
| Showcase launches existing screens | Todos, upload, refer, paywall, permissions, and account security keep their canonical homes |
| Leaf routes live in the leaf | ShowcaseRoutes.kt owns the Showcase @Serializable destinations |
Todos is a good example of the boundary. Its canonical app route is
AppRoutes.Todos on the Home stack. Showcase only pushes a second demo entry
inside the Showcase nested graph.
Leaf inventory
| Path | Role |
|---|---|
core/showcase/ | TemplateCapability, CapabilityCategory, CapabilityStatus, and CapabilityCatalog |
feature/showcase/ | Catalog screen, nested graph, Showcase routes, and bespoke demos |
feature/guide/ | Purchase-gated setup, architecture, feature, and deployment guides |
src/test/.../core/showcase/ | Catalog tests |
src/test/.../feature/showcase/ | Route tests |
src/test/.../feature/guide/ | Guide content tests |
Catalog contents
CapabilityCatalog.all groups demos into Foundation, Authentication, Backend
Data, Commerce, Growth, and Operations.
| Capability | Route status | Notes |
|---|---|---|
| Theming | Live demo | Re-tints a sample surface |
| Onboarding | Live demo | Replays the real onboarding flow |
| Haptics | Live demo | Fires each haptic helper |
| Guides | Live demo | Opens purchase-gated guide index |
| Supabase auth | Live demo | Session inspector |
| Biometric lock | Device-only | No direct route in the catalog |
| Account security | Live demo | Reuses AccountSecurityRoute |
| Todos | Live demo | Reuses TodosRoute |
| Storage upload | Live demo | Reuses UploadRoute |
| Paywall | Requires keys | Reuses PaywallRoute |
| Redeem code | Requires keys | Reuses RedeemCodeScreen |
| Manage subscription | Requires keys | Reuses ManageSubscriptionRoute |
| Deep links | Live demo | Routes through the app's deep-link handler |
| Referrals | Live demo | Reuses ReferScreen |
| Push notifications | Device-only | No direct route in the catalog |
| App rating | Live demo | Triggers Play In-App Review flow |
| Permissions | Live demo | Reuses PermissionsScreen |
| Update gate | Configured | No direct route in the catalog |
| Observability | Requires keys | No direct route in the catalog |
The code uses its own CapabilityStatus labels for the in-app catalog. In the
hub docs, treat the whole tab and the bundled guides as Removable demo.
Nested graph
showcaseGraph(...) is mounted from the shell in one fenced block. Reused
feature screens are pushed inside the Showcase stack, while bar-less screens
such as Todos and Permissions are wrapped in DetailScaffold.
ShowcaseGraph
-> ShowcaseHome
-> ShowcaseTheming
-> ShowcaseOnboarding
-> ShowcaseHaptics
-> ShowcaseAuthStatus
-> ShowcaseAccountSecurity
-> ShowcaseTodos
-> ShowcaseUploads
-> ShowcasePaywall
-> ShowcaseRedeemCode
-> ShowcaseManageSubscription
-> ShowcasePermissions
-> ShowcaseDeepLinks
-> ShowcaseRefer
-> ShowcaseRating
-> ShowcaseGuideIndex
-> ShowcaseGuideDocument(id)Removal recipe
This is the verified removal path from the template's Showcase README.
Delete the leaf folders and their tests:
app/src/main/java/com/soarstarter/kotlin/core/showcase/
app/src/main/java/com/soarstarter/kotlin/feature/showcase/
app/src/main/java/com/soarstarter/kotlin/feature/guide/
app/src/test/.../core/showcase/CapabilityCatalogTest.kt
app/src/test/.../feature/showcase/ShowcaseRouteTest.kt
app/src/test/.../feature/guide/GuideContentTest.ktFind every seam:
grep -rn "removable leaf" app/src/mainIn feature/main/MainShellScreen.kt, remove the Showcase imports, the
ShellTab.Showcase entry and route mapping, toShellTab arms,
isShowcaseDetail(), the Showcase term in showChrome, the
DeepLinkDestination.Showcase case, the Home onOpenShowcase callback,
and the showcaseGraph(...) mount.
In feature/main/AppDrawer.kt, remove the ShellTab.Showcase drawer row.
In feature/home/HomeScreen.kt, remove the onOpenShowcase parameters,
the item("inside") entry, WhatsInsideSection, CategoryTile, and the
Home-local HomeCategory / homeCategories taxonomy copy. Keep
TwoColumnGrid; DemosSection still uses it.
In core/deeplink/DeepLinkResolver.kt and DeepLinkDestination.kt, remove
the "showcase" / Showcase case.
In src/androidTest/.../nav/NavRouteTest.kt, drop the Showcase route
round-trip test and the Showcase deep-link assertions.
Optionally prune showcase_*, capability_*, and tabs_showcase strings
from res/values/strings.xml and res/values-zh/strings.xml. Keep
tabs_todos; Todos is a core feature.
Rebuild:
./gradlew assembleDebug testDebugUnitTestAfter deletion, the tab bar becomes Home / Component / Me. Auth, todos, upload, paywall, refer, notifications, permissions, legal, settings, and shared components remain.
