Project Structure
Map the generated Expo project and identify the source of truth for each concern.
The CLI generates a profile-specific project rather than exposing the private source repository.
Generated root
my-expo-app/
├── mobile-app/ # Shared Expo/React Native source
├── landing-page/ # Guest-only TanStack Start marketing/legal site
├── api-collections/ # Account-only API examples
├── admin-panel/ # Account-only Laravel/Filament + landing/SEO service
├── api-backend/ # Account-only Go mobile API
├── .bowlerkit/project.json # Selected framework/profile manifest
├── AGENTS.md # Project-local agent instructions
├── BOWLERKIT.md # Generated architecture/validation guide
└── docs/
├── AI-GUEST-CLEANUP.md # Guest cleanup choices
└── DEEP-CLEANUP-MAP.mdapi-collections/, admin-panel/, and api-backend/ are omitted from Guest archives. Guest archives include the standalone landing-page/; Account archives use the public landing and SEO routes built into admin-panel and omit the duplicate standalone app.
Mobile app
mobile-app/
├── app/
│ ├── (auth)/ # login, register, reset password
│ ├── (tabs)/ # main tab screens
│ ├── help.tsx, help/ # static/help-center screens
│ ├── settings/ # appearance, general, notifications, security
│ ├── link.tsx # allowlisted deep-link entry point
│ ├── onboarding.tsx
│ └── _layout.tsx # providers and profile-aware route guards
├── components/ # reusable UI and feature components
├── constants/ # profile, API mode, theme, monetization
├── hooks/ # push, smart query, bootstrap helpers
├── lib/ # logger and shared utilities
├── locales/ # en/id translation JSON
├── mutations/ # React Query writes
├── queries/ # React Query reads
├── services/ # API, endpoints, i18n, storage, paywall
├── store/ # Zustand auth/preferences/security/monetization
├── types/ # API and feature types
├── assets/ # images and fonts
├── app.config.ts # Expo native/build configuration
├── eas.json # EAS build profiles
├── package.json # pnpm scripts and dependencies
├── .env.example
└── tsconfig.jsonProfile source of truth
constants/bowlerkit-profile.tscontains the generatedaccountorguestvalue.constants/app-mode.tsderivesIS_ACCOUNT_ONLINEandIS_GUEST_LOCAL..bowlerkit/project.jsonrecords the selected framework/profile and cleanup baseline.
When adding a feature, decide whether it is shared or profile-gated. Guest must retain Paywall/AdMob, local settings, local help/about, and local notification behavior; it must not perform Account API calls, remote preference sync, FCM token sync, or server entitlement checks.
Account services
admin-panel/ owns Laravel migrations, Sanctum auth issuance, uploads, webhooks, admin resources, and the Account profile's public landing/SEO routes. api-backend/ validates those Sanctum tokens and serves the protected /api/v1/app/* resource contract. The two services share the Laravel PostgreSQL schema; Go never runs migrations.
See Core Concepts, Backend Architecture, and the generated BOWLERKIT.md before changing cross-service behavior.
