Skip to main content

Expo Template

The expo template (scaffolded via create-app) is a production-ready Expo Router app, styled end-to-end with @multinaire/expo-ui.

Structure

/
├── .npmrc Pre-configured for GitHub Packages auth
├── app.config.ts Dynamic Expo config (name, icons, plugins)
├── src/
│ ├── app/ Expo Router file-based routes
│ │ ├── _layout.tsx Root layout — MultinaireUI + ThemeProvider
│ │ └── index.tsx Home screen
│ └── assets/
│ ├── theme.json Colors, typography, and variables
│ ├── images/ App icon, adaptive icon, favicon
│ └── app.icon/ iOS Icon Composer asset
├── AGENTS.md Guidance for coding agents (Claude Code, etc.)
└── .claude/ Claude Code plugin config

Routes live under src/app rather than app/app.config.ts and tsconfig.json are both configured for this via expo-router/plugin and a @/* path alias to the project root.

Pre-installed modules

ModulePurpose
@multinaire/expo-uiComponent library, theme system, hooks
expo-routerFile-based navigation
iconsax-react-nativejsIcon set (993 icons) backing the Icon component
react-native-ui-datepickerPowers DateTimePicker
i18next, react-i18nextLocalization
@react-native-async-storage/async-storagePersists theme/language preference
expo-font, expo-image, expo-splash-screen, expo-status-bar, expo-system-ui, expo-navigation-bar, expo-web-browser, expo-constants, expo-linking, expo-localization, expo-dev-clientExpo modules wired into app.config.ts
react-native-gesture-handler, react-native-reanimated, react-native-worklets, react-native-screens, react-native-safe-area-context, react-native-svg, react-native-webPeer deps required by @multinaire/expo-ui

Nothing above needs to be installed manually — it ships in the template's package.json.

GitHub Packages authentication

@multinaire/expo-ui is published to GitHub Packages, not npm, so the template ships a project-level .npmrc already pointing @multinaire at the right registry. You only need to export a GitHub PAT as PERSONAL_ACCESS_TOKEN before running npm install — see GitHub Packages authentication.

Root layout

src/app/_layout.tsx wraps the app in MultinaireUI (loading theme.json) and maps the theme onto React Navigation with useMapNativeTheme and useScreenOptions:

import theme from "@/src/assets/theme.json";
import MultinaireUI, {
useMapNativeTheme,
useScreenOptions,
} from "@multinaire/expo-ui";
import { Stack, ThemeProvider } from "expo-router";

export default function RootLayout() {
return (
<MultinaireUI theme={theme}>
<RootNavigator />
</MultinaireUI>
);
}

function RootNavigator() {
const theme = useMapNativeTheme();
const { screenOptions } = useScreenOptions("stack");

return (
<ThemeProvider value={theme}>
<Stack screenOptions={screenOptions({ headerShown: false })} />
</ThemeProvider>
);
}

Don't add a second MultinaireUI or ThemeProvider in nested layouts — the root already provides both.

App identity

Expo's default scaffolding tools only rename the HelloWorld placeholder tokens inside app.json and native ios/android project files — this template has neither, so nothing renames app.config.ts automatically. Instead, name/slug/scheme and android.package/ios.bundleIdentifier are read from two constants declared at the top of app.config.ts:

const SLUG = "expo-template";
const ID = "com.multinaire.template";

Update both when starting a new project — ID must be a reverse-DNS identifier you actually own before submitting to the Play Store or App Store, not com.multinaire.*.

Theming

src/assets/theme.json is the single source of truth for colors, typography, and spacing, and is validated against @multinaire/expo-ui's theme.schema.json. Edit it directly rather than hard-coding values in components — see Theme Setup.

Scripts

ScriptDescription
npm run startStart the Metro dev server
npm run androidBuild and run on Android
npm run iosBuild and run on iOS
npm run webStart the web build
npm run lintexpo lint --fix
npm run formatprettier --write .

AGENTS.md

The template ships an AGENTS.md (referenced from CLAUDE.md) describing the project structure, pre-installed modules, and conventions for coding agents working in the scaffolded app — keep it in sync if you restructure the project.

Next steps