CLI

@objectifthunes/create-limestone is the official project scaffolder for Limestone SDK. It creates a fully configured Expo + Limestone app in seconds. The limestone CLI (installed alongside it) handles ongoing code generation tasks.

create-limestone

Usage

npx @objectifthunes/create-limestone my-app

That command starts an interactive prompt sequence. Answer the questions and a complete project is written to the my-app/ directory.

To skip prompts entirely and use a preset:

npx @objectifthunes/create-limestone my-app --yes --template full
npx @objectifthunes/create-limestone my-app --yes --template minimal
npx @objectifthunes/create-limestone my-app --yes --template prototype

--yes (or -y) accepts all defaults. --template (or -t) selects a preset. Both flags can be combined.

Interactive prompts

When running without --yes, the scaffolder asks:

PromptOptionsDefault
Project nameAny valid npm package namemy-limestone-app
Themeobsidian (dark), daylight (light), customobsidian
Configure API clientyes / noyes
API base URLAny URLhttps://api.example.com
AdaptersMulti-select from 15 Expo adaptersall
Include dev adapteryes / noyes
Include testsyes / noyes
Navigationexpo-router, noneexpo-router
Include example screensyes / noyes

Presets

Three presets are available. Pass the name to --template or select it from the prompt.

full

All 15 Expo adapters wired up, Expo Router navigation, example tab screens, test setup, and the dev adapter included for local development.

npx @objectifthunes/create-limestone my-app --yes --template full

Includes: all adapters, expo-router, example screens, vitest test setup, dev adapter.

minimal

A clean starting point with no adapters, no navigation routing, and no example screens. Only the SDK core, theme, and provider are wired. Add what you need.

npx @objectifthunes/create-limestone my-app --yes --template minimal

Includes: SDK core only, no adapters, no example screens, dev adapter.

prototype

Everything from full, but every adapter is sourced from @objectifthunes/limestone-sdk/dev (in-memory doubles). No native modules to install. Runs in Expo Go and simulators out of the box. Tests are excluded because the intent is fast iteration, not coverage.

npx @objectifthunes/create-limestone my-app --yes --template prototype

Includes: all adapters (dev/in-memory), expo-router, example screens, no test setup.

Generated files

Every scaffold writes the following files regardless of preset:

my-app/
  package.json          # dependencies matching selected adapters
  tsconfig.json
  app.json              # Expo config
  .env.example          # API_BASE_URL placeholder
  .gitignore
  CLAUDE.md             # SDK quick reference for LLMs
  limestone.config.ts   # defineConfig() wired to selected adapters
  app/_layout.tsx       # LimestoneProvider root (expo-router)
  app/index.tsx         # Home screen

With example screens enabled (full / prototype):

  app/(tabs)/_layout.tsx
  app/(tabs)/index.tsx
  app/(tabs)/settings.tsx
  app/(tabs)/profile.tsx

With tests enabled (full):

  __tests__/setup.ts
  __tests__/example.test.ts

limestone add adapter

Wire an additional Expo adapter into an existing project.

limestone add adapter expo-biometrics
limestone add adapter expo-location
limestone add adapter expo-notifications

The command prints three steps:

  1. The npx expo install command for the native module
  2. The import to add to limestone.config.ts
  3. The adapters config key and factory call to add

Special adapters with no native install step:

limestone add adapter dev       # All adapters as in-memory doubles
limestone add adapter testing   # createTestApp() usage instructions

Available adapter names

NamePortNative module
expo-biometricsBiometricProviderexpo-local-authentication
expo-cameraCameraProviderexpo-camera
expo-secure-storeSecureStorageProviderexpo-secure-store
expo-hapticsHapticsProviderexpo-haptics
expo-notificationsNotificationProviderexpo-notifications
expo-purchasesPurchaseProviderreact-native-iap
expo-permissionsPermissionsProviderexpo-modules-core
expo-sharingShareProviderexpo-sharing
expo-clipboardClipboardProviderexpo-clipboard
expo-locationLocationProviderexpo-location
expo-media-libraryMediaLibraryProviderexpo-media-library
expo-mapMapProviderreact-native-maps
expo-web-browserWebBrowserProviderexpo-web-browser
expo-contactsContactsProviderexpo-contacts
expo-reviewReviewProviderexpo-store-review
devall ports (in-memory)none
testingall ports (in-memory + state)none

limestone generate component

Scaffold a new headless component following the Limestone pattern: types.tsuse-<name>.ts<name>.tsxindex.ts.

limestone generate component PriceCard
limestone generate component UserAvatar
limestone generate component CheckoutSummary

The name must be PascalCase. The scaffolder writes four files under components/<kebab-name>/:

components/price-card/
  types.ts          # PriceCardProps + UsePriceCardReturn interfaces
  use-price-card.ts # Headless hook (no React dependency)
  price-card.tsx    # React Native component wired to useTheme()
  index.ts          # Barrel export

    1. Run the generator

    limestone generate component PriceCard

    2. Implement the headless hook

    Open components/price-card/use-price-card.ts. Add your props to PriceCardProps, your return values to UsePriceCardReturn, and implement the logic. This file has no React dependency — keep it pure.

    3. Render in the component

    Open components/price-card/price-card.tsx. The hook is already wired to useTheme(). Replace the TODO comment with your JSX.

    4. Import and use

    import { PriceCard } from './components/price-card';