An Expo-based cooking recipes mobile app built with React Native, Expo Router, and NativeWind.
- Framework: React Native + Expo SDK 54
- Routing: Expo Router
- Styling: NativeWind
- UI Library: React Native Paper
- Auth: Local (email/username & password) + Social (Google, GitHub)
- Backend: Hexum
- Node.js 18+
- npm
- Expo CLI:
npx expo --version - Android Studio (for Android emulator) or Xcode (for iOS simulator)
- An Expo account (for EAS builds)
# Clone the repo
git clone https://github.com/kaucrow/nativeat
cd nativeat
# Install dependencies
npm install
# Copy the environment file and fill in the values
cp .env.example .env# Development build
npx expo run:android # or run:ios
# EAS build (production)
eas build --platform android
eas build --platform iosCreate a .env file in the project root with the following variables:
| Variable | Description |
|---|---|
EXPO_PUBLIC_BACKEND_URL |
Backend API base URL |
EXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID |
Google OAuth Web client ID |
EXPO_PUBLIC_GITHUB_CLIENT_ID |
GitHub OAuth App client ID |
Google authentication uses @react-native-google-signin/google-signin with the server auth code flow. The native SDK returns a serverAuthCode which the backend exchanges for access/refresh tokens.
Go to the Google Cloud Console.
- Create a new project or select an existing one
- Navigate to APIs & Services > OAuth consent screen
- Configure the consent screen (External or Internal)
- Add the
.../auth/userinfo.emailand.../auth/userinfo.profilescopes
Navigate to APIs & Services > Credentials and create the following:
| Field | Value |
|---|---|
| Application type | Android |
| Package name | com.kaucrow.nativeat |
| SHA-1 certificate fingerprint | See "Getting the SHA-1 Fingerprint" below |
The redirect URI is auto-generated by Google.
| Field | Value |
|---|---|
| Application type | iOS |
| Bundle ID | com.kaucrow.nativeat |
The redirect URI is auto-generated by Google.
| Field | Value |
|---|---|
| Application type | Web application |
| Name | NativEat (or any descriptive name) |
The generated Client ID is the EXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID.
Authorized redirect URIs. Add these:
com.kaucrow.nativeat:/oauth2redirect: required for the nativeserverAuthCodeflow.https://hexum.com/api/auth/oauth/callback-ui: Example backend's callback endpoint.
The debug keystore is located at android/app/debug.keystore (auto-generated by Expo).
Run either command from the project root:
keytool -list -v -keystore android/app/debug.keystore -alias androiddebugkey -storepass android -keypass androidcd android && ./gradlew signingReportLook for this in the output:
> Task :app:signingReport
Variant: debug
Config: debug
Store: /home/kaucrow/Code/nativeat/android/app/debug.keystore
SHA1: 5E:8F:16:06:2E:A3:CD:2C:4A:0D:54:78:76:BA:A6:F3:8C:AB:F6:25
Copy the SHA1 value (colons included) into the Google Cloud Console Android OAuth client.
Note: The
android/folder is gitignored, so each developer who clones the repo will have a different debug keystore with a unique SHA-1. Add each developer's SHA-1 to the same Android OAuth client in Google Cloud Console.
- User taps "Sign in with Google"
- Native Google Sign-In SDK opens
- User selects account
- SDK returns serverAuthCode
- App sends code → POST /auth/oauth/google/login
- Backend exchanges code for tokens with Google
- Backend creates session
- Response returned to app
- Go to GitHub Settings > Developer settings > OAuth Apps > New OAuth App
- Set the Authorization callback URL to your Expo redirect URI (generated at runtime by
AuthSession.makeRedirectUri) - Copy the Client ID into
EXPO_PUBLIC_GITHUB_CLIENT_IDin your.envfile - Generate a Client Secret and configure it on your backend