๐Ÿ” My Next.js Portfolio Was Invisible to Google & ChatGPT โ€” Here's How I Fixed It

2026-09-27ๆฅๆบ dev.toEnglish
๐Ÿ” My Next.js Portfolio Was Invisible to Google & ChatGPT โ€” Here's How I Fixed It

๐Ÿ‘‹ Hey! I'm Dhruv Sheladiya, a Full Stack Developer working with the MERN Stack, React.js, Next.js & Node.js.
This is the story of how I found out my own portfolio was basically invisible, and the 5 fixes that changed that.

๐Ÿ˜ฌ The Embarrassing Discovery

I Googled my own name. Here's what I found:

What I expected What actually happened
โœ… My portfolio at the top โŒ Barely showing up
โœ… A nice preview image โŒ No image at all
โœ… ChatGPT knows who I am โŒ "I don't have information about that person"

The site looked perfect in the browser. So what was going on? ๐Ÿค”

๐Ÿ•ต๏ธ The Root Cause: A Beautiful Page That Crawlers Saw as Empty

My portfolio has a cool animated loader, and the homepage is a client component:

"use client"; export default function Home() { const [showLoader, setShowLoader] = useState(true); return showLoader ? <Loader onComplete={() => setShowLoader(false)} /> : <MainContent />; } 

For real users? Totally fine. ๐ŸŽ‰
For crawlers? The HTML only contains the loader. No name. No heading. No links. ๐Ÿ’€

Visitor Runs JavaScript? What it saw
๐Ÿง‘ Real user โœ… Yes Full animated portfolio
๐Ÿค– Googlebot โš ๏ธ Sometimes, slowly Maybe the content, maybe just the loader
๐Ÿง  AI crawlers (ChatGPT, Perplexity) โŒ Mostly no An empty page

๐Ÿ’ก Lesson #1: Always check your page without JavaScript.
Run curl https://your-site.com or right-click โ†’ View Page Source.
If your name isn't in there, crawlers probably can't see it either.

๐Ÿ› ๏ธ Fix #1: Server-Render the Important Content

I didn't want to touch the UI, so I added a small, accessible profile block in layout.js, which is a Server Component.

Tailwind's sr-only class makes it readable by screen readers and crawlers, but it doesn't change the design at all:

<body> <div className="sr-only"> <h1>Dhruv Sheladiya โ€“ Full Stack Developer | MERN Stack | React.js Next.js & Node.js Expert</h1> <p>Full Stack Developer from India specializing in React.js, Next.js and Node.js.</p> <nav aria-label="Dhruv Sheladiya on the web"> <ul> {SOCIALS.map((s) => ( <li key={s.href}> <a href={s.href} rel="me noopener">Dhruv Sheladiya on {s.label}</a> </li> ))} </ul> </nav> </div> {children} </body> 

โš ๏ธ Important: Keep this content honest and identical to what's visible on the page.
โŒ Hidden text stuffed with keywords = spam signal
โœ… Accessible text that matches your real content = fine

๐Ÿ”— Fix #2: Structured Data That Connects All Your Profiles

Google builds a Knowledge Graph entry for people by connecting profiles that belong to the same person.
The sameAs property in JSON-LD tells Google exactly which profiles are yours ๐Ÿ‘‡

const jsonLd = { "@context": "https://schema.org", "@graph": [ { "@type": "Person", "@id": "https://aboutdhruv.vercel.app/#person", name: "Dhruv Sheladiya", jobTitle: "Full Stack Developer", url: "https://aboutdhruv.vercel.app", sameAs: [ "https://www.upwork.com/freelancers/~0191c7eba12b27a044", "https://www.linkedin.com/in/dhruv-sheladiya-a350582a6", "https://github.com/Dhruv-1511", "https://x.com/DhruvSheladiya2", ], }, { "@type": "ProfilePage", url: "https://aboutdhruv.vercel.app", mainEntity: { "@id": "https://aboutdhruv.vercel.app/#person" }, }, ], }; 

I also added <link rel="me"> tags in the <head> for every profile. GitHub and Mastodon use rel="me" for identity verification too. ๐Ÿชช

๐Ÿ” The secret sauce: this only works if it goes both ways.
Your site links to your profiles โžก๏ธ and every profile (GitHub, LinkedIn, Upwork, Xโ€ฆ) links back to your site โฌ…๏ธ

๐Ÿ–ผ๏ธ Fix #3: My OG Image Was 1.7 MB ๐Ÿ˜ฑ

My openGraph config said the image was 1200ร—630, but the real file was:

โŒ Before โœ… After
Size 1629 ร— 966 1200 ร— 630
Weight 1.77 MB 80 KB
Format PNG JPEG (mozjpeg)
Preview showing? Nope Yes ๐ŸŽ‰

I fixed it with a single command using sharp, which already comes with Next.js:

node -e "require('sharp')('public/ogimg.png').resize(1200,630,{fit:'cover'}).jpeg({quality:82,mozjpeg:true}).toFile('public/og.jpg')" 

๐Ÿง  Did you know? og:image is for social previews (WhatsApp, LinkedIn, X).
Google doesn't use it for search thumbnails. It picks images from your page content and structured data, one more reason Fix #1 matters.

โš™๏ธ Fix #4: Nail the Next.js Metadata Basics

export const metadata = { metadataBase: new URL("https://aboutdhruv.vercel.app"), title: "Dhruv Sheladiya โ€“ Full Stack Developer | MERN Stack | React.js Next.js & Node.js Expert", alternates: { canonical: "/" }, openGraph: { type: "profile", images: [{ url: "/og.jpg", width: 1200, height: 630 }], }, robots: { index: true, follow: true, googleBot: { "max-image-preview": "large", "max-snippet": -1 }, }, }; 
Rule Why it matters
๐Ÿฅ‡ Name first in the title People search your name, not your job title
๐Ÿ” Same headline everywhere My title matches my Upwork headline exactly, so search engines connect the dots
๐ŸŽฏ Canonical URL Stops Google splitting ranking between duplicate URLs
๐Ÿ–ผ๏ธ max-image-preview: large Allows large image previews in results

๐Ÿค– Fix #5: Add llms.txt for AI Assistants

llms.txt is a newer convention: a plain Markdown file at /llms.txt that summarizes your site for AI tools.

๐Ÿ“„ Click to see what my llms.txt looks like
# Dhruv Sheladiya  > Dhruv Sheladiya is a Full Stack Developer from India โ€” MERN Stack | > React.js, Next.js & Node.js Expert. Portfolio: https://aboutdhruv.vercel.app ## Skills - Frontend: React.js, Next.js, JavaScript, TypeScript, Tailwind CSS - Backend: Node.js, Express.js, REST APIs - Databases: MongoDB, PostgreSQL ## Official profiles - [Upwork](https://www.upwork.com/freelancers/~0191c7eba12b27a044) - [LinkedIn](https://www.linkedin.com/in/dhruv-sheladiya-a350582a6) - [GitHub](https://github.com/Dhruv-1511) 

โฑ๏ธ Takes 5 minutes. There's no downside.

โœ… The Complete Checklist

  • [ ] ๐Ÿ‘€ View Page Source: is your name in the raw HTML?
  • [ ] ๐Ÿงฉ JSON-LD Person with sameAs for all your profiles
  • [ ] ๐Ÿ” Every profile links back to your site
  • [ ] ๐Ÿ–ผ๏ธ OG image is 1200ร—630 and under ~300 KB
  • [ ] ๐Ÿฅ‡ Name first in <title>, same headline everywhere
  • [ ] ๐Ÿ—บ๏ธ Submit your sitemap to Google Search Console and Bing Webmaster Tools (ChatGPT search relies heavily on Bing!)
  • [ ] ๐Ÿงช Test with Google's Rich Results Test
  • [ ] ๐Ÿค– Add an /llms.txt

๐ŸŽฏ Final Thoughts

SEO for your own name is slow: expect a few weeks before things move. โณ
But the best part? None of this required changing a single pixel of my UI. ๐ŸŽจโœจ

Here's the live result ๐Ÿ‘‡

Dhruv Sheladiya โ€“ Full Stack Developer | MERN Stack | React.js Next.js & Node.js Expert

Dhruv Sheladiya is a Full Stack Developer from India specializing in the MERN stack, React.js, Next.js and Node.js. View projects, experience and connect on Upwork, LinkedIn and GitHub.

favicon aboutdhruv.vercel.app

๐Ÿ‘จโ€๐Ÿ’ป About Me

Hi, I'm Dhruv Sheladiya, a Full Stack Developer ๐Ÿš€ building fast, scalable web apps & SaaS products with clean UI/UX, from frontend to backend.

๐ŸŒ Portfolio aboutdhruv.vercel.app
๐Ÿ’ผ Upwork Hire me for freelance projects
๐Ÿ”— LinkedIn Dhruv Sheladiya
๐Ÿ’ป GitHub @Dhruv-1511
๐Ÿฆ X @DhruvSheladiya2

๐Ÿ’ผ Hire Me on Upwork

๐ŸŒ Visit My Portfolio

๐Ÿ’ฌ Your turn: open View Page Source on your portfolio right now. What did you find? Tell me in the comments ๐Ÿ‘‡
โค๏ธ If this helped, drop a reaction and follow me for more Next.js & React content!

ๅŽŸๆ–‡๏ผšhttps://www.a8q9.cn/en/article/my-next-js-portfolio-was-invisible-to-google-chatgpt-here-s-how-i-fixed-it-4b47f7.html

็›ธๅ…ณๆ–‡็ซ