BowlerKitBowlerKit

Project Structure

10/11/2026

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

api-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.json

Profile source of truth

  • constants/bowlerkit-profile.ts contains the generated account or guest value.
  • constants/app-mode.ts derives IS_ACCOUNT_ONLINE and IS_GUEST_LOCAL.
  • .bowlerkit/project.json records 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.