◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Expo SDK 58 is out of beta as of 10/15 (beta since 09/15). Check your dependencies before upgrading●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Expo SDK 58 is out of beta as of 10/15 (beta since 09/15). Check your dependencies before upgrading●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/AI Models
◉ AI Models/2026-10-18Intermediate

Before You Ship an AI-Made App Icon or Image: A Ledger and Four Checks

Can you ship an AI-generated icon or illustration as is? Before deciding, run four checks: a provenance ledger, the tool's terms, resemblance to existing work, and store size rules, with a working script.

App Icon4AI-generated imagesApp Store review5Google Play39Rork590Rights check

Imagine pressing the submit button, and a reviewer asks, "What are the rights for this icon?" You had an AI produce dozens of candidates. Which one did you pick? Under which tool's terms was it made? I am not confident that I could answer that three months later.

I cannot give you a one-line rule for whether an AI-made image is allowed. What I can offer is a practical habit for solo developers: accept what cannot be decided, and make the image explainable before you submit.

What the stores ask for is "made by you, or licensed to you"

App Store Review Guideline 5.2.1 asks you not to use protected third-party material, such as trademarks, copyrighted works, or patented ideas, without permission. It also says apps should be submitted by the person or legal entity that owns or has licensed the intellectual property. The section opens with the line that your app should only include content you created or have a license to use.

Nothing there asks whether an image was AI-generated. What is checked is whether you can explain where it came from. Google Play also has policies on intellectual property and impersonation, and the direction is the same.

How AI-generated images are treated in law differs by country, and each tool words its terms differently, so I will not draw a legal conclusion here. This article sticks to four checks.

Check 1: One ledger row per image

Start by listing every image you plan to ship. No special tool is needed; put one CSV in the project root.

ColumnWhat to writeExample
filePath relative to the projectassets/images/icon.png
sourceGenerated, self-made, purchased, or free stockgenerated
toolTool name and where the prompt is savedImage tool A (prompt saved separately)
dateDate created2026-10-02
license_noteWhich clause you relied onCommercial-use clause checked

If you postpone the first row until "later," the more images you have, the harder it gets to trace them. My own rule is to add the row at the moment I adopt the image.

Check 2: Keep the tool's terms, with a date

Writing only "checked" in license_note is not enough, because terms can change. Record the date you checked and the heading of the clause you read. If you can, save the terms page as a PDF or text file next to the ledger.

Three things to look for:

  • Whether generated images may be used in a commercial app
  • Whether free and paid plans differ in what you may do
  • Whether the terms say the output belongs to you or to the service

If none of this is readable, a perfectly sound decision is not to use that tool's output for something as prominent as the icon.

Check 3: Look for resemblance to existing work and trademarks

A generated image can come close to an existing character or logo. Guideline 4.1 (Copycats) asks you not to ship an app that is a popular app with minor changes.

My routine is plain. I run candidate icons through a reverse image search and see whether similar images rank at the top. For the app name, I search both the store and the Japan Patent Office trademark search (J-PlatPat). Finding nothing does not prove safety; the point is to record that you looked in the ledger.

Check 4: Let a script check the store size rules

This is a job for a machine, not for judgment. Here is what the official sources say:

TargetRequirementSource
iOS icon (source image)Exactly square; 1024x1024 is a good size; no rounded corners or transparent pixelsExpo docs, "App icons"
Google Play icon32-bit PNG (with alpha), 512px by 512px, 1024KB or lessPlay Console Help, "Add preview assets"
Google Play feature graphicJPEG or 24-bit PNG (no alpha), 1024px by 500pxSame page

Transparent pixels that the eye cannot see can slip in during export or editing. To check them together with the ledger, here is a script.

#!/usr/bin/env python3
"""画像素材の出どころ台帳と、ストア提出サイズの確認。
 
使い方:
  python3 asset_ledger_check.py <プロジェクトのルート> [台帳CSV]
 
台帳CSV(既定: assets-ledger.csv)の列:
  file,source,tool,date,license_note
  file は プロジェクトのルートからの相対パス。
"""
import csv
import sys
from pathlib import Path
from PIL import Image  # pip install pillow
 
SKIP_DIRS = {"node_modules", ".git", "ios", "android", ".expo", "dist"}
EXTS = {".png", ".jpg", ".jpeg", ".webp"}
 
 
def has_transparency(img: Image.Image) -> bool:
    if img.mode in ("RGBA", "LA"):
        return img.getchannel("A").getextrema()[0] < 255
    return "transparency" in img.info
 
 
def main() -> int:
    root = Path(sys.argv[1]).resolve()
    ledger_path = Path(sys.argv[2]) if len(sys.argv) > 2 else root / "assets-ledger.csv"
 
    ledger = {}
    if ledger_path.exists():
        with ledger_path.open(encoding="utf-8", newline="") as f:
            for row in csv.DictReader(f):
                ledger[row["file"].strip()] = row
 
    problems = 0
    for path in sorted(root.rglob("*")):
        if path.suffix.lower() not in EXTS:
            continue
        if SKIP_DIRS & set(path.relative_to(root).parts):
            continue
        rel = path.relative_to(root).as_posix()
        with Image.open(path) as img:
            w, h = img.size
            alpha = has_transparency(img)
        kb = path.stat().st_size / 1024
        notes = []
 
        row = ledger.get(rel)
        if row is None:
            notes.append("台帳に行がありません")
        else:
            for col in ("source", "tool", "date", "license_note"):
                if not (row.get(col) or "").strip():
                    notes.append(f"台帳の {col} が空です")
 
        name = path.name.lower()
        if "icon" in name and "splash" not in name and "adaptive" not in name:
            if w != h:
                notes.append(f"アイコンが正方形ではありません({w}x{h})")
            elif w != 1024:
                notes.append(f"1024x1024 ではありません({w}x{h})")
            if alpha:
                notes.append("透明なピクセルを含んでいます(iOS のアイコンは不透明に)")
 
        status = "要確認" if notes else "OK"
        problems += bool(notes)
        print(f"[{status}] {rel}  {w}x{h}  {kb:.0f}KB  alpha={'有' if alpha else '無'}")
        for n in notes:
            print(f"        - {n}")
 
    # 台帳にあるのに実ファイルがないもの
    for rel in sorted(ledger):
        if not (root / rel).exists():
            print(f"[要確認] {rel}  台帳にあるがファイルが見つかりません")
            problems += 1
 
    print(f"\n要確認: {problems} 件")
    return 1 if problems else 0
 
 
if __name__ == "__main__":
    sys.exit(main())

Only images whose file names contain icon are treated as icons; splash and adaptive images are skipped. For the 512px Play version, check separately that it is 1024KB or less.

I ran it on a small test folder (a clean icon.png, an icon-rounded.png with one transparent pixel, a 1000x1024 store-icon.png, and some images deliberately missing from the ledger). The output:

[要確認] assets/images/icon-rounded.png  1024x1024  6KB  alpha=有
        - 台帳に行がありません
        - 透明なピクセルを含んでいます(iOS のアイコンは不透明に)
[OK] assets/images/icon.png  1024x1024  6KB  alpha=無
[OK] assets/images/shot1.png  1242x2688  15KB  alpha=無
[要確認] assets/images/splash-icon.png  512x512  1KB  alpha=有
        - 台帳に行がありません
[要確認] assets/images/store-icon.png  1000x1024  5KB  alpha=無
        - 台帳に行がありません
        - アイコンが正方形ではありません(1000x1024)
[要確認] assets/images/old.png  台帳にあるがファイルが見つかりません
 
要確認: 4 件

icon-rounded.png has a single transparent pixel in the top-left corner. You cannot see it on screen, but the script does. That is why I leave this to a machine. The exit code is 1 when anything needs attention, so you can wire it into a pre-submission check.

What this method cannot tell you

It does not guarantee that no rights problem will arise. The ledger is a record that lets you explain later what you relied on. If the terms are hard to read, or the app earns significant revenue, it is worth consulting a professional.

The script looks only at size, transparency, and blank ledger fields. It does not check whether an image resembles existing work.

If you do only one thing next

For the app you plan to submit, write one ledger row for the icon. If you find yourself stuck on the source column, that is exactly the spot to resolve before submitting.

Before asking whether an AI-made image is allowed, make sure you can explain it.

Related articles:

Share

Thank You for Reading

Rork 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

◉ AI Models2026-10-17
Three checks to run before you ask the AI again about a black preview screen
When a fresh Rork preview opens to a black screen, split the problem into three layers — device, rendering, native — before sending the same fix request again.
◉ AI Models2026-10-14
Take the Prompt Out of the App: An Edge Function Gateway With the Guard on the Output Side
A system prompt shipped inside your app is readable from the day it ships. This walkthrough moves the prompt into a Supabase Edge Function, lets the client name only a task, and puts the guard on an output allowlist, with tested code.
◉ AI Models2026-10-05
Sonnet 5.5, GPT-6.1 Sol, or Opus 5.5? I Decide by the Kind of Fix Before I Pick the Model. A Week of Logging Where My Rork Credits Went
After Rork's model menu settled into Sonnet 5.5, GPT-6.1 Sol, and Opus 5.5, I sorted my fixes into three kinds and assigned a model and effort level to each. Here is how I read the changelog, the tiny ledger that tracks where each credit goes, and the rule I drew from a week of entries.