Unmark: we erase stuff that big corpos won't.
In recent years, generative AI's have been on a high. Misinformation on the internet have skyrocketed also. To combat this, companies like Google, OpenAI, xAI and more have put watermarks on the images they generate. Some people (like me) do not like this. This tool lets you paint over a watermark and erase it, right on your phone. You select the mark yourself, there's no AI or model involved, just a small on-device algorithm (see How it works).
Unmark does NOT:
- Circumvent copy protection. Invisible pixel watermarks like SynthID are not removed: a lot of social media websites can still detect whether an image is AI-generated regardless of what Unmark does. Unmark removes the visible watermark from the photo's pixels and strips embedded metadata tags (EXIF, XMP, possible C2PA), it does not touch invisible pixel-level watermarking.
- Upload your photos anywhere, nor collect your data
- Require an account or internet connection, everything is processed entirely on your device. You could disconnect your internet and the app would still work.
- On-device watermark/object removal (no cloud upload, no network permission)
- Manual brush selection tool with adjustable brush size
- Nearest-fill + smoothing inpainting (no AI/ML model, no native code)
- Undo last stroke / reset mask, non-destructive editing (original photo is never overwritten)
- Save to gallery or share result directly
- Automatic metadata stripping (EXIF, XMP, possible C2PA content credentials) on save, with an on-pick scan showing you what was found before it's gone
- No ads, no trackers, no analytics
- Batch processing: draw one watermark region once, apply it to many photos at once
Generative AI is the big bullet point here to shit on, on this repo. I will verify that the majority of the code in repo has been generated by AI. I do not hate AI companies but i hate some of their practices. They will still try to advertise their product even if you pay for their services. Social media apps already have features like this to circumvent AI images and detect them. I didn't make this because i want to spread misinformation, i only made this because i do not like watermarks.
Available on F-Droid. New tagged releases are
picked up and built automatically, no manual submission needed per version. See
fdroid/ for how the submission itself was set up.
Tagged versions (e.g. v0.2.2) get their own dedicated, signed release on the
Releases page. CI signs with a project-only key
kept as GitHub Actions secrets, never committed to this repo. Every push also builds an APK for
verification, downloadable from the corresponding Actions
run as a build artifact, but that one isn't published as a release.
Requirements:
- Android Studio Koala (2024.1) or newer
- JDK 17
- Android SDK 29–34
git clone https://github.com/EmreO33/unmark.git
cd unmark
./gradlew assembleDebugOutput APK: app/build/outputs/apk/debug/. Building assembleRelease yourself produces an unsigned
APK unless you provide your own keystore via the UNMARK_RELEASE_KEYSTORE_* environment variables
(see app/build.gradle.kts), since the project's own release key isn't public.
No reproducible-build setup yet, so the release APK signature isn't independently verifiable against the source. The GitHub Actions workflow that builds and signs it is public, so you can compare its build log against the source at the same commit.
Unmark uses a small, pure-Kotlin inpainting algorithm: there's no AI/ML model, no bundled weights,
and no native (C/C++) code. See Inpainter.kt:
- Nearest-fill: a multi-source breadth-first search fills every pixel you painted over with the color of the closest pixel you didn't paint over.
- Smoothing: a few averaging passes over just the painted region soften the hard edges that nearest-fill leaves behind.
It won't match a proper diffusion/inpainting model on large or complex regions, but it's fast, has zero dependencies, and works well for small marks like corner watermarks and logos on reasonably textured backgrounds.
Metadata stripping works differently, and needs no algorithm at all: Unmark never copies the
original file's bytes. It decodes the picked photo to raw pixels and, on save, re-encodes a brand
new PNG from those pixels (see ImageUtils.kt
and ImageStore.kt). EXIF, XMP, IPTC, and
C2PA data live in the original container, not in pixel data, so none of it survives that round trip.
MetadataInspector.kt scans the
original file when you pick it purely to show you what would have been there, it doesn't drive a
separate removal step because there's nothing left to remove by the time you save.
Unmark requests no permissions at all. Picking a photo goes through the system Photo Picker
(ActivityResultContracts.PickVisualMedia), and saving goes through MediaStore with scoped
storage, both work without any READ_MEDIA_IMAGES/WRITE_EXTERNAL_STORAGE grant on Android 10+
(minSdk 29). No network permission is requested or used; all processing happens on-device.
Unmark does not collect, transmit, or store any personal data. All processing happens locally on your device. See PRIVACY.md for the full policy.
- Language: Kotlin
- UI: Jetpack Compose (Material 3)
- Image processing: custom, pure-Kotlin (no OpenCV, no TensorFlow Lite, no native code)
- Min SDK: 29 (Android 10), Target SDK: 34
Does Unmark remove invisible AI watermarks like SynthID? For now, No. Unmark cannot remove invisible AI watermarks. This is because Google (Maintainer of SynthID) puts random invisible pixels to throw anyone of from trying to do this. This can be possible with AI models: (https://github.com/wiltodelta/remove-ai-watermarks) but an android phone isn't powerful enough to run a model like this and someone hasn't trained a model for this. If someone did train a AI model that could remove invisible pixels and it would be lightweight enough to run on a phone, I would be glad to add that feature.
Is using this legal? Yes, for photos you have the rights to, which is the whole point: editing a photo you generated or own is your call to make. Unmark doesn't circumvent any copy protection or DRM.
Why isn't this on Google Play? Due to the nature of it being FOSS, I didn't release it on Google Play yet. Even if I do, I promise to not add, Ads or Trackers.
Is it on F-Droid yet? Yes. See Installation → F-Droid.
Does it need internet access? No, and it can't ask for it: Unmark has no network permission at all. Every step, picking a photo, erasing, saving, runs entirely on your device.
Will it work on my phone? If it's running Android 10 (API 29) or newer, yes. Older devices aren't supported (see Permissions for why that specific cutoff was chosen).
Can it process a whole folder of photos at once? Yes, use the hamburger menu's Batch process option: pick several photos, drag one box around the watermark on a preview of the first photo, and it erases that same area from every photo in the batch and saves them all. Best when every photo in the batch shares the same watermark placement, like a set of exports from the same app or site.
Can it find watermarks automatically? No, Unmark doesn't try to detect or recognize watermarks. You always tell it where to erase, either by painting over a mark by hand, or, for batches, by drawing one box that's reused across every photo. That's a deliberate choice: automatic guesses at watermark position were unreliable in practice (too small, wrong spot) and gave a false sense of "it just works" when the brush is what's actually dependable.
Why does the erased area look a bit smudgy on busy backgrounds? Unmark uses a lightweight nearest-fill and smoothing algorithm, not an AI model, see How it works for the tradeoff that comes with keeping the app small and dependency-free. It works best on small marks over fairly uniform backgrounds.
Does Unmark collect any data or analytics? No. See Privacy and PRIVACY.md.
Found a bug or want a feature? Open an issue. See Contributing below.
Contributions are welcome! Please read CONTRIBUTING.md before opening a PR.
- Bug reports / feature requests: Issues
- Translations: not set up yet
This project is licensed under GPL-3.0-or-later, see LICENSE for details.
No third-party or non-free components are bundled (no ML model weights, no proprietary libraries). All dependencies are standard AndroidX/Jetpack libraries (Apache-2.0), and the app icon is an original vector drawable in this repo.
- Built with Jetpack Compose and AndroidX libraries
- Metadata stripping was inspired by remove-ai-watermarks, a much more capable desktop/CLI tool that also handles invisible watermark regeneration and video, both out of scope for a phone app (the invisible-watermark removal there needs a CUDA GPU)
