A cross-platform mobile application designed to help users take care of their plants utilizing AI, image recognition APIs and algorithmization. Our features offer flower recognition through AI, watering reminders, and all the important information about the user's plants. We won Best Business Pitch and placed second in Best STEM Project at JA Expo, earning us a spot in the national finals. Completely open-source, written in React native.
Built with Expo (React Native), React Navigation, Firebase, i18next, Plant.id API
app/
├── app.json # Expo app config (name, icons, splash, plugins)
├── App.ts # RN AppRegistry entry that exports src/App
├── babel.config.js # Babel preset (expo)
├── eas.json # EAS Build profiles
├── metro.config.js # Metro bundler (SVG transformer)
├── package.json # Dependencies and scripts
├── tsconfig.json # TypeScript config
├── assets/
│ ├── fonts/ # OpenSans fonts used across the app
│ ├── images/ # App icons, splash, and screenshots
│ └── translations/ # i18n resources and init
├── src/
│ ├── App.tsx # App root: fonts, auth gate, navigation containers
│ ├── firebase.ts # Firebase init + typed RTDB helpers
│ ├── components/ # Reusable UI components (buttons, inputs, modals)
│ ├── screens/ # Screens (Auth, Settings, Scan, Plants, Details)
│ └── utils/ # Theme, types, fonts loader, LanguageContext
└── README.md # This file
./setup-<platform>.shOr just install yarn and Node.js
In both cases run before start
yarn installyarn startyarn add <package-name>- Runtime: React Native (Expo)
react-native@0.74,expo@51 - Language: TypeScript
- Navigation:
@react-navigation/native, stack + bottom-tabs - Auth & Data: Firebase Auth + Realtime Database (RTDB)
- State: React Contexts (
LanguageContext,PlantContext) - Internationalization:
i18next+react-i18next+expo-localization - Camera & Media:
expo-camera - UI: Expo vector icons, custom components, OpenSans fonts
LanguageContextprovideslanguageandsetLanguage. Used by i18n and API queries.PlantContextmanages:rooms: fetched from RTDB for the current userplants: fetched for the active roomcurrentRoomIndex: controls current room inPlantsScreenaddRoom(room),addPlant(plant, roomId)proxy to Firebase helpers and refresh local state
- Initialization in
assets/translations/i18n.tsusingexpo-localizationto pick default language. - Languages:
en,cs,al,skwith flat keys (no keySeparator). - Access via
i18n.t(key)orconst { t } = useTranslation(); current code imports and usesi18n.tdirectly.
- Initialization:
initializeApp+initializeAuthwithAsyncStoragepersistence. - RTDB structure:
users/{userId}/rooms/{roomId}with{ name }users/{userId}/rooms/{roomId}/plants/{plantId}withPlantInfousers/{userId}/wateringEvents/{wateringEventId}for history
- Helpers in
src/firebase.ts:addRoom(userId, roomName): Promise<string>ensures uniqueness by namegetRooms(userId)-> array of{ id, name }addPlantt(userId, roomId, plantInfo)-> create plant under roomgetPlantsInRoom(userId, roomId)-> array of typed plantsaddWateringEvent(userId, event)andgetWateringHistory(userId)getCurrentUserId()readsauth.currentUser?.uid
- Implemented in
src/screens/ScanScreen.tsxusingexpo-camera. - Flow:
- Request camera permission and mount
CameraView. - Capture image as base64 and show preview.
- Submit to Plant.id API (
/identificationor/health_assessmentbased on a toggle) withlanguagefromLanguageContext. - On successful identification, build a
PlantInfoand navigate toPlantScanScreenfor user decision; if accepted, create a default room and save to RTDB.
- Request camera permission and mount
- Implementation details:
- Randomized
temperatureandsunlightplaceholders until full data is provided by API. - Uses local activity indicator during network calls.
- Randomized
src/utils/colors.tsxcentralizes palette, sizes, and font family names.- Fonts loaded via
src/utils/loadFonts.tsxat app start (OpenSans family in assets).
{
"users": {
"userId": {
"rooms": {
"roomId": {
"name": "string",
"plants": {
"plantId": {
"photo": "string",
"nickname": "string",
"commonName": "string",
"scientificName": "string",
"taxonomy": {
"class": "string",
"genus": "string",
"order": "string",
"family": "string",
"phylum": "string",
"kingdom": "string"
},
"rank": "string",
"description": "string",
"watering": "number",
"temperature": "string",
"sunlight": "string",
"lastWatered": "number"
}
}
}
}
}
}
}
This project is open source and available under the MIT License.


