Apps | Sayv Ilahsiav

Apps | Sayv Ilahsiav

  • About
  • Apps
    • MediaMop
  • Contact

Case Study · Aug 2024 – Apr 2026

MediaMop

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.

Table Of Contents
  1. 01 / The Problem
  2. 02 / Research & Insights
  3. 03 / Defining the Solution
  4. 04 / Experience Design
  5. 05 / Building & Iteration
  6. 06 / Design Evolution
  7. 07 / Challenges & Trade-offs
  8. 08 / Outcome
  9. 09 / What's Next
  10. 10 / Key Learnings

01 / The Problem

It wasn’t a storage problem.

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

Decision fatigue

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

No sense of progress

Even after 20 minutes, my gallery appeared the same. There was no feedback loop.

03

Wrong mental model

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

Start-over anxiety

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.

02 / Research & Insights

Looking for the problem behind the problem.

The Survey (n = 23)

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 CHALLENGERESPONDENTS
Fear of losing important memories78%
Takes too much time73%
Difficulty deciding what to delete65%
Emotional attachment to photos60%
Not enough storage space60%

Survey responses, August 2024. Multi-select.

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.

The personas

I created these on the fly by analyzing the survey response. Not just for fluff, but as tools to challenge each subsequent decision.

Neurodivergent Noah

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.

Busy Bianca

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.

03 / Defining the Solution

A binary decision, masquerading as a gesture.

At its heart, MediaMop is a  swipe-based decision interface — keep, delete, skip. Three reasons it just fit:

  • Reduced every decision to a binary action.
  • Eliminated multi-step flows (no select → confirm → action).
  • Created momentum by allowing quick judgments. More instinct, less analysis.
  • Raised completion chances by lowering cognitive demand.

Five fundaments that shaped it all

01

Reduce cognitive friction, not just actions.

The problem wasn’t effort, it was decision fatigue.

02

Progress must be visible and persistent.

Completion perception generates motivation.

03

Users think in time, not system folders.

Structure must mimic mental models.

04

Cleaning should feel satisfying, not exhausting.

Design interactions intentionally emotional.

05

Speed is as psychological as it is technical.

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.

04 / Experience Design

Designing for the moment of decision.

4.1 — The principal mechanic

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.

4.2 — Reducing cognitive load

Noah’s decision-fatigue birthed three features:

  • Skip. Progress shouldn’t be blocked by indecision. If you’re not sure, move on.
  • Progress persistence by item ID, not index. In an unlikely event of an app crash or even a manual break, you won’t come back if you find that you’ve lost all your decisions. The engineering expense is negligible; the psychological cost is irrevocable.
  • The Menu screen as intermediary. Users do not jump from the Home page to the Swipe screen. They choose a particular folder. This provides scope: “I’m cleaning this album,” not “I’m cleaning my whole gallery.” A boundary that actually reduces decision fatigue by compartmentalizing the problem.

4.3 — Aligning with the mental models

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.

05 / Building & Iteration

Mock, realize, perform – in that order.

Mock-first validation

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.

Real-device integration

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.

The performance breakthrough

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.

Album list load

2–5 s

→

< 100 ms

App restart (with cache)

~ 30 s

→

~ 400 ms

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?”

Feature removals

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.

  • Search and Favourites were in the original feature list. Neither got built — the Group By system replaced search for most use cases, and the Keep action during swipe replaced Favourites. Two features eliminated by designing better alternatives.
  • Storage breakdown in Stats was built, then removed. ~3 hours of continuous rework: built → redesigned → enhanced → polished → removed the storage breakdown. It sounded valuable in planning; in practice it added visual noise without helping anyone make decisions.
  • Backup and Restore was dropped entirely. A gallery cleaner that also does backups is a different product.
  • Gamification (Duolingo-style badges) was considered early and never pursued. The progress tracking itself became the reward loop. (However, I am re-reconsidering it now.)

06 / Design Evolution

Six themes across months, not hours.

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.

The paradigm detour

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 Fiery Ocean rebalance

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:

  • Deep Navy → primary · calm, structural, the ocean the user sits inside
  • Mahogany Red → secondary · hot, for emphasis and destructive actions
  • Champagne Gold → tertiary · warm counterpoint, highlights and progress
  • Emerald Green → success · completion states, the reward tone

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.

07 / Challenges & Trade-offs

What had to be paid for.

The seven-month gap

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.

Performance vs loading expectations

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.

Regression debt

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.

The Play Store rejection

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.

08 / Outcome

Shipped.

● 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

  • The swipe loop feels fast and low-friction — instinctive judgments, not file management.
  • Progress persistence eliminates start-over anxiety.
  • Virtual albums match how people actually think about their photos.
  • Donation-based, no ads, on-device only — aligned with what respondents explicitly asked for.

What could be better

  • Suggestions system (blurry detection, near-duplicates) designed but not built.
  • Gamification remains at the idea stage.
  • Flows still have friction only real usage will reveal.

09 / What’s Next

Making it exist was the goal.

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:

  • Light gamification to reinforce progress and momentum.
  • Building the Suggestions system (already in the design).
  • Simplifying the flow based on real usage patterns.

For now, focus is shifting to a new project, with continued iteration on MediaMop in parallel.

10 / Key Learnings

What this project taught me.

01

The problem is rarely what you first think it is.

“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

Mock-first UX validation pays dividends later.

Validating the interaction on mocks, before device APIs, meant real-data problems were integration problems — not design problems.

03

Performance is a UX feature, not a technical detail.

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

Personas earn their weight when used as cognitive tools.

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

Some features have to be built to be removed.

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

Visual trends can be a trap.

Glassmorphism and neumorphism looked great in isolation and hurt usability across the app. Portfolio aesthetics are not the same as user clarity.

07

Progress persistence is trust engineering.

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

Gaps aren’t always waste.

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.

  • GitHub
  • LinkedIn
  • WhatsApp
Apps | Sayv Ilahsiav

Apps | Sayv Ilahsiav

Proudly powered by WordPress