<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged search-engine</title>
<link>https://coderlegion.com/tag/search-engine</link>
<description>Powered by Question2Answer</description>
<item>
<title>SEO Made Simple: Best Website Builders for Beginners</title>
<link>https://coderlegion.com/32942/seo-made-simple-best-website-builders-for-beginners</link>
<description>&lt;p&gt;Want to create a website for your company but scared of the technological difficulties? You are not alone. Many newcomers are intimidated by the coding, hosting and website settings. The good news is that it is much easier to establish a website nowadays and you don’t need any technological expertise. Today’s website builders allow you to build pages, add graphics, display your services and publish content - without writing a line of code. But getting your website up is only half the fight. You need people to know about it, too.&lt;/p&gt;
&lt;p&gt;And that’s why it really matters to pick the best website builder for SEO success. You want a platform that does more than give you gorgeous templates and easy editing tools. You want to develop a site that’s easy for visitors to navigate, and that search engines can comprehend.&lt;/p&gt;
&lt;h3 id=&quot;why-seo-is-important-for-your-website&quot;&gt;Why SEO is Important for Your Website&lt;/h3&gt;
&lt;p&gt;Imagine that you build a business, and you have a lot of wonderful things, but no signboard. People could pass right past you without knowing what you have to give. There is the same difficulty for a website with no search exposure.&lt;/p&gt;
&lt;p&gt;Search engine optimization (SEO) is a strategy to assist the search engines comprehend your website and match your content with searches. This can be a terrific approach for small businesses, freelancers and new entrepreneurs to reach consumers who are actively looking for their products or services.&lt;/p&gt;
&lt;p&gt;Paid ads stop producing traffic as soon as a campaign ends. Valuable content can continue to drive traffic from organic search for a long period. It might not happen immediately away, but if you continue with it, you can enhance your visibility.&lt;/p&gt;
&lt;p&gt;SEO is not about putting keywords on your sites. It offers straightforward navigation, good content, a mobile friendly design and fast loading pages. The correct website builder can make these essentials easier to handle, so you can spend more time focusing on your business.&lt;/p&gt;
&lt;h3 id=&quot;what-is-an-seo-friendly-website-creator-&quot;&gt;What Is An SEO Friendly Website Creator?&lt;/h3&gt;
&lt;p&gt;Not all website creators provide you the same control. Some make it easy to construct a page but limit your ability to alter critical SEO parameters. Others are more versatile as your site grows.&lt;/p&gt;
&lt;p&gt;Look for tools that allow you to alter page names and meta descriptions, make meaningful URLs, manage headings, and add alt text to photos. This makes your information easier to retrieve and helps search engines interpret it.&lt;/p&gt;
&lt;p&gt;Mobile-responsiveness matters, too. Your site should work on phones, tablets and computers without visitors having to pinch and zoom or struggle with menus. Loading speed is also crucial because consumers don’t want to wait for a page to open.&lt;/p&gt;
&lt;p&gt;It also has important features like as SSL security, sitemap generating, redirects and Google Search Console integration. You don’t have to have all the bells and whistles from the get-go. Choose a platform that gets the basics right and enables you improve your website without getting into complex intricacies.&lt;/p&gt;
&lt;h3 id=&quot;picking-an-easy-website-builder-online&quot;&gt;Picking an Easy Website Builder Online&lt;/h3&gt;
&lt;p&gt;If you are making a website for the first time, you want to get started without having to spend weeks learning how everything works. A Easy website builder online should let you construct pages easily, add content and update information.&lt;/p&gt;
&lt;p&gt;Drag and drop editing can be really handy. Place text, graphics and buttons visually without scripting. Get a good start with ready to use templates instead of a blank screen.&lt;/p&gt;
&lt;p&gt;And don’t forget to plan ahead for what you’ll need. You may start with a home page and several service pages, then want to add a blog, new services or landing pages. Find a builder who can deal with these alterations.&lt;/p&gt;
&lt;p&gt;Make sure to check pricing before signing up. Your plan might include hosting, custom domains, security and extra services or might charge for them separately. This way you'll know the full price up front and won't have any nasty surprises.&lt;/p&gt;
&lt;p&gt;Ultimately the proper platform needs to be easy to use today, and versatile enough to grow with your organization.&lt;/p&gt;
&lt;h3 id=&quot;website-builders-comparison-for-beginners&quot;&gt;Website Builders Comparison for Beginners&lt;/h3&gt;
&lt;p&gt;It is reliant upon your needs. Each platform has its own use cases. So it’s important considering what each platform has to offer before you chose.&lt;/p&gt;
&lt;p&gt;Wix is popular with beginners because of its visual editor, templates and built-in SEO capabilities. This is a fantastic solution for small enterprises, personal websites and service providers that desire a relatively simple editing experience.&lt;/p&gt;
&lt;p&gt;WordPress is highly adaptable, especially for blogs and content-heavy webpages. There are many themes and plugins so there is a lot of potential for customization. However, hosting, updates and security can be additional work depending on your setup.&lt;/p&gt;
&lt;p&gt;Squarespace is known for its sleek templates and easy design experience. It might be fantastic for creative professionals, consultants and enterprises who want to have a good looking internet presence without spending a lot of time on design.&lt;/p&gt;
&lt;p&gt;Above all, Shopify is an ecommerce platform. It combines the functionality of an online store and necessary SEO settings, helpful for selling things, managing orders and receiving payments. But it’s eCommerce features could be overkill for a simple service site.&lt;/p&gt;
&lt;p&gt;There is no one correct response for each person. Don't pick a platform just because it's popular—consider your budget, website goals, and how much control you need.&lt;/p&gt;
&lt;h3 id=&quot;how-to-create-a-search-engine-friendly-website&quot;&gt;How to Create a Search Engine Friendly Website&lt;/h3&gt;
&lt;p&gt;When you choose a builder, you receive the tools, but how you use them is what makes the difference.&lt;/p&gt;
&lt;p&gt;Each page needs to have a purpose. Your site should tell customers what your firm is, service pages should provide the essential material, and blog posts should answer questions that your audience regularly ask.&lt;/p&gt;
&lt;h3 id=&quot;aeo-amp-aio-getting-ready-for-today-search&quot;&gt;AEO &amp;amp; AIO: Getting ready for Today Search&lt;/h3&gt;
&lt;p&gt;More people are using AI technologies to ask inquiries and source information beyond traditional search engines. So it’s worth looking into Answer Engine Optimization (AEO) and Artificial Intelligence Optimization (AIO) in addition to SEO.&lt;/p&gt;
&lt;p&gt;The AEO is all about answering particular questions in a clear way. AIO is all about making content useful, relevant, and intelligible to AI-powered systems. Neither one guaranties that your website will be featured in an AI-generated answer, but both encourage better content.&lt;/p&gt;
&lt;h3 id=&quot;answer-questions-directly-use-descriptive-headlines-and-give-simple-explanations&quot;&gt;Answer Questions Directly, Use Descriptive Headlines, and Give Simple Explanations&lt;/h3&gt;
&lt;p&gt;For example, if you are describing website costs, first answer the big question and then get into the details. Accuracy matters too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep your material fresh.&lt;/strong&gt; Use structured data if possible and your platform allows it. Most importantly, create useful content, not just pages full of keywords. Your visitors, regardless of whether they come to your website via search or otherwise, require clear, trustworthy content.&lt;/p&gt;
&lt;h3 id=&quot;top-mistakes-to-avoid-when-building-your-website&quot;&gt;Top Mistakes to Avoid When Building Your Website&lt;/h3&gt;
&lt;p&gt;It’s easy to get caught up in fancy animations, enormous graphics and fancy layouts. But too many design features can slow a website down and make it harder to explore. Usually, a tidy layout and understandable menu works best.&lt;/p&gt;
&lt;p&gt;Another mistake is to build a website with a lot of pages to make it bigger. Each page should have a purpose, whether that’s explaining a service, answering a question or moving a customer ahead.&lt;/p&gt;
&lt;p&gt;And don't forget to add the basic SEO settings. Avoid problems quickly with missing site names, broken links and confused url’s. Take a look at these before you start, and then refer back to them as your site grows.&lt;/p&gt;
&lt;p&gt;and last of all, be patient. SEO is a marathon. The results you get will be depending on competition, quality of your material and other variables. Don’t anticipate instant rankings, expect incremental development.&lt;/p&gt;
&lt;h3 id=&quot;monitor-seo-progress-over-time&quot;&gt;Monitor SEO Progress Over Time&lt;/h3&gt;
&lt;p&gt;Once your site is live, tools such as Google Search Console will start to tell you what people are searching for to get to your pages and any potential technical difficulties. Analytics devices inform you how people engage with your website.&lt;/p&gt;
&lt;p&gt;Don't just measure visits. For a business, questions, reservations, form submissions and sales can be better measures of success. Be sure to check your content often, update information that is no longer relevant and improve pages according to the demands of your visitors.&lt;/p&gt;
&lt;p&gt;You don’t have to do it all at one time. Over time, little, incremental enhancements can make your website more valuable and effective.&lt;/p&gt;
&lt;h3 id=&quot;itweb-web-site-building-was-never-easier&quot;&gt;ItWeb: Web Site Building Was Never Easier&lt;/h3&gt;
&lt;p&gt;Your firm doesn’t need to wrestle with sophisticated coding to get online. Imbibe Technologies runs ItWeb, a website development platform which features an inbuilt page builder and a no-code approach. A great location for businesses and individuals to start when looking for a straightforward way to develop and maintain their web presence.&lt;/p&gt;
&lt;h3 id=&quot;build-smart-get-found-grow-online&quot;&gt;Build Smart, Get Found, Grow Online&lt;/h3&gt;
&lt;p&gt;Your initial site doesn’t need to be perfect. It should explain visitors who you are, what you do and how to go about it.&lt;/p&gt;
&lt;p&gt;Pick a website builder that you like, has the SEO tools that you need and has capacity for you to expand. Concentrate on valuable content, easy navigation and a pleasant experience from any device. I have to track my progress and make changes as I figure out what works.&lt;/p&gt;
&lt;p&gt;Want to design your website without writing a single line of code? Discover ItWeb and start your adventure to build, manage and develop your online presence.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32942/seo-made-simple-best-website-builders-for-beginners</guid>
<pubDate>Thu, 29 Oct 2026 07:06:24 +0000</pubDate>
</item>
<item>
<title>Keep Search Clean: Block Search Engine Spam with uBlacklist and Community Rule Sets</title>
<link>https://coderlegion.com/27840/keep-search-clean-block-search-engine-spam-with-ublacklist-and-community-rule-sets</link>
<description>&lt;p&gt;If you use Google, DuckDuckGo, or Bing regularly, you have likely run into programmatic search spam: auto-generated &quot;doorway&quot; pages, scraper blogs stealing content, DGA (Domain Generation Algorithm) random domain networks, and affiliate redirects. They waste time, clutter search results, and occasionally host malicious scripts or phishing landers.&lt;/p&gt;
&lt;p&gt;While reporting these domains to registrars and search engines helps clean up the web for everyone, you can instantly eliminate them from your personal local browsing experience using &lt;strong&gt;uBlacklist&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-problem-does-ublacklist-solve-&quot;&gt;What Problem Does uBlacklist Solve?&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/iorate/uBlacklist&quot;&gt;uBlacklist&lt;/a&gt; is a lightweight browser extension that filters specified sites from appearing in your search engine results.&lt;/p&gt;
&lt;p&gt;Instead of landing on low-quality scraper sites or clickbait doorway networks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hides Spam Results:&lt;/strong&gt; Blacklisted domains are automatically stripped or dimmed out directly in your search results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-Search Engine Support:&lt;/strong&gt; Works seamlessly across Google, Bing, DuckDuckGo, Ecosia, Startpage, and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community Rule Subscriptions:&lt;/strong&gt; Instead of manually blocking sites one by one, you can subscribe to crowdsourced community blocklists that sync automatically in the background.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-1-how-to-install-ublacklist-on-chrome&quot;&gt;Step 1: How to Install uBlacklist on Chrome&lt;/h3&gt;
&lt;p&gt;Installing the extension takes less than a minute:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Google Chrome&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Visit the &lt;a rel=&quot;nofollow&quot; href=&quot;https://chromewebstore.google.com/detail/ublacklist/pncfbmialoiaghdehhbnbhkkgmjanfhe&quot;&gt;uBlacklist page on the Chrome Web Store&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add to Chrome&lt;/strong&gt; and confirm by clicking &lt;strong&gt;Add extension&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Optional)&lt;/em&gt; Click the puzzle piece icon (Extensions) in your top-right toolbar and pin &lt;strong&gt;uBlacklist&lt;/strong&gt; for easy access.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-2-recommended-community-rule-sets&quot;&gt;Step 2: Recommended Community Rule Sets&lt;/h3&gt;
&lt;p&gt;To get maximum protection without needing to build your own list from scratch, subscribe to curated community rule sets listed on the &lt;a rel=&quot;nofollow&quot; href=&quot;https://ublacklist.github.io/rulesets?utm_source=gemini&quot;&gt;uBlacklist Rule Sets Directory&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I specifically recommend enabling these three subscriptions to target common web spam patterns:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Spam:&lt;/strong&gt; &lt;em&gt;Ad and tracking server domain list&lt;/em&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Blocks domain networks known for aggressive popups, tracking traps, and ad-heavy doorway pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spam:&lt;/strong&gt; &lt;em&gt;DGA &amp;amp; Random Subdomain Spam Blocklist&lt;/em&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Targets programmatically generated, short-lived domains (e.g., random character strings like &lt;code&gt;lwhiswfnuuiu.gay&lt;/code&gt; or &lt;code&gt;ohgssoigkcik.icu&lt;/code&gt;) frequently used by automated web spam rings.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copycat Sites:&lt;/strong&gt; &lt;em&gt;uBlock-Origin-dev-filter&lt;/em&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Shields developers from scraper sites that duplicate StackOverflow, GitHub, and technical documentation with low-quality, ad-stuffed overlays.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-3-how-to-add-recommended-rule-sets-to-your-extension&quot;&gt;Step 3: How to Add Recommended Rule Sets to Your Extension&lt;/h3&gt;
&lt;p&gt;Before subscribing directly from the community directory, enable subscriptions in your local extension settings:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Enable Subscriptions:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Click the &lt;strong&gt;Extensions icon&lt;/strong&gt; (puzzle piece) in your Chrome toolbar.&lt;/li&gt;
&lt;li&gt;Find &lt;strong&gt;uBlacklist&lt;/strong&gt;, click the &lt;strong&gt;three dots (&quot;...&quot;)&lt;/strong&gt;, and select &lt;strong&gt;Options&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;strong&gt;Subscriptions&lt;/strong&gt; section and make sure the &lt;strong&gt;Enable subscriptions&lt;/strong&gt; toggle is switched &lt;strong&gt;ON&lt;/strong&gt; (Enabled).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscribe from the Community Directory:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Visit the &lt;a rel=&quot;nofollow&quot; href=&quot;https://ublacklist.github.io/rulesets?utm_source=gemini&quot;&gt;uBlacklist Rule Sets Directory&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Locate the recommended rule sets:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spam:&lt;/strong&gt; &lt;em&gt;Ad and tracking server domain list&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spam:&lt;/strong&gt; &lt;em&gt;DGA &amp;amp; Random Subdomain Spam Blocklist&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copycat Sites:&lt;/strong&gt; &lt;em&gt;uBlock-Origin-dev-filter&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;&quot;+&quot; (Subscribe)&lt;/strong&gt; button next to each rule set.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;uBlacklist will prompt you to confirm—click &lt;strong&gt;Subscribe&lt;/strong&gt; (or &lt;strong&gt;Add&lt;/strong&gt;) to finish adding the list.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-4-how-to-verify-it-s-working&quot;&gt;Step 4: How to Verify It’s Working&lt;/h3&gt;
&lt;p&gt;To ensure your rule sets are active and working as expected:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check Subscription Status:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Click the &lt;strong&gt;Extensions icon&lt;/strong&gt; (puzzle piece) in your Chrome toolbar.&lt;/li&gt;
&lt;li&gt;Locate &lt;strong&gt;uBlacklist&lt;/strong&gt; in the list, click the &lt;strong&gt;three dots (&quot;...&quot;)&lt;/strong&gt; next to it, and select &lt;strong&gt;Options&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;strong&gt;Subscriptions&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;You should see a status or timestamp showing &lt;strong&gt;&quot;Updated [time]&quot;&lt;/strong&gt; alongside the total count of loaded rules/patterns for each subscribed list.&lt;/li&gt;
&lt;li&gt;You can click &lt;strong&gt;Update now&lt;/strong&gt; to manually trigger an initial sync.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test in Search Results:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Perform a search query on Google or DuckDuckGo.&lt;/li&gt;
&lt;li&gt;If a domain matching your blocklists appears in the raw index, uBlacklist will intercept it. &lt;/li&gt;
&lt;li&gt;Look at the bottom or top of your search results page—you will see a subtle indicator stating: &lt;strong&gt;&quot;uBlacklist has blocked N site(s)&quot;&lt;/strong&gt;. Click it to view or temporarily unhide blocked results.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By pairing direct reporting with local client-side filtering like uBlacklist, you get an immediate, pristine search experience free from automated spam networks.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27840/keep-search-clean-block-search-engine-spam-with-ublacklist-and-community-rule-sets</guid>
<pubDate>Sun, 20 Sep 2026 14:31:02 +0000</pubDate>
</item>
<item>
<title>How to Build a Repeatable AI Search Visibility Benchmark</title>
<link>https://coderlegion.com/26494/how-to-build-a-repeatable-ai-search-visibility-benchmark</link>
<description>&lt;h2 id=&quot;how-to-build-a-repeatable-ai-search-visibility-benchmark&quot;&gt;How to Build a Repeatable AI Search Visibility Benchmark&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;By &lt;strong&gt;Jarno Saarimies&lt;/strong&gt;, Founder of AEOvara · Last updated: September 8, 2026 · 9 min read&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=9946912169848812585&quot; alt=&quot;Cover image: AI search visibility benchmark![\]&quot;&gt;&lt;/p&gt;
&lt;p&gt;Your buyers are already asking ChatGPT, Perplexity, and Google AI Overviews who to trust. Google says AI Overviews now reach 2 billion monthly users, and industry tracking puts them on roughly 48% of all queries — up 58% year over year (BrightEdge, February 2026). Meanwhile, Seer Interactive's longitudinal study found organic CTR on AI Overview queries dropped from 1.76% to 0.61% between June 2024 and September 2025.&lt;/p&gt;
&lt;p&gt;Here's the problem: your analytics stack is blind to all of it. If ChatGPT recommends a competitor and never mentions you, nothing gets logged. No click, no impression, no bounce rate. The opportunity just evaporates.&lt;/p&gt;
&lt;p&gt;A benchmark fixes this. Not a one-off audit you run once and forget — a repeatable measurement system that tells you, month after month, whether you're becoming more or less visible inside AI answers.&lt;/p&gt;
&lt;p&gt;This guide shows you exactly how to build one, starting with a free spreadsheet method and scaling to automated tracking when the data demands it.&lt;/p&gt;
&lt;h3 id=&quot;what-ai-search-visibility-actually-means-define-it-before-you-measure-it-&quot;&gt;What &quot;AI search visibility&quot; actually means (define it before you measure it)&lt;/h3&gt;
&lt;p&gt;Before you measure anything, agree on what you're measuring. Five metrics carry the weight:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Mention rate&lt;/strong&gt; — the percentage of tested prompts where your brand appears at all. This is your headline number.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share of Voice (SoV)&lt;/strong&gt; — your mentions as a percentage of &lt;em&gt;all&lt;/em&gt; tracked-brand mentions in the same answers. Peec AI's own documentation shows why this matters: a brand mentioned 4 times against a competitor's 12 mentions has high visibility but only 25% SoV. Visibility is presence. SoV is competitive prominence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Citation rate&lt;/strong&gt; — whether the answer actually &lt;em&gt;links&lt;/em&gt; to you, not just names you. Track this separately: on ChatGPT most mentions carry no link, while Perplexity links almost everything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Position and prominence&lt;/strong&gt; — where you land in the answer. AI engines tend to treat the first-named brand as the default recommendation. Buried in the last paragraph is not the same as leading the list.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sentiment and accuracy&lt;/strong&gt; — not just &lt;em&gt;whether&lt;/em&gt; you appear, but &lt;em&gt;how&lt;/em&gt; you're described. A confident but outdated mention (wrong pricing, wrong positioning) can cost you the deal.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;step-1-build-a-frozen-prompt-corpus&quot;&gt;Step 1: Build a frozen prompt corpus&lt;/h3&gt;
&lt;p&gt;Pick 10–15 prompts that real buyers would actually ask. Not keywords — questions. Organize them into five categories:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Prompt type &lt;/th&gt;&lt;th&gt;What it reveals &lt;/th&gt;&lt;th&gt;Template&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Category / discovery &lt;/td&gt;&lt;td&gt;Whether you're in the consideration set at all &lt;/td&gt;&lt;td&gt;&quot;What are the best [category] for [use case]?&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Comparison &lt;/td&gt;&lt;td&gt;Positioning against a named rival &lt;/td&gt;&lt;td&gt;&quot;How does [your brand] compare to [competitor]?&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Persona / use-case &lt;/td&gt;&lt;td&gt;Whether you're recommended in your buyer's context &lt;/td&gt;&lt;td&gt;&quot;What should a [role] look for when choosing a [category]?&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Problem / jobs-to-be-done &lt;/td&gt;&lt;td&gt;Top-of-funnel presence before your category is named &lt;/td&gt;&lt;td&gt;&quot;How do I [problem]?&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Brand-direct / reputation &lt;/td&gt;&lt;td&gt;Accuracy and sentiment &lt;/td&gt;&lt;td&gt;&quot;What is [your brand]?&quot; / &quot;Is [your brand] any good?&quot;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;This list stays mostly frozen.&lt;/strong&gt; This matters more than most people realize. If you change the prompts every month, you're not tracking visibility — you're running random tests. You can add prompts once a quarter, but the core set must stay stable or your trend data is meaningless.&lt;/p&gt;
&lt;h3 id=&quot;step-2-choose-your-engines-and-cadence&quot;&gt;Step 2: Choose your engines and cadence&lt;/h3&gt;
&lt;p&gt;Measure each platform separately, because a strong ChatGPT score tells you nothing about Perplexity or AI Overviews. At minimum: ChatGPT, Perplexity, Gemini, and Google Search with AI Overviews.&lt;/p&gt;
&lt;p&gt;On cadence: weekly tracking is the standard for most teams (LLM Pulse and similar platforms default to this). Daily tracking makes sense for product launches or volatile categories — finance shows the highest citation volatility of any vertical. Monthly is the absolute floor for a manual process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Run each prompt 3–5 times per engine.&lt;/strong&gt; Generative answers are probabilistic — the same question names different brands on different runs. One query is an anecdote, not a measurement. Research on robust benchmarks suggests 500–2,000 prompts per week for statistically stable values (SUMAX Research, 2026); for a manual baseline, 10–15 prompts × multiple runs × 3–4 engines is a realistic starting point.&lt;/p&gt;
&lt;h3 id=&quot;step-3-run-the-manual-baseline-this-afternoon-free-&quot;&gt;Step 3: Run the manual baseline (this afternoon, free)&lt;/h3&gt;
&lt;p&gt;You don't need a platform yet. You need a spreadsheet and about an hour.&lt;/p&gt;
&lt;p&gt;Run your prompt set through each engine — same wording, same account settings where possible. For each response, log:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Query text&lt;/li&gt;
&lt;li&gt;Platform and date&lt;/li&gt;
&lt;li&gt;Mentioned? (Yes/No)&lt;/li&gt;
&lt;li&gt;Position (1st named, 2nd, 3rd…)&lt;/li&gt;
&lt;li&gt;Cited with a link? (Yes/No)&lt;/li&gt;
&lt;li&gt;Competitors named&lt;/li&gt;
&lt;li&gt;Sources cited in the answer&lt;/li&gt;
&lt;li&gt;Accuracy/sentiment notes&lt;/li&gt;
&lt;li&gt;Screenshot&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Screenshot everything.&lt;/strong&gt; AI results move around. Something that shows up this month may disappear next month. If you want to understand trends, you need receipts.&lt;/p&gt;
&lt;p&gt;The last column is usually the most useful. If Perplexity or another engine shows sources, those sources tell you where the answer gets its confidence. Sometimes the fix isn't &quot;write another blog post&quot; — it's getting your company described better on the third-party pages the AI is already reading.&lt;/p&gt;
&lt;h3 id=&quot;step-4-calculate-your-benchmark-numbers&quot;&gt;Step 4: Calculate your benchmark numbers&lt;/h3&gt;
&lt;p&gt;Four formulas turn raw logs into a benchmark:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mention rate&lt;/strong&gt; = prompts where you appear ÷ total prompts run × 100&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Citation rate&lt;/strong&gt; = prompts with a link to you ÷ total prompts × 100&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share of Voice&lt;/strong&gt; = your mentions ÷ all tracked-brand mentions × 100&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Position score&lt;/strong&gt; = average position when mentioned (lower is better)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example: mentioned in 5 of 12 prompts on Perplexity, with 4 of those including a link. Mention rate: 42%. Citation rate: 33%. Your competitor mentioned in 9 of 12 with 7 links. SoV: 5 ÷ 14 = 36%.&lt;/p&gt;
&lt;p&gt;That gives you a real baseline — and usually a few uncomfortable surprises. One thing to internalize early: position in a single answer is mostly noise; frequency across many runs is the signal (as SparkToro's analysis showed). Track how &lt;em&gt;often&lt;/em&gt; you appear, not where you landed once.&lt;/p&gt;
&lt;h3 id=&quot;step-5-add-context-metrics-the-spreadsheet-can-t-see&quot;&gt;Step 5: Add context metrics the spreadsheet can't see&lt;/h3&gt;
&lt;p&gt;A prompt log tells you &lt;em&gt;that&lt;/em&gt; you're visible or invisible. Three additional signals tell you whether it matters:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI referral traffic.&lt;/strong&gt; Expect attribution to undercount. Add a &quot;How did you hear about us?&quot; option with an AI assistant choice to your intake forms, because most AI mentions never produce a trackable click.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Branded search lift.&lt;/strong&gt; Growth in people searching your company name often correlates with AI exposure, per Percepture's GEO research.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conversion quality.&lt;/strong&gt; The traffic you do get is disproportionately valuable: Ahrefs' own data showed AI-referred visitors converting at 23x the rate of traditional organic visitors (0.5% of traffic generated 12.1% of signups, June 2025). Semrush found a similar 4.4x pattern. Small numbers, high intent.&lt;/p&gt;
&lt;h3 id=&quot;step-6-automate-when-manual-stops-scaling&quot;&gt;Step 6: Automate when manual stops scaling&lt;/h3&gt;
&lt;p&gt;Twenty-five prompts run five times each is 125 data points — enough for a baseline, not enough for stable rates. That's when a platform earns its money. Roughly priced landscape as of mid-2026:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Otterly AI&lt;/strong&gt; — from $29/month (15 prompts). The low-cost serious entry point; weekly refresh.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peec AI&lt;/strong&gt; — from $95/month (50 prompts). Clean visibility, position, sentiment, and SoV dashboards; strong for structured reporting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semrush AI Visibility Toolkit&lt;/strong&gt; — from $99/month standalone. Low friction if you're already on Semrush.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ahrefs Brand Radar&lt;/strong&gt; — from $199/month per AI-platform index (requires an Ahrefs base plan from $129/month). Prompt methodology anchored to search data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profound&lt;/strong&gt; — enterprise positioning, deep analytics, most advanced features behind custom pricing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whichever tool you pick, demand these capabilities: multi-platform tracking (ChatGPT, Perplexity, Gemini, AI Overviews, Claude), citation/source URL analysis — not just mention counts — competitor benchmarking, historical trends, and transparency about prompt volume methodology.&lt;/p&gt;
&lt;h3 id=&quot;the-seven-mistakes-that-break-benchmarks&quot;&gt;The seven mistakes that break benchmarks&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Chasing rank position instead of visibility rate.&lt;/strong&gt; Position swings wildly run to run; frequency is the stable metric.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measuring only one engine.&lt;/strong&gt; You're optimizing blind.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Counting mentions but ignoring citations&lt;/strong&gt; (or vice versa). They're different metrics doing different jobs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ignoring sentiment and accuracy.&lt;/strong&gt; Being named with wrong pricing isn't a win.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Running each prompt once.&lt;/strong&gt; Anecdote, not measurement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expecting clean click attribution.&lt;/strong&gt; Analytics will always undercount AI's influence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing once and moving on.&lt;/strong&gt; Visibility drifts as models update and content ages. Only a fixed cadence reveals what's actually moving.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;the-bottom-line&quot;&gt;The bottom line&lt;/h3&gt;
&lt;p&gt;You can't manage what you can't see, and traditional analytics can't see AI answers. The process is unglamorous: freeze a prompt set, run it repeatedly across engines, log mentions and citations separately, review monthly, automate when the volume outgrows your spreadsheet. Do that consistently and &quot;how visible are we in AI?&quot; stops being a worry and becomes a number you can move.&lt;/p&gt;
&lt;h3 id=&quot;faq&quot;&gt;FAQ&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;What is an AI search visibility benchmark?&lt;/strong&gt;&lt;br&gt;
An AI search visibility benchmark is a fixed set of buyer-relevant prompts that you run repeatedly across AI search engines (ChatGPT, Perplexity, Gemini, Google AI Overviews) to measure how often and how accurately your brand appears in AI-generated answers over time. It turns &quot;are we visible in AI?&quot; from a vague worry into a trackable number with a trend line.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How many prompts do I need for a reliable benchmark?&lt;/strong&gt;&lt;br&gt;
For a manual baseline, 10–15 prompts across five categories (category, comparison, persona, problem, brand-direct), run 3–5 times per engine, gives directional data. For statistically stable visibility rates, research suggests 500–2,000 prompts per week — which is where automated platforms become necessary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What's the difference between mentions and citations?&lt;/strong&gt;&lt;br&gt;
A mention means the AI names your brand in the answer text. A citation means it links to your website as a source. Mentions build brand association; citations drive trackable traffic. On ChatGPT most mentions carry no link, while Perplexity links almost everything, so the two metrics must be tracked separately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How often should I re-run my benchmark?&lt;/strong&gt;&lt;br&gt;
Weekly is the standard cadence for automated tracking; monthly is the minimum for manual runs. Re-run the exact same prompt set each time — changing prompts between runs destroys comparability. Also re-baseline after major model updates, since visibility can shift overnight when models change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can I build an AI visibility benchmark for free?&lt;/strong&gt;&lt;br&gt;
Yes. A spreadsheet, 10–15 frozen prompts, and one hour a month covers the fundamentals — mention rate, citation rate, position, competitors, and cited sources. Paid tools earn their cost when you need scale, daily cadence, sentiment scoring, and source-level analysis across hundreds of prompts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do I still need traditional SEO tracking?&lt;/strong&gt;&lt;br&gt;
Yes. Ranking on page one remains correlated with AI citations — Ahrefs found 38% of AI Overview-cited pages also rank in the top 10 — but the relationship is weakening fast (down from ~76% in mid-2024). The two systems measure different things: blue-link position versus presence inside the answer. You need both.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Jarno Saarimies&lt;/strong&gt; is the founder of &lt;strong&gt;AEOvara&lt;/strong&gt;, a Finnish consultancy specializing in AI search optimization (AEO/GEO/LLMO) — helping brands get found, cited, and recommended inside AI-generated answers. A professional photographer since 2013, Jarno runs Kuvaajankulma, a photography studio in Lappeenranta, Finland, and applies the same evidence-first mindset to search: no hype, no guesswork — measure what actually matters. &lt;a rel=&quot;nofollow&quot; href=&quot;https://aeovara.fi/asiantuntija/&quot;&gt;AEOvara Jarno S&lt;/a&gt;&lt;br&gt;
 &lt;a rel=&quot;nofollow&quot; href=&quot;https://aeovara.fi/blogi/&quot;&gt;AEOvara BLOG&lt;/a&gt;&lt;/p&gt;
</description>
<category>Tutorials</category>
<guid isPermaLink="true">https://coderlegion.com/26494/how-to-build-a-repeatable-ai-search-visibility-benchmark</guid>
<pubDate>Tue, 08 Sep 2026 13:42:54 +0000</pubDate>
</item>
<item>
<title>Google Search Console Setup for Next.js (2026 Beginner's Guide)</title>
<link>https://coderlegion.com/24706/google-search-console-setup-for-next-js-2026-beginners-guide</link>
<description>&lt;p&gt;You just shipped your Next.js site. Metadata's wired up, Open Graph tags look great, JSON-LD is in place — and yet Google has no idea your site exists. Weeks go by, you check your analytics, and organic traffic is basically zero.&lt;/p&gt;
&lt;p&gt;Here's the thing nobody tells beginners: writing good SEO code isn't the same as telling Google to actually crawl it. That connection happens through one tool — &lt;strong&gt;Google Search Console (GSC)&lt;/strong&gt; — and it's one of the most important tools new Next.js developers should set up after launch.&lt;/p&gt;
&lt;p&gt;By the end of this guide, you'll have Google Search Console fully connected to your Next.js 16 App Router site, a submitted sitemap, a correctly configured &lt;code&gt;robots.txt&lt;/code&gt;, and a repeatable process for catching indexing problems before they cost you traffic.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-this-is-tricky&quot;&gt;Why This Is Tricky&lt;/h3&gt;
&lt;p&gt;Google Search Console isn't part of your codebase, so it's easy to treat it as an afterthought — something you'll &quot;get to later.&quot; But GSC is the only place that tells you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether Google can actually &lt;strong&gt;crawl&lt;/strong&gt; your pages&lt;/li&gt;
&lt;li&gt;Which pages are &lt;strong&gt;indexed&lt;/strong&gt; (showing up in search) versus silently ignored&lt;/li&gt;
&lt;li&gt;Real search &lt;strong&gt;queries&lt;/strong&gt; people used to land on your site&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core Web Vitals&lt;/strong&gt; issues that can contribute to a poor page experience and potentially affect search performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without it, you're optimizing blind. You could have a metadata bug shipping &lt;code&gt;noindex&lt;/code&gt; to your entire site for a week and never know until traffic craters.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;This guide assumes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next.js 16&lt;/strong&gt; with the App Router&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt; in strict mode&lt;/li&gt;
&lt;li&gt;A site already deployed to a live domain (Vercel, Netlify, or self-hosted — the Next.js side works the same everywhere)&lt;/li&gt;
&lt;li&gt;Access to your domain's DNS settings (through your registrar or host)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your project doesn't have &lt;code&gt;app/sitemap.ts&lt;/code&gt; or &lt;code&gt;app/robots.ts&lt;/code&gt; yet, don't worry — we'll build both from scratch.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-1-create-the-google-search-console-property&quot;&gt;Step 1: Create the Google Search Console Property&lt;/h3&gt;
&lt;p&gt;Head to &lt;a rel=&quot;nofollow&quot; href=&quot;https://search.google.com/search-console&quot;&gt;search.google.com/search-console&lt;/a&gt; and sign in with the Google account you want to permanently own this property. If you're doing this for a client, use an account you control and add them as a verified owner afterward — don't set the property up under their personal Gmail unless you're handing off the project entirely.&lt;/p&gt;
&lt;p&gt;You'll be asked to choose a property type:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Property type &lt;/th&gt;&lt;th&gt;Covers &lt;/th&gt;&lt;th&gt;Verification&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Domain property&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;All subdomains and both &lt;code&gt;http&lt;/code&gt;/&lt;code&gt;https&lt;/code&gt; versions under one property &lt;/td&gt;&lt;td&gt;DNS only&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;URL-prefix property&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;Just the exact URL pattern you enter &lt;/td&gt;&lt;td&gt;DNS, HTML file, meta tag, GA, or GTM&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; For a new site, go with a &lt;strong&gt;Domain property&lt;/strong&gt;. It's the most complete option — you get &lt;code&gt;www&lt;/code&gt; and non-&lt;code&gt;www&lt;/code&gt;, &lt;code&gt;http&lt;/code&gt; and &lt;code&gt;https&lt;/code&gt;, and every subdomain in a single dashboard instead of juggling separate properties for each variant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The tradeoff is that Domain properties only support &lt;strong&gt;DNS verification&lt;/strong&gt;, which means you need access to your domain's DNS zone (through your registrar, or through Vercel's domain settings if Vercel manages your DNS).&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-2-verify-ownership&quot;&gt;Step 2: Verify Ownership&lt;/h3&gt;
&lt;h4 id=&quot;option-a-dns-txt-record-recommended-for-domain-properties-&quot;&gt;Option A — DNS TXT Record (Recommended for Domain Properties)&lt;/h4&gt;
&lt;p&gt;This is the most reliable method because it's tied to the domain itself, not a specific file or page — it survives redeploys, framework migrations, and hosting changes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GSC gives you a TXT record value that looks like &lt;code&gt;google-site-verification=abc123...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Log into your DNS provider (Cloudflare, Namecheap, GoDaddy, or your registrar)&lt;/li&gt;
&lt;li&gt;Add a new &lt;strong&gt;TXT record&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Host/Name:&lt;/strong&gt; &lt;code&gt;@&lt;/code&gt; (represents your root domain)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value:&lt;/strong&gt; the code GSC gave you&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TTL:&lt;/strong&gt; default (usually 3600)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Save, go back to GSC, and click &lt;strong&gt;Verify&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;Common Mistake:&lt;/strong&gt; DNS changes aren't instant. Some providers (Cloudflare especially) propagate in 2–3 minutes, but others can take up to an hour. If verification fails immediately, wait and retry rather than assuming you did something wrong.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;option-b-html-meta-tag-url-prefix-properties-&quot;&gt;Option B — HTML Meta Tag (URL-Prefix Properties)&lt;/h4&gt;
&lt;p&gt;If you went with a URL-prefix property instead, GSC gives you a meta tag like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;meta name=&quot;google-site-verification&quot; content=&quot;your-code-here&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In Next.js's App Router, don't paste this directly into a &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag — the Metadata API has a dedicated field for it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-tsx&quot;&gt;// app/layout.tsx
import type { Metadata } from &quot;next&quot;;

export const metadata: Metadata = {
  // ...your existing metadata
  verification: {
    google: &quot;your-code-here&quot;,
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;What's happening here:&lt;/strong&gt; Next.js's Metadata API generates the correct &lt;code&gt;&amp;lt;meta name=&quot;google-site-verification&quot;&amp;gt;&lt;/code&gt; tag for you, merged in with the rest of your root layout's metadata. This is safer than hand-editing HTML because it can't accidentally get wiped out by a template change.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;Common Mistake:&lt;/strong&gt; Only setting the &lt;code&gt;verification&lt;/code&gt; field in a nested page's metadata instead of the root &lt;code&gt;app/layout.tsx&lt;/code&gt;. Google checks your homepage for this tag, so it has to live in metadata that actually applies to &lt;code&gt;/&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Redeploy, then click &lt;strong&gt;Verify&lt;/strong&gt; in GSC.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-3-generate-a-sitemap-with-sitemap-ts&quot;&gt;Step 3: Generate a Sitemap with &lt;code&gt;sitemap.ts&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A sitemap is a map of every URL you want indexed. It doesn't force Google to index anything, but it can make URL discovery more efficient — especially for new sites, large sites, or pages with few internal links.&lt;/p&gt;
&lt;p&gt;Next.js has a built-in file convention for this — no packages needed:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;// app/sitemap.ts
import { MetadataRoute } from &quot;next&quot;;
import { getAllPosts } from &quot;@/lib/posts&quot;;
import { appURL } from &quot;@/lib/utils&quot;;

export default function sitemap(): MetadataRoute.Sitemap {
  const posts = getAllPosts().map((post) =&amp;gt; ({
    url: `${appURL}/blog/${post.slug}`,
    lastModified: new Date(post.updatedAt || post.publishedAt),
  }));

  const staticRoutes = [&quot;&quot;, &quot;/about&quot;, &quot;/blog&quot;, &quot;/contact&quot;].map((route) =&amp;gt; ({
    url: `${appURL}${route}`,
  }));

  return [...staticRoutes, ...posts];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;What's happening here:&lt;/strong&gt; dropping a file named &lt;code&gt;sitemap.ts&lt;/code&gt; inside &lt;code&gt;app/&lt;/code&gt; tells Next.js to automatically generate a working route at &lt;code&gt;/sitemap.xml&lt;/code&gt; — you never manually build or serve XML. &lt;code&gt;lastModified&lt;/code&gt; tells search engines when a page was last meaningfully updated. Google can use an accurate lastmod value when deciding when to recrawl a URL. Although Next.js supports &lt;code&gt;changeFrequency&lt;/code&gt; and &lt;code&gt;priority&lt;/code&gt;, Google says it ignores those two sitemap values, so don't treat them as ranking or crawling controls.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Only include canonical URLs that you actually want search engines to discover and potentially index. Don't add &lt;code&gt;/admin&lt;/code&gt;, &lt;code&gt;/api/*&lt;/code&gt;, private pages, draft URLs, or other non-indexable routes to your sitemap.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-4-configure-robots-ts-correctly&quot;&gt;Step 4: Configure &lt;code&gt;robots.ts&lt;/code&gt; Correctly&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; tells crawlers which URLs they can or can't request. It controls crawling — not whether a page can appear in search results.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;// app/robots.ts
import { MetadataRoute } from &quot;next&quot;;
import { appURL } from &quot;@/lib/utils&quot;;

export default function robots(): MetadataRoute.Robots {
  return {
    rules: {
      userAgent: &quot;*&quot;,
      allow: &quot;/&quot;,
      disallow: [&quot;/admin&quot;, &quot;/api&quot;],
    },
    sitemap: `${appURL}/sitemap.xml`,
  };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;What's happening here:&lt;/strong&gt; same pattern as the sitemap — Next.js auto-generates a working &lt;code&gt;/robots.txt&lt;/code&gt; from this file. &lt;code&gt;allow: &quot;/&quot;&lt;/code&gt; lets crawlers visit everything by default, &lt;code&gt;disallow&lt;/code&gt; blocks specific internal paths, and pointing &lt;code&gt;sitemap&lt;/code&gt; at your sitemap URL here means crawlers can discover it even before you manually submit it in GSC.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;Common Mistake:&lt;/strong&gt; Leaving &lt;code&gt;disallow: &quot;/&quot;&lt;/code&gt; in &lt;code&gt;robots.ts&lt;/code&gt; after moving from a staging environment to production. This single line blocks your &lt;strong&gt;entire site&lt;/strong&gt; from every search engine. Always double-check this file immediately after your first production deploy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt; If you need to prevent a page from being indexed, use noindex rather than relying on robots.txt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-5-submit-your-sitemap-in-gsc&quot;&gt;Step 5: Submit Your Sitemap in GSC&lt;/h3&gt;
&lt;p&gt;Once you're verified:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the GSC sidebar, click &lt;strong&gt;Sitemaps&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;sitemap.xml&lt;/code&gt; (GSC prepends your domain automatically)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Submit&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should see a &quot;Success&quot; status within a few minutes, though it can take a day or two before &quot;Discovered URLs&quot; starts populating.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; If your sitemap shows &quot;Couldn't fetch,&quot; visit &lt;code&gt;yourdomain.com/sitemap.xml&lt;/code&gt; directly in your browser first. If it 404s, the issue is your deployment, not GSC — check that &lt;code&gt;app/sitemap.ts&lt;/code&gt; actually made it into your production build.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-6-verify-robots-meta-tags-aren-t-blocking-individual-pages&quot;&gt;Step 6: Verify Robots Meta Tags Aren't Blocking Individual Pages&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; controls crawling at the site level, but an individual page can still say &quot;don't index me&quot; through page-level metadata — easy to forget on a page you copy-pasted from a draft.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-tsx&quot;&gt;// app/some-page/page.tsx
import type { Metadata } from &quot;next&quot;;

export const metadata: Metadata = {
  robots: {
    index: false,
    follow: false,
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;Common Mistake:&lt;/strong&gt; Setting &lt;code&gt;index: false&lt;/code&gt; on the root layout &quot;just to be safe&quot; during development, then forgetting to flip it before launch. This is one of the most common reasons a brand-new Next.js site gets zero organic traffic for weeks — always check your homepage's rendered &lt;code&gt;&amp;lt;meta name=&quot;robots&quot;&amp;gt;&lt;/code&gt; tag in production before assuming GSC is the problem. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You normally don't need to explicitly set &lt;code&gt;index: true&lt;/code&gt; and &lt;code&gt;follow: true&lt;/code&gt;. The important thing is making sure you haven't accidentally configured these &lt;code&gt;false&lt;/code&gt; on pages you want in search.&lt;/p&gt;
&lt;p&gt;You can check this instantly using GSC's &lt;strong&gt;URL Inspection Tool&lt;/strong&gt; (covered next) — it tells you directly whether Google sees a page as indexable.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-7-use-url-inspection-to-force-indexing&quot;&gt;Step 7: Use URL Inspection to Force Indexing&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://devstacked.tech/gsc-setup-nextjs/image1.png&quot; alt=&quot;Google Search Console URL Inspection showing the indexed status of a page&quot;&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;URL Inspection Tool&lt;/strong&gt; is the single most useful feature in GSC day-to-day. Paste any URL from your site into the search bar at the top of GSC, and it tells you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether the page is currently indexed&lt;/li&gt;
&lt;li&gt;When it was last crawled&lt;/li&gt;
&lt;li&gt;Whether anything (robots meta, canonical mismatch, &lt;code&gt;noindex&lt;/code&gt;) is blocking it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After publishing a new page or fixing a metadata bug, you can use &lt;strong&gt;Request Indexing&lt;/strong&gt; to ask Google to recrawl the URL. It doesn't guarantee immediate crawling or indexing, so use your sitemap for ongoing URL discovery rather than repeatedly requesting individual URLs.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Request Indexing has a daily quota per property. Don't use it for bulk resubmission of your whole site — that's what your sitemap is for. Reserve it for genuinely new or recently fixed pages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-8-check-core-web-vitals&quot;&gt;Step 8: Check Core Web Vitals&lt;/h3&gt;
&lt;p&gt;GSC's &lt;strong&gt;Core Web Vitals&lt;/strong&gt; report shows real-user field data (from actual Chrome visitors), not just a local Lighthouse score. This matters because &lt;strong&gt;Core Web Vitals&lt;/strong&gt; are used by Google's ranking systems, and lab data can look great locally while real users on slower connections or devices have a worse experience.&lt;/p&gt;
&lt;p&gt;Watch for pages slipping from &quot;Good&quot; into &quot;Needs improvement&quot; or &quot;Poor&quot; — this is usually caused by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unoptimized images (missing &lt;code&gt;next/image&lt;/code&gt;, or missing &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Large third-party scripts loaded without &lt;code&gt;next/script&lt;/code&gt; strategy&lt;/li&gt;
&lt;li&gt;Web fonts causing layout shift instead of using &lt;code&gt;next/font&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The report uses real-user data rather than a synthetic Lighthouse test, so your local performance score and your users' actual experience can tell different stories.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devstacked.tech/blog/image-optimization-nextjs-16&quot;&gt;Related: Image Optimization in Next.js 16&lt;/a&gt; covers the &lt;code&gt;next/image&lt;/code&gt; configuration options that most directly affect this report.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-9-check-your-canonical-urls&quot;&gt;Step 9: Check Your Canonical URLs&lt;/h3&gt;
&lt;p&gt;Google doesn't only decide whether a page can be indexed — it also chooses which URL represents duplicate or very similar versions of the same content.&lt;/p&gt;
&lt;p&gt;In Next.js, make sure important pages have the correct canonical URL, especially if your site supports multiple URL variations.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;import type { Metadata } from &quot;next&quot;;

export const metadata: Metadata = {
  alternates: {
    canonical: &quot;https://example.com/blog/my-post&quot;,
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;⚠️ A canonical URL is a hint, not a guarantee. Google can choose a different canonical if it determines another URL is a better representative of the content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-10-understanding-discovered-currently-not-indexed-&quot;&gt;Step 10: Understanding &quot;Discovered — Currently Not Indexed&quot;&lt;/h3&gt;
&lt;p&gt;Sooner or later you'll open the &lt;strong&gt;Page indexing&lt;/strong&gt; report and see a bucket of URLs labeled &lt;strong&gt;Discovered — currently not indexed&lt;/strong&gt;. This is one of the most common statuses beginners panic over, so it's worth understanding what it actually means.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://devstacked.tech/gsc-setup-nextjs/image2.png&quot; alt=&quot;Google Search Console Page indexing report showing Discovered - currently not indexed URLs&quot;&gt;&lt;/p&gt;
&lt;p&gt;It means Google found the URL — usually through your sitemap or an internal link — but hasn't crawled and indexed it yet. This is different from &lt;strong&gt;Crawled — currently not indexed&lt;/strong&gt;, where Google did visit the page but chose not to index it. Both statuses are common and don't always signal a problem; a brand-new site with dozens of freshly submitted URLs will often show a pile of &quot;Discovered&quot; pages that clear up on their own within a couple of weeks.&lt;/p&gt;
&lt;p&gt;That said, if a URL sits in this state for &lt;strong&gt;more than two to three weeks&lt;/strong&gt;, it's worth investigating:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Thin or low-value content&lt;/strong&gt; — tag pages, barely-filled pages, or near-duplicates may provide little unique value. Make sure important URLs contain useful, distinct content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crawl budget&lt;/strong&gt; — very large sites, or sites publishing a lot of near-identical pages quickly, can outpace how much Google is willing to crawl in a given period.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weak internal linking&lt;/strong&gt; — a page with no other pages linking to it signals lower importance. Link to new posts from your homepage, a category page, or related content shortly after publishing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server response issues&lt;/strong&gt; — if Googlebot hit a slow response or a temporary error when it tried to crawl, it may deprioritize a retry rather than fail loudly.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Don't spam &lt;strong&gt;Request Indexing&lt;/strong&gt; on the same &quot;Discovered&quot; URL every day — it doesn't speed anything up and doesn't change why Google deprioritized the crawl in the first place. Fix the underlying content or linking issue, then request indexing once.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-11-don-t-forget-bing-webmaster-tools&quot;&gt;Step 11: Don't Forget Bing Webmaster Tools&lt;/h3&gt;
&lt;p&gt;Google isn't the only crawler worth your time. &lt;strong&gt;Bing&lt;/strong&gt; powers Microsoft's search ecosystem and is also an important source of web search visibility beyond Google — real, easy traffic most developers skip entirely.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sign up at &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.bing.com/webmasters&quot;&gt;Bing Webmaster Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Submit the exact same &lt;code&gt;sitemap.xml&lt;/code&gt; you already built — no separate file needed&lt;/li&gt;
&lt;li&gt;Bing lets you &lt;strong&gt;import your verified site directly from Google Search Console&lt;/strong&gt; in a couple of clicks, skipping manual re-verification entirely&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;a-simple-weekly-routine&quot;&gt;A Simple Weekly Routine&lt;/h3&gt;
&lt;p&gt;Set aside 10–15 minutes a week and check:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Performance report&lt;/strong&gt; — any unusual drops or spikes in clicks/impressions?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Page indexing report&lt;/strong&gt; — any pages stuck in &quot;Discovered — currently not indexed&quot; for more than two weeks?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core Web Vitals&lt;/strong&gt; — any pages that moved from Good to Needs Improvement?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Catching a regression here in week one is a five-minute fix. Catching it three months later, after it's quietly tanked your rankings, is a much longer recovery.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;troubleshooting-checklist&quot;&gt;Troubleshooting Checklist&lt;/h3&gt;
&lt;p&gt;If something isn't working, work through these in order before assuming it's a GSC bug:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Verification failing?&lt;/strong&gt; Wait at least 30–60 minutes after adding a DNS TXT record before retrying — propagation isn't instant.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Verification meta tag &quot;not found&quot;?&lt;/strong&gt; View your production page source (not localhost) and confirm the &lt;code&gt;google-site-verification&lt;/code&gt; tag is actually in the rendered &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; — check it's set in &lt;code&gt;app/layout.tsx&lt;/code&gt;, not a nested page.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Sitemap &quot;Couldn't fetch&quot;?&lt;/strong&gt; Visit &lt;code&gt;yourdomain.com/sitemap.xml&lt;/code&gt; directly in a browser first. A 404 means a deployment problem, not a GSC problem.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Sitemap fetches but pages aren't indexed?&lt;/strong&gt; Check &lt;code&gt;robots.ts&lt;/code&gt; isn't disallowing the path, and check the page's own metadata isn't setting &lt;code&gt;robots: { index: false }&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Whole site missing from search?&lt;/strong&gt; Check &lt;code&gt;app/robots.ts&lt;/code&gt; for an accidental &lt;code&gt;disallow: &quot;/&quot;&lt;/code&gt; — this is the single most common self-inflicted outage.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Pages stuck on &quot;Discovered — currently not indexed&quot;?&lt;/strong&gt; Give it 2–3 weeks first. If it persists, check for thin content and add internal links pointing to the page.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Core Web Vitals showing &quot;Poor&quot;?&lt;/strong&gt; Confirm images use &lt;code&gt;next/image&lt;/code&gt;, fonts use &lt;code&gt;next/font&lt;/code&gt;, and large third-party scripts use &lt;code&gt;next/script&lt;/code&gt; with an appropriate loading strategy.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Data missing entirely after adding the property?&lt;/strong&gt; This can be normal for a new property. Google says data collection begins when the property is added, even before verification, but it can take up to a week for data to appear.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;frequently-asked-questions&quot;&gt;Frequently Asked Questions&lt;/h3&gt;
&lt;h4 id=&quot;do-i-need-a-domain-property-or-url-prefix-property-for-next-js-&quot;&gt;Do I need a Domain property or URL-prefix property for Next.js?&lt;/h4&gt;
&lt;p&gt;Domain property, in almost every case — it covers &lt;code&gt;www&lt;/code&gt;, non-&lt;code&gt;www&lt;/code&gt;, and both protocols under one dashboard. Only use URL-prefix if you specifically need isolated data for a subdomain or can't get DNS access.&lt;/p&gt;
&lt;h4 id=&quot;how-long-until-i-see-data-in-google-search-console-&quot;&gt;How long until I see data in Google Search Console?&lt;/h4&gt;
&lt;p&gt;Search Console doesn't give you historical performance data from before Google started collecting data for the property. Google says data collection can begin when the property is added, even before ownership verification is completed. In practice, expect the reports to take some time to populate, and don't panic if impressions stay low for the first couple of weeks on a brand-new site.&lt;/p&gt;
&lt;h4 id=&quot;my-sitemap-shows-couldn-t-fetch-what-s-wrong-&quot;&gt;My sitemap shows &quot;Couldn't fetch.&quot; What's wrong?&lt;/h4&gt;
&lt;p&gt;Almost always a deployment issue, not a GSC issue. Visit &lt;code&gt;yourdomain.com/sitemap.xml&lt;/code&gt; directly — if it 404s or shows an error, check that &lt;code&gt;app/sitemap.ts&lt;/code&gt; is actually included in your production build and isn't being blocked by &lt;code&gt;robots.ts&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;can-i-use-both-a-dns-txt-record-and-a-meta-tag-verification-&quot;&gt;Can I use both a DNS TXT record and a meta tag verification?&lt;/h4&gt;
&lt;p&gt;Yes. You can maintain multiple verification methods. This can be useful as a backup, although you don't need multiple methods for normal operation. Domain properties use DNS verification, while URL-prefix properties support additional methods such as HTML meta tags.&lt;/p&gt;
&lt;h4 id=&quot;does-adding-a-sitemap-guarantee-my-pages-get-indexed-&quot;&gt;Does adding a sitemap guarantee my pages get indexed?&lt;/h4&gt;
&lt;p&gt;No. A sitemap only helps Google &lt;em&gt;discover&lt;/em&gt; URLs faster — it doesn't override &lt;code&gt;noindex&lt;/code&gt; tags, thin-content penalties, or crawl budget limits. Pages still need to pass Google's own quality bar to actually rank.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;wrapping-up&quot;&gt;Wrapping Up&lt;/h3&gt;
&lt;p&gt;Google Search Console setup for Next.js comes down to five things that take about 20 minutes total: verify ownership, ship &lt;code&gt;app/sitemap.ts&lt;/code&gt;, ship a correctly scoped &lt;code&gt;app/robots.ts&lt;/code&gt;, submit the sitemap, and build a weekly habit of checking the Performance and Page Indexing reports. None of it is complicated — it's just easy to skip, and skipping it is exactly why so many well-built Next.js sites sit invisible in search for months after launch.&lt;/p&gt;
&lt;p&gt;From here, a natural next step is pairing this with a proper JSON-LD structured data setup so your indexed pages are eligible for rich results, not just a plain blue link.&lt;/p&gt;
&lt;h3 id=&quot;continue-learning&quot;&gt;Continue Learning&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devstacked.tech/blog/technical-seo-checklist&quot;&gt;The Complete Technical SEO Checklist for Next.js Developers (2026 Guide)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devstacked.tech/blog/nextjs-16-metadata&quot;&gt;How to Add Metadata in Next.js 16 (2026 Beginner's Guide)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devstacked.tech/blog/nextjs-rendering-strategies-explained&quot;&gt;Next.js Rendering Strategies Explained: SSR, SSG, CSR, ISR &amp;amp; Cache Components (2026)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;free-seo-tools&quot;&gt;Free SEO Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devstacked.tech/tools/json-ld-generator&quot;&gt;JSON-LD Generator for Next.js &amp;amp; HTML&lt;/a&gt; - generate Article, FAQ, Product, LocalBusiness, SoftwareApplication, Breadcrumb, Person, Organization, and Website JSON-LD — checked live against Google's actual Rich Results requirements.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devstacked.tech/tools/meta-tag-generator&quot;&gt;Meta Tag Generator for Next.js &amp;amp; HTML&lt;/a&gt; — generate SEO meta tags, Open Graph tags, Twitter Cards, and canonical URLs instantly. Handy for wiring up per-post metadata like the &lt;code&gt;generateMetadata()&lt;/code&gt; function above.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devstacked.tech/tools/rls-policy-generator&quot;&gt;Supabase RLS Policy Generator&lt;/a&gt; — if your next project pairs this blog setup with a Supabase backend, generate secure, performance-optimized Row Level Security policies in seconds.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devstacked.tech/tools/zod-schema-generator&quot;&gt;Zod Schema Generator&lt;/a&gt; — generate Zod schemas instantly from JSON or TypeScript. Includes smart inference, live validation, React Hook Form, Next.js API Routes, and Server Actions.&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24706/google-search-console-setup-for-next-js-2026-beginners-guide</guid>
<pubDate>Sun, 16 Aug 2026 05:54:15 +0000</pubDate>
</item>
<item>
<title>I built an independent search engine—and the results were interesting</title>
<link>https://coderlegion.com/19842/i-built-an-independent-search-engine-and-the-results-were-interesting</link>
<description>&lt;p&gt;A few months ago, I came across &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ActionRetro/FrogFind&quot;&gt;FrogFind&lt;/a&gt;, a retro search engine, and I decided that I wanted to try my hand at making one, too.&lt;/p&gt;
&lt;p&gt;I first started with the crawler, carefully planning out a simple single threaded Python requests bot using SQLite3 that accommodated robots.txt. This was particularly difficult—I had barely any experience in the field of search engine creation, and its subcategories.&lt;/p&gt;
&lt;p&gt;After the crawler was the webapp, which was relatively easy, because of my experience with Flask. I used Redis for rate limit storage, and various algorithms to do the searching for me.&lt;/p&gt;
&lt;p&gt;I shoved my crawler and webapp into a pip package, &lt;code&gt;quokko&lt;/code&gt;, with a CLI to control it. I wanted my project to be accessible, and for people to create their own search engines without trouble.&lt;/p&gt;
&lt;p&gt;Hosting it, as of Jun 6, 2026, there are around 13 million entries, which is very little for a search engine. The engine's quality may not be ideal, but it seems to provide me all these curious corners of the Internet, and also seems to be a tad more unfavourable to companies in the Big Tech category.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PROJECT HAS BEEN CLOSED DUE THE THE HASSLE OF HOSTING IT. . . SORRY!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It's now hosted here: &lt;a rel=&quot;nofollow&quot; href=&quot;https://quokko.splot.dev&quot;&gt;quokko.splot.dev&lt;/a&gt;&lt;br&gt;
And you'll find the code and documentation here: &lt;a rel=&quot;nofollow&quot; href=&quot;https://codeberg.org/splot-dev/quokko&quot;&gt;https://codeberg.org/splot-dev/quokko&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is a hobby project; errors are inevitable.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Its simple customizability allows for people to make their own micro search engines, and the goal is for these micro search engines to form a net of niche, curious alternative human knowledge collections. &lt;/p&gt;
&lt;p&gt;The goal of Quokko is not to become a competitor search engine, but for it to be the open door for more other search engines. &lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/19842/i-built-an-independent-search-engine-and-the-results-were-interesting</guid>
<pubDate>Sat, 06 Jun 2026 13:15:32 +0000</pubDate>
</item>
<item>
<title>Why Updating Data in Postgres Is More Expensive Than You Think</title>
<link>https://coderlegion.com/10024/why-updating-data-in-postgres-is-more-expensive-than-you-think</link>
<description>&lt;h3 id=&quot;context&quot;&gt;Context&lt;/h3&gt;
&lt;p&gt;I was recently tasked with optimizing stockinsights.ai’s full text search system for one of our core features: keyword search over filings.&lt;/p&gt;
&lt;p&gt;Previously, this worked by storing entire documents as raw strings in MongoDB and scanning through them at query time to return surrounding snippets. As you can imagine, this approach became increasingly slow and inefficient as the number of filings kept growing.&lt;/p&gt;
&lt;p&gt;This clearly needed to be fixed.&lt;/p&gt;
&lt;p&gt;While looking at the existing system, I noticed that we already stored chunked text snippets in a separate Postgres instance as part of our embeddings tables for semantic search. Each chunk already existed as a row, paired with an embedding.&lt;/p&gt;
&lt;p&gt;It seemed obvious that we should reuse this same chunked data for keyword search as well.&lt;/p&gt;
&lt;p&gt;At a high level, the idea looked something like this:&lt;/p&gt;
&lt;p&gt;Keyword search across snippets&lt;br&gt;
→ return matching text chunks&lt;br&gt;
→ rank documents higher if more chunks match&lt;br&gt;
→ return one representative snippet per document&lt;/p&gt;
&lt;p&gt;All I needed to do, or so I thought, was add another column to store &lt;code&gt;tsvectors&lt;/code&gt; (Postgres’s internal data structure for full text search) and create a GIN index on top of it.&lt;/p&gt;
&lt;p&gt;How hard could it be?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The obvious solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Postgres has built-in full text search using tsvector and tsquery. The plan was straightforward:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Add a tsvector column to the embeddings table
Populate it from the existing text column
Create a GIN index
Query snippets directly instead of scanning raw documents
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note: We could have normalized this into a separate table, but at a startup, we often accept some denormalization in favor of simpler systems.&lt;/p&gt;
&lt;p&gt;From an application point of view, this was almost trivial. No new data model, no new pipeline, just reuse what already existed.&lt;/p&gt;
&lt;p&gt;The mistake was assuming that a small logical change would translate into a small physical change inside the database.&lt;/p&gt;
&lt;p&gt;**&lt;/p&gt;
&lt;h3 id=&quot;when-the-costs-showed-up&quot;&gt;When the costs showed up&lt;/h3&gt;
&lt;p&gt;**&lt;br&gt;
Initially, nothing failed. The migration just took much longer than expected.&lt;/p&gt;
&lt;p&gt;Each document type table had roughly 2 to 5 million rows. Updating even 10,000 rows was taking hours, and each iteration made the next one slower. What started as a small backfill quickly turned into something that felt unbounded in cost.&lt;/p&gt;
&lt;p&gt;Populating the new column dragged on, disk usage grew far beyond what the additional data alone could justify, and creating the GIN index noticeably impacted write throughput while it was running.&lt;/p&gt;
&lt;p&gt;More concerning was that queries themselves began to slow down. Reads that were previously fast started degrading as the table and indexes bloated, even though the query plans hadn’t meaningfully changed.&lt;/p&gt;
&lt;p&gt;At that point, it was clear that something deeper was going on.&lt;/p&gt;
&lt;h3 id=&quot;update-in-postgres-is-not-mutation&quot;&gt;UPDATE in Postgres is not mutation&lt;/h3&gt;
&lt;p&gt;Postgres stores tables as heap files. A heap file is an unordered collection of tuples, and tuples are immutable.&lt;/p&gt;
&lt;p&gt;When you run an UPDATE, Postgres does not modify a row in place. Instead, it:&lt;/p&gt;
&lt;p&gt;Inserts a new version of the row&lt;br&gt;
Marks the old version as no longer visible&lt;br&gt;
Leaves cleanup for later&lt;br&gt;
This design exists to support MVCC (multi-version concurrency control), which allows readers and writers to operate concurrently by keeping multiple versions of rows and resolving visibility at read time.&lt;/p&gt;
&lt;p&gt;In practice, this means UPDATE is not a mutation of an existing row, but the creation of a new version of that row.&lt;/p&gt;
&lt;h3 id=&quot;why-adding-a-column-rewrites-every-row&quot;&gt;Why adding a column rewrites every row&lt;/h3&gt;
&lt;p&gt;A Postgres row is stored as a single physical tuple containing all columns. What I learned here is that there is no column-level storage, and therefore no partial row update.&lt;/p&gt;
&lt;p&gt;When you populate a new column on an existing table, Postgres must:&lt;/p&gt;
&lt;p&gt;Copy every existing column value&lt;br&gt;
Append the new column value&lt;br&gt;
Write an entirely new tuple&lt;br&gt;
Even if every other column remains unchanged, the entire row is rewritten. On a large table, this effectively means rewriting the entire dataset, not just adding one column.&lt;/p&gt;
&lt;p&gt;Why text, tsvector, and embeddings make this worse&lt;br&gt;
Our table already stored text snippets and embeddings, and we were about to add tsvectors on top of that.&lt;/p&gt;
&lt;p&gt;A few things compound the cost here:&lt;/p&gt;
&lt;p&gt;Text columns are variable length. Large values often exceed the inline storage limit. When that happens, Postgres uses TOAST.&lt;br&gt;
TOAST stores oversized column values out of line and keeps pointers to them in the main tuple.&lt;/p&gt;
&lt;p&gt;Even when data is TOASTed, updating the row still requires rewriting the main tuple and, in some cases, the TOAST entries themselves.&lt;/p&gt;
&lt;p&gt;tsvector expands data. It is not just the original text. It stores lexemes (similar to tokens) along with positional metadata, and it is also typically stored via TOAST.&lt;/p&gt;
&lt;p&gt;Embeddings make rows wide. Embeddings are large binary float arrays stored alongside text and indexed separately. Combined with text and tsvector, each row becomes wide, and wide rows are expensive to rewrite.&lt;/p&gt;
&lt;p&gt;This combination pushes right up against the limits of what an immutable row store is comfortable handling.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Indexes amplify the cost
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On top of this, the table already had indexes.&lt;/p&gt;
&lt;p&gt;Every new tuple version requires index maintenance. For each index, Postgres must:&lt;/p&gt;
&lt;p&gt;Insert new index entries&lt;br&gt;
Maintain index structure&lt;br&gt;
Write corresponding WAL records&lt;br&gt;
GIN indexes are especially heavy. A single row can generate many index entries, often one per token in the tsvector.&lt;/p&gt;
&lt;p&gt;While most indexes in Postgres are B-tree based, GIN indexes are inverted indexes.&lt;/p&gt;
&lt;p&gt;WAL (write-ahead log) is the sequential log used for crash recovery and replication. More index work means more WAL traffic, which directly affects disk usage, replication lag, and write latency.&lt;/p&gt;
&lt;p&gt;Indexes make reads fast, but they multiply write cost. That tradeoff is unavoidable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;An alternate approach: COPY, swap, drop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;While digging through Postgres blogs and discussions, I came across an alternative approach for modifying very large tables.&lt;/p&gt;
&lt;p&gt;Instead of updating the table in place, you:&lt;/p&gt;
&lt;p&gt;Create a new table with the desired schema&lt;br&gt;
Copy data into it&lt;br&gt;
Recreate indexes&lt;br&gt;
Swap it with the old table&lt;br&gt;
Drop the old table&lt;br&gt;
The COPY-swap-drop approach.&lt;/p&gt;
&lt;p&gt;This has a few important properties:&lt;/p&gt;
&lt;p&gt;Each row is written exactly once&lt;br&gt;
No dead tuples are created&lt;br&gt;
Indexes are built cleanly&lt;br&gt;
There is no incremental index maintenance during updates&lt;br&gt;
By contrast, UPDATE creates deferred work. Dead tuples accumulate and must be cleaned up later, and indexes are updated repeatedly for each new row version.&lt;/p&gt;
&lt;p&gt;In an immutable storage model, rewriting data cleanly can often be cheaper than mutating it incrementally.&lt;/p&gt;
&lt;h3 id=&quot;final-design&quot;&gt;Final design&lt;/h3&gt;
&lt;p&gt;One additional factor that helped was simply scaling the RDS instance. More memory meant more rows could be processed efficiently during the rebuild, which significantly reduced runtime.&lt;/p&gt;
&lt;p&gt;The final workflow looked like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Upgrade the instance
Use COPY-swap-drop to rebuild the table
Recreate indexes
This approach ended up being far faster and more predictable than trying to UPDATE rows in place.
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/10024/why-updating-data-in-postgres-is-more-expensive-than-you-think</guid>
<pubDate>Tue, 20 Jan 2026 03:30:41 +0000</pubDate>
</item>
<item>
<title>SEO for Vibe Coders: Key Strategies to Get Your AI-Crafted Tools Discovered</title>
<link>https://coderlegion.com/4664/seo-for-vibe-coders-key-strategies-to-get-your-ai-crafted-tools-discovered</link>
<description>&lt;p&gt;“Vibe coding” is revolutionizing software development. Instead of manually writing code, developers now use natural language prompts to guide AI tools—like &lt;strong&gt;GitHub Copilot&lt;/strong&gt;, &lt;strong&gt;Cursor&lt;/strong&gt;, or &lt;strong&gt;Bolt&lt;/strong&gt;—toward functional code generation. While it accelerates deployment, it increases the challenge of making code or tools discoverable via search.&lt;/p&gt;
&lt;h2 id=&quot;search-engine-optimisation-for-vibe-coders&quot;&gt;Search Engine Optimisation for Vibe Coders&lt;/h2&gt;
&lt;p&gt;This guide shows how vibe coders can utilise SEO techniques to ensure their AI-generated tools, scripts, or portfolios surface in search—even as traditional search evolves toward AI-managed answers.&lt;/p&gt;
&lt;h3 id=&quot;what-is-vibe-coding-amp-why-seo-needs-to-adapt-&quot;&gt;What Is Vibe Coding &amp;amp; Why SEO Needs to Adapt?&lt;/h3&gt;
&lt;p&gt;Coined by &lt;strong&gt;Andrej Karpathy&lt;/strong&gt; in 2025, vibe coding emphasizes using AI to generate code from conversational prompts. It accelerates development but also risks creating obscure or undocumented tools that traditional search engines struggle to index effectively.&lt;/p&gt;
&lt;p&gt;Meanwhile, the search landscape is shifting toward AI Answer Engines—platforms like &lt;a rel=&quot;nofollow&quot; href=&quot;https://chatgpt.com/&quot;&gt;ChatGPT&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; href=&quot;https://chat.deepseek.com/&quot;&gt;DeepSeek&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; href=&quot;https://search.google/ways-to-search/ai-overviews/&quot;&gt;Google’s AI Overview&lt;/a&gt;, and &lt;a rel=&quot;nofollow&quot; href=&quot;https://copilot.microsoft.com/&quot;&gt;Bing AI&lt;/a&gt; that deliver answers directly without requiring a click. Visibility now demands not just ranking, but being cited within AI responses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Also Read&lt;/strong&gt;, &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/4510/openais-live-unifies-advanced-reasoning-with-multimodal-capabilities-massive-context&quot;&gt;OpenAI’s GPT-5—now live—unifies advanced reasoning with multimodal capabilities and massive context&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;seo-strategies-vibe-coders-should-implement&quot;&gt;SEO Strategies Vibe Coders Should Implement&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=16385565286825202197&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;example-seo-christian-workflow&quot;&gt;Example SEO-Christian Workflow&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Project Page&lt;/strong&gt;: Create a page with structured URL like /vibe-coder-todo-app and title “Vibe-Coded To-Do App with AI Guidance.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Add a blog-style walkthrough titled “How I Built My To-Do App Using Vibe Coding”—explain prompts, iterations, debugging tips.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FAQ Section&lt;/strong&gt;: Insert Q&amp;amp;A such as “What is vibe coding?” or “Why choose AI-over-manual coding?” and include FAQ schema.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema Markup&lt;/strong&gt;: Use SoftwareSourceCode and FAQPage in JSON-LD to help AI systems recognize your content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance Boost&lt;/strong&gt;: Optimize images, scripts, and rethink mobile behavior—boost Core Web Vitals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Track Visibility&lt;/strong&gt;: Monitor Google Analytics and look for AI-driven features like featured snippets or answer panels.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;why-this-mindset-is-important-&quot;&gt;Why This Mindset Is Important?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generative SEO is the future&lt;/strong&gt;: Being discoverable isn’t just about keywords—it’s about being cited by AI systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vibe Coding Democratizes Development&lt;/strong&gt;: But without SEO, your contributions may remain invisible. The right optimization brings visibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sustain Relevance&lt;/strong&gt;: As AI reduces the need for clicks, preparing your content for voice search, snippet, and AI inclusion maximizes reach.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Also Read&lt;/strong&gt;, &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/4493/geo-and-aeo-redefine-seo-for-2025-by-structuring-content-to-be-cited-rather-than-just-ranked&quot;&gt;GEO and AEO redefine SEO for 2025 by structuring content to be cited—rather than just ranked—by AI!&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;concluding-thoughts&quot;&gt;Concluding Thoughts&lt;/h3&gt;
&lt;p&gt;Vibe coders lead the next wave of AI-powered engineering—but keeping your projects discoverable requires a new SEO approach. You should focus on documentation, structured data, conversational-focused content, and performance.&lt;/p&gt;
&lt;p&gt;Ready to audit your vibe-code portfolio or &lt;a rel=&quot;nofollow&quot; href=&quot;http://sadiqsaleem.com&quot;&gt;set up schema&lt;/a&gt; for AI visibility? Drop me a line—&lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/user/Sadiq+Saleem&quot;&gt;I’d love to help you&lt;/a&gt; get found by AI agents and humans alike.&lt;/p&gt;
</description>
<category>Automation Tools</category>
<guid isPermaLink="true">https://coderlegion.com/4664/seo-for-vibe-coders-key-strategies-to-get-your-ai-crafted-tools-discovered</guid>
<pubDate>Tue, 12 Aug 2025 23:03:06 +0000</pubDate>
</item>
<item>
<title>DevLog 20250523: Sitemap and `robots.txt`</title>
<link>https://coderlegion.com/3137/devlog-20250523-sitemap-and-robots-txt</link>
<description>&lt;p&gt;Search engine optimization (SEO) is not just about keywords and HTML metadata! Though those are the most basic things one can do (and can easily improve site visibility), there are other tricks that go a bit deeper—more technical than what ordinary readers see.&lt;/p&gt;
&lt;p&gt;I found that webmasters can go to &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.google.com/webmasters/tools&quot;&gt;Google Search Console&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.bing.com/webmasters&quot;&gt;Bing Webmaster Tools&lt;/a&gt; to add sitemaps. This continues our previous discussion on &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/methodox/devlog-20250520-search-engine-architecture-12k3&quot;&gt;Search Engine Architecture&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;sitemap&quot;&gt;Sitemap&lt;/h3&gt;
&lt;p&gt;A &lt;strong&gt;sitemap&lt;/strong&gt; is simply a file (or sometimes a web page) that tells search engines about the pages on our site. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Better discovery&lt;/strong&gt;: Search engines won’t have to “guess” at pages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faster indexing&lt;/strong&gt;: New or updated content gets found more quickly when we update the sitemap.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured hints&lt;/strong&gt;: Metadata in an XML sitemap gives crawlers extra clues about how often and how important different pages are.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are two main flavors:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;XML Sitemap&lt;/strong&gt; (for search engines)  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s an XML-formatted file (usually named &lt;code&gt;sitemap.xml&lt;/code&gt;) that lives at the website’s root.  &lt;/li&gt;
&lt;li&gt;Inside, it lists all of the website’s important URLs, plus optional metadata like:  &lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;lastmod&amp;gt;&lt;/code&gt; (when the page was last changed)  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;changefreq&amp;gt;&lt;/code&gt; (how often it tends to be updated)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;priority&amp;gt;&lt;/code&gt; (a hint about which pages we consider most important)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;By submitting this file to Google Search Console or Bing Webmaster Tools, we help crawlers discover and index our pages more efficiently—especially useful if we have a very large site, pages that aren’t well linked internally, or lots of media content.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;urlset xmlns=&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;&amp;gt;
  &amp;lt;url&amp;gt;
    &amp;lt;loc&amp;gt;https://www.example.com/&amp;lt;/loc&amp;gt;
    &amp;lt;lastmod&amp;gt;2025-05-20&amp;lt;/lastmod&amp;gt;
    &amp;lt;changefreq&amp;gt;daily&amp;lt;/changefreq&amp;gt;
    &amp;lt;priority&amp;gt;1.0&amp;lt;/priority&amp;gt;
  &amp;lt;/url&amp;gt;
  &amp;lt;url&amp;gt;
    &amp;lt;loc&amp;gt;https://www.example.com/blog/post-1&amp;lt;/loc&amp;gt;
    &amp;lt;lastmod&amp;gt;2025-05-18&amp;lt;/lastmod&amp;gt;
    &amp;lt;changefreq&amp;gt;weekly&amp;lt;/changefreq&amp;gt;
    &amp;lt;priority&amp;gt;0.8&amp;lt;/priority&amp;gt;
  &amp;lt;/url&amp;gt;
  &amp;lt;!-- more URLs here --&amp;gt;
&amp;lt;/urlset&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HTML Sitemap&lt;/strong&gt; (for people)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s just a regular web page on the site that lists links to all pages in a human-readable format.&lt;/li&gt;
&lt;li&gt;It’s primarily a usability feature—helping visitors (and indirectly search engines) navigate large or complex sites.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;robots-txt&quot;&gt;robots.txt&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;robots.txt&lt;/code&gt;&lt;/strong&gt; file is another “cheat-sheet” to put at the very root of the website (e.g. &lt;code&gt;https://www.example.com/robots.txt&lt;/code&gt;) to tell well-behaved web crawlers which parts of the site they’re welcome to explore—and which parts we’d rather keep off-limits.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Privacy &amp;amp; security&lt;/strong&gt;: Keep staging directories, admin panels, or confidential files out of search results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crawl-budget control&lt;/strong&gt;: On large sites, we can steer crawlers away from low-value pages (like faceted filters), so they focus on important content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Reduce server load by preventing bots from hammering resource-heavy sections.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some notes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Location matters&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Must live at &lt;code&gt;https://domain.com/robots.txt&lt;/code&gt; (exactly).&lt;/li&gt;
&lt;li&gt;Crawlers automatically look here first before they begin crawling website pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Basic syntax&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s plain text, with directives grouped by &lt;strong&gt;User-agent&lt;/strong&gt; (the crawler’s name).&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Common directives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Disallow:&lt;/code&gt; — path (or file) we don’t want crawled&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Allow:&lt;/code&gt; — exception to a &lt;code&gt;Disallow:&lt;/code&gt; (supported by Google, Bing, etc.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Sitemap:&lt;/code&gt; — URL of the XML sitemap&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;# Block all crawlers from /private/
User-agent: *
Disallow: /private/

# Allow Googlebot to see /private/public-info.html
User-agent: Googlebot
Allow: /private/public-info.html

# Let everyone know where the sitemap lives
Sitemap: https://www.example.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User-agents&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;*&lt;/code&gt; is the wildcard: applies to every crawler.&lt;/li&gt;
&lt;li&gt;We can target specific bots (e.g., &lt;code&gt;User-agent: Googlebot&lt;/code&gt;, &lt;code&gt;User-agent: Bingbot&lt;/code&gt;) if we need different rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disallow vs. Allow&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Disallow: /&lt;/code&gt; — don’t crawl anything on the site.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Disallow:&lt;/code&gt; (empty) — allow everything.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Allow: /path/to/page.html&lt;/code&gt; — lets a crawler index a page that would otherwise be blocked by a broader &lt;code&gt;Disallow:&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;a-few-best-practices&quot;&gt;A few best practices&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; is publicly visible—don’t use it to hide truly sensitive info (use authentication!).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test&lt;/strong&gt; in Google Search Console’s &lt;a rel=&quot;nofollow&quot; href=&quot;https://search.google.com/search-console/settings/robots-txt&quot;&gt;“robots.txt Tester”&lt;/a&gt; or Bing Webmaster Tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combine with sitemaps&lt;/strong&gt;: Always include a &lt;code&gt;Sitemap:&lt;/code&gt; line so crawlers can discover all valid URLs easily.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is an example from Google: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.google.com/robots.txt&quot;&gt;https://www.google.com/robots.txt&lt;/a&gt;&lt;/p&gt;
</description>
<category>Web Dev</category>
<guid isPermaLink="true">https://coderlegion.com/3137/devlog-20250523-sitemap-and-robots-txt</guid>
<pubDate>Wed, 18 Jun 2025 10:19:32 +0000</pubDate>
</item>
<item>
<title>DevLog 20250520: Search Engine Architecture</title>
<link>https://coderlegion.com/3110/devlog-20250520-search-engine-architecture</link>
<description>&lt;h3 id=&quot;overview&quot;&gt;Overview&lt;/h3&gt;
&lt;p&gt;For an internal database, we needed to implement some sort of text-based search capabilities to help users locate documents. One goal was to be lightweight, hassle-free, easy to set up, expand, and maintain—and ideally, to set it up once and forget about it. It's okay if it costs a bit of computing power, but agility, quick iterations, usability, and robustness are of top concern.&lt;/p&gt;
&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;
&lt;p&gt;It's surprising how much we can do without a server. Most serverless or static webpage hosts are happy to serve anything from a few MB to a few GB for free, likely even distributed across the globe. For any particular individual, if the search experience is truly customized to their needs, then not much resource is needed to deliver a satisfying experience.&lt;/p&gt;
&lt;p&gt;Let's illustrate this with an example. Suppose that, for any webpage, the information we care about includes the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Title&lt;/li&gt;
&lt;li&gt;Abstract&lt;/li&gt;
&lt;li&gt;URL&lt;/li&gt;
&lt;li&gt;Keywords (weighted)&lt;/li&gt;
&lt;li&gt;Tags&lt;/li&gt;
&lt;li&gt;Last Modification Time&lt;/li&gt;
&lt;li&gt;Webpage Language&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If we assume the abstract is at most 200 words and the rest adds up to 50 bytes, then each website we index takes about 250 bytes to store. 1KB fits four entries, 1MB fits 4096 entries, and 3MB fits about 12K entries. If a blog updates daily, the most it can produce is 365 entries per year, so 3MB is enough to hold one year's worth of content for 40 blog-sized websites.&lt;/p&gt;
&lt;p&gt;If we go a bit crazy, it's reasonable to expect a few hundred megabytes of memory consumption. Let’s say the payload is 300MB—that’s 40 × 100 = 4,000 blog-sized websites for one year. This means that, without a server, and with everything distributed as static content, a user's browser client can happily serve indexed website data locally for 4,000 websites. Considering that most of the time we dwell on just a few dozen sites, and that time relevance usually plays a big role, this leaves plenty of room for imagination.&lt;/p&gt;
&lt;h3 id=&quot;the-indexing&quot;&gt;The Indexing&lt;/h3&gt;
&lt;p&gt;Call it an indexer or web crawler. In this step, we try to gather information about all available websites and process them into condensed formats like a database, CSV, or JSON.&lt;/p&gt;
&lt;p&gt;Conceptually, the job of a web crawler could be greatly simplified if every website simply reported what it had—that’s supposedly the purpose of a sitemap. But in practice, it's surprising how much effort people spend on so-called SEO optimization, simply because there's no straightforward way to submit such information. On the other hand, perhaps it’s a good thing—we don’t want website creators to fool the search engine by submitting dishonest summary information.&lt;/p&gt;
&lt;p&gt;One major challenge with web crawling, besides parsing and potential blocking by website hosts, is rendering JavaScript. Nowadays, lots of content is dynamic, meaning it’s not directly available in plain HTML—it may not require a server per se, but much of the visible content is rendered only during runtime. For instance, a dictionary app may only display content once a search keyword is entered.&lt;/p&gt;
&lt;h3 id=&quot;the-searching&quot;&gt;The Searching&lt;/h3&gt;
&lt;p&gt;Database search, plain/full-text search, fuzzy search, vector search, and advanced queries—there are so many possible ways to organize data and perform searches, and so many libraries to choose from, it’s surprising that some websites and software still have such poor built-in search functions.&lt;/p&gt;
&lt;p&gt;At the current stage, we don’t have absolute recommendations yet, but suffice it to say: advanced platforms like ElasticSearch or even a traditional database are completely unnecessary for the majority of applications. A plain full-text search is efficient enough, and lots of lightweight JavaScript or WASM libraries exist to speed up search—such as Fuse, Lunr.js, and FlexSearch. There are databases built specifically for search (not to mention the many vector databases now available for AI embedding workloads), such as Manticore Search.&lt;/p&gt;
&lt;h3 id=&quot;the-hosting&quot;&gt;The Hosting&lt;/h3&gt;
&lt;p&gt;As mentioned, the simplest search engine frontend is just a plain website that fetches index data during loading and performs search in-memory on the client side, without any server other than static file hosting. Again, it's worth stressing how powerful this can be—not only versatile and easily deployed, but also sufficient for most small to medium workloads. For typical payloads in the 3–5MB range and up to 300MB at most, this is more than enough. We can fit a lot within such constraints.&lt;/p&gt;
</description>
<category>Web Dev</category>
<guid isPermaLink="true">https://coderlegion.com/3110/devlog-20250520-search-engine-architecture</guid>
<pubDate>Wed, 21 May 2025 01:14:38 +0000</pubDate>
</item>
</channel>
</rss>