<?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: Lin Xi</title>
    <description>The latest articles on DEV Community by Lin Xi (@linxi-ai).</description>
    <link>https://dev.to/linxi-ai</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%2F4117198%2Fb8dbd139-40f2-41bf-b4fe-ca7a729a938a.png</url>
      <title>DEV Community: Lin Xi</title>
      <link>https://dev.to/linxi-ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/linxi-ai"/>
    <language>en</language>
    <item>
      <title>A Checkout Button Is Not a Payment Flow</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Mon, 28 Sep 2026 04:54:47 +0000</pubDate>
      <link>https://dev.to/linxi-ai/a-checkout-button-is-not-a-payment-flow-44pk</link>
      <guid>https://dev.to/linxi-ai/a-checkout-button-is-not-a-payment-flow-44pk</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%2Fvysm11l8t76yl28xbhf9.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%2Fvysm11l8t76yl28xbhf9.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;br&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%2Fx5gih85jqrkof6shfx5h.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%2Fx5gih85jqrkof6shfx5h.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;br&gt;
A pricing page can feel finished when its Buy button opens checkout. The harder question is what tells the product to deliver what was sold.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four handoffs
&lt;/h2&gt;

&lt;p&gt;Separate the offer, checkout session, payment confirmation, and fulfillment. A flow is broken if the offer says monthly but checkout charges annually, or if payment succeeds while the account stays on a free plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify payment on the server
&lt;/h2&gt;

&lt;p&gt;Do not mark an order paid because a buyer reached the return page. A browser redirect is a page visit, not a payment record. For Stripe, verify the provider event and use webhooks for fulfillment. The handler must be safe when the same notification arrives more than once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the awkward paths
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cancel checkout: return safely, with no paid message and no access.&lt;/li&gt;
&lt;li&gt;Delayed confirmation: show pending, not premature success.&lt;/li&gt;
&lt;li&gt;Duplicate notification: keep one order and one entitlement.&lt;/li&gt;
&lt;li&gt;Declined payment: explain the failure and allow a safe retry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run these cases in a sandbox. Complete a payment, close the browser before the return page loads, then cancel, decline, and replay the notification. Check the buyer message, order state, and actual entitlement each time.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://docs.stripe.com/checkout/fulfillment?payment-ui=stripe-hosted" rel="noopener noreferrer"&gt;https://docs.stripe.com/checkout/fulfillment?payment-ui=stripe-hosted&lt;/a&gt; and &lt;a href="https://docs.stripe.com/testing" rel="noopener noreferrer"&gt;https://docs.stripe.com/testing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: This article was drafted with AI assistance and reviewed for technical accuracy by the author.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The URL Migration Checklist I Wish Every Redesign Had</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Wed, 23 Sep 2026 11:25:23 +0000</pubDate>
      <link>https://dev.to/linxi-ai/the-url-migration-checklist-i-wish-every-redesign-had-1ea9</link>
      <guid>https://dev.to/linxi-ai/the-url-migration-checklist-i-wish-every-redesign-had-1ea9</guid>
      <description>&lt;p&gt;A redesign can be flawless on the new homepage and still break links people saved months ago. Before launch, treat the old URL inventory as an engineering input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build the route-audit sheet
&lt;/h2&gt;

&lt;p&gt;Start with the old sitemap and CMS. Add URLs from Search Console, analytics, old newsletters, bookmarks, and external links. Track four fields: old URL, destination URL, decision, and owner.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Old path&lt;/th&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;th&gt;Expected result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/pricing&lt;/td&gt;
&lt;td&gt;Keep&lt;/td&gt;
&lt;td&gt;/pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/product-v1&lt;/td&gt;
&lt;td&gt;Permanent redirect&lt;/td&gt;
&lt;td&gt;/product, if it answers the same need&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/expired-offer&lt;/td&gt;
&lt;td&gt;Remove&lt;/td&gt;
&lt;td&gt;Intentional 404 or 410&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are fictional examples, not We0 routes or a client migration. The decision diagram is a compact way to explain the three outcomes: keep, redirect to an equivalent page, or remove without a misleading homepage catch-all.&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%2Ff867bx9w3mnyppjr2pq1.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%2Ff867bx9w3mnyppjr2pq1.png" alt="Original URL decision diagram" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes" rel="noopener noreferrer"&gt;site-move guidance&lt;/a&gt; recommends mapping old URLs to new ones and warns against irrelevant redirects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validate the HTTP behavior
&lt;/h2&gt;

&lt;p&gt;For a permanent move, use a server-side 301 or 308. A 302 is a temporary signal. Avoid chains where a direct redirect to the final equivalent URL is possible.&lt;/p&gt;

&lt;p&gt;For each high-priority row, validate both the initial response and the final destination:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com/product-v1
curl &lt;span class="nt"&gt;-IL&lt;/span&gt; https://example.com/product-v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first request shows the initial status and Location header. The second follows the chain. Then load the final page in a browser and inspect its canonical URL. For removed paths, confirm the 404 or 410 is intentional.&lt;/p&gt;

&lt;p&gt;On the new-site side, &lt;a href="https://we0.ai/features" rel="noopener noreferrer"&gt;We0.ai&lt;/a&gt; puts content, SEO settings, and publishing in one workflow. It can reduce handoffs while building replacement pages, but it cannot choose the right destination for an old URL; the route map still needs an owner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix the links you control
&lt;/h2&gt;

&lt;p&gt;Update navigation, in-content links, canonical URLs, and the sitemap to use final addresses. If the move spans localized URLs, check their relationships too. A redirect can rescue an old bookmark; it should not be the permanent route used by your own site.&lt;/p&gt;

&lt;p&gt;After launch, test three old URLs from a fresh browser window. Ask where each one ends, whether the final page loads, whether its canonical points to the new URL, and whether internal links and the sitemap already use that address. Repeat for URLs from old emails and external articles.&lt;/p&gt;

&lt;p&gt;Google recommends submitting an updated sitemap and keeping permanent redirects in place for a long period, generally at least a year. Start with twenty old URLs you would hate to lose and give each a defensible destination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;I work with We0.ai. AI assistance was used to prepare this draft; I reviewed the sources and final text.&lt;/p&gt;

</description>
      <category>seo</category>
    </item>
    <item>
      <title>Before You Watch Traffic, Define the Events Behind User Behavior</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Tue, 22 Sep 2026 05:35:31 +0000</pubDate>
      <link>https://dev.to/linxi-ai/before-you-watch-traffic-define-the-events-behind-user-behavior-3jj5</link>
      <guid>https://dev.to/linxi-ai/before-you-watch-traffic-define-the-events-behind-user-behavior-3jj5</guid>
      <description>&lt;p&gt;After an AI-built website goes live, the analytics dashboard is often the first page the team opens. Visits, traffic sources, bounce rate, and time on page are useful—but they describe what happened without always explaining why.&lt;/p&gt;

&lt;p&gt;A page view does not tell you whether someone reached the feature section, opened pricing, started a form, submitted it, or clicked a button by mistake. Before collecting hundreds of anonymous clicks, define a few events that can support an actual decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  A visit is an entry point, not an explanation
&lt;/h2&gt;

&lt;p&gt;One visitor can leave after the hero, read a feature list, open pricing, start a form, submit it, or return later from another source. If every behavior becomes only a page view, the dashboard still leaves the team guessing.&lt;/p&gt;

&lt;p&gt;An event is useful when it supports a question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did people reach the section that explains the product?&lt;/li&gt;
&lt;li&gt;Which page or message moved them to the next step?&lt;/li&gt;
&lt;li&gt;Where did they abandon a form?&lt;/li&gt;
&lt;li&gt;Which source brought visitors who continued learning?&lt;/li&gt;
&lt;li&gt;Did a content page lead to a meaningful next action?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Start with five events
&lt;/h2&gt;

&lt;p&gt;For a product website or a small SaaS, these five event families are a better starting point than dozens of anonymous click events:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;What it records&lt;/th&gt;
&lt;th&gt;Question it supports&lt;/th&gt;
&lt;th&gt;What it does not prove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;view_key_section&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A visitor reaches a feature, pricing, or case-study section&lt;/td&gt;
&lt;td&gt;Which content enters the reading path?&lt;/td&gt;
&lt;td&gt;Seeing a section does not mean agreement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;click_primary_cta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A visitor clicks the main next-step button&lt;/td&gt;
&lt;td&gt;Which page and message move people forward?&lt;/td&gt;
&lt;td&gt;A click does not equal intent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;start_form&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A visitor begins completing a form&lt;/td&gt;
&lt;td&gt;Is the entry point clear enough to begin?&lt;/td&gt;
&lt;td&gt;Starting does not mean completing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;submit_form&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A form submission with success or failure state&lt;/td&gt;
&lt;td&gt;Which visitors complete the action?&lt;/td&gt;
&lt;td&gt;A submission does not equal a sale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;use_demo_or_signup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A visitor tries a demo or starts registration&lt;/td&gt;
&lt;td&gt;Does the page move interest into experience?&lt;/td&gt;
&lt;td&gt;A signup does not equal retention&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important column is not the event name. It is the question behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Name events so they still make sense later
&lt;/h2&gt;

&lt;p&gt;Tracking systems become messy when names stop carrying meaning. &lt;code&gt;button_click&lt;/code&gt;, &lt;code&gt;click_1&lt;/code&gt;, and &lt;code&gt;new_event&lt;/code&gt; may be acceptable during launch week, but nobody remembers what they represent a few weeks later.&lt;/p&gt;

&lt;p&gt;A simple convention is enough: &lt;strong&gt;action + object + optional outcome&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;click_pricing_cta&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start_signup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;submit_contact_form_success&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;submit_contact_form_error&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;open_feature_demo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep page, user type, traffic source, experiment version, and content ID as parameters instead of creating a new event for every variation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instrument success and failure states
&lt;/h2&gt;

&lt;p&gt;A form submission is not one state. A useful implementation distinguishes success, validation error, cancellation, timeout, and duplicate submission when those states change the next decision. The same principle applies to demos and signups.&lt;/p&gt;

&lt;p&gt;The goal is not the largest tracking plan. It is a short loop: an action becomes an event, the event supports a question, and the question leads to a page, content, or release decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small event plan for today
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Pick one important page instead of tracking the entire site at once.&lt;/li&gt;
&lt;li&gt;Write the five most important user actions from entry to next step.&lt;/li&gt;
&lt;li&gt;Name each event with an action, object, and outcome where needed.&lt;/li&gt;
&lt;li&gt;Write one question beside every event.&lt;/li&gt;
&lt;li&gt;Record success, failure, cancellation, and duplicate-submission states when they matter.&lt;/li&gt;
&lt;li&gt;Assign an owner and a review date so the tracking plan does not become abandoned code.&lt;/li&gt;
&lt;li&gt;In each review, write what the data supports and what it still cannot prove.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Traffic is worth watching. But if you want to understand why people continue, stop, submit, or leave, start with the actions and design the data around them.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>saas</category>
      <category>website</category>
    </item>
    <item>
      <title>An AI-Built Website Can Look Polished and Still Say the Wrong Thing</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Mon, 21 Sep 2026 04:02:32 +0000</pubDate>
      <link>https://dev.to/linxi-ai/an-ai-built-website-can-look-polished-and-still-say-the-wrong-thing-5ao0</link>
      <guid>https://dev.to/linxi-ai/an-ai-built-website-can-look-polished-and-still-say-the-wrong-thing-5ao0</guid>
      <description>&lt;p&gt;One of the easiest ways for an AI-built website to become misleading is also one of the least dramatic: it looks finished.&lt;/p&gt;

&lt;p&gt;The headline reads smoothly. The feature list is complete. The FAQ sounds confident. Add a polished image and the page can look more mature than many websites written entirely by hand.&lt;/p&gt;

&lt;p&gt;Then a reader asks a simple question: Is that feature available today? Where did that number come from? Does â€œmultilingualâ€ include the CMS and metadata, or only the visible text? Is the same product described consistently across the homepage, pricing page, and search snippet?&lt;/p&gt;

&lt;p&gt;Once a website is used in search, sales, support, and advertising, a small content error becomes a trust problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not every sentence needs the same kind of evidence
&lt;/h2&gt;

&lt;p&gt;I find it useful to put website copy into four buckets before editing it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Content type&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Best evidence&lt;/th&gt;
&lt;th&gt;Review rhythm&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fact&lt;/td&gt;
&lt;td&gt;Supported integrations, languages, payment methods, release date&lt;/td&gt;
&lt;td&gt;Product docs, settings, formal announcement&lt;/td&gt;
&lt;td&gt;Review when the product changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Price, quota, speed, user count, success rate&lt;/td&gt;
&lt;td&gt;Pricing page, system records, reproducible test&lt;/td&gt;
&lt;td&gt;Review at every relevant version change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Judgment&lt;/td&gt;
&lt;td&gt;â€œGood for small teams,â€ â€œeasier to maintainâ€&lt;/td&gt;
&lt;td&gt;Explicit conditions and comparison scope&lt;/td&gt;
&lt;td&gt;Review as positioning changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Promise&lt;/td&gt;
&lt;td&gt;â€œImproves visibility,â€ â€œreduces repetitive workâ€&lt;/td&gt;
&lt;td&gt;Mechanism, limits, and verifiable evidence&lt;/td&gt;
&lt;td&gt;Never turn an aspiration into a guarantee&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most dangerous errors are often not obvious falsehoods. They are judgments written as facts, or possibilities written as promises.&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/images%2Fcontent-trust-workflow.svg" 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/images%2Fcontent-trust-workflow.svg" alt="A content-trust workflow connecting a website claim to its source, owner, and review date." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image: An original diagram created for this article. It is not a We0 product screenshot, does not use third-party stock art, and turns the source-owner-review-date idea into an operational workflow.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  â€œPlausibleâ€ is the hardest kind of error to catch
&lt;/h2&gt;

&lt;p&gt;If an AI invents a company founding year, someone may correct it quickly. If it describes a beta feature as â€œsupported,â€ the problem may stay hidden until a customer relies on it.&lt;/p&gt;

&lt;p&gt;The harder cases are statements that are not clearly false but invite the wrong interpretation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;â€œSupports multilingual websites.â€ Does that mean translated page text, or does it also include CMS content, metadata, and language relationships?&lt;/li&gt;
&lt;li&gt;â€œIncludes analytics.â€ Does that mean a basic event hook, or a complete attribution and reporting system?&lt;/li&gt;
&lt;li&gt;â€œSupports AI search optimization.â€ Does that mean the team can configure page fields, or does it imply that an AI system will definitely cite the page?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These sentences need more than a grammar check. They need a boundary check.&lt;/p&gt;

&lt;p&gt;Ask: &lt;strong&gt;If a customer made a decision based on this sentence, could we explain exactly where it applies and where it stops?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A CMS answers â€œwho can edit,â€ not automatically â€œwho is rightâ€
&lt;/h2&gt;

&lt;p&gt;We0â€™s public CMS page presents backend CRUD, a rich-text editor, image upload, and file upload as content-management capabilities. For a website that changes over time, giving content a proper editing home is important. It should not remain buried in page code forever.&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/images%2Fwe0-en-cms-capabilities.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/images%2Fwe0-en-cms-capabilities.png" alt="We0â€™s English CMS page, showing backend CRUD, a rich-text editor, image upload, and file upload capabilities." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image: We0.ai public product-page material. It describes the CMS capabilities visible on the page and does not prove content accuracy, customer usage, or publishing outcomes. Screenshot asset captured September 11, 2026; page checked September 21, 2026. Source: &lt;a href="https://we0.ai/cms-backend" rel="noopener noreferrer"&gt;https://we0.ai/cms-backend&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But a CMS only creates a better place to make changes. It does not tell you whether the change is correct.&lt;/p&gt;

&lt;p&gt;That still requires a source, an owner, a review state, a last-updated date, and some way to understand what changed. A pricing field with no responsible owner will still go stale inside a well-designed editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO and GEO are not keyword stuffing with a nicer name
&lt;/h2&gt;

&lt;p&gt;Titles, descriptions, Open Graph fields, canonical URLs, language mappings, and structured page information can help systems understand and share a page. They cannot replace trustworthy substance.&lt;/p&gt;

&lt;p&gt;Googleâ€™s public guidance emphasizes helpful, reliable, people-first content. For a website team, that becomes a plain operational rule: answer a real question, make important claims explainable, and do not inflate unsupported statements just to make a page more visible.&lt;/p&gt;

&lt;p&gt;We0â€™s public SEO/GEO page shows language-specific SEO configuration, page-level metadata, canonical and language mapping, Open Graph/Twitter data, and a search-friendly page structure. These are foundations for expressing and distributing content. They are not a button that guarantees ranking or AI citation.&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/images%2Fwe0-en-seo-geo-metadata.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/images%2Fwe0-en-seo-geo-metadata.png" alt="We0â€™s English SEO and GEO page, showing language-specific SEO, page-level metadata, canonical and language mapping, Open Graph/Twitter, and search-friendly page structure." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image: We0.ai public product-page material. It describes the SEO/GEO configuration direction shown on the page and does not prove rankings, indexing, AI citations, or traffic outcomes. Screenshot asset captured September 11, 2026; page checked September 21, 2026. Source: &lt;a href="https://we0.ai/seo-geo-optimization" rel="noopener noreferrer"&gt;https://we0.ai/seo-geo-optimization&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add three fields to every important claim
&lt;/h2&gt;

&lt;p&gt;If I were reviewing an AI-generated website today, I would not start by rewriting every paragraph. I would add three fields to the most important claims:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt;: What supports this sentence â€” a product document, a pricing page, a system record, or someoneâ€™s opinion?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner&lt;/strong&gt;: Who will know when it changes, and who is allowed to update it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review date&lt;/strong&gt;: When was it last checked, and what kind of product change should trigger another review?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This quickly reveals the weak spots. Some claims have no source. Some have a source but no owner. Some were accurate when written and have not been reviewed since.&lt;/p&gt;

&lt;p&gt;That is more useful than asking only whether the copy â€œsounds human.â€&lt;/p&gt;

&lt;h2&gt;
  
  
  AI is a strong drafting partner, not an independent witness
&lt;/h2&gt;

&lt;p&gt;AI is useful for turning source material into page copy, adapting a fact into different tones, finding repetition, suggesting FAQs, writing summaries, and preparing a multilingual draft.&lt;/p&gt;

&lt;p&gt;But when a page represents a real product, the final responsibility cannot belong to â€œwhat the model thought was probably true.â€ Important claims should return to source material, or be labeled clearly as a viewpoint, assumption, or future plan.&lt;/p&gt;

&lt;p&gt;This matters even more when an AI website becomes part of an SEO, GEO, content, or growth workflow. Search may bring the first visit. Whether the visitor continues to trust the site depends on whether the page survives a follow-up question.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick content-trust check
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pick five sentences from the homepage, pricing page, feature page, and FAQ.&lt;/li&gt;
&lt;li&gt;Label each one as a fact, number, judgment, or promise.&lt;/li&gt;
&lt;li&gt;Add a primary source to facts and numbers.&lt;/li&gt;
&lt;li&gt;Add conditions to judgments instead of presenting them as universal truths.&lt;/li&gt;
&lt;li&gt;Add limits to promises instead of presenting a goal as a guarantee.&lt;/li&gt;
&lt;li&gt;Record an owner and a review date.&lt;/li&gt;
&lt;li&gt;Compare the Chinese page, English page, social preview, and search description for contradictions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI can give a website content quickly. Trust does not appear merely because the page was generated quickly.&lt;/p&gt;

&lt;p&gt;A durable website workflow should be able to answer three questions: Where did this sentence come from? Who owns it? When will someone check it again?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Before an AI-Built Website Goes Live, “Login” Is Not a Permission Model</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Sun, 20 Sep 2026 04:22:32 +0000</pubDate>
      <link>https://dev.to/linxi-ai/before-an-ai-built-website-goes-live-login-is-not-a-permission-model-1og</link>
      <guid>https://dev.to/linxi-ai/before-an-ai-built-website-goes-live-login-is-not-a-permission-model-1og</guid>
      <description>&lt;p&gt;When an AI-built website reaches its first usable version, teams usually check the visual details first: spacing, colors, mobile layout, and whether the buttons look right.&lt;/p&gt;

&lt;p&gt;Authentication often comes later.&lt;/p&gt;

&lt;p&gt;Then a more difficult question appears: who can see what, who can edit it, who can publish it, and who is allowed to change the people who have access?&lt;/p&gt;

&lt;p&gt;Those are not four versions of the same login button. They are different responsibilities. If they remain vague, AI can help a team build faster while also spreading an unclear access model across more pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authentication tells you who someone is. Authorization tells you what they can do.
&lt;/h2&gt;

&lt;p&gt;A website may have visitors, members, editors, administrators, billing owners, and customer-side managers. They may all sign in successfully. They should not all see the same data or perform the same actions.&lt;/p&gt;

&lt;p&gt;Before drawing a login screen, write down the actions that matter:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;th&gt;Typical role&lt;/th&gt;
&lt;th&gt;Common gap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;View&lt;/td&gt;
&lt;td&gt;Who can see this page, record, or workspace?&lt;/td&gt;
&lt;td&gt;Visitor, member, customer&lt;/td&gt;
&lt;td&gt;The list is hidden, but the detail URL still works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edit&lt;/td&gt;
&lt;td&gt;Who can change content, settings, or member information?&lt;/td&gt;
&lt;td&gt;Editor, project member&lt;/td&gt;
&lt;td&gt;The button is hidden, but the API accepts the request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publish&lt;/td&gt;
&lt;td&gt;Who can make a change public?&lt;/td&gt;
&lt;td&gt;Content owner, administrator&lt;/td&gt;
&lt;td&gt;Editing and publishing are treated as one permission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manage&lt;/td&gt;
&lt;td&gt;Who can invite people, change roles, handle billing, or delete data?&lt;/td&gt;
&lt;td&gt;Admin, owner&lt;/td&gt;
&lt;td&gt;Nobody is clearly responsible for the most sensitive actions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The table is not the design. It is a way to make the disagreements visible before they become code.&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/images%2Fwriting-notes-pexels-7103.jpg" 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/images%2Fwriting-notes-pexels-7103.jpg" alt="A person writing notes beside a laptop, representing the early work of defining roles and access boundaries." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image: Startup Stock Photos via Pexels. It illustrates the act of documenting requirements; it is not a We0 product screenshot or a customer project. Source: &lt;a href="https://www.pexels.com/photo/person-writing-on-paper-using-yellow-and-black-pen-7103/" rel="noopener noreferrer"&gt;https://www.pexels.com/photo/person-writing-on-paper-using-yellow-and-black-pen-7103/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hiding a button is not access control
&lt;/h2&gt;

&lt;p&gt;One of the most common mistakes is treating a hidden button as a permission check.&lt;/p&gt;

&lt;p&gt;Suppose a regular member cannot see the “Delete project” button. That improves the interface, but it does not prove that the delete action is protected. If the member can call the underlying endpoint directly, the control is only hidden, not enforced.&lt;/p&gt;

&lt;p&gt;Frontend visibility helps users understand what is available. Server-side authorization is what protects the boundary. The system needs to check not only whether someone is signed in, but whether that person is allowed to perform this action on this specific resource.&lt;/p&gt;

&lt;p&gt;Role names do not solve this by themselves. Can an &lt;code&gt;editor&lt;/code&gt; edit every project or only projects they belong to? Can an &lt;code&gt;admin&lt;/code&gt; access billing information? Can a member of Organization A read a record owned by Organization B? If the answers are not written down, adding more roles will not make the model clearer.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI can generate role labels faster than it can define responsibility
&lt;/h2&gt;

&lt;p&gt;An AI builder can produce a login page, a registration flow, a dashboard menu, and role names such as &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;member&lt;/code&gt;, and &lt;code&gt;viewer&lt;/code&gt; very quickly.&lt;/p&gt;

&lt;p&gt;The difficult part is the boundary around those names:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who owns the resource: a person, a team, a customer, or an organization?&lt;/li&gt;
&lt;li&gt;Does an action affect a page, a field, an export, or a public release?&lt;/li&gt;
&lt;li&gt;What happens to content when a member is removed?&lt;/li&gt;
&lt;li&gt;Can an expired invitation link still be used?&lt;/li&gt;
&lt;li&gt;If a user belongs to two teams, which permission set applies?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the requirements do not answer these questions, the AI will fill in a plausible default. The page may look complete while ownership and accountability remain undefined.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat authentication, content, and delivery as one chain
&lt;/h2&gt;

&lt;p&gt;We0’s public features page presents landing pages, authentication, AI capabilities, payments, CMS, analytics, multilingual support, and launch delivery as part of one broader website system. That is useful context, but it also makes one boundary clear: authentication is one capability, not a substitute for the whole access and operations model.&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/images%2Fwe0-features-core-capabilities.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/images%2Fwe0-features-core-capabilities.png" alt="We0’s public features page, showing landing pages, authentication, AI capabilities, payments, CMS, analytics, multilingual support, and launch delivery." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image: We0.ai public product-page material. It describes the capability categories shown on the page and does not prove customer usage, security outcomes, or launch results. Screenshot asset captured September 11, 2026; page checked September 20, 2026. Source: &lt;a href="https://we0.ai/zh/features" rel="noopener noreferrer"&gt;https://we0.ai/zh/features&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Permissions also need to connect to content, admin operations, and publishing.&lt;/p&gt;

&lt;p&gt;An editor may be allowed to change an article but not a price. A member may view a workspace but not export all its data. An operator may submit a release but not change the domain or payment configuration.&lt;/p&gt;

&lt;p&gt;Using one broad &lt;code&gt;admin&lt;/code&gt; role can feel efficient in an early prototype. Later it often becomes a mixture of expanded access, unclear responsibility, and difficult reviews.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test what happens after login
&lt;/h2&gt;

&lt;p&gt;Before launch, test a few real situations instead of stopping at “can a user register?”&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What does a new member see immediately after accepting an invitation?&lt;/li&gt;
&lt;li&gt;What happens when a read-only member opens an edit URL directly?&lt;/li&gt;
&lt;li&gt;After an editor changes content, who sees the draft and who can publish it?&lt;/li&gt;
&lt;li&gt;When a member is removed, what happens to old links, sessions, and content?&lt;/li&gt;
&lt;li&gt;If two organizations have projects with the same name, can their data be mixed?&lt;/li&gt;
&lt;li&gt;What happens when an unauthenticated visitor opens a deep link to a private page?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These scenarios are closer to launch risk than the visual design of the sign-in page.&lt;/p&gt;

&lt;p&gt;We0’s public full-stack code-generation page groups page structure, authentication, payments, admin capabilities, multilingual support, SEO, and deployment as a broader engineering foundation. For an AI website workflow, that systems view is useful. It also creates a responsibility for the team: every generated capability still needs a clear owner and a clear boundary.&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/images%2Fwe0-en-full-stack-overview.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/images%2Fwe0-en-full-stack-overview.png" alt="We0’s public AI Full-Stack Code Generation page, showing page structure, auth, payments, admin capabilities, multilingual support, SEO, and deployment." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image: We0.ai public product-page material. It illustrates the capabilities described on the page; it is not a security audit, code-quality assessment, or proof of a successful deployment. Screenshot asset captured September 11, 2026; page checked September 20, 2026. Source: &lt;a href="https://we0.ai/full-stack-code-generation" rel="noopener noreferrer"&gt;https://we0.ai/full-stack-code-generation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Draw one role-by-action table before launch
&lt;/h2&gt;

&lt;p&gt;You do not need ten roles on day one. Choose three realistic users, list their actions, and look for conflicts.&lt;/p&gt;

&lt;p&gt;A workable starting point might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visitor&lt;/strong&gt;: can view public pages, but cannot access private data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Member&lt;/strong&gt;: can work inside the spaces they belong to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Administrator&lt;/strong&gt;: can manage members, roles, and key settings, with important actions recorded for review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add editors, billing owners, or customer administrators only when the product actually needs those distinctions.&lt;/p&gt;

&lt;p&gt;The earlier the team defines access, the easier it is for an AI builder to generate a structure that can keep evolving. When access remains vague, AI simply spreads the ambiguity across more screens.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>authentication</category>
      <category>security</category>
    </item>
    <item>
      <title>The AI Built the Happy Path. What Happens When the Form Fails?</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Fri, 18 Sep 2026 07:57:55 +0000</pubDate>
      <link>https://dev.to/linxi-ai/the-ai-built-the-happy-path-what-happens-when-the-form-fails-1gdh</link>
      <guid>https://dev.to/linxi-ai/the-ai-built-the-happy-path-what-happens-when-the-form-fails-1gdh</guid>
      <description>&lt;h2&gt;
  
  
  A generated page is not a finished interaction
&lt;/h2&gt;

&lt;p&gt;AI builders can produce a convincing first version quickly. The homepage is there, navigation works, and a form may accept a value and return a result. But “it exists” is not the same as “it is ready to hand to a user.”&lt;/p&gt;

&lt;p&gt;Real users submit incomplete email addresses, click twice when the network is slow, open dashboards with no data, and reach pages they cannot access. The quality of an AI-generated website shows up in those moments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four states to test before launch
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;What to verify&lt;/th&gt;
&lt;th&gt;Common failure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Loading&lt;/td&gt;
&lt;td&gt;The user sees that work started and duplicate actions are blocked&lt;/td&gt;
&lt;td&gt;A second click sends another request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empty&lt;/td&gt;
&lt;td&gt;The user understands why there is no data and what to do next&lt;/td&gt;
&lt;td&gt;A blank panel looks broken&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error&lt;/td&gt;
&lt;td&gt;The message is human-readable and offers recovery&lt;/td&gt;
&lt;td&gt;Raw API text or an unexplained status code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;The result is confirmed and easy to find&lt;/td&gt;
&lt;td&gt;A toast disappears before the user understands it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Forms expose the gap quickly
&lt;/h2&gt;

&lt;p&gt;A form crosses input, validation, network activity, permissions, server logic, and confirmation. Client-side validation can catch an invalid email before a request is sent, but it is not a security measure. The server still needs to validate submitted data.&lt;/p&gt;

&lt;p&gt;For a practical reference, see &lt;a href="https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Forms/Form_validation" rel="noopener noreferrer"&gt;MDN’s guide to client-side form validation&lt;/a&gt;. Pair it with the &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP Input Validation Cheat Sheet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A useful pre-launch pass tries an empty value, a malformed value, an unusually long value, a double click, a slow connection, a rejected request, and a response with no usable data. The goal is not a huge test suite on day one. The goal is to make the states visible before a user discovers them for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Empty is a product decision
&lt;/h2&gt;

&lt;p&gt;Error states get attention because they look broken. Empty states often get ignored because they look unfinished. A new dashboard with no records should explain the condition and offer a next step, not leave the user staring at a blank table.&lt;/p&gt;

&lt;p&gt;The same decision appears in search results, comments, orders, notifications, analytics, and CMS collections. An AI system can generate a convincing card list when records exist. It may not know what the product should say before the first record exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generated is not delivered
&lt;/h2&gt;

&lt;p&gt;An AI-generated page is one output of a workflow. A delivered website must remain editable, testable, and maintainable after the first output. Product, design, engineering, and operations each own part of the failure experience.&lt;/p&gt;

&lt;p&gt;One useful review question is: &lt;strong&gt;What states does this page have right now?&lt;/strong&gt; Make the answer explicit before asking for another visual refinement. A public AI website workflow such as &lt;a href="https://we0.ai/ai-builder" rel="noopener noreferrer"&gt;We0.ai&lt;/a&gt; is only one example; the same review applies to any builder.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small pre-launch checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Does every important request show a loading state?&lt;/li&gt;
&lt;li&gt;What does a first-time user see with no data?&lt;/li&gt;
&lt;li&gt;What does a user see without permission?&lt;/li&gt;
&lt;li&gt;Are client-side and server-side validation both present?&lt;/li&gt;
&lt;li&gt;Does a failed submission preserve useful input?&lt;/li&gt;
&lt;li&gt;Does a successful action lead to a visible result?&lt;/li&gt;
&lt;li&gt;Can a non-technical user understand the error message?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answers are unclear, the site may be generated, but it is not ready to be handed off.&lt;/p&gt;

&lt;p&gt;I work with We0.ai, an AI website workflow product, and mention it here only as a product example. This article does not claim customer results or platform acceptance.&lt;/p&gt;

&lt;p&gt;What edge state does your launch checklist catch most often?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>testing</category>
    </item>
    <item>
      <title>AI Can Generate Every Page. Who Owns the Website Structure?</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Wed, 16 Sep 2026 05:39:09 +0000</pubDate>
      <link>https://dev.to/linxi-ai/ai-can-generate-every-page-who-owns-the-website-structure-acl</link>
      <guid>https://dev.to/linxi-ai/ai-can-generate-every-page-who-owns-the-website-structure-acl</guid>
      <description>&lt;p&gt;AI website builders make it easy to create another page. The harder problem starts when a small team has a homepage, pricing page, feature page, use-case page, case studies, a blog, and a help center, but nobody can explain where a new visitor should start.&lt;/p&gt;

&lt;p&gt;Two navigation labels mean almost the same thing. The feature page repeats the homepage. Articles do not lead back to the product pages they describe. The site gets bigger while its logic gets harder to see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generating a page is not the same as designing a website structure.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A page map is a working tool
&lt;/h2&gt;

&lt;p&gt;A page map is a shared route map: what the main entry points are, what question each page answers, and where a reader should go next.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Home
├── Product
│   ├── Features
│   ├── Capability detail
│   └── Pricing
├── Use cases
│   ├── SaaS teams
│   └── Content teams
├── Case studies
├── Articles
└── Help center
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F0twue8ydkk8xvgfxgt7k.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%2F0twue8ydkk8xvgfxgt7k.png" alt="Program evaluation portal sitemap diagram" width="468" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Diagram: Program evaluation portal sitemap draft1 by Jmorgan (WMF), via Wikimedia Commons, CC BY-SA 3.0. It illustrates hierarchy and relationships; it is not a map of We0’s website.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The shape matters less than the reason behind each level. Product is an entry point. Features establishes scope. Capability pages answer narrower questions. Pricing supports a decision.&lt;/p&gt;

&lt;p&gt;Google’s &lt;a href="https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=en" rel="noopener noreferrer"&gt;SEO Starter Guide&lt;/a&gt; makes a similar point: organize a site logically, use descriptive URLs, and create relevant links whose text helps people understand the destination. These choices help both search engines and the people maintaining the site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask what a page is responsible for
&lt;/h2&gt;

&lt;p&gt;Before asking an AI tool to create another page, write down four answers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Write down&lt;/th&gt;
&lt;th&gt;If the answer is unclear&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who is this for?&lt;/td&gt;
&lt;td&gt;One role or situation&lt;/td&gt;
&lt;td&gt;Do not generate yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Why did they arrive?&lt;/td&gt;
&lt;td&gt;One question or decision&lt;/td&gt;
&lt;td&gt;Check for an existing page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What happens next?&lt;/td&gt;
&lt;td&gt;Read, compare, sign up, ask, or leave&lt;/td&gt;
&lt;td&gt;Add a real handoff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How is it different?&lt;/td&gt;
&lt;td&gt;A new topic, proof point, or stage&lt;/td&gt;
&lt;td&gt;Merge before creating&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This catches attractive but unnecessary pages. If a new page does not answer a new reader question, it is probably a renamed copy of something that already exists.&lt;/p&gt;

&lt;p&gt;A useful product example is &lt;a href="https://we0.ai/en" rel="noopener noreferrer"&gt;We0.ai&lt;/a&gt;, where the public capability page puts product brief, scope framing, and direction alignment before build details. The lesson is broader than one tool: clarify what the site is for before filling in more screens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the map useful after launch
&lt;/h2&gt;

&lt;p&gt;When page responsibilities are clear, later work becomes easier to review. Writers know which type of page an article should support. SEO reviews can find topics with no entry point and pages that compete with each other. Design and engineering handoffs can focus on page responsibility, not only visual polish.&lt;/p&gt;

&lt;p&gt;Try this small audit before generating anything else:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List the five most important links in the homepage navigation.&lt;/li&gt;
&lt;li&gt;Write one sentence describing the audience and job of each destination.&lt;/li&gt;
&lt;li&gt;Find two pages that repeat each other under different names.&lt;/li&gt;
&lt;li&gt;Give every high-value page a clear parent entry and a next action.&lt;/li&gt;
&lt;li&gt;Only then decide whether a new page is needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If three pages explain the same thing, the next task is probably to merge, rename, and reconnect them.&lt;/p&gt;

&lt;p&gt;This article was drafted with AI assistance and reviewed by the author for accuracy. Disclosure: the author works with We0.ai.&lt;/p&gt;

&lt;p&gt;Which page would you map first on your current site?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>seo</category>
      <category>ai</category>
    </item>
    <item>
      <title>A Multilingual Website Is a Relationship Problem, Not Just a Translation Task</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Tue, 15 Sep 2026 04:51:11 +0000</pubDate>
      <link>https://dev.to/linxi-ai/a-multilingual-website-is-a-relationship-problem-not-just-a-translation-task-1j08</link>
      <guid>https://dev.to/linxi-ai/a-multilingual-website-is-a-relationship-problem-not-just-a-translation-task-1j08</guid>
      <description>&lt;p&gt;Multilingual websites often begin with a reasonable sentence: “Let’s ship the English version first, and clean up the rest later.”&lt;/p&gt;

&lt;p&gt;The page gets duplicated. The copy is translated. An “English” item appears in the navigation. It looks finished until the next week, when the Chinese page changes its headline, the English page has no owner, and the language switcher sends people back to the homepage instead of the equivalent page. Search results start showing the wrong language. Someone finds an older translation in the CMS and nobody knows which version is current.&lt;/p&gt;

&lt;p&gt;The problem is usually not translation quality. It is that &lt;strong&gt;the relationships between language versions were never designed&lt;/strong&gt;.&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/images%2Fmultilingual-workspace-pexels.jpg" 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/images%2Fmultilingual-workspace-pexels.jpg" alt="A person working at a laptop in a creative workspace." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by Andrea Piacquadio via Pexels. This image illustrates the ongoing work of reviewing and organizing content; it is not a We0 product or customer project screenshot.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One page, several relationships
&lt;/h2&gt;

&lt;p&gt;Before choosing a translation tool, separate “language version” into four relationships.&lt;/p&gt;

&lt;p&gt;The first is the &lt;strong&gt;address relationship&lt;/strong&gt;. A Chinese product page and its English counterpart should have predictable URLs, such as &lt;code&gt;/zh/product&lt;/code&gt; and &lt;code&gt;/en/product&lt;/code&gt;, or clearly defined subdomains. Google’s international-site documentation recommends fully qualified URLs for alternate pages. A readable URL is also easier for a team to debug.&lt;/p&gt;

&lt;p&gt;The second is the &lt;strong&gt;content relationship&lt;/strong&gt;. The English page is not a mirrored text file. It is the same page intent expressed for another language and, often, another market. Prices, feature names, legal text, and support paths may need localization rather than literal substitution.&lt;/p&gt;

&lt;p&gt;The third is the &lt;strong&gt;search relationship&lt;/strong&gt;. Google recommends &lt;code&gt;hreflang&lt;/code&gt; annotations to identify language and regional alternatives. Each version should reference itself and the other versions, and the references should be reciprocal. If the Chinese page points to English but the English page never points back, Google may ignore the annotations. &lt;code&gt;hreflang&lt;/code&gt; is not a language-detection switch either; Google still determines page language algorithmically.&lt;/p&gt;

&lt;p&gt;The fourth is the &lt;strong&gt;editing relationship&lt;/strong&gt;. Who owns the source content? Which fields must be rewritten? Can one language publish first? What should a visitor see while a translation is waiting for review? These decisions belong with the page object, not only in a chat thread.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Minimum decision&lt;/th&gt;
&lt;th&gt;Common failure&lt;/th&gt;
&lt;th&gt;Acceptance question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;A language path or subdomain rule&lt;/td&gt;
&lt;td&gt;Random translated URLs&lt;/td&gt;
&lt;td&gt;Can one version map deterministically to another?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page intent&lt;/td&gt;
&lt;td&gt;Title, primary CTA, core facts&lt;/td&gt;
&lt;td&gt;Literal translation without context&lt;/td&gt;
&lt;td&gt;Do both versions answer the same user question?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hreflang&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Valid language codes and reciprocal references&lt;/td&gt;
&lt;td&gt;One-way links or invalid region codes&lt;/td&gt;
&lt;td&gt;Does every version list itself and its alternates?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canonical&lt;/td&gt;
&lt;td&gt;The canonical URL for the current page&lt;/td&gt;
&lt;td&gt;Every language canonicalizes to Chinese&lt;/td&gt;
&lt;td&gt;Will localized pages be treated as duplicates?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;Draft, review, published, retired&lt;/td&gt;
&lt;td&gt;Translation automatically goes live&lt;/td&gt;
&lt;td&gt;Can an unreviewed version stay out of production?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switcher&lt;/td&gt;
&lt;td&gt;A link to the equivalent content object&lt;/td&gt;
&lt;td&gt;Every switch goes to the homepage&lt;/td&gt;
&lt;td&gt;Does the user stay in the same content context?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/images%2Fwe0-en-multi-style-overview.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/images%2Fwe0-en-multi-style-overview.png" alt="We0’s English Multi-Style Website Design page, showing composable page structure and content priorities." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This public We0 page shows multi-style website design, brand tone, content priorities, business goals, and composable blocks. It does not demonstrate that any language version has been published.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;hreflang&lt;/code&gt; is not a lonely line of code
&lt;/h2&gt;

&lt;p&gt;Google documents three equivalent implementation methods: HTML in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, HTTP response headers, or an XML sitemap. Pick one. Maintaining all three usually creates more opportunities for drift than value.&lt;/p&gt;

&lt;p&gt;With HTML, a minimal setup looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"zh-Hans"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/zh/product"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/en/product"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"x-default"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three concepts are easy to mix up. &lt;code&gt;hreflang&lt;/code&gt; says which language or region an alternate serves. &lt;code&gt;canonical&lt;/code&gt; says which URL is the preferred address for the current content. A language switcher serves the person reading the page. They work together, but none replaces the others.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;x-default&lt;/code&gt; is useful for a language selector or a fallback page when no language matches. Language codes must follow the supported ISO formats; a country code by itself is not a language. Most importantly, the same alternate set should appear on each version, with reciprocal references, rather than existing only on the default-language page.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO cannot be a release-night task
&lt;/h2&gt;

&lt;p&gt;Teams often treat translation as a content job and SEO as a final pre-launch check. The body copy is ready, but the title, description, Open Graph data, canonical, and sitemap still belong to the default language.&lt;/p&gt;

&lt;p&gt;For each language version, review:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Whether the title and description match real search phrasing in that language.&lt;/li&gt;
&lt;li&gt;Whether the canonical points to the current language’s canonical URL.&lt;/li&gt;
&lt;li&gt;Whether &lt;code&gt;hreflang&lt;/code&gt; references are reciprocal, complete, and valid.&lt;/li&gt;
&lt;li&gt;Whether the switcher links to the equivalent content object, not a generic homepage.&lt;/li&gt;
&lt;li&gt;Whether untranslated or unreviewed content has an explicit publishing state.&lt;/li&gt;
&lt;li&gt;Whether structured data, image alt text, and social cards are localized too.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Google also notes that a page whose main content is not translated, even if its template is localized, may be treated as a duplicate. That is a simple warning with a useful implication: language versions need a meaningful content distinction and a reliable technical connection.&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/images%2Fwe0-en-seo-geo-overview.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/images%2Fwe0-en-seo-geo-overview.png" alt="We0’s English SEO and GEO Optimization page, showing multilingual SEO and language-mapping concepts." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This public We0 page illustrates page-level SEO/GEO configuration and language mapping. It is not evidence of rankings, indexing, or AI citations.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We0.ai presents multi-style design, page structure, and SEO/GEO configuration as parts of one website workflow. For a team adding a second language, the practical value of this kind of workspace is context: pages, content, and publishing configuration can stay connected. It does not remove the need for a person to confirm facts, localization choices, and review boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Draw one language map today
&lt;/h2&gt;

&lt;p&gt;Do not start with the whole site. Pick one business-critical page, such as a product or pricing page, and write down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the default-language URL and the second-language URL;&lt;/li&gt;
&lt;li&gt;each version’s title, description, and primary CTA;&lt;/li&gt;
&lt;li&gt;the canonical URL for each page;&lt;/li&gt;
&lt;li&gt;the reciprocal &lt;code&gt;hreflang&lt;/code&gt; references;&lt;/li&gt;
&lt;li&gt;where the language switcher lands;&lt;/li&gt;
&lt;li&gt;who owns translation, review, and publication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the map cannot be drawn, pause the bulk translation. A small first release is fine. A set of language pages with unclear relationships is not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Translation changes the language. Relationship design is what turns the result into a maintainable website.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: The author works with We0.ai. We0 appears as one product example in the workflow discussion; no ranking, indexing, conversion, or publication outcome is promised.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;This article was written with AI assistance and reviewed for factual accuracy by the author.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>seo</category>
      <category>webdev</category>
      <category>internationalization</category>
    </item>
    <item>
      <title>Before an AI Website, Define the Content Model</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Mon, 14 Sep 2026 04:49:04 +0000</pubDate>
      <link>https://dev.to/linxi-ai/before-an-ai-website-define-the-content-model-189o</link>
      <guid>https://dev.to/linxi-ai/before-an-ai-website-define-the-content-model-189o</guid>
      <description>&lt;h1&gt;
  
  
  Before an AI Website, Define the Content Model
&lt;/h1&gt;

&lt;p&gt;The fastest way to make an AI-built website difficult to maintain is to treat every sentence as part of the layout.&lt;/p&gt;

&lt;p&gt;The first page looks good. Then a price changes, a case study needs a new version, or someone asks for the same FAQ on three pages. The team can see the words, but nobody can say where the source lives. A quick generation has quietly become a content problem.&lt;/p&gt;

&lt;p&gt;This is why I prefer to define a small content model before asking an AI builder to generate the polished page. The model does not need to be a large database project. It only needs to make changing facts, reusable stories, relationships, and publishing states visible.&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/images%2Fcontent-model-workspace-pexels.jpg" 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/images%2Fcontent-model-workspace-pexels.jpg" alt="A person browsing and organizing documents on a laptop in a real-world workspace." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by Thirdman on Pexels. It illustrates the work of organizing content; it is not a We0 product screen or customer project.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A page is not a content model
&lt;/h2&gt;

&lt;p&gt;When a block of copy is written directly into a page, it is easy to ship and hard to change. The same product description gets copied into a hero, a pricing card, and an FAQ. A later edit has to find all three versions. An AI system may even produce slightly different wording for each one, leaving the team unsure which version is authoritative.&lt;/p&gt;

&lt;p&gt;A content model asks ordinary questions: What is this piece of information called? Who owns it? Where else can it appear? Does it have a status, a version, or a language?&lt;/p&gt;

&lt;p&gt;For a product page, the title, one-line value proposition, price, button label, and FAQ may deserve separate fields. They change at different rates and often have different owners. Keeping them as one large text block makes generation fast while making editing slower every week.&lt;/p&gt;

&lt;p&gt;I usually start with three categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Facts:&lt;/strong&gt; price, specifications, availability, service scope, and updated-at dates. These need one source of truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Narrative:&lt;/strong&gt; titles, value propositions, case-study copy, and answers. These need tone and revision control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relationships:&lt;/strong&gt; which product belongs to which category, which FAQ belongs to which feature, and which article points to which landing page. Relationships make reuse possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not to build a complicated admin system on day one. The point is to separate content that will change from choices that only describe this particular layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fields before blocks
&lt;/h2&gt;

&lt;p&gt;Many AI website workflows begin with blocks: hero, feature grid, pricing, FAQ. That is a useful order for visual exploration, but not always for ongoing maintenance.&lt;/p&gt;

&lt;p&gt;Define the fields first, then decide how those fields should be composed into blocks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Content object&lt;/th&gt;
&lt;th&gt;Minimum fields&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Signal to model it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;Name, short description, status, primary CTA&lt;/td&gt;
&lt;td&gt;Product or sales&lt;/td&gt;
&lt;td&gt;The same product appears on multiple pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Case study&lt;/td&gt;
&lt;td&gt;Customer type, problem, approach, limits, date&lt;/td&gt;
&lt;td&gt;Marketing or customer success&lt;/td&gt;
&lt;td&gt;Stories need filtering or reuse by industry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAQ&lt;/td&gt;
&lt;td&gt;Question, answer, related feature, updated-at&lt;/td&gt;
&lt;td&gt;Support or product&lt;/td&gt;
&lt;td&gt;The same question keeps returning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Article&lt;/td&gt;
&lt;td&gt;Title, excerpt, author, tags, body, publish state&lt;/td&gt;
&lt;td&gt;Content team&lt;/td&gt;
&lt;td&gt;Draft, review, and scheduled publishing matter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If an object appears on one page and rarely changes, it can remain page content for now. If it appears in more than one place or is edited every week, it should become a managed field early. &lt;strong&gt;That boundary is more useful than asking whether a CMS is fashionable.&lt;/strong&gt;&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/images%2Fwe0-en-cms-overview.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/images%2Fwe0-en-cms-overview.png" alt="We0’s English CMS capability page showing the direction of content management and back-office editing." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a public capability description from We0’s English website. It does not show customer data, an approval result, or a publishing outcome.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once the fields are clear, the AI prompt becomes testable. Instead of “make the case-study section more convincing,” you can say: “Read customer type, problem, approach, and date from the case-study object. Use three columns on desktop, one column on mobile, and hide the date label when it is empty.” The second instruction gives the model a structure to follow and the team something to review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Relationships and states are where the trouble starts
&lt;/h2&gt;

&lt;p&gt;Relationships and states are easy to skip because they are not visible in a first screenshot.&lt;/p&gt;

&lt;p&gt;An article may belong to one product or several. An FAQ may be attached to a feature whose name later changes. A post may move from draft to review, published, and retired. When those states exist only in someone’s memory, an old version remains live after the content has supposedly changed.&lt;/p&gt;

&lt;p&gt;Before generating the full site, ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If we rename or remove this object, which pages are affected?&lt;/li&gt;
&lt;li&gt;If two versions exist, who decides which one is current?&lt;/li&gt;
&lt;li&gt;Can an unpublished change be previewed without changing the live page?&lt;/li&gt;
&lt;li&gt;If we add another language, which fields can be reused and which need rewriting?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These questions do not force a team to build complex permissions, workflows, or translation systems today. They expose assumptions early, before a temporary decision becomes a permanent page structure.&lt;/p&gt;

&lt;p&gt;Stable field names also help when the content must be understood outside the CMS. For public articles, a team can map an object to &lt;a href="https://schema.org/Article" rel="noopener noreferrer"&gt;Schema.org’s Article type&lt;/a&gt; and use &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article" rel="noopener noreferrer"&gt;MDN’s article element reference&lt;/a&gt; to check the page semantics. These are not CMS product docs; they are simple ways to keep the content object and the rendered page aligned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let AI turn structure into a visible page
&lt;/h2&gt;

&lt;p&gt;Once the objects, fields, and relationships are explicit, AI website generation becomes more useful. It can compose fields into a page, try alternative layouts, fill responsive states, and adjust the presentation when editors find a problem.&lt;/p&gt;

&lt;p&gt;We0 AI brings AI Builder, CMS, and later editing into one workspace. The practical benefit is continuity: the page structure and content structure can be revised in the same context. That still requires a person to verify facts, ownership, and publishing boundaries. It does not guarantee search rankings, citations, traffic, or conversions.&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/images%2Fwe0-en-ai-builder-overview.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/images%2Fwe0-en-ai-builder-overview.png" alt="We0’s English AI Builder capability page showing a workflow from site generation to adjustment and launch." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This public AI Builder capability description illustrates the workflow from structured input to an editable page. It is not evidence of a customer project or business result.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A 20-minute content-model check
&lt;/h2&gt;

&lt;p&gt;Choose the page your team changes most often and write down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which words are likely to change next month?&lt;/li&gt;
&lt;li&gt;Which pieces appear on more than one page?&lt;/li&gt;
&lt;li&gt;Who owns facts, who owns tone, and who approves publication?&lt;/li&gt;
&lt;li&gt;Which status, date, and relationship does each object need?&lt;/li&gt;
&lt;li&gt;Which facts must not be rewritten when the AI tries a new layout?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Turn those answers into fields before asking the builder to generate the page. The first version may still need work, but the rework will be about layout and expression instead of hunting for the source of every sentence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI makes a page appear quickly. The content model decides whether a team can keep changing it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are drafting your own fields, you can review how &lt;a href="https://we0.ai/" rel="noopener noreferrer"&gt;We0 AI&lt;/a&gt; places AI website creation, CMS, and growth work in one workspace, then decide which parts of your site should become reusable objects.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I am affiliated with We0.ai. This article discusses AI website content structure and workflow; We0 is included as a product example. No ranking, indexing, GEO citation, traffic, or business outcome is promised.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>contentmodel</category>
      <category>webdev</category>
      <category>ai</category>
      <category>seo</category>
    </item>
    <item>
      <title>AI Website Handoffs: When a Prototype Needs a Real Code Boundary</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Sun, 13 Sep 2026 04:36:15 +0000</pubDate>
      <link>https://dev.to/linxi-ai/ai-website-handoffs-when-a-prototype-needs-a-real-code-boundary-2fcc</link>
      <guid>https://dev.to/linxi-ai/ai-website-handoffs-when-a-prototype-needs-a-real-code-boundary-2fcc</guid>
      <description>&lt;p&gt;A polished AI-generated website can hide an unfinished delivery model. The hard question is not whether a builder can produce a convincing page. It is whether the next person can safely change the real system without reconstructing the original prompt, platform state, and deployment assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three kinds of change
&lt;/h2&gt;

&lt;p&gt;Separate visual, content, and system work before deciding where the boundary belongs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visual: spacing, colors, layout, and imagery. Keep these in the canvas or component styles while the team is exploring.&lt;/li&gt;
&lt;li&gt;Content: pricing, articles, case studies, and localized copy. Give these stable fields, a CMS, or a clear editing path.&lt;/li&gt;
&lt;li&gt;System: authentication, data relationships, payments, permissions, and integrations. These need code, environments, tests, and a release path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The boundary should move when a failure affects real users, orders, or data responsibility. Starting to write code should not turn every copy edit into an engineering ticket, but production behavior needs an explicit owner and a reversible change path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the handoff
&lt;/h2&gt;

&lt;p&gt;Hand the project to someone who was not present for the initial generation. Ask them to update one product field, add a protected page, rotate a secret, change a domain, and roll back a release. If every step depends on an old prompt or the original builder, the system has already accumulated avoidable risk.&lt;/p&gt;

&lt;p&gt;Document the minimum before the handoff:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Minimum record&lt;/th&gt;
&lt;th&gt;Verification question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Environment&lt;/td&gt;
&lt;td&gt;Repository, runtime, configuration&lt;/td&gt;
&lt;td&gt;Can the next owner run it locally or in staging?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data and secrets&lt;/td&gt;
&lt;td&gt;Storage, secrets, permissions&lt;/td&gt;
&lt;td&gt;Who can read, export, rotate, or delete them?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth and payments&lt;/td&gt;
&lt;td&gt;Providers, callbacks, test accounts&lt;/td&gt;
&lt;td&gt;Who handles an expired credential or failed callback?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content&lt;/td&gt;
&lt;td&gt;Fields, editing path, publishing permissions&lt;/td&gt;
&lt;td&gt;Can an operator change content without page code?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release&lt;/td&gt;
&lt;td&gt;Live version, checks, rollback owner&lt;/td&gt;
&lt;td&gt;How do we confirm the expected version is public?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The code boundary is about responsibility
&lt;/h2&gt;

&lt;p&gt;AI-assisted projects often lose decisions between requirements, product, design, development, and operations. A useful handoff artifact can stay short: current goal, explicit non-goals, data model, external dependencies, acceptance checks, release path, and the first things the next owner should inspect. The format matters less than preserving which decisions are settled and which are still assumptions.&lt;/p&gt;

&lt;p&gt;Full-stack generation is useful when auth, admin work, payments, multilingual structure, SEO, and deployment need a path that can continue. A team can move quickly first, then make the boundary explicit when the project actually needs it instead of rebuilding a polished prototype from scratch.&lt;/p&gt;

&lt;p&gt;We0.ai is included here as a workflow example. Its public capability pages describe full-stack generation, multi-agent coordination, and domain delivery. This is not a claim that a product removes the need for architecture, testing, release ownership, rankings, traffic, AI citations, approval, or commercial outcomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a builder is enough
&lt;/h2&gt;

&lt;p&gt;For a one-day campaign page, a value-proposition test, or a visual exploration with no accounts or user data, staying in the builder is reasonable. Once the site owns real accounts, real orders, real content responsibility, or a release rhythm, “we will migrate later” is a risky default.&lt;/p&gt;

&lt;p&gt;Ask one deliberately unglamorous question: who will change the real thing three months from now without the original builder’s help? If the answer is unclear, the missing work may be a handoff boundary that lets the project keep working.&lt;/p&gt;

</description>
      <category>deployment</category>
    </item>
    <item>
      <title>Your AI-Generated Website Needs a Content Model</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Sat, 12 Sep 2026 04:00:57 +0000</pubDate>
      <link>https://dev.to/linxi-ai/your-ai-generated-website-needs-a-content-model-24ck</link>
      <guid>https://dev.to/linxi-ai/your-ai-generated-website-needs-a-content-model-24ck</guid>
      <description>&lt;p&gt;The page is easy to generate. The durable part is deciding which facts become editable objects, who owns them, and how a change reaches production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model facts before adding more pages
&lt;/h2&gt;

&lt;p&gt;Separate facts that change often from layout. Products, case studies, and articles each need clear fields, owners, and review boundaries. If a fact will be edited, reused, or reviewed on its own, it should not live only inside one undifferentiated block of page copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep page-level metadata next to page intent
&lt;/h2&gt;

&lt;p&gt;Title, description, author, updated date, language, canonical URL, and primary image should be stable page-level fields. This keeps multilingual releases and search snippets aligned with what the page actually says.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat publishing as a state transition
&lt;/h2&gt;

&lt;p&gt;A content change should make its affected pages, deployment state, and verification steps visible. The team should know what changed, who approved it, and whether the current version is live.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical post-launch test
&lt;/h2&gt;

&lt;p&gt;Ask someone unfamiliar with the project to update one product fact, replace one image, and change a page title. They should be able to find the path and explain which pages are affected without asking a developer.&lt;/p&gt;

&lt;p&gt;Tools such as &lt;a href="https://we0.ai/" rel="noopener noreferrer"&gt;We0.ai&lt;/a&gt; can be used as a workflow example.&lt;/p&gt;

&lt;p&gt;Disclosure: I work with We0.ai, which appears once as an example of the workflow described here.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>seo</category>
    </item>
    <item>
      <title>The First Prompt Matters More Than the First Page</title>
      <dc:creator>Lin Xi</dc:creator>
      <pubDate>Fri, 11 Sep 2026 04:27:39 +0000</pubDate>
      <link>https://dev.to/linxi-ai/the-first-prompt-matters-more-than-the-first-page-3402</link>
      <guid>https://dev.to/linxi-ai/the-first-prompt-matters-more-than-the-first-page-3402</guid>
      <description>&lt;h1&gt;
  
  
  The First Prompt Matters More Than the First Page
&lt;/h1&gt;

&lt;p&gt;AI website builders make the first version dramatically faster. They do not make the product decisions for you. The first sentence still determines whether the system builds something that can do a job or simply arranges a page that resembles a website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn the prompt into a small project brief
&lt;/h2&gt;

&lt;p&gt;A useful website input should define four things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who is coming to the site&lt;/li&gt;
&lt;li&gt;why they are coming now&lt;/li&gt;
&lt;li&gt;what they should complete there&lt;/li&gt;
&lt;li&gt;what this version deliberately will not do&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Build a website for an independent coffee brand” is broad. “Build a mobile-first site for nearby office workers who want specialty coffee beans; introduce three products, then guide visitors toward a monthly delivery subscription; do not build a complex membership system in this version” gives the implementation a boundary.&lt;/p&gt;

&lt;p&gt;Constraints make the result easier to compare and the next edit easier to choose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Map intent to an implementable page
&lt;/h2&gt;

&lt;p&gt;Once the audience and primary action are clear, map them to a small page model. Decide which page type owns the action, which content is reusable, and which information is required above the fold. Keep unresolved assumptions visible instead of hiding them inside a prompt.&lt;/p&gt;

&lt;p&gt;A good correction is specific: clarify the audience, reduce the scope, or resolve a conflict between references. “Make it more premium” is not a useful technical requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five checks before calling the first version done
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Routes and crawl paths
&lt;/h3&gt;

&lt;p&gt;Every important route should return a successful status, be linked internally, and be reachable without relying on a client-only interaction. Check &lt;code&gt;robots.txt&lt;/code&gt;, accidental &lt;code&gt;noindex&lt;/code&gt;, canonical URLs, and the sitemap before expecting search engines to discover the page.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Metadata generated from page intent
&lt;/h3&gt;

&lt;p&gt;Set title tags, meta descriptions, Open Graph fields, and canonical URLs from the same page-level source of truth. The metadata should match the page promise and the query it is intended to answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. CMS fields that support the next edit
&lt;/h3&gt;

&lt;p&gt;If the page will change after launch, model the changing parts as editable content rather than burying them in layout code. Keep product facts, FAQs, dates, and author information structured so a small update does not require rebuilding the whole page.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Analytics events tied to meaningful actions
&lt;/h3&gt;

&lt;p&gt;Page views are not enough to evaluate the brief. Define consistent events for actions such as a pricing interaction, signup, contact request, or checkout start. Include the page and content context needed to trace a visit to an outcome.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. A task record that preserves the decision
&lt;/h3&gt;

&lt;p&gt;When a signal appears, record its source, affected URL, proposed change, owner, and verification step together. This keeps the original product decision connected to the implementation and the measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The prompt keeps working after launch
&lt;/h2&gt;

&lt;p&gt;The generation button looks like a finish line, but the brief starts changing as soon as the site meets real work. Sales learns that customers care more about delivery time than brand story. Mobile users cannot find the purchase action. A page gets impressions but very few clicks.&lt;/p&gt;

&lt;p&gt;The useful category is therefore broader than an AI website builder. Building is only the beginning; live editing, CMS content, domains, SEO, GEO visibility, analytics, and the lead or payment flow belong to the same operating question: why did the visitor stop moving forward?&lt;/p&gt;

&lt;p&gt;Tools such as &lt;a href="https://we0.ai/" rel="noopener noreferrer"&gt;We0.ai&lt;/a&gt; are exploring this website-workbench model. It does not guarantee rankings, AI citations, traffic, or sales. It reduces how much context a team has to reconstruct before making and verifying the next change.&lt;/p&gt;

&lt;p&gt;The first page may still need several rounds of work. At least each round will have somewhere to go.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: The author is affiliated with &lt;a href="https://we0.ai/" rel="noopener noreferrer"&gt;We0.ai&lt;/a&gt;. This article discusses AI website building and requirements clarity from a workflow perspective. We0 is included as a product example and no ranking, traffic, GEO citation, or business outcome is promised.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
