A minimal, single-tap coin-flip Android app. Tap the coin, get HEADS or TAILS. That's it.
Built with Expo + React Native, published to Google Play via EAS.
- Package:
app.stridehub.toss - Latest release: v1.1.0 (see CHANGELOG.md — one build per day during closed testing, plan in ROADMAP.md)
- By: STRIDEHUB
- Single animated coin on the home screen — tap to flip (HEADS / TAILS)
- Flip stats under the coin — heads/tails counts, current streak, last 10 results (persisted), one-tap reset
- Light / dark theme toggle in the header, persisted with
AsyncStorage - Drawer sidebar (Settings, Terms & Conditions, Privacy Policy)
- Splash overlay with the logo +
BY STRIDEHUB, fades into the app - Inter font (Google Fonts) throughout
| Layer | Choice |
|---|---|
| Runtime | Expo SDK 54, React Native 0.81, React 19 |
| Language | TypeScript |
| Navigation | @react-navigation/drawer 7 |
| Animation | react-native-reanimated 4 + worklets |
| Persistence | @react-native-async-storage/async-storage |
| Fonts | @expo-google-fonts/inter |
| Build/Ship | EAS Build + EAS Submit |
.
├── App.tsx # Providers + Drawer navigator + splash gate
├── app.json # Expo config (icon, splash, package, plugins)
├── babel.config.js # babel-preset-expo + react-native-worklets/plugin
├── eas.json # EAS Build + Submit profiles
├── assets/
│ └── Heads.png # App logo (used for icon + splash + adaptive icon)
└── src/
├── components/
│ ├── DocumentScreen.tsx # Shared scaffold for T&C / Privacy
│ └── SplashOverlay.tsx # JS splash with logo + "BY STRIDEHUB"
├── navigation/
│ └── DrawerContent.tsx # Custom sidebar
├── screens/
│ ├── HomeScreen.tsx # Coin + theme toggle button
│ ├── SettingsScreen.tsx
│ ├── TermsScreen.tsx
│ └── PrivacyScreen.tsx
├── store/
│ ├── SettingsStore.tsx # Voice assist + flip axis, persisted
│ └── StatsStore.tsx # Flip stats (counts, streak, recent), persisted
└── theme/
└── ThemeContext.tsx # Light/dark colors + persistence
Prereqs: Node 20+, npm, Android device or emulator with Expo Go matching SDK 54.
npm install
npx expo start --clearScan the QR with Expo Go on your phone, or press a to launch Android.
Automated (default): push a version tag and GitHub Actions does the rest — EAS builds the AAB and auto-submits it to the Play closed-testing (alpha) track:
git tag v1.2.0 && git push origin main v1.2.0Requires two repo secrets (one-time setup): EXPO_TOKEN (create here) and GOOGLE_SERVICE_ACCOUNT_JSON (contents of the Play service account key). See .github/workflows/eas-release.yml.
Manual fallback: requires eas-cli installed globally (npm install -g eas-cli) and an Expo account linked to this project.
# First time only — generate the Android upload keystore on EAS
eas credentials --platform android
# Build the production AAB on EAS servers (10–20 min)
eas build --platform android --profile productionPlace a Google Play service account JSON in the project root as google-service-account.json. It's already in .gitignore.
eas submit --platform android --profile productionThis pushes the latest production build to the Closed testing (alpha) track and publishes it to testers automatically (see eas.json). Google requires a 14-day closed test with 12+ engaged testers before granting production access — daily builds and release notes live in ROADMAP.md and CHANGELOG.md. Promote to production manually in Play Console once access is granted.
| File | What it controls |
|---|---|
app.json |
App name, package, version, icon, adaptive icon, splash plugin, EAS project ID |
eas.json |
Build profiles (dev / preview / production) + Play Store submit settings |
babel.config.js |
Babel preset + worklets plugin (required for Reanimated 4) |
Private — © STRIDEHUB.