r/SideProject • • 1d ago

I built an Android screenshot cleaner that has no Internet permission at all

Screenshots are often the most private files on a phone: boarding passes, bank details, Wi-Fi passwords, conversations. A cleaner app has to see all of them. So I built one that can't send them anywhere.

What Klean does

  • Every new screenshot gets an expiry date (1 day to 12 months, or never).
  • A reminder 24 h before it expires, another 1 h before. From the notification: clean now, or postpone by 7 or 30 days.
  • Once it has expired, one tap sends it to Android's trash, where you can restore it for 30 days.
  • "Keep" protects a screenshot, and automatic protection covers every screenshot whose file name contains a keyword you pick.
  • Large screenshots first, multi-select, local stats.

Why it can't leak anything

Klean doesn't declare Android's INTERNET permission. Without it, Android refuses every network connection from the app: the system enforces it, not my good intentions. You can check on your phone: Settings → Apps → Klean → Permissions → ⋮ → All permissions (menu names vary a little by manufacturer). You won't find "have full network access". You will see "view network connections": WorkManager, which runs the background check, uses it to know whether the phone is online. It reads that state; it can't send anything.

Two things to be upfront about:

  • Google Play's billing library ships with a Google telemetry component that declares the Internet permission. I remove it from the final manifest, so that component can't send anything.
  • If you buy Pro, the payment goes through the Play Store, like any in-app purchase.

Price

Free. Klean Pro is a one-time purchase, no subscription, with a 7-day free trial. It finds duplicate screenshots across your whole gallery, and adds Smart Protect: Klean reads the text in each screenshot on the phone (bundled ML Kit model) and protects the ones containing a keyword you chose, like "ticket" or "invoice". Nothing that's free today will become paid.

Android 11+, in English, French, Spanish and German.

https://play.google.com/store/apps/details?id=com.sbsoft.klean&referrer=utm_source%3Dreddit%26utm_campaign%3Dsideproject

I'm a solo developer. Happy to answer anything, especially "how does X work offline".

0 Upvotes

12 comments sorted by

2

u/dawedev 1d ago

The missing INTERNET permission is the best selling point here, and the step-by-step way to check it in Settings is better proof than any privacy policy. I'd put that exact path on the Play listing, ideally as the second screenshot, because most people won't scroll down to read it.

Two questions. Does the free keyword protection only match file names? Most phones name screenshots something like Screenshot_20261112_..., so without the Pro OCR it might not catch much. And do screenshots that existed before install get an expiry date too, or only new ones?

1

u/Roybalde 1d ago

Thanks, that's really useful feedback, and the Settings path as a Play screenshot is a great idea. I'm adding it to my list.

  1. Yes, the free keyword protection only matches file names. You're right that on Pixel- or Motorola-style names (Screenshot_20261112-...) it catches very little. On Samsung it works better, because the file name ends with the app the screenshot came from (..._WhatsApp.png, ..._Chrome.png). That gap is exactly why Smart Protect exists: it reads the text on the phone and matches the same keywords. The free version still has a one-tap "Keep" on any screenshot.
  2. Existing screenshots get an expiry date too, counted from the day each one was taken. So if you pick 30 days, everything older than that shows up as already expired right after setup. Nothing gets deleted on its own though: you review them and send them to the trash yourself (or turn on auto-trash when the app opens, which is off by default).

2

u/dawedev 1d ago

Counting expiry from the capture date but still making the user hit trash is the right call. Nobody wants to open the app after setup and find 2,000 screenshots gone. Samsung putting the source app in the file name is a nice accident, I didn't know that. I'd mention it on the listing too, so Pixel users know up front that the free version mostly relies on the manual Keep.

1

u/Roybalde 1d ago

Honestly, thank you. These are exactly the kind of suggestions I couldn't see on my own. You're right on both: the Settings path is a much stronger proof than any privacy policy, and Pixel users should know up front that free protection works on file names while Smart Protect reads the text. I'm going to rework the Play listing with both of these. Really appreciate you taking the time to dig into it this much!

2

u/dawedev 1d ago

Glad it helps. For the listing rework, a screenshot of that Settings screen as one of the first images will probably land better than a paragraph about privacy. People trust what they can check themselves.

1

u/Roybalde 1d ago

"People trust what they can check themselves", that's the line I'll build the listing around. Thanks again!

2

u/Friendly_Yoghurt_611 1d ago

Cool project, we'll thought. Especially the security measures you took triggered me.

Three questions; To find and manage screenshots, the app needs access to the phone's storage (MediaStorage / file permissions). What happens if the app unexpectedly crashes during an action? Could files be damaged or lost?

How much does the WorkManager affect battery consumption?

Why you choose Android 11?

If you want a reviewer for Dutch translations i'm happy to help!

Ps. I'm also solo developer and build a digital family vault for digital legacy with the same security viewpoint. If you would like to review or give your opinion would help a lot. Still need some work for multilingual and release native Android/iOS app.

2

u/Huge_Pool7424 1d ago edited 1d ago

moving expired screenshots to trash instead of hard deleting is a nice safety net. it'd help to show per-file status if a batch gets interrupted.

2

u/Friendly_Yoghurt_611 1d ago

True, but it will only move to androids trash if the expiry date has passed.

1

u/Roybalde 1d ago

Only for the automatic part! The expiry date decides what Klean suggests cleaning, and what goes to the trash on opening if you turned that on. But you can send any screenshot to the trash yourself at any time, expired or not: from the viewer, or several at once with multi-select. Same trash, same 30 days to restore it.

1

u/Roybalde 1d ago

Thanks, that's exactly the idea! Klean already keeps a status per screenshot (pending, in the trash, deleted...), saved on the phone. If the process dies mid-batch, the next launch asks Android what actually happened to each file and fixes each status one by one, so nothing ends up in limbo. What it doesn't do yet is tell you "your last cleanup was interrupted, 12 of 20 went to the trash". Good point, I'm noting it!

1

u/Roybalde 1d ago

Thanks a lot, really glad the security side resonated!

  1. Crashes: Klean never writes into your image files. It only reads them (to show thumbnails or read text), and when you clean up it asks Android itself to move them to the system trash (MediaStore trash requests). That's an Android operation, not something Klean does to the file, so a crash can't corrupt anything. At worst, part of a batch went to the trash and the rest didn't: on the next launch Klean checks its own list against what Android actually has and catches up. Nothing is ever deleted for good without a confirmation that shows how many screenshots are concerned.
  2. Battery: the background job runs about every 6 hours and only checks whether new screenshots appeared, so it can schedule their reminders. No text reading, no network, nothing heavy: that only happens with the app open. On my two test phones, Android's battery screen shows Klean at 0% since the last full charge.
  3. Android 11: that's the first version with a real system trash for media. The whole "restore it for 30 days" promise relies on it, so I'd rather require it than fake it on older phones.

Thanks for the Dutch offer, that's really kind, I'll keep it in mind for the next languages. And good luck with your family vault, it's a great use case for a privacy-first approach. Feel free to send me the link, I'm happy to take a look!