Case Study · Aug 2024 – Apr 2026
A gallery cleaning app, designed around cognitive friction — not storage.
Role
Product & UX Designer
Timeline
~23 working days · 20 months
Platform
Android · Flutter
Status
Submitted to Google Play
A gallery cleaning app that tried to make an unpleasant chore feel fast, organized, and — on a good day — satisfying.
This wasn’t about “I want to create an app.” This began when I found myself staring at a phone loaded with over 9,000 photos and experiencing the sinking sensation each time I clicked on the photo gallery.
While the most apparent solution was “I have a storage issue,” after some ineffective manual sorting processes, a new perspective revealed itself – the issue was never storage but rather cognitive friction.
01
Every item required me to decide keep or delete. That’s 9,000 decisions for me! It felt was paralyzing. After a dozen items, I’d quit.
02
Even after 20 minutes, my gallery appeared the same. There was no feedback loop.
03
The phone organizes the media items based on where they come from (Camera, Screenshots, WhatsApp). But we people don’t think in folders, we think in time: “last month,” “stuff from 2019.”
04
I’d pick-up my phone the next day and there’d be no memory of what items I had already reviewed. It was like I had to start from scratch every time.
I wasn’t aiming to build these as features. My aim was to eliminate these friction points. The features came developed with time.
I ran a Google Forms survey from Aug 4 to Aug 21, 2024. There were 23 participants, who mostly comprised ages 18 to 34 years, and were tech-savvy. 30% of these identified as neurodivergent.
I designed this survey with one constraint that being — the swipe mechanic was deliberately hidden. The questions revolved around the problems faced and desired features, not solutions. My goal was to validate the problem I was facing, not seek answers.
| TOP CHALLENGE | RESPONDENTS |
|---|---|
| Fear of losing important memories | 78% |
| Takes too much time | 73% |
| Difficulty deciding what to delete | 65% |
| Emotional attachment to photos | 60% |
| Not enough storage space | 60% |
The survey results reframed everything. Before the survey, MediaMop appeared to be a storage utility tool. After it, I could see that my product was clearly an emotional support tool for a something people want to do but avoid because of the cognitive load. The top 3 pain points were all psychological — fear, time, and indecision. Storage surprisingly ranked fourth.
Key insight
91% participants desired automatic organization. Only 47% of the participants cared about progress tracking but I kept it as a core feature anyway, because it solved that “no sense of progress” problem I had experienced first-hand. Sometimes design should overrule data.
“Swipe option like tinder.”
This is what one wrote unprompted! My swipe-mechanic feature had not even been mentioned in the survey, and somebody came up with the idea from the exact same problem. Now that’s what I’d call convergent design thinking.
I created these on the fly by analyzing the survey response. Not just for fluff, but as tools to challenge each subsequent decision.
24 · Freelance Designer · UK
“I would like my gallery as clean and organized as my desk.”
Troubled with decision fatigue, procrastination and the overwhelm due to sheer size. Needs low-friction entry point and a way to not have to decide everything right-now.
34 · Marketing Manager · USA
“I need something that is quick, doesn’t take too much time and won’t make me feel like I’m losing memories.”
Cleans while commuting; needs fast sessions, instant app startup, and progress retained when the app restarts.
Decision fatigue was the critical insight generated by Noah’s persona and formed the basis of many subsequent decisions, such as the Skip button, progress persistence, and visual progress representation. Bianca’s commute scenario shaped the framework: sessions must be interruptible, startup must be instant, and the feedback must be immediate.
At its heart, MediaMop is a swipe-based decision interface — keep, delete, skip. Three reasons it just fit:
01
The problem wasn’t effort, it was decision fatigue.
02
Completion perception generates motivation.
03
Structure must mimic mental models.
04
Design interactions intentionally emotional.
05
Resistance can develop even in a two-second delay.
On naming: MediaMop, not SwipeSweep
I brainstormed dozens of swipe-centric names like SwipeSweep, SwipeClean, SwipeAway. In the end, I settled on the one name that didn’t mention swiping. Instead I used “Swipe to Sweep” as the tagline. Why? Swiping is just one simple, effective cleaning mechanic, it’s not a “storage optimization engine.” So if the interaction ever changes, the name still works without limiting possibilities. Someday if another mechanic solves this problem better, it should absolutely be explored.
The swipe screen was painted in my mind even before I opened Figma: a row of thumbnails at the top, large preview in the middle covering most of the screen, and the row of action buttons at the bottom.
Colour semantics surprisingly took way longer. After three failed iterations, I settled into: Delete = error red, Keep = primary (brand colour), Undo/Skip = tertiary (neutral). Now that the semantics were clear, translating them into something consistent took another series of iterations.
Another challenge was video support. You can’t judge a video from a thumbnail. To make the video review feel more native, I incorporated several features like auto-play on open, tap-to-toggle controls, auto-hide after three seconds. These are the patterns we are already familiar from Instagram and TikTok. So no learning curve there.
Noah’s decision-fatigue birthed three features:
Somewhere along the way during the design phase, I realized device folders don’t match how users think about their media. Nobody with 9,000 photos is thinking “I need to clean the Camera folder.” We are thinking “I need to clean up everything from last year.”
So I added views. Like filters but better. Group By Month / Year / Type. These would be virtual albums that don’t exist on the device. Now the users can slice their gallery by how they think, not how the device stores files.
As a developer, I knew it would be architecturally demanding; but as a designer, I was beginning to see the interactivity challenge. The survey’s 91% preference for automatic organization brought me here. I just hadn’t seen it yet.
I built the entire interaction flow against mock data before touching any device API. This was intentionally done to validate the UX independent of platform complexity. When real-data problems emerged later, they were integration problems, not design problems. The interaction model was already proven.
This will become a standard for my every future project.
Transition from mocks to gallery integration led to the most intensive day in the development process, when almost 5,500 LOC was added in one sitting. Android 13+ specific permissions for media access, async thumbnails loading, media file size unavailable in media API. None of this could be foreseen in mocks.
One thing was clear and non-negotiable: privacy-first. All media processing happens on-device. No cloud uploads, no external APIs.
Following the seven-month break (§07), I came back to test on my own collection of 9,000 photos. Opening the album list took 2–5 seconds. That clearly broke the “start cleaning right away” promise from my very first design brief.
The problem stemmed from the architecture: The app fetched all media assets for every album, doing synchronous disk I/O on the UI thread. The solution was a light-weight AlbumSummary model for the album list view, with the full item loaded only when a user entered an album. Later, a persistent JSON cache took the same principle further.
2–5 s
→
~ 30 s
→
This was not about optimizing the server. It was about fixing the user experience. The problem was not “how can we speed up the process?” It was “which delay specifically makes the user lose trust, and how do we get rid of it?”
Cut after building
Features sometimes have to be built before you can tell whether they earn their place. Every removal below was a small lesson in restraint.
The visual identity didn’t arrive through planning. It arrived through iteration across multiple sessions — and, critically, through living with an imperfect version long enough to feel what was wrong.
Ghibli Green
Forest & Mint
Cerulean Clarity
Gilded Midnight
Premium Flat
Fiery Ocean
I had to see each one in the real product to know it wasn’t right. Sketches and colour boards weren’t enough.
In an earlier phase, I explored three visual paradigms: glassmorphic (frosted glass), neumorphic (soft shadows), and premium flat (solid fills, subtle outlines).
Glassmorphism and neumorphism looked impressive in isolation. Across the full app, they muddied tap targets and broke visual hierarchy.
Applications like Steam had taught me that choosing aesthetics for portfolio appeal over user clarity is a trap.
The first Premium Flat pass put Mahogany Red in the primary slot — bold, fiery, distinctive. It felt right on day one. A week of living with it made something quieter clear: a dramatic red as the dominant surface colour made the app feel loud and warning-like, when cleaning should feel calm and considered. Red is the language of stop, and the whole app was asking users to go.
The fix wasn’t a new palette. It was a rebalance of the same three colours into different roles:
I saved the mood board as ocean fire.png and started calling the palette Fiery Ocean — an ocean of navy lit by warm fire and gilded light. Same ingredients as Phase 4, different recipe. That’s what shipped.
Between June 2025 and January 2026, the project sat untouched. My day job was 10–12 hour days, six days a week. When I came back, something had shifted — the time away had clarified my priorities. Ten days of focused work after the pause produced more than the first three days combined. Not every gap is wasted.
The album list fix introduced a brief loading state when entering an album. I accepted that trade-off because tapping an album already implies “loading its contents” — the delay maps to user expectations, so it reads as natural rather than broken.
After rapid feature development and a visual refactor, an entire day (~9 hours, ~6,500 lines touched) went to stabilization — virtual albums showing empty, doubled item counts, premature “Done” labels, sizes showing as 0B. The cost of fixing regressions late always exceeds the cost of testing incrementally.
Four days before the intended launch, Google rejected the app: MANAGE_EXTERNAL_STORAGE was “not a core feature.” The permission was a legacy leftover from month one, never cleaned up. The fix was one line; the lesson was about audit discipline.
● v1.0.0 + 3 · Submitted to Google Play
MediaMop v1.0.0+3 runs on my own 9,000-item gallery without the friction that started the project. Album lists open under 100 ms, app restart takes 400 ms, progress persists across sessions, and the swipe loop feels immediate.
What works
What could be better
There’s a strong temptation to keep building — more features, more refinement, more polish. But that would violate a principle that shaped the whole project:
Make it exist first. Then make it better.
This version is the “exist” milestone. Future iterations will focus on:
For now, focus is shifting to a new project, with continued iteration on MediaMop in parallel.
01
“Storage” was the surface. “Fear, time, and indecision” was the reality. Surveys that uncover the real problem are worth more than surveys that confirm your solution.
02
Validating the interaction on mocks, before device APIs, meant real-data problems were integration problems — not design problems.
03
A five-second load broke a design promise. The fix wasn’t “make it fast” — it was “identify the specific delay that erodes trust, and eliminate that one.”
04
Noah’s decision fatigue directly produced the skip button, ID-based persistence, and visible completion states. Bianca’s commute produced short interruptible sessions and fast startup. The features came from the personas, not from opinion.
05
The Stats screen’s storage breakdown made sense on paper, added clutter in practice, and got deleted. Simplification is a skill only reachable after complexity.
06
Glassmorphism and neumorphism looked great in isolation and hurt usability across the app. Portfolio aesthetics are not the same as user clarity.
07
Storing decisions by ID instead of index cost a little storage. Losing ten minutes of a user’s work costs their trust permanently. The asymmetry makes the choice obvious.
08
A seven-month pause I didn’t want turned into unintentional incubation. Time away from a project isn’t the same as time lost to it.
Product and UX decisions were mine; development was done collaboratively with another.