How I Redesigned 4 Years of Blog Posts (196 of them!) Overnight with AI A solo developer automated the overnight renewal of 196 blog posts on aicoreutility.com using Gemini Flash-Lite, after Google AdSense rejected the site for "insufficient content quality." The pipeline archived 31 low-value posts, rewrote 143 posts at a cost of approximately ₩300 total, and fixed issues including outdated year references and Korean-language slugs. The developer has reapplied to AdSense and is awaiting approval. 📅 Written on 2026-05-10 — A retrospective on the actual renewal of aicoreutility.com, which I operate myself. When I applied to AdSense for aicoreutility.com, I received a clear rejection reason: "Insufficient content quality." I had migrated 196 posts from Tistory, where I had written for 4 years, onto the site. Over half of these posts were short under 1500 characters and old from 2020-2023 . I had two options: I'm a solo developer. I don't have time to rewrite 196 posts while taking care of my family. So, I built an automated renewal pipeline using Gemini Flash-Lite. Not every post is worth saving. Valueless posts are a negative for SEO. I archived 31 posts based on two criteria. -- Posts that are very short and have almost no views UPDATE blog posts SET status='archived' WHERE length content original < 1500 AND view count <= 3; -- Posts of moderate length + low value + old UPDATE blog posts SET status='archived' WHERE length content original < 2500 AND view count <= 2 AND ai score < 7 AND original published at < '2024-01-01'; 199 posts → 168 posts. I lost 31 posts, but the average quality increased. A simple "rewrite this post" prompt leads to hallucinations. I broke it down into 5 stages. The model used was gemini-2.5-flash-lite . Cost per post is about ₩2. When I reviewed the first batch of results, the post body contained phrases like "5 things in 2024." It's currently 2026. Gemini was using old years from its training data. I added the current KST time at the beginning of every stage's prompt. php def now context - str: now = datetime.now KST return f" Current Time — Must Adhere \n" f"Today is {now.strftime '%Y년 %m월 %d일' } KST .\n" f"When referring to years/time periods, please use {now.year} as the basis. " f"Do not arbitrarily use old years from training data like 2023, 2024, etc. .\n" Solved. I ran 130 posts at once, but it stopped halfway due to Gemini API rate limits. It halted at post 49. Would running it again start from scratch? I added an HTML marker at the end of each post. php < -- renewed-2026 -- The script skips posts with this marker. Even if it stops, running it again only processes the remaining ones. In the end, I ran it twice more to complete 143 posts. Some original post slugs were in Korean, like /blog/리액트-훅-정리 . While they work in browser address bars, they cause issues with SEO and social media sharing. I normalized all slugs to ASCII and used a sha1 hash as a fallback. I forcefully added two sections to the renewed posts. This is to prevent readers from wondering "Is this an old post?" and to help AdSense recognize it as "fresh content." | Metric | Value | |---|---| | Renewal Cost | Approx. ₩300 Gemini Flash-Lite, 143 posts | | Total Time Spent | Approx. 35 minutes script execution time | | Published Posts | 146 143 renewed + 3 native | | Archived Posts | 53 | | Consistency | 100% all posts timestamped for 2026 | I've reapplied to AdSense and am waiting for the results. If approved, I plan to place ad units in only one location that doesn't disrupt readability. I won't enable auto ads.