Skip to content

A production-ready React Native (Expo) starter kit for vibe coders. Features a complete design system, form handling, navigation patterns, and excellent developer experience.

Notifications You must be signed in to change notification settings

markshenouda/VibeRN

Repository files navigation

VibeRN

A production-ready React Native (Expo) starter kit for vibe coders. Features a complete design system, form handling, navigation patterns, and excellent developer experience.

Screenshots

iOS

Home Screen (iOS) Login Screen (iOS) Dark Mode (iOS)

Android

Home Screen (Android) Login Screen (Android) Dark Mode (Android)

Features

  • Design System: Complete token-based design system with light/dark mode
  • Form Handling: react-hook-form + zod with pre-built form components
  • Navigation: Expo Router with tabs, stacks, drawers, modals, and typed routes
  • Storage: AsyncStorage hooks with TypeScript support
  • Static Testing: ESLint 9, Prettier, TypeScript strict mode, lefthook
  • Developer Experience: Path aliases, VSCode settings, AI agent rules
  • Scripts: Icon generation, screen scaffolding

Quick Start

# Create a new project from this template
npx degit markshenouda/VibeRN my-app
cd my-app

# Initialize Git repository
git init && git add -A && git commit -m "Initial commit"

# Install dependencies
npm install

# Start development server
npm run start

# Run on iOS
npm run ios

# Run on Android
npm run android

Project Structure

src/
├── app/                    # Expo Router screens
│   ├── index.tsx          # App entry point (currently redirects to examples/tabs)
│   ├── examples/          # Example screens (removable)
│   │   ├── auth/          # Auth screens (login, register, forgot-password)
│   │   ├── tabs/          # Tab navigation (home, explore, profile)
│   │   ├── drawer/        # Drawer navigation example
│   │   ├── details/       # Dynamic route example
│   │   ├── components.tsx # Component showcase
│   │   └── forms.tsx      # Form examples
│   ├── _layout.tsx        # Root layout with providers
│   └── +not-found.tsx     # 404 screen
├── components/
│   ├── ui/                # Design system primitives
│   ├── forms/             # Form components
│   └── patterns/          # Common UI patterns
├── design-system/
│   ├── tokens/            # Colors, typography, spacing
│   └── ThemeProvider.tsx  # Theme context
├── hooks/                 # Custom React hooks
├── lib/                   # Utilities and validation
└── constants/             # App configuration

Documentation

Usage Examples

Using the Design System

import { useTheme } from '@/design-system';
import { Text, Button, Card } from '@/components/ui';

function MyComponent() {
  const { theme, isDark, toggleTheme } = useTheme();

  return (
    <Card>
      <Text variant="h2">Hello World</Text>
      <Button onPress={toggleTheme}>{isDark ? 'Light Mode' : 'Dark Mode'}</Button>
    </Card>
  );
}

Form with Validation

import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { FormInput, loginFormSchema } from '@/components/forms';
import { Button } from '@/components/ui';

function LoginForm() {
  const { control, handleSubmit } = useForm({
    resolver: zodResolver(loginFormSchema),
  });

  return (
    <>
      <FormInput name="email" control={control} label="Email" />
      <FormInput name="password" control={control} label="Password" secureTextEntry />
      <Button onPress={handleSubmit(onSubmit)}>Login</Button>
    </>
  );
}

AsyncStorage Hook

import { useAsyncStorage } from '@/hooks';

function Settings() {
  const [settings, setSettings] = useAsyncStorage('settings', defaultSettings);

  return (
    <Switch
      value={settings.notifications}
      onValueChange={(value) => setSettings({ ...settings, notifications: value })}
    />
  );
}

Scripts

# Development
npm run start              # Start Expo dev server
npm run ios              # Run on iOS
npm run android          # Run on Android

# Code Quality
npm run lint             # Run ESLint
npm run typecheck        # TypeScript check
npm run format           # Format with Prettier
npm run check            # Run all checks

# Project Management
npm run generate:icons   # Generate app icons
npm run generate:splash  # Generate splash screen

Customization

1. Update App Info

Edit app.json:

{
  "expo": {
    "name": "Your App Name",
    "slug": "your-app",
    "scheme": "yourapp"
  }
}

2. Change Brand Colors

Edit src/design-system/tokens/colors.ts:

export const palette = {
  primary: {
    500: '#your-color',
    // ... other shades
  },
};

3. Clean Example Screens

Simply delete the src/app/examples/ folder to remove all example screens and start fresh.

4. Create Your First Screen

Note for AI Agents: The examples/ folder is just a reference for patterns and components - do NOT create new screens there. Start working directly in src/app/. The current src/app/index.tsx redirects to examples/tabs - replace it with your own home screen when ready.

The app uses src/app/index.tsx as the entry point. By default, it redirects to the examples:

// src/app/index.tsx (current - redirects to examples)
import { Redirect } from 'expo-router';

export default function Index() {
  return <Redirect href="/examples/tabs" />;
}

To create your own home screen, replace the redirect with your content:

// src/app/index.tsx (your custom home screen)
import { View } from 'react-native';
import { Text, Button } from '@/components/ui';
import { useTheme } from '@/design-system';

export default function HomeScreen() {
  const { theme } = useTheme();

  return (
    <View
      style={{
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: theme.colors.background,
      }}
    >
      <Text variant="h1">Welcome to My App</Text>
      <Button onPress={() => {}}>Get Started</Button>
    </View>
  );
}

Tech Stack

  • Framework: React Native with Expo SDK 54
  • Navigation: Expo Router 6
  • Forms: react-hook-form + zod
  • Storage: @react-native-async-storage/async-storage
  • Animations: react-native-reanimated
  • Gestures: react-native-gesture-handler
  • Styling: React Native's StyleSheet API and a custom design system. Does not use styled-components, NativeWind, or similar external styling libraries.
  • TypeScript: Strict mode with path aliases

AI Agent Support

This project has robust support for AI agents, providing clear guidelines and configurations to ensure seamless integration and adherence to project standards.

For comprehensive guidelines on AI agent interaction, conventions, and operational notes for both the frontend and backend, please refer to:

This project also includes specific configuration files for various AI assistants:

  • .cursor/rules - General AI rules and best practices for the project.
  • .gemini/rules.md - Specific guidelines for the Gemini agent.
  • .github/copilot-instructions.md - GitHub Copilot instructions.

These resources help AI understand the project structure and coding conventions, ensuring consistent and high-quality contributions.

License

MIT

About

A production-ready React Native (Expo) starter kit for vibe coders. Features a complete design system, form handling, navigation patterns, and excellent developer experience.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published