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

SurfaceStatusImplementation
Showcase tabRemovable demofeature/showcase/
Capability catalogRemovable democore/showcase/CapabilityCatalog.kt
Developer guidesRemovable demofeature/guide/
Shell seamsRemovable demoLines 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:

RuleMeaning
core/ avoids Showcase importsCore services, data, UI, and feature screens keep working after deletion
core/showcase/ is part of the leafIt holds catalog data and is deleted with the tab
Showcase launches existing screensTodos, upload, refer, paywall, permissions, and account security keep their canonical homes
Leaf routes live in the leafShowcaseRoutes.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

PathRole
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.

CapabilityRoute statusNotes
ThemingLive demoRe-tints a sample surface
OnboardingLive demoReplays the real onboarding flow
HapticsLive demoFires each haptic helper
GuidesLive demoOpens purchase-gated guide index
Supabase authLive demoSession inspector
Biometric lockDevice-onlyNo direct route in the catalog
Account securityLive demoReuses AccountSecurityRoute
TodosLive demoReuses TodosRoute
Storage uploadLive demoReuses UploadRoute
PaywallRequires keysReuses PaywallRoute
Redeem codeRequires keysReuses RedeemCodeScreen
Manage subscriptionRequires keysReuses ManageSubscriptionRoute
Deep linksLive demoRoutes through the app's deep-link handler
ReferralsLive demoReuses ReferScreen
Push notificationsDevice-onlyNo direct route in the catalog
App ratingLive demoTriggers Play In-App Review flow
PermissionsLive demoReuses PermissionsScreen
Update gateConfiguredNo direct route in the catalog
ObservabilityRequires keysNo 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.kt

Find every seam:

grep -rn "removable leaf" app/src/main

In 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 testDebugUnitTest

After deletion, the tab bar becomes Home / Component / Me. Auth, todos, upload, paywall, refer, notifications, permissions, legal, settings, and shared components remain.

On this page