My Process
Back to today11/06/2025
I have been learning how to code for past 3 weeks. As someone that has never coded before, this was a fun and challenging first project. I learned what API's, GitHub, Vercel, Supabase were, and how to use Cursor, Claude and Chat GPT to build an automated pipeline that gathers live data, processes it through prompt engineering, and renders a meaningful image. Please feel free to contact me with questions and feedback. I hope you enjoy this project!
Challenges
Most of the work focused on backend challenges: making the prompt safe, building a logic that interprets headlines as symbols rather than literal text, and experimenting with clustering and update cadence to balance coherence with variation. Getting the AI engine to think metaphorically instead of descriptively was surprisingly difficult, since randomness is discouraged in most models, and I had to design a clear decision logic.
1. Balancing Autonomy vs. Control in Image Generation: Getting GPT-Image-1 to produce consistent yet symbolic paintings was difficult, because it tended to either over-abstract or over-literalize. I spent a lot of effort fine-tuning prompts, negative prompts, and structural “locks” to find the right balance between freedom and compositional discipline.
2.Creating a Dynamic Generation Logic for Breaking News: Designing a stable pipeline that generated an image only when meaningful changes occurred was challenging. I had to define what qualified as breaking news. It included creating thresholds for recency, cluster change, and number of news sources so the system reacted to real global shifts while not over-generating images.
3. Prompt Composition, Safety & Data Interpretation: Linking world news clusters semantically to symbolic visual motifs demanded experimentation. I started with keyword-based clustering, but it felt too vague and generic. I then tried embedding-based clustering (using text-embedding-3-small) which introduced complexity, but gave much richer results. This semantic version managed to capture relationships between global headlines more meaningfully. I had to handle OpenAI safety rejections by sanitizing harsh language and abstracting violent or sensitive terms. I also created fallback heuristics for edge cases through post-processing, such as breaking earthquake news showing up as magnitude numbers "M 5.0" without descriptors.
Learnings
1. Creativity lies in constraint. Randomness is not encouraged, so decision logic becomes extremely important.
2. Precision in logic design is what enables open-ended expression. It's hard to make AI not take things literally, but certain things need to be defined.
3. GPT-Image-1 has some distinct limitations: (a) It cannot do additive masked image edits without regenerating the entire image, (b) it cannot derive artistic style from words without interpretation logic, and (c) it cannot apply artistic style without modifying the image content.
(I originally started off with asking GPT-Image-1 to determine the image style based on World Art News. I also asked it to keep updating images with masked, additive edits based on breaking World and Art news. Through trial and error, I learned that those things were not possible, and that my design had to be simplified.)
Paintings from older prompt iterations are displayed below. Scroll down to view how the prompt evolution affected the generated images.

Nov 5, 2025 • 23:32 ET

Nov 5, 2025 • 21:55 ET

Nov 5, 2025 • 20:58 ET

Nov 5, 2025 • 17:24 ET

Nov 5, 2025 • 16:24 ET

Nov 5, 2025 • 15:29 ET

Nov 5, 2025 • 14:21 ET

Nov 5, 2025 • 12:25 ET

Nov 5, 2025 • 09:46 ET

Nov 5, 2025 • 09:21 ET

Nov 5, 2025 • 08:33 ET

Nov 5, 2025 • 07:43 ET

Nov 5, 2025 • 06:40 ET

Nov 5, 2025 • 06:19 ET

Nov 5, 2025 • 05:47 ET

Nov 5, 2025 • 05:24 ET

Nov 5, 2025 • 05:18 ET

Nov 5, 2025 • 04:45 ET

Nov 5, 2025 • 04:24 ET

Nov 5, 2025 • 03:53 ET

Nov 5, 2025 • 03:29 ET

Nov 5, 2025 • 02:40 ET

Nov 5, 2025 • 02:21 ET

Nov 5, 2025 • 01:32 ET

Nov 5, 2025 • 00:43 ET

Nov 5, 2025 • 00:21 ET

Nov 4, 2025 • 23:45 ET

Nov 4, 2025 • 23:26 ET

Nov 4, 2025 • 22:56 ET

Nov 4, 2025 • 20:41 ET

Nov 4, 2025 • 18:40 ET

Nov 4, 2025 • 18:20 ET

Nov 4, 2025 • 17:43 ET

Nov 4, 2025 • 17:19 ET

Nov 4, 2025 • 16:39 ET

Nov 4, 2025 • 16:28 ET

Nov 4, 2025 • 16:19 ET

Nov 4, 2025 • 15:44 ET

Nov 4, 2025 • 15:24 ET

Nov 4, 2025 • 13:31 ET

Nov 4, 2025 • 12:42 ET

Nov 4, 2025 • 12:27 ET

Nov 4, 2025 • 12:17 ET

Nov 4, 2025 • 12:01 ET

Nov 4, 2025 • 11:50 ET

Nov 4, 2025 • 11:25 ET

Nov 4, 2025 • 10:44 ET

Nov 4, 2025 • 10:23 ET

Nov 4, 2025 • 09:46 ET

Nov 4, 2025 • 09:22 ET

Nov 4, 2025 • 07:55 ET

Nov 4, 2025 • 06:55 ET

Nov 4, 2025 • 06:42 ET

Nov 4, 2025 • 06:23 ET

Nov 4, 2025 • 05:51 ET

Nov 4, 2025 • 05:30 ET

Nov 4, 2025 • 05:18 ET

Nov 4, 2025 • 04:56 ET

Nov 4, 2025 • 04:33 ET

Nov 4, 2025 • 03:59 ET

Nov 4, 2025 • 03:34 ET

Nov 4, 2025 • 02:56 ET

Nov 4, 2025 • 02:44 ET

Nov 4, 2025 • 02:28 ET

Nov 4, 2025 • 01:58 ET

Nov 4, 2025 • 01:41 ET

Nov 4, 2025 • 00:57 ET

Nov 4, 2025 • 00:44 ET

Nov 3, 2025 • 23:48 ET

Nov 3, 2025 • 23:29 ET

Nov 3, 2025 • 22:51 ET

Nov 3, 2025 • 22:15 ET

Nov 3, 2025 • 21:57 ET

Nov 3, 2025 • 20:59 ET

Nov 3, 2025 • 12:35 ET

Nov 3, 2025 • 05:18 ET

Nov 2, 2025 • 05:13 ET

Nov 1, 2025 • 17:28 ET

Nov 1, 2025 • 17:18 ET

Nov 1, 2025 • 06:14 ET

Oct 31, 2025 • 06:16 ET

Oct 30, 2025 • 12:50 ET

Oct 29, 2025 • 06:16 ET

Oct 28, 2025 • 06:16 ET

Oct 27, 2025 • 06:17 ET

Oct 26, 2025 • 06:13 ET

Oct 25, 2025 • 06:13 ET

Oct 24, 2025 • 06:16 ET

Oct 23, 2025 • 06:15 ET

Oct 22, 2025 • 06:16 ET

Oct 21, 2025 • 06:15 ET

Oct 20, 2025 • 16:31 ET

Oct 16, 2025 • 15:03 ET

Oct 16, 2025 • 14:34 ET

Oct 15, 2025 • 16:37 ET