SEO & Structured Data Improvements
SEO & Structured Data Improvements
Deep analysis and implementation guide for improving search engine visibility, structured data, and social sharing.
Table of Contents
- Fill Missing Config Values
- JSON-LD Structured Data
- Open Graph Images
- Hreflang Tags for Bilingual Content
- Robots.txt Configuration
- Search Engine Verification
- Breadcrumbs
- Publication-Specific Schema
- Meta Description Audit
1. Fill Missing Config Values
Current State
File: _config.yml (lines 53-78)
Multiple SEO-critical fields are empty:
twitter:
username: # EMPTY
facebook:
username: # EMPTY
app_id: # EMPTY
publisher: # EMPTY
og_image: # EMPTY - no default OG image
social:
type: # EMPTY
name: # EMPTY
links: # EMPTY
analytics:
provider: false # DISABLED
Implementation
# _config.yml - update these sections
# Twitter (even if you don't use Twitter, needed for card metadata)
twitter:
username: &twitter "" # Add if you have one, or leave empty
# Default Open Graph image (shown when pages lack custom images)
og_image: /images/og-default.png # Create a 1200x630 image
# Social profiles (enables Person JSON-LD with sameAs links)
social:
type: Person
name: "Efrén Rodríguez Rodríguez"
links:
- https://github.com/EfrenPy
- https://www.linkedin.com/in/efren-rodriguez-rodriguez
- https://orcid.org/0000-0002-XXXX-XXXX # Your ORCID
- https://scholar.google.com/citations?user=XXXXXX # Your Google Scholar
# Analytics (optional but recommended)
analytics:
provider: "google-gtag"
google:
tracking_id: "G-XXXXXXXXXX" # Your GA4 measurement ID
anonymize_ip: true
Create default OG image
Create a 1200x630px image at /images/og-default.png with:
- Your name
-
“CERN Researcher Silicon Detectors” - Your profile photo
- Site URL
This image will be used as the fallback when sharing any page that lacks a custom teaser.
2. JSON-LD Structured Data
Current State
File: _includes/seo.html (lines 105-125)
Two JSON-LD blocks exist but are conditionally rendered and incomplete:
- Organization schema only renders if
site.og_imageis set (currently empty) - Person schema only renders if
site.socialis configured (currently empty)
File: _layouts/single.html (line 17)
Uses microdata itemtype="http://schema.org/CreativeWork" for all content types (generic, not specific).
Implementation
Enhanced Person schema
Create a new include _includes/jsonld-person.html:
<!-- _includes/jsonld-person.html -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Efrén Rodríguez Rodríguez",
"url": "https://efrenrodriguezrodriguez.com",
"image": "https://efrenrodriguezrodriguez.com/images/webp/profile.webp",
"jobTitle": "Postdoctoral Researcher",
"worksFor": {
"@type": "Organization",
"name": "CERN",
"url": "https://home.cern"
},
"alumniOf": [
{
"@type": "CollegeOrUniversity",
"name": "Universidade de Santiago de Compostela",
"url": "https://www.usc.gal"
}
],
"knowsAbout": [
"Particle Physics",
"Silicon Detectors",
"Python",
"Data Analysis",
"FPGA Design"
],
"sameAs": [
"https://github.com/EfrenPy"
, "https://www.linkedin.com/in/efrenrguezrguez"
, "https://orcid.org/0000-0002-7973-8061"
, "https://scholar.google.com/citations?user=pir4UaIAAAAJ&hl=en"
]
}
</script>
Include it in _includes/head.html:
WebSite schema (enables Google Sitelinks search box)
Create _includes/jsonld-website.html:
<!-- _includes/jsonld-website.html -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Efrén Rodríguez Rodríguez",
"url": "https://efrenrodriguezrodriguez.com",
"description": "Postdoctoral researcher at CERN specializing in silicon pixel detectors, data analysis, and particle physics instrumentation. PhD in Particle Physics with expertise in timing detectors and Python.",
"inLanguage": ["en", "es"],
"author": {
"@type": "Person",
"name": "Efrén Rodríguez Rodríguez"
}
}
</script>
BreadcrumbList schema
Create _includes/jsonld-breadcrumbs.html:
<!-- _includes/jsonld-breadcrumbs.html -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://efrenrodriguezrodriguez.com"
}
,{
"@type": "ListItem",
"position": 3,
"name": "Docs",
"item": "https://efrenrodriguezrodriguez.com/docs/"
}
,{
"@type": "ListItem",
"position": 4,
"name": "Improvements",
"item": "https://efrenrodriguezrodriguez.com/docs/improvements/"
}
,{
"@type": "ListItem",
"position": 5,
"name": "02 seo structured data",
"item": "https://efrenrodriguezrodriguez.com/docs/improvements/02-seo-structured-data/"
}
]
}
</script>
3. Open Graph Images
Current State
og_imagein_config.ymlis empty (no default)- Publication teasers use placeholder paths (
path-to-your-image.png) - Portfolio items have teasers but they’re small thumbnails (150px)
Implementation
Create per-section OG images
For optimal social sharing, create 1200x630px images:
images/
og-default.png # Fallback: name + role + photo
og-publications.png # "Research Publications" header
og-portfolio.png # "Projects" header
og-talks.png # "Talks & Conferences" header
Add og_image to page front matter
For pages that should have custom social images:
# _pages/publications.md
---
title: "Publications"
og_image: /images/og-publications.png
---
Update portfolio items with proper teasers
Fix placeholder teaser paths in publications:
# _publications/silicon-vertex-detector-timing-upgrade-II-lhcb.md
header:
teaser: webp/upgradeII.webp # Use actual image, not 'path-to-your-image.png'
# _publications/the-lhcb-upgrade-i.md
header:
teaser: webp/lhcb-upgrade.webp # Replace placeholder
Update seo.html for better OG image handling
In _includes/seo.html, the current OG image logic (around line 86-90) can be improved:
<!-- _includes/seo.html - enhanced OG image logic -->
<meta property="og:image" content="https://efrenrodriguezrodriguez.comwebp/profile.webp">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
4. Hreflang Tags for Bilingual Content
Current State
The site has full bilingual support (EN/ES) via JavaScript toggle, but:
- No
hreflangtags in<head> - The locale is set to
es_ESbut content renders in both languages - No alternate language hints for search engines
Implementation
Since the site uses client-side language switching (same URL for both languages), traditional hreflang is not applicable. However, you can signal to search engines that the content is multilingual:
<!-- _includes/head.html - add after canonical link -->
<link rel="alternate" hreflang="en" href="https://efrenrodriguezrodriguez.com/docs/improvements/02-seo-structured-data/">
<link rel="alternate" hreflang="es" href="https://efrenrodriguezrodriguez.com/docs/improvements/02-seo-structured-data/">
<link rel="alternate" hreflang="x-default" href="https://efrenrodriguezrodriguez.com/docs/improvements/02-seo-structured-data/">
Better long-term approach: If you want proper SEO for both languages, consider URL-based language routing:
efrenrodriguezrodriguez.com/en/for Englishefrenrodriguezrodriguez.com/es/for Spanish
This would require significant restructuring but gives search engines proper language-specific URLs to index.
5. Robots.txt Configuration
Current State
No robots.txt file exists in the repository root. The jekyll-sitemap plugin may generate a default one, but it’s better to be explicit.
Implementation
Create robots.txt in the repository root:
# robots.txt
User-agent: *
Allow: /
Sitemap: https://efrenrodriguezrodriguez.com/sitemap.xml
# Block crawling of non-content paths
Disallow: /assets/js/
Disallow: /assets/fonts/
Disallow: /files/
Note: Add ---\n--- YAML front matter if you want Jekyll to process it (for variable substitution), or leave it as a plain text file.
6. Search Engine Verification
Current State
Verification meta tags exist in _includes/seo.html but config values are empty.
Implementation
- Google Search Console:
- Go to Search Console
- Add property:
https://efrenrodriguezrodriguez.com - Choose “HTML tag” verification method
- Copy the
contentvalue
- Bing Webmaster Tools:
- Go to Bing Webmaster
- Add site and get verification code
- Update
_config.yml:
google_site_verification: "your-google-verification-code"
bing_site_verification: "your-bing-verification-code"
- After verification, submit your sitemap URL in both consoles:
https://efrenrodriguezrodriguez.com/sitemap.xml
7. Breadcrumbs
Current State
File: _config.yml (line 18): breadcrumbs: false
Breadcrumbs are disabled. The include _includes/breadcrumbs.html exists but is never rendered.
Implementation
Enable breadcrumbs in _config.yml:
breadcrumbs: true
This will automatically render the breadcrumb trail on subpages, improving:
- Navigation UX for deep pages
- Search engine understanding of site hierarchy
- Potential for breadcrumb rich snippets in Google results
Combine with the JSON-LD BreadcrumbList schema from section 2 for maximum SEO benefit.
8. Publication-Specific Schema
Current State
Publications use generic CreativeWork microdata. For academic content, Google Scholar and Google Search support ScholarlyArticle schema.
Implementation
Create _includes/jsonld-publication.html:
<!-- _includes/jsonld-publication.html -->
Include it in _layouts/single.html:
Portfolio project schema
Create _includes/jsonld-project.html:
<!-- _includes/jsonld-project.html -->
9. Meta Description Audit
Current State
Pages use the excerpt field as the meta description (via seo.html). This is functional but some are missing or generic.
Recommendations
Review each page’s excerpt to ensure it’s:
- 150-160 characters max
- Contains relevant keywords
- Unique per page
- Describes the page content accurately
Pages to review:
| Page | Current Excerpt | Action |
|---|---|---|
| Homepage | “Particle Physics Researcher | Silicon Detector Expert | CERN” | Good, but could include name |
| CV | None | Add: “CV of Efrén Rodríguez Rodríguez - CERN postdoctoral researcher specializing in silicon particle detectors” |
| Contact | None | Add: “Contact Efrén Rodríguez Rodríguez for research collaborations, speaking engagements, or project inquiries” |
| Publications | None | Add: “Published research papers on silicon detectors, LHCb VELO upgrade, and particle physics instrumentation” |
| Portfolio | None | Add: “Research and personal projects: LHCb VELO, Timepix4, 3D sensor simulation, and open-source tools” |
Add excerpt to any page front matter that lacks one:
# _pages/cv.md
---
excerpt: "CV of Efrén Rodríguez Rodríguez - CERN postdoctoral researcher in silicon particle detectors and instrumentation."
---
Priority Matrix
| Improvement | Impact | Effort | Priority |
|---|---|---|---|
| Fill _config.yml social/og_image | High | Low | P0 |
| Default OG image | High | Low | P0 |
| Fix publication placeholder images | Medium | Low | P0 |
| Person JSON-LD | High | Medium | P1 |
| ScholarlyArticle schema | High | Medium | P1 |
| Meta description audit | Medium | Low | P1 |
| Search engine verification | Medium | Low | P1 |
| Robots.txt | Low | Low | P1 |
| Enable breadcrumbs | Medium | Low | P2 |
| BreadcrumbList JSON-LD | Medium | Medium | P2 |
| Hreflang tags | Low | Low | P2 |
| URL-based language routing | High | Very High | P3 (future) |
Validation
After implementing, validate structured data: