### Local Development Setup with Jekyll
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
Instructions for setting up the local development environment for the archive using Git, Bundler, and Jekyll. Includes commands for cloning, installing dependencies, serving with live reload, and building for production.
```bash
# 1. Clone the repository
git clone https://github.com/deepakness/seo-by-the-sea-archive.git
cd seo-by-the-sea-archive
# 2. Install dependencies (requires Ruby)
bundle install
# 3. Serve locally with live reload
bundle exec jekyll serve --livereload
# Site available at http://localhost:4000/seo-by-the-sea-archive/
# 4. Build for production (output to _site/)
bundle exec jekyll build
```
--------------------------------
### Example Search Index Record
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
An example of a single record within the generated search index JSON array. Each record contains metadata and truncated content for a specific archived post.
```json
{
"title": "Google's Adaptive PageRank Patent",
"url": "/seo-by-the-sea-archive/archive/posts/googles-adaptive-pagerank-patent/",
"date_published": "2012-04-18",
"source_url": "https://www.seobythesea.com/2012/04/googles-adaptive-pagerank-patent/",
"slug": "googles-adaptive-pagerank-patent",
"author": "Bill Slawski",
"content": "Google filed a patent in 2011 describing an adaptive version of PageRank..."
}
```
--------------------------------
### Archived Post Front Matter Example
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
YAML front matter structure for each archived post, including layout, title, author, date, source URL, and slug. The `source_url` is mandatory.
```yaml
---
layout: post
archived_post: true
title: "Google's Adaptive PageRank Patent"
author: "Bill Slawski"
date_published: "2012-04-18"
source_url: "https://www.seobythesea.com/2012/04/googles-adaptive-pagerank-patent/"
slug: "googles-adaptive-pagerank-patent"
---
Google filed a patent in 2011 describing an adaptive version of PageRank...
## What the Patent Describes
The adaptive PageRank patent (US 8,131,716) introduced the concept of...
```
--------------------------------
### Takedown or Correction Request Instructions
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
Follow these instructions to submit a GitHub Issue for takedown or correction requests. Provide the necessary details for prompt action.
```markdown
Open a GitHub Issue at:
https://github.com/deepakness/seo-by-the-sea-archive/issues
Include:
- The post URL or archive/posts/{slug}/ path
- What you want corrected, updated, or removed
- Your relationship to the content (author, rightsholder, representative)
```
--------------------------------
### Pull Request Checklist for Contributions
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
Use this checklist when opening a pull request to ensure your contribution adheres to the project's guidelines. Focus on specific issues and avoid rewriting original content.
```markdown
Good contributions:
- Fix broken internal archive links
- Fix broken local media references
- Correct metadata issues in manifests or navigation pages
- Improve topic indexes and reading paths
- Improve accessibility, readability, or mobile behavior
Please avoid:
- Rewriting Bill's posts
- Adding commentary inside archived post bodies
- Adding a broad open-source license to archived writing or media
- Bulk formatting changes that make preservation diffs harder to review
PR checklist:
- [ ] Change is focused (one issue at a time)
- [ ] Explain what was corrected and how you verified it
- [ ] Attribution and source_url fields preserved
- [ ] GitHub Pages still builds after site-file changes
```
--------------------------------
### Default HTML Layout with SEO Meta Tags
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
The default layout provides the full HTML shell, including smart SEO meta tags for titles and descriptions, navigation, and injected search configuration globals. It handles fallback logic for SEO descriptions based on page content or site defaults.
```html
{% assign seo_title = site.title %}
{% if page.title %}
{% assign seo_title = page.title | append: " | " | append: site.title %}
{% endif %}
{% assign seo_description = page.description | default: "" | strip %}
{% if seo_description == "" and page.archived_post %}
{% assign seo_description = page.content | markdownify | strip_html
| normalize_whitespace | strip | truncate: 155 %}
{% endif %}
{% if seo_description == "" %}
{% assign seo_description = site.description %}
{% endif %}
{{ seo_title | escape }}Skip to contentSEO by the SeaPreservation Archive{{ content }}
```
--------------------------------
### Jekyll Site Configuration (_config.yml)
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
Defines the basic settings for the Jekyll site, including title, URL, base URL, Markdown processor, and default layouts for pages and posts.
```yaml
title: "SEO by the Sea Archive"
description: "A preservation archive of Bill Slawski's SEO by the Sea writing."
url: "https://deepakness.github.io"
baseurl: "/seo-by-the-sea-archive"
markdown: kramdown
kramdown:
input: GFM # GitHub Flavored Markdown
exclude:
- Gemfile
- Gemfile.lock
- README.md
- vendor
defaults:
# All pages default to the "page" layout
- scope:
path: ""
type: "pages"
values:
layout: "page"
# Posts in archive/posts/ automatically use "post" layout and are flagged
- scope:
path: "archive/posts"
type: "pages"
values:
layout: "post"
archived_post: true
```
--------------------------------
### Client-Side Search Script (JavaScript)
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
Implements an in-memory search by fetching 'search.json', scoring results based on title, slug, and content, and displaying up to 50 matches. Requires the 'search.json' file and specific HTML elements for input, status, and results.
```javascript
// assets/site.js — full implementation
(function () {
// Resolve URLs against the Jekyll baseurl injected in the page
function baseUrl(path) {
var base = window.ARCHIVE_BASEURL || "";
return base + path;
}
// Case-insensitive normalisation
function normalize(value) {
return (value || "").toString().toLowerCase();
}
// Human-readable date formatting using the browser locale
function formatDate(value) {
if (!value) return "";
var date = new Date(value);
if (Number.isNaN(date.getTime())) return value.slice(0, 10);
return date.toLocaleDateString(undefined, {
year: "numeric", month: "short", day: "numeric"
});
}
// Relevance scoring: title=8, slug=4, content=1 per matching term
function scoreItem(item, terms) {
var title = normalize(item.title);
var slug = normalize(item.slug);
var content = normalize(item.content);
var score = 0;
terms.forEach(function (term) {
if (title.indexOf(term) !== -1) score += 8;
if (slug.indexOf(term) !== -1) score += 4;
if (content.indexOf(term) !== -1) score += 1;
});
return score;
}
function initSearch() {
var input = document.querySelector("[data-search-input]");
var resultsEl = document.querySelector("[data-search-results]");
var statusEl = document.querySelector("[data-search-status]");
if (!input || !resultsEl || !statusEl) return;
// Support ?q= URL parameter for deep-linking to a search query
var params = new URLSearchParams(window.location.search);
input.value = params.get("q") || "";
fetch(baseUrl("/search.json"))
.then(function (r) {
if (!r.ok) throw new Error("Search index unavailable");
return r.json();
})
.then(function (items) {
function run() {
var query = input.value.trim();
var terms = normalize(query).split(/\s+/).filter(Boolean);
var matches = [];
if (terms.length) {
matches = items
.map(function (item) {
return { item: item, score: scoreItem(item, terms) };
})
.filter(function (e) { return e.score > 0; })
.sort(function (a, b) { return b.score - a.score; })
.map(function (e) { return e.item; });
}
// Render up to 50 results
resultsEl.innerHTML = "";
if (!query) {
statusEl.textContent = window.ARCHIVE_EMPTY_SEARCH_TEXT ||
"Type a topic, title, date, source URL, or phrase.";
return;
}
if (!matches.length) {
statusEl.textContent = "No matching archived posts found.";
return;
}
statusEl.textContent = matches.length + " result" +
(matches.length === 1 ? "" : "s");
matches.slice(0, 50).forEach(function (item) {
var li = document.createElement("li");
var link = document.createElement("a");
var meta = document.createElement("span");
var excerpt = document.createElement("p");
link.className = "item-title";
link.href = item.url;
link.textContent = item.title || item.slug || "Untitled post";
meta.className = "item-meta";
meta.textContent = [
formatDate(item.date_published),
item.author || window.ARCHIVE_DEFAULT_AUTHOR || ""
].filter(Boolean).join(" / ");
excerpt.textContent = item.content || "";
li.appendChild(link);
li.appendChild(meta);
li.appendChild(excerpt);
resultsEl.appendChild(li);
});
}
input.addEventListener("input", run);
run(); // run immediately in case ?q= is present
})
.catch(function () {
statusEl.textContent = "Search index could not be loaded.";
});
}
document.addEventListener("DOMContentLoaded", initSearch);
}());
```
--------------------------------
### Markdown Structure for Curated Reading Paths
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
This markdown excerpt shows the structure for organizing curated reading paths by topic, including links to specific archived posts and general search queries.
```markdown
## Search Patents and PageRank
- [Google's Adaptive PageRank Patent](/archive/posts/googles-adaptive-pagerank-patent/)
- [New PageRank Same as Old PageRank?](/archive/posts/new-pagerank-same-as-old-pagerank/)
- [Replacement PageRank](/archive/posts/replacement-pagerank/)
- [Search all PageRank posts](/search/?q=PageRank)
## Entities and Knowledge Graphs
- [Answering Queries with a Knowledge Graph](/archive/posts/answering-queries-with-a-knowledge-graph/)
- [Google Knowledge Graph Reconciliation](/archive/posts/google-knowledge-graph-reconciliation/)
- [Entity Names in Google](/archive/posts/entity-names-in-google/)
- [Search entity posts](/search/?q=entities)
## Local Search
- [Authority Pages for Businesses in Google's Local Search](/archive/posts/authority-documents-for-googles-local-search/)
- [Google Barcodes and Place Rank](/archive/posts/google-barcodes-and-place-rank-transforming-local-search/)
- [Search local search posts](/search/?q=local%20search)
```
--------------------------------
### Jekyll Gemfile Configuration
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
This Gemfile specifies the necessary gems for building the Jekyll site, ensuring compatibility with the GitHub Pages environment.
```ruby
source "https://rubygems.org"
gem "github-pages", group: :jekyll_plugins
# Uses Jekyll 3.10.0 + kramdown 2.4.0 + rouge 3.30.0
```
--------------------------------
### Jekyll Post Layout (_layouts/post.html)
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
HTML structure for rendering individual archived posts, including header, preservation notice, content, and footer navigation. Uses Liquid templating for dynamic content.
```html
---
layout: default
---
Archived post
{{ page.title }}
{% if page.author %}{{ page.author }}{% endif %}
{% if page.date_published %}
{{ page.date_published | date: "%B %-d, %Y" }}
{% endif %}
{% if page.source_url %}
Original source
{% endif %}
This is a preservation copy. Rights remain with Bill Slawski and/or the
appropriate rightsholders.
{{ content }}
```
--------------------------------
### Search Index JSON Template
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
This Liquid template generates a JSON array of all archived posts, suitable for client-side search. It strips HTML, normalizes whitespace, and truncates content to manage file size. Ensure `layout: null` and `permalink: /search.json` are set.
```liquid
{% raw %}
---
layout: null
permalink: /search.json
---
{% assign posts = site.pages
| where_exp: "item", "item.archived_post == true"
| sort: "date_published"
| reverse %}
[
{% for post in posts %}
{
"title": {{ post.title | default: post.slug | jsonify }},
"url": {{ post.url | relative_url | jsonify }},
"date_published": {{ post.date_published | default: "" | jsonify }},
"source_url": {{ post.source_url | default: "" | jsonify }},
"slug": {{ post.slug | default: "" | jsonify }},
"author": {{ post.author | default: "Bill Slawski" | jsonify }},
"content": {{ post.content | strip_html | strip_newlines | truncate: 1600 | jsonify }}
}{% unless forloop.last %},{% endunless %}
{% endfor %}
]
{% endraw %}
```
--------------------------------
### HTML Structure for Search Page (HTML)
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
Provides the necessary HTML elements for the client-side search functionality. Includes a form for input, a paragraph for status messages, and an ordered list for displaying search results.
```html
Loading search index...
```
--------------------------------
### CSS Design System Tokens and Components
Source: https://context7.com/deepakness/seo-by-the-sea-archive/llms.txt
This CSS defines design tokens for colors, typography, and layout, along with component styles for notices, stats, and animations. It includes responsive adjustments for smaller screens.
```css
/* Design tokens */
:root {
--bg: #fbfbf8; /* off-white page background */
--paper: #ffffff; /* card/panel background */
--ink: #182026; /* primary text */
--muted: #5a6670; /* secondary text, meta */
--line: #d9ded8; /* borders and dividers */
--accent: #0b6f6a; /* teal — links, buttons, focus */
--accent-strong:#064d49; /* darker teal — hover states */
--warm: #a94732; /* rust — kicker labels, highlights */
--soft: #eef3f0; /* light teal tint — hover backgrounds */
--measure: 74ch; /* max prose width */
--wide: 1160px; /* max section width */
}
/* Archived post preservation notice */
.post-notice {
margin: 0 0 2rem;
padding: 0.9rem 1rem;
border-left: 4px solid var(--accent);
background: var(--soft);
color: var(--muted);
}
/* Stat counter grid (e.g., "1,290 archived posts") */
.stats-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1px;
margin-top: 2rem;
background: var(--line);
border: 1px solid var(--line);
}
.stat { background: var(--paper); padding: 1.25rem; }
.stat strong { display: block; font-size: clamp(1.7rem, 4vw, 3rem); }
/* Hero section entrance animation */
@keyframes rise-in {
from { opacity: 0; transform: translateY(18px); }
to { opacity: 1; transform: translateY(0); }
}
.home-hero__copy { animation: rise-in 580ms ease-out both; }
.home-hero__portrait { animation: rise-in 680ms ease-out 120ms both; }
/* Responsive: single column below 760px */
@media (max-width: 760px) {
.home-hero__content { grid-template-columns: 1fr; }
.stats-row, .link-grid { grid-template-columns: 1fr; }
.search-form { flex-direction: column; }
}
```
--------------------------------
### Iterate and Display Posts by Year
Source: https://github.com/deepakness/seo-by-the-sea-archive/blob/main/years.md
This Liquid code iterates through the sorted posts, extracts the year from the publication date, and conditionally creates new year headings and ordered lists. It handles posts without a publication date by assigning them to 'Undated'. This snippet structures the archive chronologically.
```liquid
{% for post in posts %}
{% if post.date_published %}
{% assign year = post.date_published | slice: 0, 4 %}
{% else %}
{% assign year = "Undated" %}
{% endif %}
{% if year != current_year %}
{% unless forloop.first %}{% endunless %}
{{ year }}
{% assign current_year = year %}
{% endif %}
{{ post.title }}
{% if post.date_published %}{{ post.date_published | date: "%B %-d, %Y" }}{% endif %}
{% if post.source_url %} / Original source{% endif %}
{% endfor %}
```
--------------------------------
### Assign and Sort Posts by Date
Source: https://github.com/deepakness/seo-by-the-sea-archive/blob/main/years.md
This Liquid code snippet assigns all archived pages to the 'posts' variable, sorts them by 'date_published' in ascending order, and then reverses the order to display the most recent posts first. It's used to prepare the data for chronological display.
```liquid
{% assign posts = site.pages | where_exp: "item", "item.archived_post == true" | sort: "date_published" | reverse %}
{% assign current_year = "" %}
```
=== COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.