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.
Every native capability, typed and swappable.
defineConfig({ adapters }) wires every native feature as a port. Click 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
createExpoCamera → CameraProvider → useCamera() → 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.
$ 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.
// 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.
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.
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(),
},
}) 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.
"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.