Public Access
1
0

feat: enhance SEO with sitemap and robots.txt, add Open Graph and Twitter meta tags

This commit is contained in:
2025-08-21 19:09:40 -04:00
parent 53223431f1
commit 3b764a3b43
11 changed files with 87 additions and 9 deletions

View File

@@ -6,6 +6,9 @@ module.exports = function(eleventyConfig) {
eleventyConfig.addPassthroughCopy("src/resume"); eleventyConfig.addPassthroughCopy("src/resume");
eleventyConfig.addPassthroughCopy("src/assets/images"); eleventyConfig.addPassthroughCopy("src/assets/images");
eleventyConfig.addPassthroughCopy({ "favicon" : "/" } ); eleventyConfig.addPassthroughCopy({ "favicon" : "/" } );
eleventyConfig.addPassthroughCopy({ 'src/robots.txt': '/robots.txt' });
eleventyConfig.addPassthroughCopy({ 'src/sitemap.xml': '/sitemap.xml' });
// Add a filter for readable dates using vanilla JS // Add a filter for readable dates using vanilla JS
eleventyConfig.addFilter("readableDate", dateObj => { eleventyConfig.addFilter("readableDate", dateObj => {
// The toLocaleDateString method can be used to format dates // The toLocaleDateString method can be used to format dates
@@ -19,6 +22,14 @@ module.exports = function(eleventyConfig) {
}); });
}); });
// Add htmlDateString filter for sitemap <lastmod>
eleventyConfig.addFilter("htmlDateString", dateObj => {
if (!dateObj) return "";
// Format date as YYYY-MM-DD for sitemaps
const d = new Date(dateObj);
return d.toISOString().split("T")[0];
});
// Shortcode for creating a callout box // Shortcode for creating a callout box
// This is a "paired shortcode" which means it has a start and end tag. // This is a "paired shortcode" which means it has a start and end tag.
eleventyConfig.addPairedShortcode("callout", function(content, title) { eleventyConfig.addPairedShortcode("callout", function(content, title) {

View File

@@ -1,4 +1,5 @@
{ {
"url": "https://jesus.twk95.com",
"author": { "author": {
"name": "Jesus Otero", "name": "Jesus Otero",
"email": "jesus@twk95.com", "email": "jesus@twk95.com",

View File

@@ -5,6 +5,36 @@
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>{{ title }}</title> <title>{{ title }}</title>
<meta name="description" content="{{ description }}"> <meta name="description" content="{{ description }}">
<!-- Open Graph Meta Tags -->
<meta property="og:title" content="{{ title }}">
<meta property="og:description" content="{{ description }}">
<meta property="og:type" content="article">
<meta property="og:url" content="{{ site.url }}{{ page.url }}">
<meta property="og:image" content="{{ image }}">
<!-- Twitter Card Meta Tags -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ title }}">
<meta name="twitter:description" content="{{ description }}">
<meta name="twitter:image" content="{{ image }}">
<!-- Structured Data (JSON-LD) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "{{ title }}",
"description": "{{ description }}",
"image": "{{ image }}",
"author": {
"@type": "Person",
"name": "{{ site.author.name }}"
},
"datePublished": "{{ date }}",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "{{ site.url }}{{ page.url }}"
}
}
</script>
<script src="https://cdn.tailwindcss.com"></script> <script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">

View File

@@ -1,6 +1,8 @@
--- ---
title: "Blog" title: "Blog"
layout: "layout.njk" layout: "layout.njk"
sitemapPriority: 0.8
sitemapChangefreq: "monthly"
--- ---
<h1 class="text-4xl font-bold text-white mb-8 section-title">All Posts</h1> <h1 class="text-4xl font-bold text-white mb-8 section-title">All Posts</h1>

View File

@@ -3,7 +3,10 @@ title: "Junos ZTP with Dnsmasq DHCP in OPNsense"
date: "2025-08-14" date: "2025-08-14"
layout: "post.njk" layout: "post.njk"
tags: "posts" tags: "posts"
description: "Stop configuring your new lab devices manually!"
excerpt: "Stop configuring your new lab devices manually!" excerpt: "Stop configuring your new lab devices manually!"
sitemapPriority: 0.5
sitemapChangefreq: "never"
--- ---
Most people know that DHCP (Dynamic Host Configuration Protocol) is a protocol used to dynamically allocate IP addresses. But did you know that it can be used to configure other host device settings? Network device vendors like Junip... *ermm*, HPE Networking... take advantage of DHCP to implement "Zero Touch Provisioning" and even perform software upgrades for out-of-the-box devices. Here I will show you how to use OPNsense with Dnsmasq DHCP to "auto-provision" your Junos devices. Most people know that DHCP (Dynamic Host Configuration Protocol) is a protocol used to dynamically allocate IP addresses. But did you know that it can be used to configure other host device settings? Network device vendors like Junip... *ermm*, HPE Networking... take advantage of DHCP to implement "Zero Touch Provisioning" and even perform software upgrades for out-of-the-box devices. Here I will show you how to use OPNsense with Dnsmasq DHCP to "auto-provision" your Junos devices.

View File

@@ -3,7 +3,10 @@ title: "My First Blog Post"
date: "2025-08-05" date: "2025-08-05"
layout: "post.njk" layout: "post.njk"
tags: "posts" tags: "posts"
description: "First post made using Eleventy!"
excerpt: Made using Eleventy! excerpt: Made using Eleventy!
sitemapPriority: 0.5
sitemapChangefreq: "never"
--- ---
Welcome to my new blog! This is my very first post. This website was created using eleventy in a custom nodejs docker container, pretty cool huh?? Maybe I'll post the source code here one day! Welcome to my new blog! This is my very first post. This website was created using eleventy in a custom nodejs docker container, pretty cool huh?? Maybe I'll post the source code here one day!

View File

@@ -1,9 +0,0 @@
---
title: ""
date: ""
layout: "post.njk"
#tags: "posts"
excerpt: ""
---
Type here

View File

@@ -2,6 +2,7 @@
title: "Test page!" title: "Test page!"
date: "2025-08-07" date: "2025-08-07"
layout: "post.njk" layout: "post.njk"
draft: true
excerpt: This post is a feature showcase of what you can do with Eleventy excerpt: This post is a feature showcase of what you can do with Eleventy
--- ---

View File

@@ -2,6 +2,8 @@
title: "Jesus - Network Engineer" title: "Jesus - Network Engineer"
layout: "layout.njk" layout: "layout.njk"
descrption: "A website showcasing my skills and experience as a network engineer" descrption: "A website showcasing my skills and experience as a network engineer"
sitemapPriority: 0.9
sitemapChangefreq: "weekly"
--- ---
<!-- Hero Section --> <!-- Hero Section -->
<section id="hero" class="text-center py-20"> <section id="hero" class="text-center py-20">

9
src/robots.txt Normal file
View File

@@ -0,0 +1,9 @@
User-agent: *
Allow: /
User-agent: GPTBot
Disallow: /
Host: https://jesus.twk95.com
Sitemap: https://jesus.twk95.com/sitemap.xml

25
src/sitemap.xml.njk Normal file
View File

@@ -0,0 +1,25 @@
---
permalink: /sitemap.xml
eleventyExcludeFromCollections: true
---
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{%- for page in collections.all %}
{%- set draft = page.data.draft %}
{%- if not draft %}
{%- set priority = page.data.priority if page.data.priority else "0.5" %}
<url>
<loc>{{ site.url }}{{ page.url }}</loc>
<lastmod>{{ page.date | htmlDateString }}</lastmod>
<changefreq>{{ page.data.sitemapChangefreq | default("monthly") }}</changefreq>
<priority>{{ page.data.sitemapPriority | default(0.8) }}</priority>
</url>
{%- endif %}
{%- endfor %}
<url>
<loc>https://jesus.twk95.com/resume/jesus.pdf</loc>
<lastmod>2025-08-21</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>