Build1 publisher3 min readPublished
Sparkpix.ai shrank its 2,300-character image prompt to a short, scoped iPhone 12 reference
Sparkpix.ai cut its GPT Image 2 humanizer prompt from 2,300 characters to one sentence asking for a photo that looks shot on an iPhone 12 camera. The builder compared the two by eye, and the scoped version now live has not been through that comparison.
The Engineer · Build desk
What happened
- Sparkpix.ai's AI Image Humanizer used a 2,300-character prompt listing AI tells to remove, camera details to add, and rules for colour, shadows and lens optics.
- That prompt returned faces covered in freckles and skin so drained of colour that it looked like a corpse.
- A one-sentence replacement asking for a photo 'like it was taken with an iPhone 12 camera' was tested against GPT Image 2 and preferred by eye on 2026-07-30.
- When the sentence was unscoped, 'make it look like an iPhone photo' also told the model to change the medium, and anime uploads came back as photographs.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- decision Prompt writers choosing a reference word get a usable test: a word about the lens is safe, while a word naming a kind of picture lets the model recompose the subject.
- cost Any app that pre-fills a prompt in the browser and also keeps a server default has to trace which string reaches the model before a prompt experiment tells it anything.
- contradiction The post says production runs one sentence, but the constant it prints has two, and the second is backed by bug reports ending, with no by-eye test behind it.
The long prompt grew by patching. According to the post, "Add natural skin texture" produced freckles, "don't add freckles" produced flat skin, and "keep healthy colour" fought "remove the saturated AI grade" [3]. Every clause had gone in to fix a problem the clause before it created [3]. "The model obeyed every clause a little too hard, and the clauses pulled against each other," wrote the author, who builds sparkpix.ai and disclosed that the post was drafted with AI assistance for structure and wording [4][7].
The case for naming a camera is a claim about training data. The author says "like it was taken with an iPhone 12 camera" brings the sensor noise, colour science, skin rendering and slightly imperfect light all at once, because the model has seen millions of those photos [6]. The model is GPT Image 2, called through apimodels.app from a Next.js app on Vercel [7]. The post does not say how many images went into the by-eye comparison or who judged them [5]. Three things have to hold before the result carries over to another stack. The model has to have seen a large volume of photos from the device you name. The look you want has to be a phone snapshot. And one team's visual preference has to be an acceptable bar for shipping.
The short prompt broke in two places. Putting "selfie" in the sentence re-posed people [8]. The word names a genre as well as a camera: arm raised, head tilted, shot close and from above. The model changed a pose the user had already chosen [8]. The author diagnosed the anime-to-photo conversion the same way. "The model was doing exactly what it was told," the author wrote [19].
The fix put words back. The team rejected appending "do not change the art style" because it recreated the original failure, two clauses arguing [18]. The production constant limits the camera reference to "a photographic image" and adds a second sentence that, per the post, tells the model to keep an illustration or anime image as an illustration and not turn it into a photograph [11]. Counted from the string literals in the post, the constant is 248 characters, about a ninth of the old prompt [1]. "It is in production because it fixed the anime-to-photo reports, not because it was benchmarked," the author wrote [12]. The evidence covers the one-sentence prompt, judged by eye. The author's distinction between a clause that constrains and a clause that contradicts rests on those reports stopping [12][18].
The first shortening shipped, and for real users it was an A/B test in which both arms got A [13]. The wording lived in three places: two tool defaults on the server and a pre-filled textarea on each landing page [13]. The editor sends its textarea as the prompt, and the server uses its default only when that field is empty [13]. "We had edited the fallback," the author wrote [14]. Now one exported constant is imported by both the tool config and the pages [15]. The old long prompt was deleted outright, and I think that is correct, because the author traces the drift to an unused second copy [15]. It survives only in git history [15].
The refund code is the most careful engineering in the post. A humanizer call can fail after credits are taken, either because the safety filter refuses the image or because the upstream API errors [16]. A background job, a client poll and a cleanup cron can each observe that failure [16]. The code lets the database decide who refunds: `UPDATE generations SET status = 'failed' ... WHERE id = $2 AND status = 'processing'`, with credits added back only when `rowCount` is above zero [17]. Only the first caller moves the row out of processing. Later callers match no rows and add no credits [17].
What to watch
- A side-by-side test of the scoped two-sentence prompt against the one-sentence version, with the number of images compared.
- Whether the iPhone 12 reference still wins by eye when apimodels.app serves a model later than GPT Image 2.
- Reports of the art-style sentence being over-applied, such as photographic uploads handled as illustrations.