<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Building Instantsite]]></title><description><![CDATA[Building Instantsite]]></description><link>https://instantsite.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6aba8ba0db6accbbd9358570/be99b2e9-6294-4417-b6fb-7df075f028a0.png</url><title>Building Instantsite</title><link>https://instantsite.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 06:32:00 GMT</lastBuildDate><atom:link href="https://instantsite.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Debug the Mobile Menu as Four Separate Behaviors]]></title><description><![CDATA[A desktop navigation check cannot tell you whether someone on a phone can reach a service page. Even a visible menu icon answers only the first of several questions. For an existing service-business w]]></description><link>https://instantsite.hashnode.dev/debug-mobile-menu-service-websites</link><guid isPermaLink="true">https://instantsite.hashnode.dev/debug-mobile-menu-service-websites</guid><category><![CDATA[Web Development]]></category><category><![CDATA[Web Design]]></category><category><![CDATA[user experience]]></category><category><![CDATA[mobile ux]]></category><category><![CDATA[website testing]]></category><dc:creator><![CDATA[Emmanouil Vasigia]]></dc:creator><pubDate>Sun, 04 Oct 2026 16:38:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aba8ba0db6accbbd9358570/4a61a548-3847-499f-9f03-933dd95c4c1f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A desktop navigation check cannot tell you whether someone on a phone can reach a service page. Even a visible menu icon answers only the first of several questions. For an existing service-business website, a useful test follows the path: <strong>Can the visitor see the menu control, open it, find the relevant service link, and reach the intended page?</strong></p>
<p>Those are separate behaviors, with different places to investigate when one fails. The reports below illustrate why that distinction matters. They are individual reports from Squarespace and WordPress sites, not evidence of how often these problems occur on service-business websites.</p>
<h2>Start with the symptom, not the platform</h2>
<table>
<thead>
<tr>
<th>Check</th>
<th>What to do on a phone</th>
<th>If it fails, inspect</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Visibility</strong></td>
<td>Look for the navigation control at the phone’s viewport width.</td>
<td>Responsive CSS, hidden elements, and elements covered by other content.</td>
</tr>
<tr>
<td><strong>Opening</strong></td>
<td>Tap the control and observe what happens.</td>
<td>The control’s link destination, event handlers, and any custom code attached to the tap.</td>
</tr>
<tr>
<td><strong>Options</strong></td>
<td>Inspect the opened menu and expand any submenu needed to find a service.</td>
<td>Menu configuration, submenu state, and whether the submenu can be activated.</td>
</tr>
<tr>
<td><strong>Destination</strong></td>
<td>Follow the service link.</td>
<td>Its target URL, redirects, and the page that actually loads.</td>
</tr>
</tbody></table>
<p>Record the first failed check. “The mobile menu is broken” is less useful to a developer than “the control is visible, but tapping it navigates away before any options appear.”</p>
<h2>1. If the control is absent, inspect the rendered phone view</h2>
<p>In <a href="https://forum.squarespace.com/topic/342144-menu-bar-not-showing-up-on-mobile-verson">one Squarespace discussion</a>, a site owner reported that the menu appeared on desktop but not on phones. A responder identified custom CSS as the cause in that case. That is a reason to <em>inspect</em> CSS when a control is missing, not a reason to assume CSS causes every missing menu.</p>
<p>First, check whether the control exists in the document at the viewport width you are testing. If it does, inspect its computed styles and those of its ancestors. Look for rules affecting <code>display</code>, <code>visibility</code>, opacity, positioning, and overflow. Check which media-query rules apply at that width. Also inspect whether another element covers the control; a control can be present in the layout yet unavailable to tap.</p>
<p>If the control is not in the rendered document, changing its color or stacking order will not fix it. Check how the site’s navigation is configured or rendered before editing styles. Keep the observed symptom and the proposed fix separate in your notes.</p>
<h2>2. If a tap goes elsewhere, inspect the control’s action</h2>
<p>A <a href="https://forum.squarespace.com/topic/317088-mobile-menu-not-working">different Squarespace owner reported</a> that tapping the mobile menu opened a Connect page instead of displaying menu options. The owner attributed that behavior to custom code. Unlike an absent control, this one had a visible tap target. The reported failure was what the tap <em>did</em>.</p>
<p>To investigate that symptom, identify the exact element receiving the tap. Is it a button intended to toggle a panel, an anchor with a destination, or an element containing both? Inspect its attributes and any attached event handlers. Then reproduce the tap while watching whether the menu changes state or the browser navigates. If custom code is present, examine it as a possible contributor rather than treating the report above as a diagnosis of your own site.</p>
<p>Be precise about the expected behavior. If the design uses a menu button, specify what panel it should open. If the design uses a navigation link, specify where it should lead. A test that checks only whether the element responds to a tap can pass while the visitor still never sees the service options.</p>
<h2>3. If the menu opens, test the route through its options</h2>
<p>The next failure may be one level deeper. In <a href="https://wordpress.org/support/topic/sub-menu-items-missing-on-mobile-menu">a WordPress support discussion</a>, a site owner reported that submenu items did not expand on a phone even though they worked on desktop. A responder said the items worked in their own test. The disagreement is important: the report identifies a behavior to check, but it does not establish that the behavior was reproducible for every tester or what caused it.</p>
<p>For your site, list the steps required to reach a specific service page. Does the menu open? Is the service item visible immediately, or is it inside a submenu? If a submenu is required, can you expand it with a tap, and can you select the link afterward? Test the same route with keyboard controls if the navigation is intended to support them. Record the phone, browser, viewport, and sequence of actions when reporting an issue so someone else can try to reproduce the same path.</p>
<p>Do not stop when the submenu looks open. Follow its service link and check the loaded page. Menu state and link destination are different parts of the route.</p>
<h2>Turn the checks into a reproducible test</h2>
<p>A small test record is more actionable than a screenshot of an icon. For each service route you choose to audit, capture:</p>
<ol>
<li><p><strong>Starting point:</strong> the page and viewport used for the test.</p>
</li>
<li><p><strong>Expected path:</strong> the control, menu option, and service page you intend to reach.</p>
</li>
<li><p><strong>Observed behavior:</strong> the first step that differs from that path.</p>
</li>
<li><p><strong>Reproduction details:</strong> device or browser, taps or key presses, and whether the behavior repeats.</p>
</li>
<li><p><strong>Relevant implementation:</strong> the control element, applicable CSS, menu configuration, or custom code you inspected.</p>
</li>
</ol>
<p>For example, consider this <strong>hypothetical</strong> test note: “At the tested phone width, the menu button is visible. Tapping it opens the menu. The ‘Services’ item appears, but its submenu does not open when tapped, so this test does not reach the selected service page.” That note narrows the investigation to option expansion without claiming that the menu is invisible or that its destination is wrong.</p>
<p>If you automate the route, make each checkpoint an explicit assertion rather than testing only the final page. Assert that the control is available, that activating it exposes the expected options, that the chosen service link is available, and that following it loads the intended destination. A failed assertion should tell you <em>which step</em> failed. Match selectors and expected destinations to your actual site; the hypothetical labels above are not a universal menu structure.</p>
<p>The practical goal is not to prove that a site has a mobile-navigation problem. It is to give an owner or developer a clean way to verify the complete path to a service page and, if necessary, identify the first step that needs work.</p>
]]></content:encoded></item><item><title><![CDATA[A Contact Form Success Message Is One Checkpoint, Not the Whole Test]]></title><description><![CDATA[Your contact form says “Success.” What can you verify from that result?
You can verify what appeared on the page during that submission. You cannot use the message alone to verify that the inquiry app]]></description><link>https://instantsite.hashnode.dev/contact-form-success-message-three-checkpoints</link><guid isPermaLink="true">https://instantsite.hashnode.dev/contact-form-success-message-three-checkpoints</guid><category><![CDATA[website testing]]></category><category><![CDATA[Contact Forms]]></category><category><![CDATA[Small business]]></category><category><![CDATA[website optimization]]></category><dc:creator><![CDATA[Emmanouil Vasigia]]></dc:creator><pubDate>Sat, 03 Oct 2026 19:02:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aba8ba0db6accbbd9358570/c15416cb-b3cb-42fa-8caf-8b6644b6b87f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Your contact form says “Success.” What can you verify from that result?</p>
<p>You can verify what appeared on the page during that submission. You cannot use the message alone to verify that the inquiry appeared where your business expects to receive it, or that a later reply reached the visitor. In <a href="https://community.shopify.com/t/not-receiving-emails-from-contact-form/347813">one Shopify community report</a>, a poster described submissions that 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.</p>
<p>For an existing website, I’d test the inquiry path as three separate checkpoints: <strong>on-screen confirmation, business receipt, and reply</strong>. The third checkpoint applies only if a reply is part of the workflow you want to test. This approach makes the test more useful than relying on the confirmation message alone, while keeping its conclusions narrow.</p>
<h2>Specify what each checkpoint means on your site</h2>
<p>Before sending anything, write down the destination you intend to check. “The business received it” is too vague for a test if nobody has agreed on where to look.</p>
<table>
<thead>
<tr>
<th>Checkpoint</th>
<th>Observation to make</th>
<th>What it does not establish</th>
</tr>
</thead>
<tbody><tr>
<td>On-screen confirmation</td>
<td>What appeared after the test submission</td>
<td>Whether the inquiry appeared at the business destination</td>
</tr>
<tr>
<td>Business receipt</td>
<td>Whether the matching inquiry was found at the intended destination</td>
<td>Whether anyone replied</td>
</tr>
<tr>
<td>Reply, if applicable</td>
<td>Whether a reply was sent and received at the test visitor address</td>
<td>What will happen with future inquiries</td>
</tr>
</tbody></table>
<p>Your intended destination might be an email address or a dashboard, depending on how your own site is set up. Name the specific location you expect to use, then have someone with access check <em>that</em> location. Finding a message somewhere else would be a different observation, not a substitute for the check you planned.</p>
<p>Treat “not checked” as its own state. If nobody has looked at the intended destination, you do not yet have a receipt result. Likewise, a reply cannot be marked “not received” until you know whether one was sent and have checked the test visitor address.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6aba8ba0db6accbbd9358570/4ff3f39c-faf4-485e-b904-52e5dba612cb.png" alt="Message Sent" style="display:block;margin:0 auto" />

<h2>Run one traceable test</h2>
<p>Use a test inquiry that you can distinguish from other messages. For example, put a marker such as <code>FORM-TEST-APR15-A</code> in the message. The marker is a hypothetical example; its exact text does not matter. Use a visitor-side address you can access, and identify the inquiry as a test.</p>
<p>Follow the path in order:</p>
<ol>
<li><p><strong>Submit through the live form.</strong> Record the marker, submission time, and exact on-screen result. If the result is unclear, write “unclear” rather than assuming the submission succeeded.</p>
</li>
<li><p><strong>Check the intended business destination.</strong> Look for the same marker and record the location checked. Distinguish “matching inquiry found,” “matching inquiry not found where checked,” and “destination not yet checked.”</p>
</li>
<li><p><strong>Test a reply only if the workflow calls for one.</strong> If someone sends a reply through the usual process, record that action. Then check the visitor-side address and record whether the reply was received.</p>
</li>
</ol>
<p>A compact record keeps observations from turning into guesses:</p>
<pre><code class="language-text">Test marker: [unique marker]
Visitor-side address: [address used for this test]
Submitted at: [time]
On-screen result: [success / other result / unclear]
Intended business destination: [specific location]
Destination checked by: [person / not yet checked]
Matching inquiry at destination: [found / not found / not yet checked]
Reply expected for this test: [yes / no]
Reply sent: [yes / no / not applicable / not yet checked]
Reply received at visitor address: [yes / no / not applicable / not yet checked]
</code></pre>
<p>This is an observation log, not a claim about the system’s internals. Its value is that someone reviewing the test can tell which steps were actually checked. It also gives people who handle different parts of the inquiry a common marker to look for.</p>
<h2>Interpret the observations without skipping a step</h2>
<p>Consider a hypothetical test in which the page shows success, but the person checking the intended business destination cannot find the marked inquiry. Record exactly that: <strong>success shown; matching inquiry not found at the location checked</strong>. The next step is to investigate that mismatch using whatever settings or records are available for your site. The observation alone does not identify a cause, and it should not be rewritten as a claim that the message disappeared everywhere.</p>
<p>Now consider a different result: the marked inquiry is found, but no one has tried to reply. The receipt checkpoint has been checked; the reply checkpoint has not. Calling the whole path “verified” would erase that distinction. If a reply is sent but is not found at the visitor-side address, record those two observations separately as well.</p>
<p>Finally, suppose the confirmation appeared, the matching inquiry was found, and an expected reply was received. You have observed a complete path for <strong>that test inquiry</strong>. Keep the result tied to its marker and time rather than treating it as a guarantee about every future submission.</p>
<p>This is why the order matters. Starting with a general question such as “Does our form work?” invites one yes-or-no answer to cover several different checks. Starting with a marked submission gives you a smaller, answerable set of questions: What did the visitor see? Where did the inquiry appear? If a reply was expected, did it reach the test visitor?</p>
<h2>Make the next check depend on the missing observation</h2>
<p>If the business destination has not been checked, ask someone with access to check it before drawing a conclusion about receipt. If the inquiry is found there, decide whether a reply test is relevant to the workflow. If it is not found where checked, retain the marker, time, and named destination for further investigation. These are different next actions because the recorded states are different.</p>
<p>The practical mistake to avoid is promoting the first checkpoint into proof of the others. Let the success message stand for what you saw on the page. Then use a marked inquiry to check receipt, and, when appropriate, an actual reply to check the final step.</p>
]]></content:encoded></item><item><title><![CDATA[I Tried to Make AI Build a Complete Website From One Sentence. Here’s What Broke]]></title><description><![CDATA[The first version looked almost too easy. Give the AI one sentence: “I run a roofing company in Austin.”
A few seconds later, you have a homepage. Nice headline. Services section. CTA. Decent copy. At]]></description><link>https://instantsite.hashnode.dev/ai-build-website-from-one-sentence</link><guid isPermaLink="true">https://instantsite.hashnode.dev/ai-build-website-from-one-sentence</guid><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[AI]]></category><category><![CDATA[llm]]></category><category><![CDATA[software architecture]]></category><category><![CDATA[Next.js]]></category><dc:creator><![CDATA[Emmanouil Vasigia]]></dc:creator><pubDate>Mon, 28 Sep 2026 17:30:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aba8ba0db6accbbd9358570/5eb48396-06ec-4d36-8c7e-6c75d3f52553.svg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The first version looked almost too easy. Give the AI one sentence: “I run a roofing company in Austin.”</p>
<p>A few seconds later, you have a homepage. Nice headline. Services section. CTA. Decent copy. At that point, it is very tempting to think: “Okay. The hard part is done.” It wasn’t. 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. That changed everything. A homepage is easy LLMs are very good at producing something that looks convincing once. Give them a prompt and they can generate:</p>
<ul>
<li><p>a hero section</p>
</li>
<li><p>service descriptions</p>
</li>
<li><p>an About section</p>
</li>
<li><p>testimonials</p>
</li>
<li><p>FAQs</p>
</li>
<li><p>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.</p>
</li>
</ul>
<p>Generate the website.</p>
<p>The output looked fine. Until I generated another page. Then another. Suddenly the website had three different personalities. The homepage sounded premium. The services page sounded like a discount contractor. The About page sounded like a Fortune 500 company. The model was generating pages independently. That was the mistake. A website is not a collection of unrelated prompts. It needs a shared source of truth. So instead of generating pages immediately, I started generating a structured representation of the business first. Something closer to: { "business": "Austin Roofing Co", "industry": "Roofing", "location": "Austin, Texas", "audience": "Homeowners", "tone": "Professional and local", "services": [ "Roof repair", "Roof replacement", "Storm damage repair" ], "primaryGoal": "Request a quote" }</p>
<p>Every page then uses the same context. This sounds obvious now. It was not obvious in version one. Problem #2: AI loves inventing things Ask an AI to create a business website and it wants to be helpful. Sometimes a little too helpful. It may invent:</p>
<ul>
<li><p>customer testimonials</p>
</li>
<li><p>awards</p>
</li>
<li><p>years of experience</p>
</li>
<li><p>certifications</p>
</li>
<li><p>addresses</p>
</li>
<li><p>statistics</p>
</li>
<li><p>phone numbers A sentence like: “Trusted by 2,000 homeowners since 1998”</p>
</li>
</ul>
<p>looks fantastic on a landing page. There is only one problem. Nobody told the AI that. For a fictional demo, this is harmless. For a real business, it is a serious problem. So I had to start treating certain information differently. There are facts the model can rewrite. There are facts it can infer carefully. And there are facts it should never create. That distinction became one of the most important parts of the system. Problem #3: Good-looking HTML can still be broken This one surprised me. A generated page could look great at 1440px. Then I opened it on mobile. Chaos. Headings wrapping into five lines. Buttons leaving their containers. Images becoming enormous. Two-column layouts refusing to become one column. Text becoming unreadable over backgrounds. The AI had created something that was technically valid and visually broken.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6aba8ba0db6accbbd9358570/bf809e88-1dd5-4b9b-b884-13f70c352c8b.svg" alt="" style="display:block;margin:0 auto" />

<p>This is where I realized something important: Generating the site and verifying the site are two completely different problems. So I added a separate visual QA step. Instead of trusting the generated result, the system has to inspect what actually rendered. Things like: Does content overflow? Are sections missing? Is text readable? Does the navigation work? Are elements overlapping? Does the page still make sense on mobile?</p>
<p>The AI can say the website is correct. The browser is the final judge. Problem #4: “Regenerate” is not a solution A lot of AI products solve bad output with one button: Generate again. That works surprisingly well in demos. It is also expensive. If generation fails 10% of the time, simply running the whole thing again means:</p>
<ul>
<li><p>more model calls</p>
</li>
<li><p>more latency</p>
</li>
<li><p>more compute</p>
</li>
<li><p>more money</p>
</li>
<li><p>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 -&gt; isolate -&gt; repair</p>
</li>
</ul>
<p>instead of: fail -&gt; regenerate everything -&gt; hope</p>
<p>That one change made the system feel much less like a slot machine. Problem #5: The AI kept being creative when I needed it to be boring This was probably the funniest problem. Creativity sounds great when building with AI. Until you are generating production UI. Sometimes you do not want creativity. You want: Header Hero Services About CTA Footer</p>
<p>That is it. No floating glassmorphism card. No randomly rotated image. No giant quote taking up the whole viewport. No mysterious “Our Philosophy” section for a plumbing company. The model kept trying to impress me. I kept trying to make it behave. Eventually I realized the system needs both freedom and constraints. Too many constraints and every site looks identical. Too much freedom and every generation becomes unpredictable. Finding that middle ground was much harder than writing the prompt. The architecture slowly changed The original idea was basically:</p>
<img src="https://cdn.hashnode.com/uploads/covers/6aba8ba0db6accbbd9358570/988ac470-4426-443f-979b-f8ccbe2024d1.svg" alt="" style="display:block;margin:0 auto" />

<p>Business description ↓ AI ↓ Website</p>
<p>The real system started looking more like:</p>
<img src="https://cdn.hashnode.com/uploads/covers/6aba8ba0db6accbbd9358570/2e68262b-614c-4296-afdb-4f5c8cd5c16f.svg" alt="" style="display:block;margin:0 auto" />

<p>Business description ↓ Business understanding ↓ Website structure ↓ Page planning ↓ Content generation ↓ Design generation ↓ Rendering ↓ Visual validation ↓ Repair ↓ Final website</p>
<p>The interesting part is that AI is only one piece of that pipeline. Most of the work is actually about controlling it. The biggest lesson Before building this, I thought the main challenge would be: “Can AI generate a good website?”</p>
<p>It can. That is not the interesting question anymore. The real question is: Can AI generate a good website repeatedly, predictably, and without a human fixing it afterward?</p>
<p>That is a completely different engineering problem. The first impressive result took very little time. The reliable system took much longer. And I suspect this is true for a lot of AI products right now. The demo is easy. The last 20% is the product. I’m still working on this problem while building <a href="https://instantsite.app">Instantsite</a>, where the goal is to turn a short business description into a complete editable website. But the thing I find most interesting is not the website generatio</p>
<p>n itself. It is everything required to make unpredictable AI output behave like predictable software. That part is much harder than the demo makes it look. One question If you’re building with generative AI, what was the first thing that worked perfectly in the demo and completely fell apart in production?</p>
]]></content:encoded></item></channel></rss>