diff --git a/README.md b/README.md
index ff444af..00fba2d 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,7 @@ GitGen generates a static HTML site with the following capabilities:
- Diffstat summary
- Unified diff view (truncated to 500 lines)
- Safe HTML escaping throughout
+ - SEO meta
- Parallel repository processing for faster generation
All output is static HTML and CSS, suitable for hosting on any static web server.
diff --git a/gitgen.py b/gitgen.py
index c69345a..318c60c 100644
--- a/gitgen.py
+++ b/gitgen.py
@@ -382,7 +382,34 @@ class HTMLGenerator:
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{repo['name_escaped']} - Repository Overview</title>
+ <meta name="description" content="{repo['description']}">
<link rel="stylesheet" href="../main.css">
+
+ <!-- Open Graph -->
+ <meta property="og:site_name" content="{BASE_NAME}">
+ <meta property="og:url" content="{BASE_URL}/{repo['name']}">
+ <meta property="og:title" content="{repo['name_escaped']} - Repository Overview">
+ <meta property="og:description" content="{repo['description']}">
+ <meta property="og:type" content="website">
+ <meta property="og:locale" content="en_GB">
+
+ <!-- Twitter Card -->
+ <meta property="twitter:card" content="summary">
+ <meta property="twitter:url" content="{BASE_URL}/{repo['name']}">
+ <meta property="twitter:title" content="{repo['name_escaped']} - Repository Overview">
+ <meta property="twitter:description" content="{repo['description']}">
+
+ <!-- Microdata -->
+ <script type="application/ld+json">
+ {{
+ "@context": "http://schema.org",
+ "@type": "website",
+ "name": "{repo['name_escaped']} - Repository Overview",
+ "headline": "{repo['name_escaped']} - Repository Overview",
+ "url": "{BASE_URL}/{repo['name']}",
+ "description": "{repo['description']}"
+ }}
+ </script>
</head>
<body>
<div class="header">
@@ -438,7 +465,34 @@ class HTMLGenerator:
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{repo['name_escaped']} - Files</title>
+ <meta name="description" content="Files list for repo: {repo['name_escaped']}">
<link rel="stylesheet" href="../main.css">
+
+ <!-- Open Graph -->
+ <meta property="og:site_name" content="{BASE_NAME}">
+ <meta property="og:url" content="{BASE_URL}/{repo['name']}/files.html">
+ <meta property="og:title" content="{repo['name_escaped']} - Files list">
+ <meta property="og:description" content="Files list for repo: {repo['name_escaped']}">
+ <meta property="og:type" content="website">
+ <meta property="og:locale" content="en_GB">
+
+ <!-- Twitter Card -->
+ <meta property="twitter:card" content="summary">
+ <meta property="twitter:url" content="{BASE_URL}/{repo['name']}/files.html">
+ <meta property="twitter:title" content="{repo['name_escaped']} - Files list">
+ <meta property="twitter:description" content="Files list for repo: {repo['name_escaped']}">
+
+ <!-- Microdata -->
+ <script type="application/ld+json">
+ {{
+ "@context": "http://schema.org",
+ "@type": "website",
+ "name": "{repo['name_escaped']} - Files list",
+ "headline": "{repo['name_escaped']} - Files list",
+ "url": "{BASE_URL}/{repo['name']}/files.html",
+ "description": "Files list for repo: {repo['name_escaped']}"
+ }}
+ </script>
</head>
<body>
<div class="header">
@@ -503,7 +557,34 @@ class HTMLGenerator:
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{repo['name_escaped']} - Commits</title>
+ <meta name="description" content="Commit History for repo: {repo['name_escaped']}">
<link rel="stylesheet" href="../main.css">
+
+ <!-- Open Graph -->
+ <meta property="og:site_name" content="{BASE_NAME}">
+ <meta property="og:url" content="{BASE_URL}/{repo['name']}/commits.html">
+ <meta property="og:title" content="{repo['name_escaped']} - Commit History">
+ <meta property="og:description" content="Commit History for repo: {repo['name_escaped']}">
+ <meta property="og:type" content="website">
+ <meta property="og:locale" content="en_GB">
+
+ <!-- Twitter Card -->
+ <meta property="twitter:card" content="summary">
+ <meta property="twitter:url" content="{BASE_URL}/{repo['name']}/commits.html">
+ <meta property="twitter:title" content="{repo['name_escaped']} - Commit History">
+ <meta property="twitter:description" content="Commit History for repo: {repo['name_escaped']}">
+
+ <!-- Microdata -->
+ <script type="application/ld+json">
+ {{
+ "@context": "http://schema.org",
+ "@type": "website",
+ "name": "{repo['name_escaped']} - Commit History",
+ "headline": "{repo['name_escaped']} - Commit History",
+ "url": "{BASE_URL}/{repo['name']}/commits.html",
+ "description": "Commit History for repo: {repo['name_escaped']}"
+ }}
+ </script>
</head>
<body>
<div class="header">
@@ -692,7 +773,34 @@ class HTMLGenerator:
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Commit {commit_details['short_hash']} - {repo['name_escaped']}</title>
+ <meta name="description" content="Details of commit ID {commit_details['short_hash']} in repo: {repo['name_escaped']}">
<link rel="stylesheet" href="../../main.css">
+
+ <!-- Open Graph -->
+ <meta property="og:site_name" content="{BASE_NAME}">
+ <meta property="og:url" content="{BASE_URL}/{repo['name']}/commits/{commit_details['short_hash']}.html">
+ <meta property="og:title" content="{repo['name_escaped']} - Commit ID {commit_details['short_hash']}">
+ <meta property="og:description" content="Details of commit ID {commit_details['short_hash']} in repo: {repo['name_escaped']}">
+ <meta property="og:type" content="website">
+ <meta property="og:locale" content="en_GB">
+
+ <!-- Twitter Card -->
+ <meta property="twitter:card" content="summary">
+ <meta property="twitter:url" content="{BASE_URL}/{repo['name']}/commits/{commit_details['short_hash']}.html">
+ <meta property="twitter:title" content="{repo['name_escaped']} - Commit ID {commit_details['short_hash']}">
+ <meta property="twitter:description" content="Details of commit ID {commit_details['short_hash']} in repo: {repo['name_escaped']}">
+
+ <!-- Microdata -->
+ <script type="application/ld+json">
+ {{
+ "@context": "http://schema.org",
+ "@type": "website",
+ "name": "{repo['name_escaped']} - Commit ID {commit_details['short_hash']}",
+ "headline": "{repo['name_escaped']} - Commit ID {commit_details['short_hash']}",
+ "url": "{BASE_URL}/{repo['name']}/commits/{commit_details['short_hash']}.html",
+ "description": "Details of commit ID {commit_details['short_hash']} in repo: {repo['name_escaped']}"
+ }}
+ </script>
</head>
<body>
<div class="header">