Making a Next.js portfolio visible on Google: the SEO that really counts
Favicon, site name, structured data, multilingual sitemap: the concrete technical signals that decide how your site looks in search results — and how I tuned them on this portfolio.
The problem: well ranked doesn't mean well presented
When you type my name into Google, my portfolio comes up first. The ranking works. But a good ranking doesn't guarantee a good presentation: the icon shown next to the link, the site name, the description — all of that plays out on precise technical signals that Google reads in your code.
This article details the settings that make the difference between a generic result and one that inspires trust.
The favicon: a constraint almost nobody respects
Google shows an icon to the left of every result. For it to be yours and not a generic fallback, three conditions:
- The favicon must be served at a stable URL and declared via
<link rel="icon">. - Its size must be a multiple of 48px (48, 96, 144…). A
64×64— common as it is — is simply ignored by Google. - It must stay legible at very small sizes: a monogram or a symbol, never a detailed logo.
In Next.js, a simple app/icon.tsx file generates the favicon and automatically injects the <link> tag. The trap hides in the exported size.
A perfect favicon but in
64×64will never appear in Google's results. The detail that costs weeks of doubt.
The "site name": taking back control of what Google displays
By default, Google often shows the domain (mysite.com) instead of the real name. To force a proper name on it, you have to align three signals that must be strictly identical:
- The
namefield of theWebSitestructured data (JSON-LD). - The
og:site_nametag (Open Graph). - The
application-namemeta.
If these three values diverge — even just "Jean Portfolio" on one side and "Jean — Portfolio" on the other — Google gives up and falls back to the domain. Consistency is the only rule.
Structured data: explaining who you are
The Person JSON-LD is what lets Google understand that the site is about a specific individual, with a profession, a location and social profiles. The fields that weigh most:
name,jobTitle,description— the base identity.sameAs— the list of your profiles (GitHub, LinkedIn). This is what links your site to your online presence and feeds the Knowledge Panel.image— a photo, useful for rich results.
Linking each entity by an @id identifier (#person, #website) avoids duplicates and gives Google a clean graph rather than a collection of isolated cards.
The multilingual sitemap: not getting devoured by hreflang
A site in several languages must tell Google which version to show to whom. Without that, the different languages cannibalize each other in the index. The rule: each URL declares all its language variants via alternates.languages, plus an x-default.
Next.js generates a native sitemap.ts where each entry carries its hreflang. It's more reliable than third-party plugins, which often miss dynamic routes of the [locale] type.
What really counts, in order
If I had to prioritize for a new project:
- Google Search Console — without it, you're blind. Submit the sitemap, request indexing.
- Consistency of identity signals — a compliant favicon, an aligned site name, clean JSON-LD.
- Real content — a single-page site plateaus fast. Technical articles like this one make you exist on real queries.
- The Core Web Vitals — a fast site is a better-ranked site. Measure, then optimize.
Technical SEO isn't magic: it's a series of clear signals, sent cleanly, then left to the time Google takes to re-crawl. Patience does the rest.