<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Muhammad Kamran</title>
    <description>The latest articles on DEV Community by Muhammad Kamran (@kamrandev).</description>
    <link>https://dev.to/kamrandev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4132176%2F3d310ec1-f7e5-4a55-8ede-af0c8dd8f15a.jpeg</url>
      <title>DEV Community: Muhammad Kamran</title>
      <link>https://dev.to/kamrandev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kamrandev"/>
    <language>en</language>
    <item>
      <title>What Makes a Website SEO-Friendly? A Developer Explains</title>
      <dc:creator>Muhammad Kamran</dc:creator>
      <pubDate>Thu, 24 Sep 2026 10:29:15 +0000</pubDate>
      <link>https://dev.to/kamrandev/what-makes-a-website-seo-friendly-a-developer-explains-2lof</link>
      <guid>https://dev.to/kamrandev/what-makes-a-website-seo-friendly-a-developer-explains-2lof</guid>
      <description>&lt;p&gt;Last week I found a bug on my own portfolio. The About page had a FAQ answer that said I'd built websites "for businesses in Computer Vision, Portfolio, Professional Services and International Clients." Those aren't countries. My code was splitting each project's industry label on a dot and treating whatever came after it as a place. Google had already indexed the page, and that answer was sitting inside FAQ schema, ready for any AI assistant to quote.&lt;/p&gt;

&lt;p&gt;I fixed it in ten minutes. But it's a good example of what "SEO-friendly" actually means, because no plugin would have caught that. It was a construction decision, made badly, by me.&lt;/p&gt;

&lt;p&gt;So here's my working definition. A website is SEO-friendly when search engines can find every page, understand what each page is about, and serve it fast on a phone. Every part of that is decided while the site is being built. I build web apps and websites for a living, Next.js and Laravel mostly, WordPress when it's the right tool, and for two years I've also done the SEO work that comes after a build. Doing the second job is what taught me what the first job gets wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture first, before anyone opens Figma
&lt;/h2&gt;

&lt;p&gt;A good structure is shallow. Every page that matters should be reachable within about three clicks of the home page, related pages should sit together, and there should be one page per topic. Two pages about the same thing means Google picks one, and it's often not the one you wanted.&lt;/p&gt;

&lt;p&gt;URLs should mirror that structure and stay boring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/services/woocommerce-development/
/work/resumaic/
/insights/website-speed-and-seo/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The thing nobody tells you until it hurts: every URL you change later needs a redirect. I've watched a redesign lose a year of rankings because the agency rebuilt the site with new slugs and nobody mapped the old ones. That's not an SEO problem, it's a planning problem. Decide the structure before design starts and you never have to do the migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Headings are for meaning, not for size
&lt;/h2&gt;

&lt;p&gt;Search engines read your HTML, not your screen. One &lt;code&gt;h1&lt;/code&gt; that says what the page is. &lt;code&gt;h2&lt;/code&gt; for the sections. A real &lt;code&gt;nav&lt;/code&gt;. Real links. Alt text that actually describes the image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;WooCommerce Development&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;What I build&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/work/store.webp"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Product page for a UK homeware store, built on WooCommerce"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Page builders make this very easy to break. Elementor will let you make body text look like a heading, or put five &lt;code&gt;h1&lt;/code&gt;s on one page, and it looks identical in the browser. I've inherited sites like that. The fix is always the same: set the hierarchy on purpose and style it separately. Screen readers navigate by headings too, so you're fixing accessibility at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can Google even get in?
&lt;/h2&gt;

&lt;p&gt;Crawlability is whether a search engine can fetch the page. Indexability is whether it's allowed to keep it. Both come down to small things: &lt;code&gt;robots.txt&lt;/code&gt;, a sitemap, &lt;code&gt;noindex&lt;/code&gt; tags, and canonical tags saying which version of a page is the real one.&lt;/p&gt;

&lt;p&gt;The classic WordPress failure is launching with "Discourage search engines from indexing this site" still ticked. I've seen that box stay checked for months.&lt;/p&gt;

&lt;p&gt;Mine was subtler. Before I rebuilt kamrandev.com this month, the domain spent two years serving a default WordPress install with a "Hello World" post. Bing crawled that once, decided the domain wasn't worth coming back to, and stopped. When the real site went live, Bing Webmaster Tools showed every page as "Discovered but not crawled." The fix was to submit the sitemap, request the key pages by hand, and push the URLs through IndexNow. Google, by contrast, had all 32 pages indexed inside a week. Two engines, same site, completely different outcomes. Check both consoles, not just one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schema: state the facts instead of hoping they're inferred
&lt;/h2&gt;

&lt;p&gt;Structured data is you telling the machine outright: this is a person, this is where he works, these are his other profiles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Person"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Muhammad Kamran"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Software Developer — AI/ML &amp;amp; Full Stack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://kamrandev.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sameAs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.linkedin.com/in/kamran-professional/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/thekamrandev"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without that, the search engine has to guess from prose. With it, there's nothing to guess. That matters more now than it did two years ago, because AI answer engines lean on explicit, machine-readable facts when they decide who to cite.&lt;/p&gt;

&lt;p&gt;A caveat I'd rather say than have you find out: Google stopped showing FAQ rich results in May 2026. So add FAQ markup because it makes the answers easy to extract, not because you'll get dropdowns in the results. And validate everything with the Rich Results Test before launch, because schema that parses as JSON can still be wrong. Ask my About page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Internal links are a budget. Spend it on purpose.
&lt;/h2&gt;

&lt;p&gt;Every internal link does two jobs. It helps crawlers find the page, and it tells them how much you think the page matters. A page nothing links to is an orphan, and orphans don't rank.&lt;/p&gt;

&lt;p&gt;Use anchor text that says what's on the other end. "WooCommerce development", not "click here". Route links from your strongest pages toward the ones you want to rank. And keep the menu small. A navigation with forty links spends your budget on forty things at once.&lt;/p&gt;

&lt;p&gt;I draw the linking plan next to the sitemap, before writing starts. Sprinkling links in afterwards is how you end up with an orphaned case study you forgot existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed is decided at build time
&lt;/h2&gt;

&lt;p&gt;Core Web Vitals are three numbers Google measures from real users:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;What it asks&lt;/th&gt;
&lt;th&gt;Good&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LCP&lt;/td&gt;
&lt;td&gt;How fast does the main content show up?&lt;/td&gt;
&lt;td&gt;2.5 s or less&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INP&lt;/td&gt;
&lt;td&gt;How fast does the page react to a tap?&lt;/td&gt;
&lt;td&gt;200 ms or less&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td&gt;Does the page hold still while loading?&lt;/td&gt;
&lt;td&gt;0.1 or less&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Loads fast, reacts fast, stays put.&lt;/p&gt;

&lt;p&gt;The ranking effect is real but small. The behavioural effect is not small. People leave slow pages before the content renders. And you can't fix that later with a caching plugin, because the weight is in the foundation: the framework, the theme, the plugin count, the image sizes, the hosting.&lt;/p&gt;

&lt;p&gt;The best number I have on this is OnlineToolPot, a tool platform with 130-plus generated pages that I worked on at Cross Media Sol. Mobile PageSpeed went from about 55 to about 90. Nothing clever. We removed a duplicate icon library, loaded heavy components dynamically, and fixed how fonts were loaded. All build decisions.&lt;/p&gt;

&lt;p&gt;Google indexes the mobile version of your site. The phone is the version being judged, so test on a real one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "we'll do SEO later" costs more
&lt;/h2&gt;

&lt;p&gt;Everything above is cheapest on day one. Architecture decided in planning costs nothing extra. Schema added during the build takes an afternoon. Retrofitting either onto a finished site with tangled markup can take longer than the original build did.&lt;/p&gt;

&lt;p&gt;If you're hiring someone, including me, ask these and expect specific answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How will URLs be organised, and who maps redirects if anything changes?&lt;/li&gt;
&lt;li&gt;Is heading structure set deliberately, or whatever the page builder produces?&lt;/li&gt;
&lt;li&gt;What schema ships on launch day, and how is it validated?&lt;/li&gt;
&lt;li&gt;What are the Core Web Vitals targets, and what hosting is it going on?&lt;/li&gt;
&lt;li&gt;Will Search Console and Bing Webmaster Tools be set up and indexation confirmed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer to any of those is a shrug, that's the answer.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Muhammad Kamran, a software developer in Lahore working across AI/ML and the full stack. This post first appeared on &lt;a href="https://kamrandev.com/insights/what-makes-a-website-seo-friendly/" rel="noopener noreferrer"&gt;kamrandev.com&lt;/a&gt;, and the &lt;a href="https://kamrandev.com/work/" rel="noopener noreferrer"&gt;case studies&lt;/a&gt; show how this plays out on real projects, including the ones where I got it wrong first.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
