A cross-platform mobile app for reef aquarium hobbyists to track creatures, manage recurring maintenance tasks, and stay on top of their tank care β built with React Native, Expo, and TypeScript.
- Dashboard β at-a-glance view of your tank: creature counts, overdue/upcoming tasks, and quick actions
- Creature Registry β catalog your fish, corals, invertebrates and more with photos, species info, and health logs
- Maintenance Tasks β recurring and one-off task management with automatic rescheduling (water changes, parameter tests, feeding, etc.)
- Notifications β configurable reminders before tasks are due
- Search & Filter β find creatures by name, species, or type
- Dark Mode β automatic theme based on system preference
- Auth0 Authentication β secure login/registration
- Offline-first β all data stored locally via AsyncStorage
| Layer | Technology |
|---|---|
| Framework | Expo (SDK 54) + Expo Router |
| Language | TypeScript |
| UI | React Native Paper (Material Design 3) |
| Auth | Auth0 via react-native-auth0 |
| Storage | @react-native-async-storage/async-storage |
| Unit Tests | Jest + React Testing Library |
| E2E Tests | Playwright |
| CI/CD | GitHub Actions |
- Node.js 20+
- npm 10+
- An Auth0 account (for authentication)
# Clone the repository
git clone https://github.com/<your-org>/ReefKeeper.git
cd ReefKeeper
# Install dependencies
npm installIMPORTANT: Create a .env file before running the app, especially for Android development. Without this file, authentication will fail with "Unknown Host unconfigured.auth0.com".
Copy the example env file and fill in your Auth0 credentials:
cp .env.example .env
# Edit .env with your actual Auth0 credentials| Variable | Description |
|---|---|
AUTH0_DOMAIN |
Your Auth0 tenant domain (e.g., yourapp.eu.auth0.com) |
AUTH0_CLIENT_ID |
Auth0 application client ID (for web/iOS) |
AUTH0_CLIENT_ID_APK |
Auth0 application client ID for Android (optional, defaults to AUTH0_CLIENT_ID) |
AUTH0_CLIENT_SECRET |
Auth0 application client secret |
AUTH0_CALLBACK_URL |
OAuth callback URL (http://localhost:8081 for local dev) |
TEST_USER_EMAIL |
Email for the E2E test user |
TEST_USER_PASSWORD |
Password for the E2E test user |
For Android authentication to work properly, you need to configure the following URLs in your Auth0 application settings:
Allowed Callback URLs:
reef-keeper://{yourDomain}/android/com.reefkeeper.app/callback
http://localhost:8081
Allowed Logout URLs:
reef-keeper://{yourDomain}/android/com.reefkeeper.app/callback
http://localhost:8081
Replace {yourDomain} with your actual Auth0 domain (e.g., reefkeeper.eu.auth0.com).
Note: The Android package name is com.reefkeeper.app and the custom scheme is reef-keeper.
# Start in web mode
npx expo start --web
# Start for iOS (requires macOS + Xcode)
npx expo start --ios
# Start for Android (requires Android Studio)
npx expo start --androidThe app will be available at http://localhost:8081.
Note: To build a standalone Android APK for testing without Metro, see the Android Development Build Guide.
npm testRuns Jest tests located in __tests__/. The configuration is in jest.config.js.
Playwright tests live in e2e/ and run against the web build.
# Install Playwright browsers (first time only)
npx playwright install chromium
# Run E2E tests (auto-starts the dev server)
npx playwright test
# Run with visible browser
npx playwright test --headed
# View the last test report
npx playwright show-reportReefKeeper/
βββ app/ # Expo Router screens
β βββ (tabs)/ # Tab navigator (Dashboard, Creatures, Tasks)
β βββ creature/ # Creature detail & add screens
β βββ task/ # Task detail & add screens
β βββ settings.tsx # Settings screen
β βββ _layout.tsx # Root layout (Auth0 provider, theme)
βββ components/ # Reusable UI components
βββ constants/ # Theme colors, creature types, default tasks
βββ hooks/ # Custom React hooks (useCreatures, useTasks, etc.)
βββ models/ # TypeScript interfaces (Creature, Task)
βββ services/ # Data layer (AsyncStorage CRUD, notifications)
βββ e2e/ # Playwright E2E tests (web)
βββ maestro/ # Maestro UI tests (Android)
βββ __tests__/ # Jest unit tests
βββ .github/workflows/ # CI/CD pipelines (ci, web, android)
βββ docs/screenshots/ # App screenshots
- Fork the repository
- Create a branch for your feature or fix:
git checkout -b feature/my-feature
- Make your changes β follow the existing code style (TypeScript strict mode, functional components, hooks)
- Run checks before committing:
npx tsc --noEmit # Type-check npm test # Unit tests npx playwright test # E2E tests
- Commit with a clear message and open a Pull Request
The Shared CI pipeline automatically runs type-checking, unit tests, and dependency audits on every PR.
- Functional components with hooks β no class components
- TypeScript strict mode β no
anyunless absolutely necessary - React Native Paper for all UI elements β follow Material Design 3 patterns
- AsyncStorage for persistence β all keys prefixed with
@reef_keeper - Expo Router file-based routing β screens go in
app/
Three-layer pipeline architecture for fast feedback and independent platform releases:
Runs on every push & PR to main. Fast quality gate (<8 min).
| Step | Description |
|---|---|
| TypeScript type-check | tsc --noEmit |
| Lint | Expo lint (if configured) |
| Unit tests | Jest with coverage |
| Dependency audit | npm audit for known vulnerabilities |
Runs on merge to main and version tags (v*). Calls Shared CI first.
| Job | Steps |
|---|---|
| web-build | Version injection β Expo web export β Upload bundle artifact |
| web-e2e | Install Playwright β Run E2E tests β Upload report |
| web-deploy | Deploy placeholder β wire to your hosting (Vercel, Netlify, Azure, etc.) |
Runs on merge to main and version tags (v*). Calls Shared CI first.
| Job | Steps |
|---|---|
| android-build | Expo prebuild β Gradle build debug APK + release AAB (on tags) β Upload artifacts |
| android-test | Download APK β Start emulator β Run Maestro E2E tests β Upload report |
| android-release-internal | Upload to Google Play internal track (placeholder) |
| android-release-production | Promote to production β requires manual approval via GitHub environment |
Automatically creates GitHub issues when CI pipelines fail. Triggered on workflow completion.
| Feature | Description |
|---|---|
| Auto-detection | Monitors Shared CI, Web, and Android workflows for failures |
| Detailed reporting | Extracts failed job details, error logs, and traces |
| Copilot assignment | Assigns issues to @copilot for automatic fixing |
| Duplicate prevention | Checks for existing open issues before creating new ones |
| Update tracking | Adds comments to existing issues for repeated failures |
See docs/ci-failure-workflow.md for detailed documentation.
This project is private. All rights reserved.



