<?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 Azmi</title>
    <description>The latest articles on DEV Community by Muhammad Azmi (@muhammadazmi).</description>
    <link>https://dev.to/muhammadazmi</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%2F4038634%2F64e0617f-f3a5-49bf-9736-3821639fb851.jpg</url>
      <title>DEV Community: Muhammad Azmi</title>
      <link>https://dev.to/muhammadazmi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muhammadazmi"/>
    <language>en</language>
    <item>
      <title>I'm Learning SEO by Doing It on My Own Portfolio — Roast My Setup</title>
      <dc:creator>Muhammad Azmi</dc:creator>
      <pubDate>Mon, 20 Jul 2026 18:08:21 +0000</pubDate>
      <link>https://dev.to/muhammadazmi/im-learning-seo-by-doing-it-on-my-own-portfolio-roast-my-setup-4n98</link>
      <guid>https://dev.to/muhammadazmi/im-learning-seo-by-doing-it-on-my-own-portfolio-roast-my-setup-4n98</guid>
      <description>&lt;p&gt;I've spent the last few weeks going down the SEO rabbit hole — not reading about it, actually implementing it on my own site and watching what happens in Search Console. Figured I'd write up what I did and where I'm stuck, and ask people who actually know this stuff to tell me what I got wrong.&lt;/p&gt;

&lt;p&gt;Site: &lt;a href="https://muhammadazmi.web.id" rel="noopener noreferrer"&gt;https://muhammadazmi.web.id&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I've done so far&lt;/p&gt;

&lt;p&gt;Per-locale metadata, not just translation. Site has en and id versions. Each route generates its own canonical + full hreflang map (including x-default), rather than slapping lang="id" on a copy-pasted English page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;alternates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;canonical&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEntries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;locales&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;localePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;routeKey&lt;/span&gt;&lt;span class="p"&gt;)])),&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-default&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;localePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;routeKey&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Structured data. Person and WebSite JSON-LD on every page, hoping it helps Google understand this is a person's portfolio, not a random landing page, and maybe someday earns a knowledge panel.&lt;/p&gt;

&lt;p&gt;A directive I'm not sure matters yet: I added Content-Signal: search=yes, ai-input=yes, ai-train=yes to robots.txt — the new-ish contentsignals.org proposal for telling crawlers what you're okay with beyond just "can you index this." Genuinely don't know if any crawler respects it yet. Added it mostly out of curiosity because cloudflare ai ready site is recommended it.&lt;/p&gt;

&lt;p&gt;Sitemap with per-URL alternate languages, dynamic via generateSitemap, one entry per route × locale.&lt;/p&gt;

&lt;p&gt;What's NOT working&lt;/p&gt;

&lt;p&gt;I'm ranking around position 12+ for my own name ("muhammad azmi") — which should be the easiest query to win. Turns out it's a fairly common Indonesian name, so I'm competing against other real people's LinkedIn/GitHub profiles, not just weak content. Makes me think the technical stuff I did above is necessary-but-not-sufficient — the actual gap is backlinks and domain authority, not markup.&lt;/p&gt;

&lt;p&gt;What I want to ask you all&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is per-locale hreflang actually worth the complexity for a portfolio this small, or is that over-engineering for a 4-page site?&lt;/li&gt;
&lt;li&gt;Anyone using the Content-Signal directive for real — is it worth the line, or premature?&lt;/li&gt;
&lt;li&gt;For a personal name query specifically — beyond backlinks, is there anything structurally different you'd do vs. a normal keyword-targeted page?&lt;/li&gt;
&lt;li&gt;If you have 2 minutes, an honest first-impression of the site (either language) would help more than anything I could read in a guide.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Not trying to fish for compliments — I'd rather hear "this part is wrong" than "looks good."&lt;/p&gt;

&lt;p&gt;I'm new here, don't be kind. Cheers :)&lt;/p&gt;

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