BowlerKitBowlerKit
Features

Guest mode and deep cleanup

10/11/2026

Run a BowlerKit KMP app without a backend, and optionally strip the account code.

The profile switch

BowlerKitProfile.current (ACCOUNT or GUEST) in sharedLogic/.../BowlerKitProfile.kt is the single switch. The CLI writes it when you pick a profile, and both the Compose and SwiftUI apps read it. The source template defaults to ACCOUNT.

Guest gates Account authentication, remote preference sync, FCM token registration, notification history, and server entitlement checks. These paths do not call the BowlerKit demo backend. Generic HTTP clients and public API examples remain in the shared source.

Guest keepsGuest does not use
Local settings and a local guest profileAccount endpoints, login and registration
Static help/about contentRemote preference sync
Paywall/RevenueCat (anonymous customer) and AdMobFCM device tokens and server notification history
Local remindersServer entitlement checks

Store purchases, restore, ads, and public API examples can still require internet access. Guest does not mean the app is entirely offline.

Cleanup levels

The generated project records the baseline as runtime-only. The next step is yours to choose:

  • Runtime-only (recommended): keeps the shared source and unused auth/native dependencies while profile gates control Guest behavior. This preserves the template structure for upgrades.
  • Deep: also removes authentication, remote-sync paths, FCM push, camera/photo permissions and unreferenced routes. The template does not ship Crashlytics; remove Firebase wiring only when no Firebase feature remains, including any analytics or crash reporting you added.

Deep cleanup creates a customer-owned fork and complicates future BowlerKit upgrades. Never infer it from "remove auth": choose the level explicitly.

Give your AI agent the generated docs/AI-GUEST-CLEANUP.md, the "KMP deep cleanup map" in docs/DEEP-CLEANUP-MAP.md, and the bowlerkit-kmp and bowlerkit-guest-cleanup skills, and tell it which level to apply. Apply shared changes in sharedLogic and update affected Compose and SwiftUI code together.

Deep cleanup must retain LocalReminders, both local notification gateways, Android notification-channel creation, and the reminder receiver/permissions. Move channel creation out of the FCM gateway before removing it; the cleanup map identifies these dependencies.

Validate

./gradlew -Pbowlerkit.iosOnly=false check :androidApp:assembleDebug
./gradlew :sharedLogic:iosSimulatorArm64Test        # macOS

Confirm a cold Guest launch with the backend unavailable, persistent settings, anonymous RevenueCat purchases/restore, AdMob, static help/about content, and local reminder scheduling/cancellation on both platforms. Verify that no Account API, FCM token, remote preference, or server entitlement requests occur.

A text search for demo.bowlerkit.com can help locate defaults to inspect, but the shared source intentionally retains that URL. A match alone does not mean Guest uses it.