Schema.org Structured Data for Developer Portfolio Sites
Why Structured Data Matters for Portfolios
Structured data helps Google understand what your page is about. For a developer portfolio, this means your search results can show rich information: your name, job title, skills, and links to your profiles. Instead of a generic blue link, you get a knowledge-panel-style result that stands out.
I added Schema.org structured data to my portfolio site and noticed improved search appearance within a few weeks. Here is exactly what I implemented and why.
JSON-LD Format
Google recommends JSON-LD (JavaScript Object Notation for Linked Data) as the preferred structured data format. It goes in a script tag in your page's head or body:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Steve Light",
"jobTitle": "AI Engineer",
"description": "AI engineer building multi-agent pipelines and automation tools",
"url": "https://stevecv.com",
"sameAs": [
"https://github.com/stevelight",
"https://linkedin.com/in/stevelight"
],
"knowsAbout": [
"Artificial Intelligence",
"Machine Learning",
"Python",
"Node.js",
"Multi-Agent Systems"
],
"address": {
"@type": "PostalAddress",
"addressRegion": "South West England",
"addressCountry": "GB"
}
}
</script>This tells Google: this page is about a person named Steve Light, who is an AI engineer, based in South West England, with profiles on GitHub and LinkedIn.
The Person Schema
The Person type is the most important schema for a portfolio. Key properties:
name: Your full namejobTitle: Your current roledescription: A brief professional summaryurl: Your canonical portfolio URLsameAs: Array of your official profile URLs on other platformsknowsAbout: Array of your skills and expertise areasworksFor: Your current employer (optional)
Blog Post Schema
Each blog post gets its own structured data using the Article or BlogPosting type:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "How to Build a cron-Based Content Publishing System",
"description": "Learn how to build an automated content publishing system",
"datePublished": "2026-03-21",
"dateModified": "2026-03-21",
"author": {
"@type": "Person",
"name": "Steve Light",
"url": "https://stevecv.com"
},
"publisher": {
"@type": "Person",
"name": "Steve Light"
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://stevecv.com/blog/cron-based-publishing.html"
},
"keywords": ["cron", "automation", "Python", "publishing"]
}
</script>The BlogPosting type can appear as a rich result in Google with the publication date, author name, and article headline prominently displayed.
Automating Blog Post Schema
I generate the structured data automatically in my blog generation script. The post metadata (title, date, tags) feeds directly into the JSON-LD template:
def generate_article_schema(post):
return json.dumps({
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": post["title"],
"description": post["meta_description"],
"datePublished": post["date"],
"dateModified": post["date"],
"author": {
"@type": "Person",
"name": "Steve Light",
"url": "https://stevecv.com"
},
"keywords": post["tags"]
}, indent=2)This ensures every blog post has correct structured data without manual effort.
Website and WebSite Schema
Add a WebSite schema to your homepage for sitelinks and search box features:
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Steve Light | AI Engineer",
"url": "https://stevecv.com",
"description": "Portfolio and blog of Steve Light, AI engineer"
}BreadcrumbList for Navigation
Breadcrumb structured data helps Google understand your site hierarchy:
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://stevecv.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Blog",
"item": "https://stevecv.com/blog/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Article Title Here"
}
]
}Google displays breadcrumbs in search results, showing the path to the page. This looks more professional than a raw URL and helps users understand where they are in your site.
Validation and Testing
Always validate your structured data:
- Google Rich Results Test: https://search.google.com/test/rich-results tests whether your page is eligible for rich results
- Schema.org Validator: https://validator.schema.org/ checks your JSON-LD syntax against the Schema.org specification
- Google Search Console: The Enhancements section shows structured data issues across your entire site
Common Mistakes
- Missing required properties:
BlogPostingrequires headline, author, and datePublished at minimum - Invalid dates: Use ISO 8601 format (YYYY-MM-DD)
- Mismatched canonical URLs: The URL in structured data should match your canonical tag
- Overstuffing keywords: Keep the knowsAbout and keywords arrays focused and relevant
Impact
Structured data is not a ranking factor directly, but it improves click-through rates by making your search results more informative and visually distinctive. For a portfolio site where you want every search impression to count, the 30 minutes of implementation effort is well worth it.