{"slug": "i-spent-hours-on-app-store-screenshots-so-i-built-a-tool-that-makes-them", "title": "I spent hours on App Store screenshots, so I built a tool that makes them", "summary": "A developer built sukuji, a tool that generates five App Store screenshots at 1290x2796 from uploaded app screens, using Gemini to plan the set and write headlines and GPT Image to paint backgrounds. The developer found that printing headlines onto the canvas before image generation, defining a clear exclusion zone around the text, and explicitly stating that the printed headline is the one exception all prevented the image model from overwriting or crowding the type. The tool launched first in Japan with English added later, is free with no account required, and is limited to two runs per day due to cost.", "body_md": "The most useful thing I learned building this: if you want an image model to\n\nwork well with text, don't let it touch the text at all. Print the text first,\n\nthen let the model paint around it.\n\nWhen my app was ready for the App Store, I thought the hard part was over. Then\n\nI got to the screenshots. Deciding what each one should say, finding a device\n\nframe, lining everything up, exporting at the exact size Apple wants. None of\n\nit was hard on its own, but it took me hours.\n\nSo I built sukuji. You upload a few screens from your app and get five App\n\nStore screenshots back at 1290x2796, each with a headline, your screen in a\n\ndevice frame, and a designed background.\n\nUnder the hood, Gemini plans the set and writes the headlines, and GPT Image\n\npaints the artwork. Getting those two to cooperate taught me a few things.\n\nImage models have gotten much better at text, especially in English. But I\n\nstill didn't want the model writing my headlines. I wanted the same typeface\n\nand size across all five images, a font I chose rather than one it picked, and\n\ntext that doesn't change shape every time I regenerate. And a single wrong\n\nletter means redoing the whole image. So the headline was always typeset in\n\ncode and added afterwards.\n\nThat created a different problem. The model had no idea where the headline\n\nwould go, so it happily put a floating object right where the words would\n\nland. Telling it to \"leave the top of the image empty\" helped a little, but not\n\nreliably.\n\nWhat worked was flipping the order. Now the headline is printed onto the canvas\n\nfirst, next to the phone, and only then does the model paint. It can see the\n\nwords, so it works around them instead of guessing.\n\nEven with the text printed, objects kept crowding it. My prompt said nothing\n\nmay touch the letters. The model obeyed: things stopped just short of the\n\nwords, practically leaning on them.\n\nTechnically, nothing touched. The fix was to stop describing a line and start\n\ndescribing a space: a clear zone around the text, measured out, with the rule\n\nthat coming close counts as failing. Once \"close\" was defined as a failure, the\n\ncrowding mostly stopped.\n\nFor the opening image there's no phone, just the character from your app on a\n\nplain background. My prompt told the model to replace that plain background\n\nentirely with a scene.\n\nIt did, headline and all. The text I had printed onto the canvas was gone. The\n\nfix was one sentence: the printed headline is the one exception, and it stays\n\nexactly as it is.\n\nAll three lessons are the same lesson, really. Image models take your words\n\nliterally, so the exceptions have to be spelled out.\n\nSomeone on Reddit pointed out that screenshot tools fail when the headline just\n\nrestates the icon: \"Track your habits\" for a habit app. They were right.\n\nNow each headline has to come from something specific on that screen, and the\n\nmodel asks itself one question before keeping a line: would this work just as\n\nwell for a competitor? If yes, it rewrites it.\n\nI launched in Japan first and added English later. After two weeks:\n\nThat cost is why it's limited to two runs a day. It's free for now, with no\n\naccount needed.\n\nI'd love to hear where it falls short, especially if the headlines come out\n\ngeneric for your app.", "url": "https://wpnews.pro/news/i-spent-hours-on-app-store-screenshots-so-i-built-a-tool-that-makes-them", "canonical_source": "https://dev.to/oshio_0bffeb2fb927538e835/i-spent-hours-on-app-store-screenshots-so-i-built-a-tool-that-makes-them-6a9", "published_at": "2026-09-25 05:34:02+00:00", "updated_at": "2026-09-25 05:58:57.332331+00:00", "lang": "en", "topics": ["ai-tools", "generative-ai", "ai-products", "large-language-models"], "entities": ["sukuji", "Gemini", "GPT Image", "App Store", "Apple", "Reddit"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/i-spent-hours-on-app-store-screenshots-so-i-built-a-tool-that-makes-them", "markdown": "https://wpnews.pro/news/i-spent-hours-on-app-store-screenshots-so-i-built-a-tool-that-makes-them.md", "text": "https://wpnews.pro/news/i-spent-hours-on-app-store-screenshots-so-i-built-a-tool-that-makes-them.txt", "jsonld": "https://wpnews.pro/news/i-spent-hours-on-app-store-screenshots-so-i-built-a-tool-that-makes-them.jsonld"}}