LeafLens
A mobile-first plant identification and collection system. Users capture a leaf photo and get structured analysis — identity, traits, habitat, care, safety — plus searchable medicinal-use metadata, delivered through a React Native client backed by a TypeScript API and Gemini.
The problem
Plant identification apps stop at a name. Users foraging or studying local flora need structured context — traits, habitat, care, safety, and medicinal relevance — plus a way to search their own finds and public plants by name, use, or condition.
Role & responsibilities
Sole developer across the whole stack. Rebuilt an earlier Java implementation as a TypeScript monorepo, tracking the migration capability-by-capability in a feature-parity matrix; designed the mobile client, the REST API, the Gemini analysis pipeline, and the search model.
Architecture
Expo/React Native client sends a multipart image to an Express + TypeScript API, which normalizes it with multer and sharp, calls Gemini for structured analysis, validates the output with zod, and persists results in MongoDB with images in S3-compatible object storage. JWT auth with bcrypt; six versioned route modules under /api/v1.
Key features
- Analyze-and-save pipeline returning identity, traits, habitat, care, and safety metadata
- Personal collections plus a public explore feed with keyword, tag, and condition-term search
- Cavite-localized enrichment flagging plants known to grow in the region
- Consistent status, empty, and progress UI states across the mobile client
- Java-to-TypeScript rewrite tracked against a 17-capability feature-parity matrix
- Account lifecycle including profile management and confirmed account deletion
Outcomes
6
versioned REST route modules
17
capabilities tracked through the migration
3
implementations — RN client, TS API, legacy Java
Stack
React NativeExpoTypeScriptExpressMongoDBGemini APIJWT