<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Master Web Development Blog</title>
        <link>https://hendradev.vercel.app/blog</link>
        <description>Master Web Development Blog</description>
        <lastBuildDate>Mon, 29 Jun 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Optimizing Claude for Software Engineering: Memory & Skills]]></title>
            <link>https://hendradev.vercel.app/blog/optimizing-claude-for-engineers</link>
            <guid>https://hendradev.vercel.app/blog/optimizing-claude-for-engineers</guid>
            <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A practical, follow-along guide for an engineer who already uses **Claude Cowork** with repos in project coworks, but has never touched Memory or Skills.]]></description>
            <content:encoded><![CDATA[<p>A practical, follow-along guide for an engineer who already uses <strong>Claude Cowork</strong> with repos in project coworks, but has never touched <strong>Memory</strong> or <strong>Skills</strong>. The goal: stop re-explaining yourself, and turn repeated workflows into one-shot commands.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-mental-model--three-surfaces-one-toolbox">1. Mental model — three surfaces, one toolbox<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#1-mental-model--three-surfaces-one-toolbox" class="hash-link" aria-label="Direct link to 1. Mental model — three surfaces, one toolbox" title="Direct link to 1. Mental model — three surfaces, one toolbox" translate="no">​</a></h2>
<p>You have three ways to reach Claude. Pick based on the task, not habit.</p>
<table><thead><tr><th>Surface</th><th>Best for</th><th>Memory it uses</th><th>Skills it uses</th></tr></thead><tbody><tr><td><strong>Claude Chat (claude.ai / app)</strong></td><td>Quick questions, design discussions, throwaway scripts, drafting</td><td>Chat Memory + Project Memory</td><td>Pre-built + custom (uploaded as zip)</td></tr><tr><td><strong>Claude Cowork</strong> (desktop agentic app)</td><td>Multi-step work on a folder/repo, "do this across my codebase"</td><td>Same as Chat (claude.ai memory + per-project memory)</td><td>Pre-built + custom</td></tr><tr><td><strong>Claude Code</strong> (terminal / IDE agent)</td><td>Deep, iterative coding inside a repo; the highest-leverage surface for engineers</td><td><code>CLAUDE.md</code> hierarchy + auto memory (separate system)</td><td>Custom skills only (filesystem-based)</td></tr></tbody></table>
<p><strong>Key insight:</strong> Claude Code's memory is a <em>different system</em> from claude.ai/Cowork memory. They do not share a profile. You set them up separately. <strong>Skills</strong>, by contrast, are portable — write a skill once and it can work across all three surfaces.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-memory--stop-repeating-yourself">2. Memory — stop repeating yourself<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#2-memory--stop-repeating-yourself" class="hash-link" aria-label="Direct link to 2. Memory — stop repeating yourself" title="Direct link to 2. Memory — stop repeating yourself" translate="no">​</a></h2>
<p>Memory is what carries context across sessions so you don't re-introduce your stack, conventions, and preferences every time.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2a-claude-chat--cowork-memory">2A. Claude Chat / Cowork memory<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#2a-claude-chat--cowork-memory" class="hash-link" aria-label="Direct link to 2A. Claude Chat / Cowork memory" title="Direct link to 2A. Claude Chat / Cowork memory" translate="no">​</a></h3>
<p>These share the same memory system on claude.ai.</p>
<p><strong>Turn it on (2 minutes):</strong></p>
<ol>
<li class="">Go to <strong>Settings → Capabilities</strong>.</li>
<li class="">Enable <strong>"Search and reference chats"</strong> — lets Claude look back through past conversations.</li>
<li class="">Enable <strong>"Generate memory from chat history"</strong> — lets Claude extract and store what matters (your role, stack, recurring projects, preferences).</li>
<li class=""><em>(Optional)</em> <strong>Import memory</strong> from ChatGPT / Gemini / Grok if you've built context elsewhere — Settings → Capabilities → Memory Import. Processing takes ~24 hours.</li>
</ol>
<p><strong>How it behaves:</strong></p>
<ul>
<li class="">A synthesis of key insights is rebuilt roughly every 24 hours and injected into every new <em>standalone</em> chat.</li>
<li class=""><strong>Project memory is separate.</strong> Each Cowork/Chat project has its own isolated memory space and project summary. Context from your "Payments Service" project won't bleed into your "Mobile App" project. This is exactly what you want as an engineer juggling repos.</li>
<li class="">It deliberately stores work context (role, tools, conventions, project details) and avoids secrets like passwords or account numbers.</li>
</ul>
<p><strong>Managing it:</strong></p>
<ul>
<li class="">Ask directly: <em>"What do you remember about me?"</em> to audit.</li>
<li class="">Say <em>"Remember that we migrated from REST to gRPC"</em> or <em>"Forget the old deploy process"</em> mid-conversation.</li>
<li class=""><strong>Pause</strong> (keeps memories, stops creating new ones) vs <strong>Reset</strong> (permanent wipe, including project memories) in Settings.</li>
<li class="">Use <strong>Incognito chat</strong> (ghost icon) for one-off conversations you don't want saved.</li>
<li class="">Do a <strong>monthly memory check-up</strong>: scan Settings, delete anything stale.</li>
</ul>
<p><strong>Project instructions vs. memory:</strong> In each Cowork project, also fill in the project's <strong>custom instructions</strong> field. Memory is <em>learned</em>; instructions are <em>declared</em>. Put hard rules there (e.g., "This repo uses pnpm, Vitest, and conventional commits. Never edit files in <code>/generated</code>.").</p>
<blockquote>
<p>⚠️ Confidentiality note: don't store client-identifiable or regulated data (HIPAA, privileged, etc.) in memory. Use Incognito/temporary chats for those.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2b-claude-code-memory--claudemd-highest-roi-for-engineers">2B. Claude Code memory — <code>CLAUDE.md</code> (highest ROI for engineers)<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#2b-claude-code-memory--claudemd-highest-roi-for-engineers" class="hash-link" aria-label="Direct link to 2b-claude-code-memory--claudemd-highest-roi-for-engineers" title="Direct link to 2b-claude-code-memory--claudemd-highest-roi-for-engineers" translate="no">​</a></h3>
<p>If you adopt one new habit from this guide, make it this. <code>CLAUDE.md</code> becomes part of Claude's system prompt and loads automatically at the start of every Code session. One hour writing a good one saves countless hours of re-explanation.</p>
<p><strong>The hierarchy (all levels concatenate; more specific files effectively win on conflicts):</strong></p>
<table><thead><tr><th>Scope</th><th>Location</th><th>Use for</th><th>Commit to git?</th></tr></thead><tbody><tr><td>Managed policy</td><td><code>/etc/claude-code/CLAUDE.md</code> (org-deployed)</td><td>Company-wide security/compliance</td><td>N/A (IT-managed)</td></tr><tr><td><strong>User</strong></td><td><code>~/.claude/CLAUDE.md</code></td><td>Your personal prefs across <em>all</em> projects</td><td>No (personal)</td></tr><tr><td><strong>Project</strong></td><td><code>./CLAUDE.md</code> or <code>./.claude/CLAUDE.md</code></td><td>Team conventions, architecture, commands</td><td><strong>Yes</strong></td></tr><tr><td>Local</td><td><code>./CLAUDE.local.md</code> (deprecated — prefer imports)</td><td>Personal per-project notes</td><td>No (gitignore)</td></tr></tbody></table>
<p><strong>How loading works (important nuances):</strong></p>
<ul>
<li class="">Claude walks <em>up</em> the directory tree from where you launch, loading every <code>CLAUDE.md</code> it finds.</li>
<li class=""><strong>Nested/subdirectory</strong> <code>CLAUDE.md</code> files (e.g., <code>packages/auth/CLAUDE.md</code>) are <strong>not</strong> loaded at launch. They load on demand only when Claude reads a file in that subtree. This keeps startup lean — great for monorepos.</li>
<li class="">The <strong>root project</strong> <code>CLAUDE.md</code> survives <code>/compact</code> (Claude re-reads it from disk). Nested ones reload only when next touched. If an instruction "disappeared," it was probably given only in chat, never written to a file.</li>
</ul>
<p><strong>What to put in it (keep it tight — aim for ~80–120 lines, hard ceiling ~200):</strong>
Models reliably follow ~150–200 instructions; Code's own system prompt eats ~50. Every wasted line competes with the rules that matter. Include:</p>
<ul>
<li class="">Build / test / lint / migration commands (exact, runnable)</li>
<li class="">Tech stack and key conventions ("2-space indent", "early returns over nesting &gt;3 deep")</li>
<li class="">Project layout ("API handlers live in <code>src/api/handlers/</code>")</li>
<li class="">"Always do X" rules and a <strong>Human Approval Required</strong> checklist for risky actions</li>
<li class="">Mark critical rules with <code>IMPORTANT:</code> or <code>YOU MUST</code></li>
</ul>
<p><strong>What to leave out:</strong> personality fluff ("be a senior engineer", "think step by step" — it already does), anything Claude learns in one session, and any secrets/tokens.</p>
<p><strong>Authoring shortcuts:</strong></p>
<ul>
<li class="">Type <code>#</code> at the start of an input → Claude prompts you to save that line to a memory file.</li>
<li class="">Run <code>/memory</code> → opens memory files in your editor and shows exactly what's loaded (your #1 debugging tool when Claude "ignores" a rule — often the rule lives in a nested file that hasn't loaded yet).</li>
<li class="">Use <code>@path/to/file.md</code> <strong>imports</strong> to modularize (e.g., <code>@docs/coding-standards.md</code>). Note: imports <em>organize</em> but don't save context — imported files still load at launch. Don't import your whole docs site.</li>
</ul>
<p><strong>Path-scoped rules (<code>.claude/rules/</code>):</strong> For instructions that should only apply to certain files, put them in <code>.claude/rules/</code> with path globs (e.g., <code>src/**/*.{ts,tsx}</code>). They load <em>only</em> when Claude works on matching files — keeps API rules out of context during frontend work.</p>
<p><strong>Auto memory:</strong> Claude Code also writes its own learnings (from your corrections and preferences) into a <code>MEMORY.md</code>, loaded at session start. Treat the split as: <strong><code>CLAUDE.md</code> = your requirements</strong>, <strong>auto memory = what Claude observed about you</strong>. Browse/edit it via <code>/memory</code>.</p>
<p><strong>Pro tip:</strong> Commit <code>CLAUDE.md</code> to git. <code>git checkout CLAUDE.md</code> lets you experiment with instructions and roll back.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-skills--turn-repeated-workflows-into-reusable-expertise">3. Skills — turn repeated workflows into reusable expertise<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#3-skills--turn-repeated-workflows-into-reusable-expertise" class="hash-link" aria-label="Direct link to 3. Skills — turn repeated workflows into reusable expertise" title="Direct link to 3. Skills — turn repeated workflows into reusable expertise" translate="no">​</a></h2>
<p>A <strong>Skill</strong> is a folder containing a <code>SKILL.md</code> (instructions + metadata) and optional scripts/templates. Claude loads only the name+description at startup, then reads the full skill <em>only when relevant</em> (progressive disclosure). Unlike a prompt (one-off) or <code>CLAUDE.md</code> (always-on background), a skill is <strong>on-demand expertise</strong> Claude reaches for when the task matches.</p>
<p>Think: <code>CLAUDE.md</code> is for "nouns" (what/where things are, always loaded). Skills are for "verbs" (how to perform a specific procedure, loaded when triggered).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3a-pre-built-skills-use-immediately-zero-setup">3A. Pre-built skills (use immediately, zero setup)<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#3a-pre-built-skills-use-immediately-zero-setup" class="hash-link" aria-label="Direct link to 3A. Pre-built skills (use immediately, zero setup)" title="Direct link to 3A. Pre-built skills (use immediately, zero setup)" translate="no">​</a></h3>
<p>Anthropic ships skills for <strong>PowerPoint, Excel, Word, and PDF</strong>. They already work behind the scenes when you ask Claude to create those documents — no action needed. (Useful when you need to generate a report, design doc, or spreadsheet from your data.)</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3b-where-custom-skills-live-per-surface">3B. Where custom skills live, per surface<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#3b-where-custom-skills-live-per-surface" class="hash-link" aria-label="Direct link to 3B. Where custom skills live, per surface" title="Direct link to 3B. Where custom skills live, per surface" translate="no">​</a></h3>
<table><thead><tr><th>Surface</th><th>How to add a custom skill</th></tr></thead><tbody><tr><td><strong>Claude Code</strong></td><td>Drop a folder in <code>.claude/skills/&lt;name&gt;/</code> (project) or <code>~/.claude/skills/&lt;name&gt;/</code> (personal, all projects). Discovered automatically — no upload.</td></tr><tr><td><strong>claude.ai / Cowork</strong></td><td><strong>Settings → Features</strong>, upload the skill as a <strong>zip</strong>. Requires Pro/Max/Team/Enterprise with code execution enabled. (Custom skills here are per-user, not org-shared.)</td></tr><tr><td><strong>API</strong></td><td>Upload via the <code>/v1/skills</code> endpoints; reference by <code>skill_id</code>. (For when you build apps on Claude.)</td></tr></tbody></table>
<p>A skill authored once works across surfaces with minimal change, as long as the environment provides what it needs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3c-anatomy-of-a-skillmd">3C. Anatomy of a <code>SKILL.md</code><a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#3c-anatomy-of-a-skillmd" class="hash-link" aria-label="Direct link to 3c-anatomy-of-a-skillmd" title="Direct link to 3c-anatomy-of-a-skillmd" translate="no">​</a></h3>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">name</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> pr</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">-</span><span class="token front-matter-block front-matter yaml language-yaml">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">-</span><span class="token front-matter-block front-matter yaml language-yaml">writer</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> </span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">&gt;</span><span class="token front-matter-block front-matter yaml language-yaml scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml scalar string" style="color:#e3116c">  Generates a structured pull-request description from a git diff.</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml scalar string" style="color:#e3116c">  Use this when the user asks to "write a PR description", "summarize</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml scalar string" style="color:#e3116c">  my changes for a PR", or prepares to open a pull request.</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> PR Description Writer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Instructions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Run </span><span class="token code-snippet code keyword" style="color:#00009f">`git diff main...HEAD`</span><span class="token plain"> to read the actual changes.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Group changes by area (feature, fix, refactor, tests, docs).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Produce sections: </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Summary</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">, </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Changes</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">, </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Testing</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">, </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Risk/rollback</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">4.</span><span class="token plain"> Flag any change touching auth, billing, or migrations under </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">⚠️ Needs review</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">5.</span><span class="token plain"> Keep it under 300 words. Use imperative mood.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Examples</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Input: a diff adding rate limiting → output highlights the new middleware,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  config flags, and a testing checklist.</span><br></span></code></pre></div></div>
<p><strong>Rules that matter:</strong></p>
<ul>
<li class=""><code>name</code>: lowercase, numbers, hyphens only; max 64 chars; can't contain "anthropic"/"claude".</li>
<li class=""><code>description</code>: this is a <strong>trigger</strong>, not a summary. Write <em>"Use this when the user wants to X"</em>, including the phrases you'd actually type. This single field decides whether Claude picks the skill. Max 1024 chars.</li>
<li class="">Keep <code>SKILL.md</code> concise. Move long reference material into a <code>references/</code> folder and link to it (progressive disclosure keeps your context window clean).</li>
<li class="">Bundling <strong>scripts</strong> is more powerful than instructions alone — offload deterministic work (exact API calls, formatting, parsing) to code so Claude does the planning and the script does the precise part.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3d-the-fastest-way-to-build-one-let-claude-build-it">3D. The fastest way to build one: let Claude build it<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#3d-the-fastest-way-to-build-one-let-claude-build-it" class="hash-link" aria-label="Direct link to 3D. The fastest way to build one: let Claude build it" title="Direct link to 3D. The fastest way to build one: let Claude build it" translate="no">​</a></h3>
<p>You don't need to memorize the format. Two options:</p>
<ol>
<li class=""><strong>In Claude Code:</strong> there's a <code>skill-creator</code> skill — ask Claude to scaffold a new skill and it generates the <code>SKILL.md</code> and structure. Live changes to <code>SKILL.md</code> take effect within the session (no restart) as long as the skills directory existed at launch.</li>
<li class=""><strong>The Claude-A / Claude-B loop</strong> (the recommended refinement method):<!-- -->
<ul>
<li class="">Work through a task <em>without</em> a skill, noticing the context you keep providing.</li>
<li class="">Ask one Claude ("A") to capture that into a <code>SKILL.md</code>.</li>
<li class="">Give the skill to a fresh Claude ("B") on real tasks; watch where it struggles.</li>
<li class="">Bring the observation back to A ("B forgot to exclude test accounts even though the skill mentions it") and refine — e.g., promote "always filter" to "<strong>MUST</strong> filter."</li>
<li class="">Repeat. You're tuning against real behavior, not assumptions.</li>
</ul>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3e-distribution--control-for-teams">3E. Distribution &amp; control (for teams)<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#3e-distribution--control-for-teams" class="hash-link" aria-label="Direct link to 3E. Distribution &amp; control (for teams)" title="Direct link to 3E. Distribution &amp; control (for teams)" translate="no">​</a></h3>
<ul>
<li class=""><strong>Project skills:</strong> commit <code>.claude/skills/</code> to version control so the whole team gets them.</li>
<li class=""><strong>Personal skills:</strong> keep in <code>~/.claude/skills/</code>.</li>
<li class="">Control which skills Claude may auto-invoke via <code>/permissions</code> (e.g., <code>Skill(commit)</code>, deny <code>Skill(deploy *)</code>).</li>
<li class="">As an org scales, an internal plugin marketplace beats checking every skill into every repo (each loaded skill adds a little context cost).</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-your-concrete-setup-plan-do-these-in-order">4. Your concrete setup plan (do these in order)<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#4-your-concrete-setup-plan-do-these-in-order" class="hash-link" aria-label="Direct link to 4. Your concrete setup plan (do these in order)" title="Direct link to 4. Your concrete setup plan (do these in order)" translate="no">​</a></h2>
<p><strong>Day 1 — Memory foundation (~20 min)</strong></p>
<ol>
<li class="">claude.ai → Settings → Capabilities → enable both memory toggles. Optionally import from your other AI tools.</li>
<li class="">In each Cowork project, fill the <strong>project instructions</strong> with hard rules (package manager, test runner, commit style, no-touch directories).</li>
<li class="">Ask Claude <em>"What do you remember about me?"</em> to confirm it's working.</li>
</ol>
<p><strong>Day 1–2 — <code>CLAUDE.md</code> for your main repo (~1 hr)</strong> 4. In your repo root, create <code>CLAUDE.md</code>. Start small: stack, build/test/lint commands, 5–10 conventions, project layout, a "Human Approval Required" list. Keep under ~100 lines. 5. Create <code>~/.claude/CLAUDE.md</code> for personal cross-project prefs (communication style, "show diffs not whole files", "run tests after changes"). 6. Commit the project <code>CLAUDE.md</code>. Run <code>/memory</code> to verify it loaded. 7. For a monorepo, add lightweight nested <code>CLAUDE.md</code> files per package (they load on demand).</p>
<p><strong>Week 1 — First skills</strong> 8. Use the pre-built docx/xlsx/pdf skills once (e.g., "turn this benchmark CSV into an Excel report") to see them work. 9. Build your first custom skill for a workflow you repeat. Use <code>skill-creator</code> or the A/B loop. 10. Commit it to <code>.claude/skills/</code> so your team benefits. Iterate when it triggers wrongly (tune the <code>description</code>).</p>
<p><strong>Ongoing</strong> 11. When you correct Claude on something durable, write it into the right file (<code>#</code> shortcut, or update <code>CLAUDE.md</code>/project instructions). If it only matters for one task, skip it. 12. Monthly: audit memory and <code>CLAUDE.md</code> for staleness — outdated rules are worse than none.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-skills-worth-building-as-an-engineer">5. Skills worth building as an engineer<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#5-skills-worth-building-as-an-engineer" class="hash-link" aria-label="Direct link to 5. Skills worth building as an engineer" title="Direct link to 5. Skills worth building as an engineer" translate="no">​</a></h2>
<p>Start with whatever you explain to Claude most often. Common high-value ones:</p>
<ul>
<li class=""><strong><code>pr-description-writer</code></strong> — diff → structured PR body (example above).</li>
<li class=""><strong><code>commit-message</code></strong> — staged changes → conventional-commit message.</li>
<li class=""><strong><code>test-generator</code></strong> — generate tests matching your framework, fixtures, and naming conventions.</li>
<li class=""><strong><code>code-review</code></strong> — apply <em>your team's</em> review checklist (security, error handling, logging) to a diff.</li>
<li class=""><strong><code>run-skill-generator</code></strong> (exists in Code) — captures how to build/launch your app from a clean env and records it so <code>/run</code> and <code>/verify</code> follow the recipe instead of re-discovering it.</li>
<li class=""><strong><code>migration-scaffold</code></strong> — generate DB migration boilerplate with your project's patterns.</li>
<li class=""><strong><code>new-service</code></strong> — scaffold a new handler/service with the natural-language choices baked in ("async or sync?").</li>
</ul>
<p>The best skills start tiny — a few lines plus one "gotcha" — and grow as Claude hits new edge cases. Capture the first failure, add one script, share it, iterate.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-cheat-sheet">6. Cheat sheet<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#6-cheat-sheet" class="hash-link" aria-label="Direct link to 6. Cheat sheet" title="Direct link to 6. Cheat sheet" translate="no">​</a></h2>
<table><thead><tr><th>I want to…</th><th>Do this</th></tr></thead><tbody><tr><td>Stop re-explaining my stack in Chat/Cowork</td><td>Enable both memory toggles + fill project instructions</td></tr><tr><td>Give Claude Code persistent project context</td><td>Write <code>CLAUDE.md</code> at repo root, commit it</td></tr><tr><td>Set personal prefs across all repos</td><td><code>~/.claude/CLAUDE.md</code></td></tr><tr><td>Apply rules only to certain files</td><td><code>.claude/rules/</code> with path globs</td></tr><tr><td>See what Claude has loaded / fix ignored rules</td><td>Run <code>/memory</code></td></tr><tr><td>Save a memory mid-session (Code)</td><td>Start the line with <code>#</code></td></tr><tr><td>Reuse a multi-step workflow</td><td>Build a skill (<code>skill-creator</code> or A/B loop)</td></tr><tr><td>Generate Office/PDF docs</td><td>Just ask — pre-built skills handle it</td></tr><tr><td>Share a workflow with my team</td><td>Commit <code>.claude/skills/</code> to git</td></tr><tr><td>One-off chat with no memory</td><td>Incognito (ghost icon)</td></tr></tbody></table>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sources-to-bookmark">Sources to bookmark<a href="https://hendradev.vercel.app/blog/optimizing-claude-for-engineers#sources-to-bookmark" class="hash-link" aria-label="Direct link to Sources to bookmark" title="Direct link to Sources to bookmark" translate="no">​</a></h3>
<ul>
<li class="">Skills overview: <code>https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview</code></li>
<li class="">Skills in Claude Code: <code>https://code.claude.com/docs/en/skills</code></li>
<li class="">Claude Code memory (<code>CLAUDE.md</code>): <code>https://code.claude.com/docs/en/memory</code></li>
<li class="">Chat search &amp; memory: <code>https://support.claude.com/en/articles/11817273</code></li>
<li class="">Skills authoring best practices: <code>https://www.claudeskills.org/docs/agent-skills/best-practices</code></li>
</ul>
<p><em>Feature availability and UI evolve quickly — if a menu path differs, check the linked docs for the current version.</em></p>]]></content:encoded>
            <category>claude</category>
            <category>claude-chat</category>
            <category>claude-cowork</category>
            <category>claude-code</category>
        </item>
        <item>
            <title><![CDATA[Why I Swapped "Building from Scratch" for Docusaurus]]></title>
            <link>https://hendradev.vercel.app/blog/why-use-docusaurus</link>
            <guid>https://hendradev.vercel.app/blog/why-use-docusaurus</guid>
            <pubDate>Mon, 29 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Docusaurus Banner]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Docusaurus Banner" src="https://hendradev.vercel.app/assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg" width="1500" height="500" class="img_ev3q"></p>
<p>In the developer community, we often have a "Not Invented Here" syndrome. We feel that to truly own our personal brand, we need to build our websites from the ground up—hand-coding every div, managing our own routing, and sweating over the perfect dark mode implementation.</p>
<p>But lately, I’ve shifted my philosophy. For my blog and documentation, I’ve moved to Docusaurus. Here is why I believe it’s the superior choice over a "from scratch" React or Next.js build.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-speed-to-production-easy-to-use--deploy">1. Speed to Production (Easy to Use &amp; Deploy)<a href="https://hendradev.vercel.app/blog/why-use-docusaurus#1-speed-to-production-easy-to-use--deploy" class="hash-link" aria-label="Direct link to 1. Speed to Production (Easy to Use &amp; Deploy)" title="Direct link to 1. Speed to Production (Easy to Use &amp; Deploy)" translate="no">​</a></h2>
<p>Building from scratch means you are the architect, the plumber, and the decorator. You have to handle:</p>
<ul>
<li class="">Route management.</li>
<li class="">Theme switching (Dark/Light mode).</li>
<li class="">Mobile responsiveness.</li>
<li class="">Asset optimization.</li>
</ul>
<p>With Docusaurus, you get a "Fast Track" to deployment. It’s a specialized static site generator (SSG) that comes with these features out of the box. You can go from <code>npx create-docusaurus@latest</code> to a live site on Vercel, Netlify, or GitHub Pages in under 10 minutes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-the-power-of-mdx-markdown-with-superpowers">2. The Power of MDX: Markdown with "Superpowers"<a href="https://hendradev.vercel.app/blog/why-use-docusaurus#2-the-power-of-mdx-markdown-with-superpowers" class="hash-link" aria-label="Direct link to 2. The Power of MDX: Markdown with &quot;Superpowers&quot;" title="Direct link to 2. The Power of MDX: Markdown with &quot;Superpowers&quot;" translate="no">​</a></h2>
<p>The biggest selling point for me is the content format. Most developers love Markdown for its simplicity, but it can be limiting when you want to show off an interactive demo.</p>
<p>Docusaurus uses MDX (Markdown + JSX). This means I can write my technical articles in clean Markdown, but when I need a live code editor, an interactive chart, or a custom React component, I can just drop it right into the text.</p>
<div class="language-mdx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-mdx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># My Awesome Component</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Check out this interactive button I built:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">import MyCustomButton from "@site/src/components/MyCustomButton";</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;MyCustomButton onClick={() =&gt; alert("Hello from MDX!")} /&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-docs-as-code-best-practices">3. "Docs-as-Code" Best Practices<a href="https://hendradev.vercel.app/blog/why-use-docusaurus#3-docs-as-code-best-practices" class="hash-link" aria-label="Direct link to 3. &quot;Docs-as-Code&quot; Best Practices" title="Direct link to 3. &quot;Docs-as-Code&quot; Best Practices" translate="no">​</a></h2>
<p>Docusaurus isn't just a blog; it’s a documentation engine. It follows the industry’s best practices for content structure:</p>
<p>Versioning: Perfect if you’re documenting an Open Source project or a library.</p>
<p>Sidebar &amp; Breadcrumbs: Automatic navigation that makes long-form technical content readable.</p>
<p>SEO by Default: It generates static HTML for every route, ensuring your blog posts actually show up on Google.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-a-rich-plugin-ecosystem-algolia--more">4. A Rich Plugin Ecosystem (Algolia &amp; More)<a href="https://hendradev.vercel.app/blog/why-use-docusaurus#4-a-rich-plugin-ecosystem-algolia--more" class="hash-link" aria-label="Direct link to 4. A Rich Plugin Ecosystem (Algolia &amp; More)" title="Direct link to 4. A Rich Plugin Ecosystem (Algolia &amp; More)" translate="no">​</a></h2>
<p>When you build from scratch, adding a search bar is a project in itself. You have to index your content, manage a search engine, and build the UI.</p>
<p>In Docusaurus, adding world-class search is as simple as a configuration change. The Algolia DocSearch plugin is the gold standard for technical sites. Once configured, you have a lightning-fast, keyboard-accessible search bar that "just works."</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thoughts">Final Thoughts<a href="https://hendradev.vercel.app/blog/why-use-docusaurus#final-thoughts" class="hash-link" aria-label="Direct link to Final Thoughts" title="Direct link to Final Thoughts" translate="no">​</a></h2>
<p>Building from scratch is great for learning, but Docusaurus is for shipping. As a developer, I want my time spent on writing high-quality content and building cool React components, not debugging the "Active" state of a sidebar link for the 10th time.</p>
<p>If you want a site that is professional, accessible, and incredibly easy to maintain, Docusaurus is the way to go.</p>]]></content:encoded>
            <category>Docusaurus</category>
        </item>
        <item>
            <title><![CDATA[Stop Using Divs for Everything: A Guide to Semantic HTML]]></title>
            <link>https://hendradev.vercel.app/blog/semantic-html-best-practices</link>
            <guid>https://hendradev.vercel.app/blog/semantic-html-best-practices</guid>
            <pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn why semantic HTML matters and how to write cleaner, more accessible code by choosing the right elements instead of defaulting to divs.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Semantic HTML Structure Illustration" src="https://hendradev.vercel.app/assets/images/semantic-html-banner-24531cb0b92b8c914b3c43d6eba4372b.png" width="1446" height="956" class="img_ev3q"></p>
<p>We've all been there. You're building a web page, and you reach for the trusty <code>&lt;div&gt;</code> tag. Again. And again. Before you know it, your HTML looks like a sea of meaningless boxes. While divs aren't inherently bad, overusing them is one of the most common mistakes in modern web development.</p>
<p>Semantic HTML is about choosing the right element for the job—elements that convey meaning about their content, not just how they look. Let's explore why this matters and how to do it right.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-semantic-html-matters">Why Semantic HTML Matters<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#why-semantic-html-matters" class="hash-link" aria-label="Direct link to Why Semantic HTML Matters" title="Direct link to Why Semantic HTML Matters" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-accessibility">1. <strong>Accessibility</strong><a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#1-accessibility" class="hash-link" aria-label="Direct link to 1-accessibility" title="Direct link to 1-accessibility" translate="no">​</a></h3>
<p>Screen readers and assistive technologies rely on semantic elements to help users navigate your site. When you use <code>&lt;nav&gt;</code> instead of <code>&lt;div class="navigation"&gt;</code>, screen readers can identify it as a navigation landmark, allowing users to jump directly to it.</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- ❌ Non-semantic --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">header</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">navigation</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">nav-item</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Home</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">nav-item</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">About</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- ✅ Semantic --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">nav</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">a</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">/</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Home</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">a</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">a</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">/about</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">About</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">a</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">nav</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-seo-benefits">2. <strong>SEO Benefits</strong><a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#2-seo-benefits" class="hash-link" aria-label="Direct link to 2-seo-benefits" title="Direct link to 2-seo-benefits" translate="no">​</a></h3>
<p>Search engines use semantic HTML to better understand your content structure. A <code>&lt;main&gt;</code> element tells crawlers where your primary content lives, while <code>&lt;article&gt;</code> and <code>&lt;section&gt;</code> help organize information hierarchically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-code-readability">3. <strong>Code Readability</strong><a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#3-code-readability" class="hash-link" aria-label="Direct link to 3-code-readability" title="Direct link to 3-code-readability" translate="no">​</a></h3>
<p>Semantic HTML is self-documenting. Compare these two examples:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- ❌ Div soup --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">wrapper</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">content</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">post</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">post-header</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">post-body</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- ✅ Clear semantic structure --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">main</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">main</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>The second version immediately communicates the page structure without requiring you to parse class names.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-better-browser-support">4. <strong>Better Browser Support</strong><a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#4-better-browser-support" class="hash-link" aria-label="Direct link to 4-better-browser-support" title="Direct link to 4-better-browser-support" translate="no">​</a></h3>
<p>Semantic elements come with built-in keyboard navigation and ARIA roles. For instance, <code>&lt;button&gt;</code> is natively focusable and responds to Enter/Space keys, whereas a <code>&lt;div onclick="..."&gt;</code> requires extra work to achieve the same accessibility.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="essential-semantic-elements-and-when-to-use-them">Essential Semantic Elements and When to Use Them<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#essential-semantic-elements-and-when-to-use-them" class="hash-link" aria-label="Direct link to Essential Semantic Elements and When to Use Them" title="Direct link to Essential Semantic Elements and When to Use Them" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="structural-elements">Structural Elements<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#structural-elements" class="hash-link" aria-label="Direct link to Structural Elements" title="Direct link to Structural Elements" translate="no">​</a></h3>
<p><strong><code>&lt;header&gt;</code></strong> - Introductory content or navigational aids. Can be used multiple times (page header, article header, section header).</p>
<p><strong><code>&lt;nav&gt;</code></strong> - Major navigation blocks. Don't use it for every list of links—reserve it for primary navigation.</p>
<p><strong><code>&lt;main&gt;</code></strong> - The dominant content of the page. Use only once per page.</p>
<p><strong><code>&lt;article&gt;</code></strong> - Self-contained, independently distributable content (blog posts, news articles, forum posts).</p>
<p><strong><code>&lt;section&gt;</code></strong> - Thematic grouping of content, typically with a heading. If you can't give it a meaningful heading, it probably shouldn't be a section.</p>
<p><strong><code>&lt;aside&gt;</code></strong> - Tangentially related content (sidebars, pull quotes, related links).</p>
<p><strong><code>&lt;footer&gt;</code></strong> - Footer for its nearest sectioning content or root element.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="content-elements">Content Elements<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#content-elements" class="hash-link" aria-label="Direct link to Content Elements" title="Direct link to Content Elements" translate="no">​</a></h3>
<p><strong><code>&lt;h1&gt;</code> through <code>&lt;h6&gt;</code></strong> - Headings that establish document outline. Don't skip levels for styling—use CSS instead.</p>
<p><strong><code>&lt;p&gt;</code></strong> - Paragraphs of text. Don't use divs for text blocks.</p>
<p><strong><code>&lt;figure&gt;</code> and <code>&lt;figcaption&gt;</code></strong> - Images, diagrams, code snippets with captions.</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">figure</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">img</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">/charts/revenue-2025.png</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">alt</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Q4 2025 Revenue Chart</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">figcaption</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Revenue increased 23% in Q4 2025</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">figcaption</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">figure</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p><strong><code>&lt;time&gt;</code></strong> - Dates and times with machine-readable values.</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">time</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">datetime</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">2026-01-15</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">January 15, 2026</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">time</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-semantic-html-patterns">Common Semantic HTML Patterns<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#common-semantic-html-patterns" class="hash-link" aria-label="Direct link to Common Semantic HTML Patterns" title="Direct link to Common Semantic HTML Patterns" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="blog-post-structure">Blog Post Structure<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#blog-post-structure" class="hash-link" aria-label="Direct link to Blog Post Structure" title="Direct link to Blog Post Structure" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">h1</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Understanding React Server Components</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">h1</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      By </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">span</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">John Doe</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">span</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> on</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">time</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">datetime</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">2026-01-15</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">January 15, 2026</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">time</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">h2</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Introduction</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">h2</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">React Server Components represent a paradigm shift...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">h2</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">How They Work</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">h2</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Server Components render on the server...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">footer</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      Tags: </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">a</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">/tags/react</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">React</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">a</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">a</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">/tags/performance</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Performance</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">a</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">footer</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="navigation-menu">Navigation Menu<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#navigation-menu" class="hash-link" aria-label="Direct link to Navigation Menu" title="Direct link to Navigation Menu" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">nav</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">aria-label</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Main navigation</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ul</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">li</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">a</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">/</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Home</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">a</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">li</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">li</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">a</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">/blog</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Blog</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">a</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">li</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">li</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">a</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">/about</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">About</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">a</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">li</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ul</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">nav</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="form-with-proper-labels">Form with Proper Labels<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#form-with-proper-labels" class="hash-link" aria-label="Direct link to Form with Proper Labels" title="Direct link to Form with Proper Labels" translate="no">​</a></h3>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- ❌ Non-semantic --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">form-group</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">label</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Email</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">input</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">input</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">text</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- ✅ Semantic --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">form</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">label</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">for</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">email</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Email</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">label</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">input</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">email</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">id</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">email</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">email</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">required</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">submit</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Subscribe</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">form</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-use-divs">When to Use Divs<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#when-to-use-divs" class="hash-link" aria-label="Direct link to When to Use Divs" title="Direct link to When to Use Divs" translate="no">​</a></h2>
<p>Divs aren't evil—they're just generic containers. Use them when:</p>
<ul>
<li class="">You need a wrapper purely for styling or layout purposes</li>
<li class="">No semantic element accurately describes the content</li>
<li class="">You're creating a grid or flexbox container</li>
</ul>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- ✅ Appropriate div usage for layout --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">h2</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Our Services</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">h2</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">grid grid-cols-3 gap-4</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="practical-tips-for-implementation">Practical Tips for Implementation<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#practical-tips-for-implementation" class="hash-link" aria-label="Direct link to Practical Tips for Implementation" title="Direct link to Practical Tips for Implementation" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-start-with-structure">1. Start with Structure<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#1-start-with-structure" class="hash-link" aria-label="Direct link to 1. Start with Structure" title="Direct link to 1. Start with Structure" translate="no">​</a></h3>
<p>Before writing any HTML, sketch out your page structure using semantic elements. Think in terms of landmarks: header, navigation, main content, complementary content, and footer.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-use-html5-outlining">2. Use HTML5 Outlining<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#2-use-html5-outlining" class="hash-link" aria-label="Direct link to 2. Use HTML5 Outlining" title="Direct link to 2. Use HTML5 Outlining" translate="no">​</a></h3>
<p>Your headings and sectioning elements create an outline. Tools like the HTML5 Outliner browser extension can help you visualize this structure.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-test-with-screen-readers">3. Test with Screen Readers<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#3-test-with-screen-readers" class="hash-link" aria-label="Direct link to 3. Test with Screen Readers" title="Direct link to 3. Test with Screen Readers" translate="no">​</a></h3>
<p>Use VoiceOver (Mac), NVDA (Windows), or JAWS to navigate your site. You'll quickly discover where semantic HTML makes a difference.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-validate-your-html">4. Validate Your HTML<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#4-validate-your-html" class="hash-link" aria-label="Direct link to 4. Validate Your HTML" title="Direct link to 4. Validate Your HTML" translate="no">​</a></h3>
<p>Use the W3C Markup Validation Service to catch semantic errors and ensure proper nesting.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-leverage-developer-tools">5. Leverage Developer Tools<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#5-leverage-developer-tools" class="hash-link" aria-label="Direct link to 5. Leverage Developer Tools" title="Direct link to 5. Leverage Developer Tools" translate="no">​</a></h3>
<p>Modern browser DevTools can show you the accessibility tree, which reveals how assistive technologies interpret your markup.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="react-and-vue-considerations">React and Vue Considerations<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#react-and-vue-considerations" class="hash-link" aria-label="Direct link to React and Vue Considerations" title="Direct link to React and Vue Considerations" translate="no">​</a></h2>
<p>When working with React or Vue, it's tempting to use divs everywhere since everything is a component. Resist this urge:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// ❌ Div soup in React</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#d73a49">BlogPost</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">blog-post</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">post-header</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">title</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">My Post</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">className</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">post-content</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ✅ Semantic React component</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:#d73a49">BlogPost</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">h1</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">My Post</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">h1</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">...</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">article</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Use React Fragments (<code>&lt;&gt;</code>) or Vue's template syntax to avoid unnecessary wrapper divs when you just need to return multiple elements.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://hendradev.vercel.app/blog/semantic-html-best-practices#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Semantic HTML is a fundamental skill that pays dividends in accessibility, SEO, maintainability, and developer experience. It requires minimal extra effort but makes your code more professional and your websites more inclusive.</p>
<p>The next time you reach for a div, pause and ask: "Is there a more meaningful element for this content?" Your future self, your teammates, your users, and search engines will thank you.</p>
<p>Start small—refactor one component or page at a time. Before long, writing semantic HTML will become second nature, and you'll wonder how you ever settled for div soup.</p>
<hr>
<p><strong>Further Reading:</strong></p>
<ul>
<li class=""><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element" target="_blank" rel="noopener noreferrer" class="">MDN Web Docs: HTML elements reference</a></li>
<li class=""><a href="https://www.w3.org/TR/html52/" target="_blank" rel="noopener noreferrer" class="">W3C HTML5 Specification</a></li>
<li class=""><a href="https://webaim.org/techniques/semanticstructure/" target="_blank" rel="noopener noreferrer" class="">WebAIM: Semantic Structure</a></li>
<li class=""><a href="https://www.a11yproject.com/checklist/" target="_blank" rel="noopener noreferrer" class="">A11y Project: Accessibility checklist</a></li>
</ul>]]></content:encoded>
            <category>html</category>
            <category>web-development</category>
            <category>accessibility</category>
            <category>best-practices</category>
            <category>frontend</category>
        </item>
    </channel>
</rss>