<?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: Emmanouil Vasigia</title>
    <description>The latest articles on DEV Community by Emmanouil Vasigia (@emanuil_vg).</description>
    <link>https://dev.to/emanuil_vg</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4147696%2F94176d12-b008-40b1-9871-49e05847863e.jpg</url>
      <title>DEV Community: Emmanouil Vasigia</title>
      <link>https://dev.to/emanuil_vg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emanuil_vg"/>
    <language>en</language>
    <item>
      <title>Debug the mobile menu as four separate interactions</title>
      <dc:creator>Emmanouil Vasigia</dc:creator>
      <pubDate>Sun, 04 Oct 2026 16:32:27 +0000</pubDate>
      <link>https://dev.to/emanuil_vg/debug-the-mobile-menu-as-four-separate-interactions-26ah</link>
      <guid>https://dev.to/emanuil_vg/debug-the-mobile-menu-as-four-separate-interactions-26ah</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmzopz1bhymwsv6roqmp5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmzopz1bhymwsv6roqmp5.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A mobile menu can pass one check and fail the next. If you maintain an existing site, test the path from the menu control to a service page as four separate interactions: the control is visible, a tap opens the intended menu, the relevant link is available, and that link reaches the intended page.&lt;/p&gt;

&lt;p&gt;That sequence is more useful than a single “mobile navigation works” verdict. It also keeps the first debugging step close to what you can observe, before you decide which code to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the observable result
&lt;/h2&gt;

&lt;p&gt;Use a phone and write down what happens at each step. Keep the observations separate from any proposed cause.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visibility:&lt;/strong&gt; Is the menu control present on the phone screen? Record the page and screen size you tested. A successful desktop check does not answer this question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tap behavior:&lt;/strong&gt; If the control is visible, what appears after one tap? Record whether you see menu options, a different page, or no visible change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Option availability:&lt;/strong&gt; If the menu opens, can you see and select the link you need? If it is nested, test whether you can reach it rather than assuming the parent item is sufficient.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destination:&lt;/strong&gt; Tap the link and check the page that loads. A menu that opens is not, by itself, a completed path to the service page.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Run the sequence from the actual page a visitor might land on, not just the homepage. If you change anything while testing, note the change and run the same sequence again. That gives you a narrower comparison than trying several adjustments and then asking whether the menu feels better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep three reported symptoms distinct
&lt;/h2&gt;

&lt;p&gt;An individual &lt;a href="https://forum.squarespace.com/topic/342144-menu-bar-not-showing-up-on-mobile-verson" rel="noopener noreferrer"&gt;Squarespace forum report&lt;/a&gt; described a menu that appeared on desktop but was absent on phones. A responder identified custom CSS as the cause in that discussion. For a comparable symptom on your own site, the first question is whether the control is rendered and visible at the phone size you are testing. There is no tap behavior to debug until you can see and use the control. The forum exchange is one case, not evidence that CSS is the cause whenever a mobile menu is missing.&lt;/p&gt;

&lt;p&gt;A separate &lt;a href="https://forum.squarespace.com/topic/317088-mobile-menu-not-working" rel="noopener noreferrer"&gt;Squarespace report&lt;/a&gt; described a different result: tapping the mobile menu opened a Connect page instead of showing menu options. That site owner attributed the issue to custom code. In that case, the control was visible enough to tap, so treating the problem as a missing-menu issue would skip the most useful observation: &lt;em&gt;where did the tap take the visitor?&lt;/em&gt; Record the destination before changing anything. The reported attribution to custom code belongs to that particular case; it is not a diagnosis for another site.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://wordpress.org/support/topic/sub-menu-items-missing-on-mobile-menu" rel="noopener noreferrer"&gt;WordPress support discussion&lt;/a&gt; adds a third distinction. The site owner reported that submenu items did not expand on a phone despite working on desktop. A responder said the items worked in their test. That disagreement matters. If you cannot reproduce a reported failure, document the phone, browser, page, and exact sequence used for each test rather than declaring either observation wrong. The report identifies a symptom to investigate, not a confirmed cause or a universal WordPress behavior.&lt;/p&gt;

&lt;p&gt;These accounts come from individual site owners. They do not establish how often these problems occur, and they do not establish a pattern among service-business websites. Their practical value is narrower: they show why “the mobile menu is broken” is not a precise enough starting point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Match the investigation to the failed step
&lt;/h2&gt;

&lt;p&gt;When the &lt;strong&gt;control is absent&lt;/strong&gt;, check the phone-sized view before examining link destinations. Compare the same page on phone and desktop, and note whether the absence occurs on every page you test or only one. If the site has custom CSS, consider it a candidate to inspect, not a confirmed explanation. Change one relevant rule at a time in a controlled test, then repeat the visibility check.&lt;/p&gt;

&lt;p&gt;When a &lt;strong&gt;tap goes to a page instead of opening options&lt;/strong&gt;, capture the destination and identify the element you tapped. Inspect the configured behavior and any custom code associated with that control before you start rearranging menu items. A link to the wrong page and a menu that never opens may look similar to a visitor, but they lead to different questions for the person debugging.&lt;/p&gt;

&lt;p&gt;When a &lt;strong&gt;submenu does not expand&lt;/strong&gt;, test the parent item and the submenu separately. Note whether a tap navigates, expands the submenu, or appears to do nothing. Try to reproduce the behavior under a documented set of conditions before assigning a cause, particularly if another tester gets a different result.&lt;/p&gt;

&lt;p&gt;When the &lt;strong&gt;menu opens but the service link is not available&lt;/strong&gt;, inspect the options actually shown on the phone. Finding a service page through desktop navigation does not establish that a phone visitor can find it through the mobile menu. If the link is present, complete the test by selecting it and checking its destination.&lt;/p&gt;

&lt;p&gt;This is a diagnostic sequence, not a claim that any particular site has a navigation defect. The useful output is a small, reproducible description: the page tested, the device conditions, the interaction attempted, and the result at the first step that did not behave as intended. That description gives you a better basis for investigating your own implementation than a broad label such as “mobile menu issue.”&lt;/p&gt;

</description>
      <category>webdesign</category>
      <category>userexperience</category>
      <category>smallbusiness</category>
      <category>mobileux</category>
    </item>
    <item>
      <title>Test a contact form as three separate checkpoints</title>
      <dc:creator>Emmanouil Vasigia</dc:creator>
      <pubDate>Sat, 03 Oct 2026 18:56:18 +0000</pubDate>
      <link>https://dev.to/emanuil_vg/test-a-contact-form-as-three-separate-checkpoints-4gpl</link>
      <guid>https://dev.to/emanuil_vg/test-a-contact-form-as-three-separate-checkpoints-4gpl</guid>
      <description>&lt;p&gt;Before changing a contact form, run one traceable test through the path you expect an inquiry to take. Record three observations separately: what the sender sees, what the business receives, and what happens when the business responds. A success message answers the first question, not all three.&lt;/p&gt;

&lt;p&gt;This distinction matters because the checkpoints can disagree. In &lt;a href="https://community.shopify.com/t/not-receiving-emails-from-contact-form/347813" rel="noopener noreferrer"&gt;one Shopify community report&lt;/a&gt;, contact-form submissions appeared to succeed but did not arrive by email. That is an individual report, not a measure of how often this happens or an explanation of its cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up a test you can recognize
&lt;/h2&gt;

&lt;p&gt;Use the public form as a visitor would. Before submitting it, write down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The email address you will use as the test sender&lt;/li&gt;
&lt;li&gt;The person or destination expected to receive the inquiry&lt;/li&gt;
&lt;li&gt;A distinctive phrase to put in the message, such as &lt;code&gt;contact-path-test-0414&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Who will check for receipt and, if applicable, send a response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The phrase is a matching key for this test. Keep it in your notes and in the form message so the recipient can distinguish this submission from other inquiries. If several people might handle messages, choose a designated checker for the test rather than relying on an unconfirmed assumption that someone saw it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checkpoint 1: Observe the form response
&lt;/h2&gt;

&lt;p&gt;Submit the test inquiry and record the time, the page you submitted it from, and the exact on-screen result. Did the form display a confirmation? Did it display something else?&lt;/p&gt;

&lt;p&gt;Describe only what you observed. For example: “Test submitted at 2:10 p.m.; confirmation displayed.” Do not turn that into “message delivered.” The form response is useful evidence about the sender-facing step, but receipt needs its own check.&lt;/p&gt;

&lt;p&gt;If the form does not show a confirmation, record that outcome too. It gives whoever investigates the site a different starting point than a test that displayed a confirmation but could not be matched to a received inquiry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checkpoint 2: Match the received inquiry
&lt;/h2&gt;

&lt;p&gt;Ask the designated checker to look at the destination chosen before the test. Have them look for the distinctive phrase and compare the inquiry with the test you submitted. Record whether they found a matching message and when they checked.&lt;/p&gt;

&lt;p&gt;Use a result label that preserves the distinction:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Form observation&lt;/th&gt;
&lt;th&gt;Receipt observation&lt;/th&gt;
&lt;th&gt;What you can conclude from this test&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Confirmation displayed&lt;/td&gt;
&lt;td&gt;Matching inquiry found&lt;/td&gt;
&lt;td&gt;This test reached the checked destination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confirmation displayed&lt;/td&gt;
&lt;td&gt;No matching inquiry found during the check&lt;/td&gt;
&lt;td&gt;Receipt at that destination was not verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No confirmation displayed&lt;/td&gt;
&lt;td&gt;Matching inquiry found&lt;/td&gt;
&lt;td&gt;The sender-facing result and receipt need separate examination&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These labels describe observations, not causes. In particular, “not found during the check” does not identify where the inquiry went or which part of the site needs changing. Keep the test phrase, submission time, checked destination, and check time together so a site maintainer can examine the discrepancy without reconstructing the test from memory.&lt;/p&gt;

&lt;p&gt;If you run a second test, give it a different phrase and record it separately. That keeps a later result from being mistaken for the first submission. A successful second test also does not erase the first observation; it tells you that the two tests had different observed outcomes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxtzkaqnu1ow3awqvyjz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxtzkaqnu1ow3awqvyjz.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Checkpoint 3: Observe the response path, if you are testing it
&lt;/h2&gt;

&lt;p&gt;Once a matching inquiry is found, you can extend the test through the normal reply process. Ask the person handling the inquiry to respond to the test sender, then check that sender address and record what arrived. If responding involves a handoff to another person or workspace, note who performed that step.&lt;/p&gt;

&lt;p&gt;Keep this result separate from notification receipt. “Inquiry found” records what the business saw. “Response sent” records an action by the business. “Response found at the test sender address” records the sender-side observation. If the inquiry was not found, label the response step “not tested” rather than treating it as a failed reply.&lt;/p&gt;

&lt;p&gt;This third checkpoint is a workflow check, not a claim that the form itself controls replies. It helps make the scope of a completed test explicit: did you stop when the business received the inquiry, or did you also observe a response at the sender address?&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the result narrow
&lt;/h2&gt;

&lt;p&gt;A useful final note might read: “Confirmation displayed at 2:10 p.m.; designated checker did not find the matching inquiry at the expected destination by 2:25 p.m.; response not tested.” A different test might record all three observations as completed. Neither result establishes what will happen to every future inquiry.&lt;/p&gt;

&lt;p&gt;For an existing website, this test is a more useful diagnostic than relying on the confirmation screen alone. It replaces a single “form works” checkbox with a record of where verification actually stopped.&lt;/p&gt;

</description>
      <category>websitetesting</category>
      <category>smallbusiness</category>
      <category>leadgeneration</category>
      <category>websiteoptimization</category>
    </item>
    <item>
      <title>I Tried to Make AI Build a Complete Website From One Sentence. Here’s What Broke</title>
      <dc:creator>Emmanouil Vasigia</dc:creator>
      <pubDate>Mon, 28 Sep 2026 17:49:46 +0000</pubDate>
      <link>https://dev.to/emanuil_vg/i-tried-to-make-ai-build-a-complete-website-from-one-sentence-heres-what-broke-4lem</link>
      <guid>https://dev.to/emanuil_vg/i-tried-to-make-ai-build-a-complete-website-from-one-sentence-heres-what-broke-4lem</guid>
      <description>&lt;p&gt;I Tried to Make AI Build a Complete Website From One Sentence. Here’s What Broke&lt;br&gt;
The demo worked in minutes. Making it reliable enough for real users took much longer.&lt;br&gt;
The first version looked almost too easy.&lt;br&gt;
Give the AI one sentence:&lt;br&gt;
“I run a roofing company in Austin.”&lt;/p&gt;

&lt;p&gt;A few seconds later, you have a homepage.&lt;br&gt;
Nice headline.&lt;br&gt;
Services section.&lt;br&gt;
CTA.&lt;br&gt;
Decent copy.&lt;br&gt;
At that point, it is very tempting to think:&lt;br&gt;
“Okay. The hard part is done.”&lt;br&gt;
It wasn’t.&lt;br&gt;
The hard part started when I stopped asking AI to generate a page and started asking it to generate an entire website that a real business could actually use.&lt;br&gt;
That changed everything.&lt;br&gt;
A homepage is easy&lt;br&gt;
LLMs are very good at producing something that looks convincing once.&lt;br&gt;
Give them a prompt and they can generate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a hero section&lt;/li&gt;
&lt;li&gt;service descriptions&lt;/li&gt;
&lt;li&gt;an About section&lt;/li&gt;
&lt;li&gt;testimonials&lt;/li&gt;
&lt;li&gt;FAQs&lt;/li&gt;
&lt;li&gt;calls to action
For a demo, this is enough.
For a real website, it is nowhere near enough.
A website needs consistency across multiple pages.
The navigation has to make sense.
The copy cannot contradict itself.
The layout needs to survive mobile screens.
Buttons need to point somewhere real.
Sections cannot randomly disappear.
The business name cannot change halfway through the site.
And the AI should probably not invent a phone number.
That last one happened more often than I expected.
Problem #1: The AI had no idea what the website actually was
My first approach was basically:
Here is the business.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generate the website.&lt;/p&gt;

&lt;p&gt;The output looked fine.&lt;br&gt;
Until I generated another page.&lt;br&gt;
Then another.&lt;br&gt;
Suddenly the website had three different personalities.&lt;br&gt;
The homepage sounded premium.&lt;br&gt;
The services page sounded like a discount contractor.&lt;br&gt;
The About page sounded like a Fortune 500 company.&lt;br&gt;
The model was generating pages independently.&lt;br&gt;
That was the mistake.&lt;br&gt;
A website is not a collection of unrelated prompts.&lt;br&gt;
It needs a shared source of truth.&lt;br&gt;
So instead of generating pages immediately, I started generating a structured representation of the business first.&lt;br&gt;
Something closer to:&lt;br&gt;
{&lt;br&gt;
  "business": "Austin Roofing Co",&lt;br&gt;
  "industry": "Roofing",&lt;br&gt;
  "location": "Austin, Texas",&lt;br&gt;
  "audience": "Homeowners",&lt;br&gt;
  "tone": "Professional and local",&lt;br&gt;
  "services": [&lt;br&gt;
    "Roof repair",&lt;br&gt;
    "Roof replacement",&lt;br&gt;
    "Storm damage repair"&lt;br&gt;
  ],&lt;br&gt;
  "primaryGoal": "Request a quote"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Every page then uses the same context.&lt;br&gt;
This sounds obvious now.&lt;br&gt;
It was not obvious in version one.&lt;br&gt;
Problem #2: AI loves inventing things&lt;br&gt;
Ask an AI to create a business website and it wants to be helpful.&lt;br&gt;
Sometimes a little too helpful.&lt;br&gt;
It may invent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;customer testimonials&lt;/li&gt;
&lt;li&gt;awards&lt;/li&gt;
&lt;li&gt;years of experience&lt;/li&gt;
&lt;li&gt;certifications&lt;/li&gt;
&lt;li&gt;addresses&lt;/li&gt;
&lt;li&gt;statistics&lt;/li&gt;
&lt;li&gt;phone numbers
A sentence like:
“Trusted by 2,000 homeowners since 1998”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;looks fantastic on a landing page.&lt;br&gt;
There is only one problem.&lt;br&gt;
Nobody told the AI that.&lt;br&gt;
For a fictional demo, this is harmless.&lt;br&gt;
For a real business, it is a serious problem.&lt;br&gt;
So I had to start treating certain information differently.&lt;br&gt;
There are facts the model can rewrite.&lt;br&gt;
There are facts it can infer carefully.&lt;br&gt;
And there are facts it should never create.&lt;br&gt;
That distinction became one of the most important parts of the system.&lt;br&gt;
Problem #3: Good-looking HTML can still be broken&lt;br&gt;
This one surprised me.&lt;br&gt;
A generated page could look great at 1440px.&lt;br&gt;
Then I opened it on mobile.&lt;br&gt;
Chaos.&lt;br&gt;
Headings wrapping into five lines.&lt;br&gt;
Buttons leaving their containers.&lt;br&gt;
Images becoming enormous.&lt;br&gt;
Two-column layouts refusing to become one column.&lt;br&gt;
Text becoming unreadable over backgrounds.&lt;br&gt;
The AI had created something that was technically valid and visually broken.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwdbilk9o69m5rl02tnr0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwdbilk9o69m5rl02tnr0.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where I realized something important:&lt;br&gt;
Generating the site and verifying the site are two completely different problems.&lt;br&gt;
So I added a separate visual QA step.&lt;br&gt;
Instead of trusting the generated result, the system has to inspect what actually rendered.&lt;br&gt;
Things like:&lt;br&gt;
Does content overflow?&lt;br&gt;
Are sections missing?&lt;br&gt;
Is text readable?&lt;br&gt;
Does the navigation work?&lt;br&gt;
Are elements overlapping?&lt;br&gt;
Does the page still make sense on mobile?&lt;/p&gt;

&lt;p&gt;The AI can say the website is correct.&lt;br&gt;
The browser is the final judge.&lt;br&gt;
Problem #4: “Regenerate” is not a solution&lt;br&gt;
A lot of AI products solve bad output with one button:&lt;br&gt;
Generate again.&lt;br&gt;
That works surprisingly well in demos.&lt;br&gt;
It is also expensive.&lt;br&gt;
If generation fails 10% of the time, simply running the whole thing again means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more model calls&lt;/li&gt;
&lt;li&gt;more latency&lt;/li&gt;
&lt;li&gt;more compute&lt;/li&gt;
&lt;li&gt;more money&lt;/li&gt;
&lt;li&gt;another chance for something else to break
So instead of regenerating everything, I started trying to identify the exact thing that failed.
Bad section?
Fix the section.
Broken page?
Rebuild the page.
Bad content?
Regenerate the content.
The goal became:
detect -&amp;gt; isolate -&amp;gt; repair&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;instead of:&lt;br&gt;
fail -&amp;gt; regenerate everything -&amp;gt; hope&lt;/p&gt;

&lt;p&gt;That one change made the system feel much less like a slot machine.&lt;br&gt;
Problem #5: The AI kept being creative when I needed it to be boring&lt;br&gt;
This was probably the funniest problem.&lt;br&gt;
Creativity sounds great when building with AI.&lt;br&gt;
Until you are generating production UI.&lt;br&gt;
Sometimes you do not want creativity.&lt;br&gt;
You want:&lt;br&gt;
Header&lt;br&gt;
Hero&lt;br&gt;
Services&lt;br&gt;
About&lt;br&gt;
CTA&lt;br&gt;
Footer&lt;/p&gt;

&lt;p&gt;That is it.&lt;br&gt;
No floating glassmorphism card.&lt;br&gt;
No randomly rotated image.&lt;br&gt;
No giant quote taking up the whole viewport.&lt;br&gt;
No mysterious “Our Philosophy” section for a plumbing company.&lt;br&gt;
The model kept trying to impress me.&lt;br&gt;
I kept trying to make it behave.&lt;br&gt;
Eventually I realized the system needs both freedom and constraints.&lt;br&gt;
Too many constraints and every site looks identical.&lt;br&gt;
Too much freedom and every generation becomes unpredictable.&lt;br&gt;
Finding that middle ground was much harder than writing the prompt.&lt;br&gt;
The architecture slowly changed&lt;br&gt;
The original idea was basically:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbjnke8v81czgwjrgcp49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbjnke8v81czgwjrgcp49.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Business description&lt;br&gt;
        ↓&lt;br&gt;
       AI&lt;br&gt;
        ↓&lt;br&gt;
     Website&lt;/p&gt;

&lt;p&gt;The real system started looking more like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqm4ay6lbt4j6uc4tvzsf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqm4ay6lbt4j6uc4tvzsf.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Business description&lt;br&gt;
        ↓&lt;br&gt;
Business understanding&lt;br&gt;
        ↓&lt;br&gt;
Website structure&lt;br&gt;
        ↓&lt;br&gt;
Page planning&lt;br&gt;
        ↓&lt;br&gt;
Content generation&lt;br&gt;
        ↓&lt;br&gt;
Design generation&lt;br&gt;
        ↓&lt;br&gt;
Rendering&lt;br&gt;
        ↓&lt;br&gt;
Visual validation&lt;br&gt;
        ↓&lt;br&gt;
Repair&lt;br&gt;
        ↓&lt;br&gt;
Final website&lt;/p&gt;

&lt;p&gt;The interesting part is that AI is only one piece of that pipeline.&lt;br&gt;
Most of the work is actually about controlling it.&lt;br&gt;
The biggest lesson&lt;br&gt;
Before building this, I thought the main challenge would be:&lt;br&gt;
“Can AI generate a good website?”&lt;/p&gt;

&lt;p&gt;It can.&lt;br&gt;
That is not the interesting question anymore.&lt;br&gt;
The real question is:&lt;br&gt;
Can AI generate a good website repeatedly, predictably, and without a human fixing it afterward?&lt;/p&gt;

&lt;p&gt;That is a completely different engineering problem.&lt;br&gt;
The first impressive result took very little time.&lt;br&gt;
The reliable system took much longer.&lt;br&gt;
And I suspect this is true for a lot of AI products right now.&lt;br&gt;
The demo is easy.&lt;br&gt;
The last 20% is the product.&lt;br&gt;
I’m still working on this problem while building &lt;a href="https://instantsite.app" rel="noopener noreferrer"&gt;Instantsite&lt;/a&gt;, where the goal is to turn a short business description into a complete editable website.&lt;br&gt;
But the thing I find most interesting is not the website generation itself.&lt;br&gt;
It is everything required to make unpredictable AI output behave like predictable software.&lt;br&gt;
That part is much harder than the demo makes it look.&lt;br&gt;
One question&lt;br&gt;
If you’re building with generative AI, what was the first thing that worked perfectly in the demo and completely fell apart in production?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
