When I decided to make my projects discoverable, I realized I had no idea what "doing SEO" actually meant in practice. I knew roughly what it was—optimizing for search engines—but I'd never implemented it for a real site.
The research process felt like an archaeological dig. Every article touched on something different, used different vocabulary, and assumed different levels of knowledge. I had to cross-reference a dozen sources to get a coherent picture of what I actually needed to do and in what order.
This post is the guide I wish I'd had: a clear, sequential checklist with code examples and honest "why this matters" explanations.
How Search Engines Work (Briefly)
Before the checklist, a quick mental model. Search engines do three things:
- Crawl — bots (Googlebot, Bingbot) follow links and discover pages
- Index — they read and store page content so it can be searched
- Rank — when someone searches, they decide which indexed pages to show and in what order
The checklist below addresses all three stages: helping bots find your pages, helping them understand your content, and giving them signals to rank you well.
The Checklist
1. Title Tag
The <title> tag is the single most
important on-page SEO element. It's what appears as the
clickable headline in search results. Make it descriptive
and specific.
<!-- Bad: generic -->
<title>Home</title>
<!-- Good: descriptive -->
<title>Nikhil Nathwani — Web Developer & Blog</title>
For blog posts, put the article title first, then your name:
Article Title | Your Name. Google typically
displays ~60 characters before truncating.
2. Meta Description
The description that appears under your title in search results. It doesn't directly affect ranking, but it affects click-through rate—which does.
<meta
name="description"
content="How I replaced ~30 lines of JavaScript ranking logic
with a single SQL RANK() window function."
/> Keep it under 160 characters. Write it like ad copy: tell the reader exactly what they'll get, and make it sound worth clicking.
3. Canonical URL
If your page is accessible at multiple URLs (with/without
trailing slash, with/without www, HTTP vs
HTTPS), search engines may treat them as duplicate content
and split ranking signals between them. A
canonical tag tells search engines which
version is authoritative.
<link
rel="canonical"
href="https://nikhilnathwani.com/blog/session-management.html"
/> Even if you don't have a duplicate URL problem today, it's a cheap one-liner to add to every page.
4. robots.txt
A plain text file at the root of your site that tells crawlers which pages they can and can't index. For most personal sites, you want everything crawled:
User-agent: *
Allow: /
Sitemap: https://yourdomain.com/sitemap.xml
The Sitemap: line is a bonus: it tells crawlers
where to find your sitemap (see below) so they don't have to
discover it on their own.
5. sitemap.xml
A sitemap is a list of all pages on your site. It helps search engines discover content they might miss otherwise, and tells them how often pages change.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://yourdomain.com/</loc>
<lastmod>2026-05-25</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://yourdomain.com/blog/my-post.html</loc>
<lastmod>2026-02-02</lastmod>
<changefreq>never</changefreq>
<priority>0.7</priority>
</url>
</urlset> Update it whenever you publish a new page. Remember to also submit it in Google Search Console (step 8 below).
6. Structured Data (JSON-LD)
Structured data is metadata that helps
search engines understand what your content is, not
just what it says. You add it as a
<script type="application/ld+json"> block
using the
schema.org
vocabulary.
For a personal site, two types are most useful:
Person — on your homepage, describes who you are:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Nikhil Nathwani",
"url": "https://nikhilnathwani.com",
"jobTitle": "Full-Stack Web Developer",
"sameAs": [
"https://github.com/nikhilNathwani",
"https://www.linkedin.com/in/nathwani-nikhil/"
]
}
</script> BlogPosting — on each article page, describes the post:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Moving Calculations from Frontend to Backend",
"description": "How I replaced ~30 lines of JavaScript with a SQL RANK() window function.",
"url": "https://nikhilnathwani.com/blog/sql-window-functions-refactor.html",
"datePublished": "2026-01-26",
"author": {
"@type": "Person",
"name": "Nikhil Nathwani",
"url": "https://nikhilnathwani.com"
}
}
</script> Structured data can unlock rich results— enhanced search listings with extra info (star ratings, breadcrumbs, author bylines). For blog posts, it can trigger author attribution in search snippets.
7. Open Graph + Twitter Card Tags
These aren't strictly SEO, but they're SEO-adjacent and worth doing at the same time. When someone shares your URL on LinkedIn, Slack, Twitter/X, or iMessage, these tags control the preview card that appears.
<!-- Open Graph (Facebook, LinkedIn, Slack, iMessage) -->
<meta property="og:type" content="article" />
<meta property="og:url" content="https://yourdomain.com/blog/post.html" />
<meta property="og:title" content="Post Title | Your Name" />
<meta property="og:description" content="Post description." />
<meta property="og:image" content="https://yourdomain.com/og-image.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Post Title | Your Name" />
<meta name="twitter:description" content="Post description." />
<meta name="twitter:image" content="https://yourdomain.com/og-image.png" /> Your OG image should be 1200×630px. A clean branded image goes a long way—even a simple one with your name and the post title.
8. Google Search Console
Google Search Console (GSC) is free and invaluable. It shows you which searches are surfacing your pages, click-through rates, and any crawl errors Google encounters.
Setup steps:
- Go to search.google.com/search-console
- Add your domain and verify ownership (usually via a DNS TXT record or an HTML file upload)
-
Submit your sitemap: in the left sidebar, go to
Sitemaps and enter your
sitemap.xmlURL - Use URL Inspection to request indexing for new pages
After submitting, it can take a few days to a few weeks for Google to crawl and index your pages. GSC will tell you when they're indexed and flag any issues.
9. Bing Webmaster Tools
Yes, there's a Bing equivalent—and it's worth doing because DuckDuckGo uses Bing's index. Verifying on Bing covers both search engines at once.
Setup steps:
- Go to bing.com/webmasters
- Sign in with a Microsoft account
- If you've already done Google Search Console, use the "Import from Google Search Console" option—it copies your site and sitemap configuration in one click
- Verify ownership (Bing accepts the same HTML meta tag method as Google)
The import from GSC makes this genuinely quick—it took me about five minutes after GSC was already set up.
What You Can Mostly Ignore
SEO content online often oversells the complexity. For a personal developer site, here's what doesn't need to be on your radar:
- Keyword density: the "stuff your page with keywords" era is over. Write naturally.
- Backlinks (for now): building backlinks matters for competitive keywords, but for a personal portfolio or niche project site, write good content and let it grow organically.
- PageSpeed micro-optimization: aim for reasonable performance, but don't obsess over shaving milliseconds off a blog that loads in under a second.
- Submitting to other search engines: Google and Bing cover the vast majority of search traffic. Yandex is worth considering only if you're targeting Russian-speaking users; otherwise skip it.
Validation Tools
Once you've implemented the above, use these to verify everything is working:
- Google Rich Results Test — validates your JSON-LD structured data
- schema.org Validator — checks structured data for errors and warnings
- Meta (Facebook) Sharing Debugger — previews your Open Graph card as it'll appear on Facebook/LinkedIn
- Twitter Card Validator — previews your Twitter card
Putting It Together
The full SEO surface area sounds large, but most of it is a one-time setup. Write your title and description tags, add a canonical link, drop in a robots.txt and sitemap.xml, add JSON-LD, paste in the OG/Twitter meta tags, and submit to both Search Consoles. Total time for a new site: a few hours at most.
The part that requires ongoing attention is keeping your sitemap up to date as you publish new pages and checking Search Console periodically for crawl errors or new ranking data.
Everything else—writing good content, loading fast, being mobile-friendly—is the foundation that makes all of this worth anything. The technical checklist above is just how you tell search engines that foundation exists.