InboxFlow
InboxFlow — a mobile email management app that helps users clean, organize, and automate their inbox with smart sender grouping, swipe gestures, and automation rules.

Technologies Used
Project Overview
InboxFlow is a full-stack mobile application built to tackle inbox overload. It connects to Gmail via OAuth2, syncs email data to a local backend, and provides a fast, intuitive interface for processing hundreds of emails in seconds.
Users can group all mail from one sender into "Bundles", freeze unwanted senders with one tap (auto-deletes future mail), snooze emails for later, and set up automation rules that run silently in the background. The app includes weekly analytics, real-time search, multi-language support (EN / RO / RU), and an offline mode that shows cached emails when there's no connection.
Key Features
Challenges
Performance degraded noticeably on inboxes with 1 000+ emails. Fixed by extracting memoized row components (React.memo + useCallback), enabling FlatList windowing, and adding a module-level avatar cache to prevent re-fetching on scroll remount. The bundles unread badge was always showing 50 — equal to the page limit — because the count was derived from paginated results. Replaced with a dedicated COUNT DISTINCT SQL endpoint that returns the real number regardless of pagination. "Mark all as read" caused a network timeout on large inboxes. The root cause was a synchronous Gmail API call that fetched thousands of records before responding. Fixed by moving the Gmail sync to a fire-and-forget setImmediate block so the HTTP response returns immediately after the database update. Automation rule conditions were stored as DataTypes.JSON in Sequelize, but certain database configurations returned them as raw strings. This silently broke the unfreeze feature. Fixed with a defensive parseArr() helper that handles both parsed arrays and JSON strings.
Results
Smooth 60 fps scrolling on lists with 1 000+ emails after FlatList optimization Bundles badge accuracy: from always-wrong "50" → exact real-time count "Mark all read" response time: from timeout error → instant (< 200 ms) Avatar load on scroll: near-zero re-fetches thanks to module-level cache
Ready to build something
extraordinary?
Tell us about your project. We'll get back to you within 24 hours with a clear plan and honest timeline.