May 2024 - Jul 2026 • MOBILE APP / WEB APP
Mobile app for reddit post with enhanced UI/UX, infinite scroll.
Official Reddit clients are heavy, ad-laden, and offer little control over feed behavior, image quality, or session persistence; there was no lightweight, cross-platform Reddit client that handled infinite scroll, gallery posts, and search correctly while staying fast on mobile data.
Built and shipped a cross-platform (Android/iOS/desktop/web) Flutter Reddit client with cookie-based auth, true infinite-scroll feeds, site-wide search with sort-by, and swipeable gallery posts; a later audit pass found and fixed 10+ concrete bugs including a broken pagination model that was losing already-loaded posts, a dropped session-cookie rotation bug, N+1 author-avatar requests on every feed load, and full-resolution image decoding that was inflating memory use well beyond what was ever rendered on screen.
Reddy is a self-built Reddit client written in Flutter, targeting Android, iOS, Windows, Linux, and web from a single codebase. Instead of Reddit's OAuth API, it authenticates via a WebView login flow and persists the resulting session cookies locally, which lets the app read a real logged-in feed without needing an approved API app. State management runs on GetX (RxList/Rx observables), with Hive used for structured local storage (search history) and SharedPreferences for auth session and settings.
The app went through two build phases: an initial feature build (feed, subreddit browsing, search, comments, video/gallery playback), followed by a dedicated audit-and-fix pass that hunted down and resolved a set of real correctness and performance bugs that had shipped silently.
Key technical achievements include:
RxList<RedditPostModel> in HomeController, a scroll listener that prefetches ~800px before the bottom, and a real SliverList.builder (swapped out from a non-lazy ListView nested in a CustomScrollView) for genuinely lazy rendering.AuthController + RedditAuthService backed by SharedPreferences that reloads cookies before first frame, added a "Re-authenticate" flow that clears the cookie jar to support account switching, and centralized 401 handling so an expired session cleanly routes back to login instead of leaving the app broken.is_gallery + media_metadata/gallery_data) weren't parsed at all, falling back to a raw URL. Added parsing into an ordered galleryImages list and a swipeable PageView carousel with a "1/N" counter.response.headers['Cookie'] (a request header) instead of set-cookie (the actual response header), so Reddit's rotated session cookies were never being persisted — fixed and wired through AuthController.updateCookie.Image.network with no disk cache, and even after switching to cached_network_image, images were decoded at full source resolution regardless of display size (a 4000×3000 image shown in a 400px card decoded ~10x more pixels than were ever rendered). Set memCacheWidth/memCacheHeight based on actual on-screen size × device pixel ratio, and wrapped feed items in RepaintBoundary so scrolling no longer forces every post card to repaint together.r/<subreddit> shorthand versus a general query, runs general queries against /search.json with the same infinite-scroll feed UI, and added a Best/Hot/New/Top/Rising sort menu — transparently remapping sort values Reddit doesn't actually support on certain endpoints (e.g. controversial isn't valid on /search.json and is mapped to top; best isn't a real per-subreddit listing and is mapped to hot).beeceptor.com webhook; deleted along with other logging that leaked cookies/response bodies to the console.The result is a Reddit client that behaves closer to reddit.com's own search/sort semantics than a naive wrapper, with feed scrolling, image memory, and session handling tuned for actual mobile constraints rather than desktop-first defaults.