<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: KNALLHART.DEV</title>
    <description>The latest articles on DEV Community by KNALLHART.DEV (@knallhartdev).</description>
    <link>https://dev.to/knallhartdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3979912%2F1f8f3633-d828-4bf6-a89b-c08fa56c26ae.jpg</url>
      <title>DEV Community: KNALLHART.DEV</title>
      <link>https://dev.to/knallhartdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/knallhartdev"/>
    <language>en</language>
    <item>
      <title>I built a €10 AI service that brutally roasts your website</title>
      <dc:creator>KNALLHART.DEV</dc:creator>
      <pubDate>Thu, 11 Jun 2026 16:54:40 +0000</pubDate>
      <link>https://dev.to/knallhartdev/i-built-a-eu10-ai-service-that-brutally-roasts-your-website-2oob</link>
      <guid>https://dev.to/knallhartdev/i-built-a-eu10-ai-service-that-brutally-roasts-your-website-2oob</guid>
      <description>&lt;p&gt;I've been building websites for clients for years. And every time &lt;br&gt;
I looked at their sites, I saw the same problems — unclear CTAs, &lt;br&gt;
hero sections that try to say everything at once, cookie-cutter &lt;br&gt;
layouts that put the booking form three scrolls deep.&lt;/p&gt;

&lt;p&gt;The feedback I'd give them privately was always more honest than &lt;br&gt;
what anyone would write in a formal audit. So I built a tool that &lt;br&gt;
does exactly that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://knallhart.dev" rel="noopener noreferrer"&gt;knallhart.dev&lt;/a&gt; does one thing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You submit a URL and your email&lt;/li&gt;
&lt;li&gt;Pay €10 via Stripe&lt;/li&gt;
&lt;li&gt;Our service takes a full-page Playwright screenshot&lt;/li&gt;
&lt;li&gt;Sends it to Gemini 2.5 Flash with a brutally honest prompt&lt;/li&gt;
&lt;li&gt;You get an email with 3 specific critiques + actionable fixes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No dashboards, no subscriptions, no 47-point audit template. &lt;br&gt;
Just three things that are actually wrong and how to fix them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; on Vercel (frontend + webhook handling)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright&lt;/strong&gt; for full-page screenshots (headless Chromium)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 2.5 Flash&lt;/strong&gt; for the AI analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; for payments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resend&lt;/strong&gt; for email delivery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hardest part was getting Playwright to reliably handle &lt;br&gt;
lazy loading on modern sites. The trick: scroll until &lt;br&gt;
&lt;code&gt;window.scrollY&lt;/code&gt; stops changing rather than calculating &lt;br&gt;
&lt;code&gt;scrollHeight&lt;/code&gt; upfront — that value is unreliable on &lt;br&gt;
too many sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real example output
&lt;/h2&gt;

&lt;p&gt;Here's what it said about basecamp.com:&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Welcome to Visual Overload&lt;/strong&gt; — Seriously, did a screenshot &lt;br&gt;
gallery throw up on your hero section? "Refreshingly &lt;br&gt;
straightforward" indeed, if "straightforward" means immediately &lt;br&gt;
overwhelming me with a static, unreadable dump of your entire &lt;br&gt;
application UI before I even know what Basecamp &lt;em&gt;is&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fix: Replace the dense UI screenshots with a clean, &lt;br&gt;
aspirational visual that highlights benefits, not features.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Great Wall of Founder's Text&lt;/strong&gt; — A full-page novel &lt;br&gt;
from the co-founder right after being visually assaulted. &lt;br&gt;
This isn't a fireside chat; it's a product page.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fix: Break it into scannable sections. Move the full letter &lt;br&gt;
to an About page.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Testimonial Tsunami&lt;/strong&gt; — Nine testimonials in a 3x3 grid &lt;br&gt;
and then a button promising a thousand more. This isn't &lt;br&gt;
social proof; it's a marathon reading challenge.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fix: 2-3 high-impact quotes max, placed near relevant features.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gemini 2.5 Flash is surprisingly good at visual critique&lt;/strong&gt; &lt;br&gt;
when you give it proper context. The prompt matters a lot — &lt;br&gt;
telling it this is a full-page desktop screenshot, that fixed &lt;br&gt;
elements may be mispositioned, and to focus on the first 900px &lt;br&gt;
as the critical first impression made a huge difference in &lt;br&gt;
output quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bot protection is a real problem.&lt;/strong&gt; Large e-commerce sites &lt;br&gt;
(Otto, Zalando) detect headless browsers immediately and serve &lt;br&gt;
a gray placeholder. I handle this by checking screenshot file &lt;br&gt;
size before sending to Gemini — anything suspiciously small &lt;br&gt;
triggers an automatic Stripe refund.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Serverless + async don't mix the way you think.&lt;/strong&gt; &lt;br&gt;
On Vercel, fire-and-forget async operations get killed the &lt;br&gt;
moment you return a response. You have to await the service &lt;br&gt;
call even if the service itself handles things asynchronously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you want your site roasted: &lt;a href="https://knallhart.dev" rel="noopener noreferrer"&gt;knallhart.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have questions about the build, drop them in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>sideprojects</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
