Flipfile: organizing photos, not freeing up space
Flipfile is simple to use. You go through your photos one at a time. Swipe up to drop one in the trash, swipe down to file it into an album.
It started out as Swipe. The first commit described it as a swipe-to-clean photo app: swipe around, clean up your photos. Seven weeks in, the first paragraph of the product doc said something else: help people organize their photo library, not free up storage. Deleting is just one possible outcome of organizing, and freed space is a side effect of deleting. Neither one is the point of the product.
Why it doesn't say "Freed 3.2 GB"
In one feature discussion, the agent's suggestions kept drifting toward "freeing space": show GB, add a view sorted by file size. I turned them down one by one.
The reason: once you show GB, the product slides toward "cleaning". People go hunting for the biggest videos to delete instead of looking through every photo. The end state of organizing is that every photo has a place: in an album, in the trash, or in "Unsorted". There is no fourth place. To protect that, I later even removed two swipe-down modes, "mark as system favorite" and "just confirm keep". They moved a photo out of "Unsorted" without putting it in any album, so the photo ended up nowhere.
In the same discussion I also turned down asking for ratings. Seven weeks later I changed my mind. Every store had 0 ratings, a search for "swipe" didn't place it in the top 190, and ratings feed into ranking. So now it uses only the system rating prompt, asks once after you finish a batch with 20 or more photos filed in total, and at most once per version.
A few key decisions
- No network at all. No server, no account, no analytics, no ads. Only the one-time purchase goes through the App Store. The cost is that the free allowance can't sync across devices: get a new phone and the count starts over. I accept that, because closing that gap would mean adding iCloud storage, which gives an offline app network behavior.
- Deletion goes through the system API. Photos go to "Recently Deleted" and can be recovered for 30 days. Early on the app showed its own confirmation dialog stacked on top of the system one, and in the system dialog the safe option is labeled "Don't Allow", which is easy to tap by mistake. So I removed mine.
- Saves are instant, deletes pile up. Swiping down into an album takes effect right away. Photos you swipe up go to the trash first, where you can change your mind. In the trash you tap "Delete N photos" once, and the system shows one confirmation.
- The free allowance is stored in the Keychain. If it lived in regular settings, deleting and reinstalling the app would reset it, and the paywall would be meaningless. Deletes you cancel in the system dialog don't count.
- One-time purchase, with Family Sharing. No subscription.
The free allowance changed once
At first only deletes counted toward the free allowance. Filing into albums was unlimited. That meant people who mostly filed photos into albums never hit the paywall, and filing into albums is the core action of the app. Starting with 1.8.0, the first 100 photos filed or deleted, combined, are free. Undoing a filing gives one back. Moving a photo from one album to another doesn't count. Photos filed before the update aren't counted retroactively, so nobody hits the wall right after updating.
The rename
Nobody could find the name Swipe in the store. A search for "swipe" didn't place it in the top 190 in the US, China, the UK or Japan. Dozens of apps have Swipe in their names, and the biggest one has more than 90,000 ratings in the US store. In 1.6.0 I renamed it Flipfile, a word that belongs only to it. The repository, the Bundle ID and the in-app purchases stayed the same. Only the name people see changed.
Later the English store name changed again, to Flipfile: Swipe Photo Cleaner. In the US store, for organizing searches like "organize photos" and "sort photos", the top swipe app in the category is called Slidebox: Photo Cleaner App. With only organizing words in its name, Flipfile ranked for just one term, "sort photos". The store name gave ground to search. The decisions inside the app didn't change: no GB, and deletes are reported as a photo count only.
Mistakes along the way
- Approved, then stuck for a day. 1.1.0 used the default "Manual" release option, and after it was approved nobody pressed release. The lesson went into the rules of the Swipe repository, but only there. A week later Xiaodou Ledger hit the same problem. Only after that did I set up a knowledge base shared by all my apps, with every version set to release automatically once approved.
- "Change it based on theory first" broke things twice. I went through several rounds of tuning the swipe gesture. Twice the agent changed things based on reasoning: manually adding initial velocity to the spring, and making the card fly off in the direction you let go. Both times it felt worse. After that I set a rule: first write down the invariants for all four directions, and for any change involving direction or arc, verify it by replaying drag traces recorded on a real device. No more changes based on theory alone.
- A test config that only looked useful. A StoreKit configuration file only takes effect through a scheme's test action, and the repository had no shared scheme. It sat in the repo for two days, looking like coverage while never actually being used. I deleted it once I found out.
Deleting all the tests
At the end of August I deleted every test in this project. My reasoning: if you can write a correct test, you've already figured out how the code should be written, and code you've thought through that far shouldn't be wrong in the first place. What replaced them is "run it and look": every change gets exercised by hand in the simulator or on a real device, with screenshots as evidence.
That has a cost, and the commit history says so. Earlier that same day there had been a geometry bug in the fan layout that you couldn't see by eye. It was found by running the same assertion for every possible number of albums.
Now
181 commits, 157 of them made together with Claude. Submitting for review is also mostly done by the agent through the App Store Connect API. The exception is when the China ICP filing (备案) details don't match, and someone has to click a confirmation once on the website. The current version is 1.8.0. The app is in seven languages, the store listing in 13, and it's available in 175 countries and regions.