GEMINI LABJP
NANOLITE — Nano Banana 2 Lite is here: Google's fastest and most cost-efficient Gemini Image model, made for running lightweight image generation cheaplyOMNIFLASH — Gemini Omni Flash is in public preview, a natively multimodal model that lets enterprises and developers build custom, dynamic video workflowsAGENTS — Managed Agents expand with background: true for async server-side runs and polling, remote MCP server integration, and refreshing credentials across interactionsMEMORY — The Memory Bank IngestEvents API is generally available, decoupling event ingestion from memory generation so you can stream content continuouslyTHROUGHPUT — Provisioned Throughput now lets you submit up to seven pending orders for the same model and regionDEPRECATE — Image generation models shut down on August 17, and the Grok 4.1 family on the Gemini Enterprise Agent Platform on August 20NANOLITE — Nano Banana 2 Lite is here: Google's fastest and most cost-efficient Gemini Image model, made for running lightweight image generation cheaplyOMNIFLASH — Gemini Omni Flash is in public preview, a natively multimodal model that lets enterprises and developers build custom, dynamic video workflowsAGENTS — Managed Agents expand with background: true for async server-side runs and polling, remote MCP server integration, and refreshing credentials across interactionsMEMORY — The Memory Bank IngestEvents API is generally available, decoupling event ingestion from memory generation so you can stream content continuouslyTHROUGHPUT — Provisioned Throughput now lets you submit up to seven pending orders for the same model and regionDEPRECATE — Image generation models shut down on August 17, and the Grok 4.1 family on the Gemini Enterprise Agent Platform on August 20
Articles/Gemini Basics
Gemini Basics/2026-07-18Intermediate

"No Watermark Detected" Doesn't Mean It Isn't AI — The Asymmetry of SynthID

Images generated with Gemini carry a SynthID watermark. But a positive result and a negative result don't carry the same weight, and that asymmetry changes how you should track provenance.

SynthIDImage Generation3ProvenanceGemini75Indie Development12

I opened the asset folder for my wallpaper app and stopped.

Hundreds of PNGs. Some generated with Gemini, some drawn by hand years ago, some assembled from stock pieces and exported. The filenames tell me nothing about which is which.

My first thought was: run them through SynthID. Google's generations carry an invisible watermark, so feeding each file through a detector should sort the pile. I started looking into it — and found that the idea itself was built on a wrong assumption.

The detector doesn't answer in black and white.

The question: can SynthID tell you whether an image came from Gemini?

The short answer is only partly — and the part it covers is the opposite of the part you usually want.

When you're sorting a folder, the answer you're reaching for is usually "this one is not AI-generated." That's exactly the answer SynthID cannot give you. It can speak confidently about "this came from Google AI," and almost nothing else.

Miss that asymmetry, and you'll build a ledger that's quietly wrong.

SynthID lives in the pixels, not in the file's metadata

Two families of provenance mechanisms are in play, and they fail in opposite ways.

MechanismWhere it livesSurvives a screenshot?Information carried
C2PA (Content Credentials)File metadataNoRich — origin, timestamp, edit history
SynthIDThe pixels themselvesYesAlmost none — closer to presence/absence

C2PA is a signed record attached to the file. It can say who made it, when, and with which model — but a re-encode or a screenshot strips it clean.

SynthID embeds a signal into the pixels without visibly changing the image. Screenshot it, push it through social media compression, and the signal travels with the picture. What it can't do is carry detail. Assume the watermark says little beyond "a Google AI watermark is here."

When Google and OpenAI announced a combined two-layer approach in May 2026, this is why: the failure modes complement each other neatly. Strip the C2PA data and SynthID still flags AI origin. Keep the C2PA data and you get the full story. Neither layer alone closes the gap.

Before I understood this split, I assumed a watermark meant the problem was solved end to end. It isn't a container for information. It's a mark.

A positive and a negative are not equal

This is the heart of it. Upload an image to the Gemini app and ask whether it was made with Google AI, and you get a result. The two possible results are not symmetrical.

ResultWhat it establishesWhat it doesn't
Watermark detectedAll or part of the image was created or edited by Google AIWhich model, when, or which region of the image
Watermark not detectedYou can't positively attribute it to Google AIThat it isn't AI-generated at all

A negative leaves at least three live possibilities.

One: a human really did make it. Two: another vendor's AI made it — SynthID is Google's scheme, so other systems' output generally won't carry it. Three: it is Google AI output, but your processing weakened the watermark past the point of detection.

The third one is the trap, because your own pipeline is a plausible route into it.

So detection is strong only when positive. A negative settles nothing. The structure mirrors a medical screen — negative doesn't mean healthy. Collapse that distinction and you end up with a ledger that files unmarked images as "hand-made," with no visible sign that it's wrong.

Which pushed me toward keeping the verdict as three states, not two: confirmed, unknown, and recorded-at-source. Never rounding a negative down to "mine" is the minimum price of working with this system honestly.

How much processing can the watermark survive?

Which makes the third possibility worth pricing out, because it collides directly with your export pipeline.

Pulling together what's publicly described, the tendencies look roughly like this.

OperationWatermark tendency
Moderate JPEG compressionUsually survives
Resizing (down to roughly half)Usually survives
Light cropping, color space conversionUsually survives — the signal is spread across the whole image
Mild brightness/contrast adjustmentUsually survives
Extreme compression, heavy filteringMay weaken or disappear
Style transfer, image-to-image regenerationMay disappear
Content-aware fill and other large repaintsMay disappear

The exact thresholds shift with implementation and environment, so treat none of this as a guarantee. What you can actually establish as an indie developer is narrower: what happens after your pipeline runs.

For my wallpaper app, generated images get resized to each device's native resolution and re-encoded to WebP. Those sit on the survives-usually side of the table. But "usually survives" isn't a promise. My older export script also applied fairly aggressive sharpening and noise reduction for file-size reasons, and the table above says nothing about how that interacts with the signal.

Which is why redesigning your export pipeline around the watermark is the wrong instinct. You'd be bending choices made for image quality and delivery size in service of someone else's verification step. The watermark exists so third parties can check later. It was never meant to be the foundation of your own asset records.

Record it at generation time instead of detecting it later

Stepping back, the "run each file through a detector" plan was solving the problem from the wrong end.

Everything I wanted to know was fully available at generation time. Which model, which prompt, what timestamp. I had thrown that away and was trying to reconstruct it probabilistically afterward. I was handing a deterministic fact to a statistical mechanism. Wrong direction.

The minimum fix is a sidecar JSON written next to every generated file.

import hashlib
import json
from datetime import datetime, timezone
from pathlib import Path
 
MODEL_ID = "gemini-3.1-flash-lite-image"  # use the actual model ID you generated with
 
def write_sidecar(image_path: Path, prompt: str, model_id: str = MODEL_ID) -> Path:
    """Drop a provenance record beside the image. Call it right after generation."""
    image_bytes = image_path.read_bytes()
 
    record = {
        "file": image_path.name,
        # lets you verify later that the bytes are the same ones you generated
        "sha256": hashlib.sha256(image_bytes).hexdigest(),
        # hash, not the full prompt — store the text separately if you need it
        "prompt_sha256": hashlib.sha256(prompt.encode("utf-8")).hexdigest(),
        "model_id": model_id,
        "generated_at": datetime.now(timezone.utc).isoformat(),
        # three states, so a negative never gets rounded down to "mine"
        "origin": "confirmed_generated",
    }
 
    sidecar = image_path.with_suffix(image_path.suffix + ".json")
    sidecar.write_text(json.dumps(record, ensure_ascii=False, indent=2), encoding="utf-8")
    return sidecar

The reason origin isn't a boolean is the whole point of this article. What you wrote yourself at generation time is confirmed_generated. An older asset with no record is unknown — not not_generated. Even if a detector comes back negative, it stays unknown.

Because when you revisit the ledger months later, you need to tell apart "never checked," "checked and couldn't tell," and "known to be generated." Flatten those into a boolean and the distinction is gone for good.

If you already have a large pile of unlabeled assets, SynthID detection is genuinely useful as a supplement: promote anything that comes back positive to confirmed_generated, and leave negatives at unknown. Decide up front that detection only ever moves records in one direction, and you stop fighting the asymmetry.

For a fuller provenance design, Recording the Provenance of Gemini Output — Design for Reproducibility and Audit covers the foundations. If the August 17 image model shutdown is forcing you to separate regenerable assets from frozen ones, Images From a Model That's Shutting Down Can Never Be Made Again — Managing Regenerability With a Ledger is the more specific piece.

Images aren't the only output that carries a watermark — the audio side is covered in Lyria 3 Pro API Implementation Guide — Generating Full-Length Studio-Quality Music From Text and Images.

One thing you can check today

If you're shipping generated images in an app or service, there's a single useful experiment.

Take a few final outputs from your export pipeline, upload them to the Gemini app, and see whether the watermark is detected.

A positive tells you your pipeline preserves the signal. A negative doesn't mean your pipeline is broken — it means your assets currently sit in a state where no third party can attribute them to Google AI. Either result lands you in the same place on what to do next.

Rather than waiting for a detector to supply the answer, the side that already holds the answer writes it down first. Unglamorous, but it's the part that pays off when you open that asset folder months later.

Thanks for reading.

Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

Gemini Basics2026-06-22
Putting Gemini image generation to work: from prompt design to thumbnails generated from video
A practical playbook for running Gemini image generation as a repeatable workflow instead of a lucky dip. From decomposing prompts into reproducible parts to the video-to-image automation unlocked by the Nano Banana 2 GA, with working code, a pre-publish quality gate, and a design that survives preview shutdowns.
Gemini Basics2026-06-13
Deep Think, Deep Research, Live, or Omni? How I Reassigned a Week of Work Across Gemini's Growing Set of Modes
Gemini now spans thinking, researching, talking, and creating. Three practical questions that decide which mode gets which task, based on a week of reassigning my indie-dev workflow.
Gemini Basics2026-05-27
Fixing NotebookLM Audio Overview When It Generates in the Wrong Language or Stalls Mid-Way
Five concrete causes and fixes for when NotebookLM's Audio Overview ignores your source language, freezes on the progress bar, or cuts off mid-playback — written from hands-on use during app review analysis.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →