LLM-First Mobile Toolkit

Built by LLMs.
For LLMs.

The first mobile SDK designed from the ground up for AI-assisted development. Every project ships with a CLAUDE.md that teaches your AI the entire stack. Every port has a test double. Every component is headless and predictably named.

16 typed ports. 15 Expo adapters. One defineConfig() call. React Native + Expo. Built for Claude Code.

Get Started
$ npx @objectifthunes/create-limestone my-app

Every native capability, typed and swappable.

defineConfig({ adapters }) wires every native feature as a port. Click to toggle.

Limestone Port Wiring
All systems ready dev mode
Native Ports — Column A
Biometrics expo-biometrics
Camera expo-camera
Secure Storage expo-secure-store
Haptics expo-haptics
Notifications expo-notifications
Permissions expo-permissions
Purchases
Location
Click a port to toggle
Native Ports — Column B
Share expo-sharing
Clipboard expo-clipboard
Web Browser expo-web-browser
Review Prompt expo-review
Contacts
Media Library
Maps
Keychain
Click a port to toggle

What LLM-first means.

Not just usable by AI. Designed so AI agents produce correct mobile code on the first try.

CLAUDE.md in every project

npx @objectifthunes/create-limestone generates a comprehensive CLAUDE.md tailored to your stack. Claude Code, Cursor, and Windsurf instantly understand your ports, adapters, components, and how to add features — no context window bloat.

llms.txt at the docs root

A structured text file at /llms.txt that any LLM can fetch for instant SDK context — ports, adapters, components, hooks, patterns. Universal access, no integration required.

Headless hooks — no guessing

Every component ships with a headless useXxx() hook that returns styles and state. LLMs pick the right primitive every time — the naming is 1:1 predictable. No hunting through prop tables.

Theme tokens — no magic strings

defineTheme() validates every token at startup with Zod. LLMs read the token interface and know exactly which values are valid. No hex strings scattered across components.

Testing doubles for every port

createInMemoryBiometrics(), createInMemoryCamera() — every port has an in-memory double with an inspectable state object. LLMs write real tests, not mocks, on the first try.

Predictable naming everywhere

createExpoCameraCameraProvideruseCamera()createInMemoryCamera(). Every concept has exactly one name. AI agents generate the right import without trial and error.

How Claude Code uses Limestone.

A typical AI-assisted mobile workflow. No native module guessing, no trial-and-error.

STEP 1 — Scaffold
$ npx @objectifthunes/create-limestone my-app --template saas
  Generated: app.tsx, config.ts, theme.ts, CLAUDE.md...
  Adapters wired: biometrics, haptics, notifications, secure-store

The CLAUDE.md tells the LLM: which adapters are wired, which ports are active, how to add components, how to write tests with in-memory doubles.

STEP 2 — Generate
// Claude Code reads CLAUDE.md and writes this directly:
import { useBiometrics, useHaptics } from '@objectifthunes/limestone-sdk';

export function LoginScreen() {
  const bio = useBiometrics();
  const haptics = useHaptics();
  const authenticate = async () => {
    const result = await bio.authenticate({ promptMessage: 'Verify identity' });
    if (result.success) await haptics.notification('success');
  };
}

The LLM uses hooks directly — no guessing the adapter API. The hook name, method name, and return type are all documented in CLAUDE.md.

STEP 3 — Test
import { createInMemoryBiometrics } from '@objectifthunes/limestone-sdk/testing';

const bio = createInMemoryBiometrics();
bio.state.available = false;     // simulate hardware absent
bio.state.nextResult = { success: false, error: 'not_enrolled' };

const result = await bio.authenticate();
expect(result.success).toBe(false);

The LLM writes real tests with the in-memory double. Inspectable state object — no mock frameworks, no vi.fn() chains to get wrong.

Hexagonal architecture. Zero native lock-in.

The same architecture that makes the SDK LLM-friendly also makes it future-proof. 150+ components across 17 categories. Typed port contracts mean AI agents always know the shape of things.

Dev mode — zero native modules
import {
  createExpoBiometrics,
  createExpoHaptics,
  createExpoNotifications,
  createExpoSecureStore,
} from '@objectifthunes/limestone-sdk/dev'

// All in-memory. No Expo Go needed.
const config = defineConfig({
  theme: myTheme,
  adapters: {
    biometrics: createExpoBiometrics(),
    haptics: createExpoHaptics(),
    notifications: createExpoNotifications(),
    storage: createExpoSecureStore(),
  },
})
Production — real Expo modules
import { createExpoBiometrics }
  from '@objectifthunes/limestone-sdk/expo-biometrics'
import { createExpoHaptics }
  from '@objectifthunes/limestone-sdk/expo-haptics'
import { createExpoNotifications }
  from '@objectifthunes/limestone-sdk/expo-notifications'
import { createExpoSecureStore }
  from '@objectifthunes/limestone-sdk/expo-secure-store'

const config = defineConfig({
  theme: myTheme,
  adapters: {
    biometrics: createExpoBiometrics(),
    haptics: createExpoHaptics(),
    notifications: createExpoNotifications(),
    storage: createExpoSecureStore(),
  },
})

150+ components. 17 categories. All headless.

Every component ships a pure useXxx(tokens, props) hook. Theme-token-driven. No hardcoded colors. No hidden dependencies.

Primitives (13)
Button, IconButton, Link, Text, Box, Image, Icon, Skeleton, and more
Layout (5)
Stack, Grid, ScrollView, SafeArea, KeyboardAvoidingView
Inputs (17)
TextInput, Select, DatePicker, Calendar, Autocomplete, SignaturePad, and more
Navigation (9)
Header, Tabs, CollapsibleHeader, BottomSheet, Drawer, FAB, and more
Overlays (6)
Modal, Tooltip, Menu, ContextMenu, Popover, Lightbox
Feedback (9)
Toast, Dialog, Badge, Banner, ProgressBar, Spinner, ConnectionStatus
Data Display (17)
Chart, DataTable, ActivityRing, RatingStars, Card, List, Timeline, and more
Media (8)
VideoPlayer, Carousel, QRScanner, MapView, AudioPlayer, CameraView
Forms (3)
Form, FormField, FormError
Screens (20)
Auth, Dashboard, ProductDetail, Cart, Feed, OrderTracking, and 14 more
3D (6)
Scene3D, ModelViewer, Panorama360, BeforeAfter3D, ObjectScanner
AR (8)
ARView, ARPlacement, ARMeasure, ARNavigation, ARTryOn, and more
Interactive (6)
SwipeableRow, DragToReorder, PinchToZoom, PullToRefresh, ParallaxHeader
Social (5)
StoryRow, ReactionPicker, CommentThread, MentionInput, PresenceIndicator
Animations (8)
FadeIn, SlideUp, Shimmer, Confetti, ErrorShake, SpringBounce, and more
Content (5)
MarkdownRenderer, CodeBlock, RichTextEditor, BlockQuote, Callout
Offline (5)
SyncIndicator, ConflictCard, OfflineQueueList, CachedImage, PendingBadge
"The best mobile SDK for AI agents is one where the AI never has to guess."

Typed port contracts. Headless hooks. In-memory test doubles. Every design decision optimized for AI comprehension.

Stay in the loop.

New adapters, components, and guides — delivered to your inbox. No spam.

Get Started