Helping Google Know Who I Am: SEO for a Developer Portfolio (Person Schema, Canonical Tags, sameAs)
My name is a common one. When I search it, results are mixed, and my own portfolio is not guaranteed to show up. So I spent some time making my portfolio easier for Google to understand. I can't promise this will rank m
My name is a common one. When I search it, results are mixed, and my own portfolio is not guaranteed to show up. So I spent some time making my portfolio easier for Google to understand.
I can't promise this will rank me first, because Google decides that. But these changes give search engines clear signals about who I am. Here is what I did on a React portfolio hosted on Vercel.
1. Each page needs its own canonical tag
My first problem was in Search Console. One page showed "Alternate page with proper canonical tag" and was not indexed.
URL Inspection showed the canonical was my home page (/), not the page itself. A single hard-coded <link rel="canonical"> in index.html was shared by every route, so Google treated my other pages as duplicates of the home page.
The fix: set the canonical per route.
import { useEffect } from "react";
const SITE = "https://your-domain.com";
export function useCanonical(path: string) {
useEffect(() => {
let link = document.querySelector<HTMLLinkElement>('link[rel="canonical"]');
if (!link) {
link = document.createElement("link");
link.rel = "canonical";
document.head.appendChild(link);
}
link.href = `${SITE}${path}`;
}, [path]);
}
2. Unique titles and descriptions per route
I gave every page its own title in a consistent pattern, with my name first:
Home | Your Name | Web Developer & UI Designer from Your City
About | About | Your Name
Projects | Projects | Your Name
Blog | Blog | Your Name
Contact | Contact | Your Name
Each page also has its own meta description. For a single-page app, I update document.title and the meta tags when the route changes.
A tip: don't stuff keywords. Write titles and descriptions that a real person would want to click.
3. Add Person structured data (JSON-LD)
Structured data tells Google exactly what your site is about. For a personal site, the Person type is a good fit.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Your Name",
"url": "https://your-domain.com/",
"image": "https://your-domain.com/your-photo.jpg",
"jobTitle": "Web Developer & UI Designer",
"address": {
"@type": "PostalAddress",
"addressLocality": "Your City",
"addressRegion": "Your State",
"addressCountry": "Your Country"
},
"knowsAbout": ["Web development", "React", "TypeScript", "UI design"],
"sameAs": [
"https://www.youtube.com/@your-channel",
"https://www.linkedin.com/in/your-profile",
"https://dev.to/your-username",
"https://github.com/your-username",
"https://your-blog.blogspot.com"
]
}
</script>
Two things to be careful about:
- Keep only one
Personblock, and don't repeat keys likeimageorsameAs. A duplicate or a typo can break the JSON. - Only add profile links that are really yours. I once nearly added a GitHub URL that was a guess, and it could have pointed to a stranger's profile. Always open every
sameAslink and confirm it is your account.
After deploying, check it with the Schema Markup Validator at validator.schema.org.
4. Link your profiles to each other
sameAs works best when the links go both ways:
- Put your portfolio URL in your GitHub, LinkedIn, dev.to and YouTube profiles
- Link to your YouTube, LinkedIn, GitHub and blog from the portfolio
- Use the same name everywhere
This helps search engines connect all of these accounts to one person.
5. Make the content itself clear
- One
h1per page that matches the page's purpose - Descriptive
alttext on your profile photo, with your name - A sitemap with every route, using your real domain
- Real text content on each page, not only images and cards
- Don't make two pages show the same content. I noticed my Home and About pages were nearly identical, and fixed it by giving each a different purpose
6. Tell Google about the changes
- Deploy to Vercel
- In Search Console, paste the URL into URL Inspection
- Click Test live URL, then Request indexing
- Submit
sitemap.xmlunder Sitemaps
Indexing can take days to weeks, and requesting it again and again doesn't speed it up.
What I'm watching now
I don't have ranking results to show, and I won't pretend I do. What I'm tracking:
- Whether the "not indexed" pages move to Indexed in Search Console
- Whether my name plus "web developer" brings up my portfolio
- Whether my GitHub, YouTube and dev.to profiles show up together
Quick checklist
- [ ] A different canonical tag on every route
- [ ] Unique title and description per page
- [ ] One valid
PersonJSON-LD block with realsameAslinks - [ ] Profiles link back to the portfolio
- [ ] Sitemap submitted
- [ ] No duplicate pages
Wrapping up
None of this is magic. It is about removing confusion for search engines and keeping your online presence consistent.
You can see the portfolio here: ritika-rajput-portfolio.vercel.app. I also share videos on RitikaMoments and write on dev.to.
Have you tried improving your own search presence? What worked for you?
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.