diff --git a/.github/workflows/docs-build-check.yml b/.github/workflows/docs-build-check.yml
new file mode 100644
index 00000000..3d4f3f96
--- /dev/null
+++ b/.github/workflows/docs-build-check.yml
@@ -0,0 +1,33 @@
+name: Docs Build Check
+
+on:
+ pull_request:
+ push:
+ branches:
+ - master
+ - admincom/docs-improvements
+
+permissions:
+ contents: read
+
+jobs:
+ build-check:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
+ with:
+ enable-cache: true
+ cache-dependency-glob: "uv.lock"
+ python-version: "3.11"
+
+ - name: Install dependencies
+ run: uv sync --locked
+
+ - name: Build docs (strict)
+ run: uv run mkdocs build --strict
diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml
new file mode 100644
index 00000000..e9c24c2b
--- /dev/null
+++ b/.github/workflows/docs-deploy.yml
@@ -0,0 +1,54 @@
+name: Deploy Docs Preview
+
+on:
+ push:
+ branches:
+ - master
+ - admincom/docs-improvements
+ workflow_dispatch:
+
+permissions:
+ contents: write
+
+concurrency:
+ group: docs-deploy
+ cancel-in-progress: false
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@v6
+ with:
+ enable-cache: true
+ cache-dependency-glob: "uv.lock"
+ python-version: "3.11"
+
+ - name: Install dependencies
+ run: uv sync --locked
+
+ - name: Configure git identity for the gh-deploy commit
+ run: |
+ git config user.name "github-actions[bot]"
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+
+ # This fork's preview serves at a dedicated dev domain, docs-dev.peeringdb.dk,
+ # distinct from upstream production's docs.peeringdb.com. The domain is set
+ # as a repo variable (Settings -> Secrets and variables -> Actions ->
+ # Variables -> SITE_URL_OVERRIDE) rather than hardcoded here, so it can be
+ # changed without editing this file. It feeds both scripts/generate_cname.py
+ # (writes docs/CNAME) and scripts/generate_blog_atom_feed.py (the feed's
+ # self-link), so both stay in sync with wherever this deploy actually serves
+ # from. Safe by default if this branch is ever merged upstream: with no
+ # variable set there, both hooks fall back to mkdocs.yml's site_url
+ # (docs.peeringdb.com), so no manual CNAME edit is needed at merge time.
+ - name: Deploy to gh-pages
+ env:
+ SITE_URL_OVERRIDE: ${{ vars.SITE_URL_OVERRIDE }}
+ run: uv run mkdocs gh-deploy --clean --force --no-history
diff --git a/.gitignore b/.gitignore
index 62d55573..980dd2d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,8 @@ site/
.DS_Store
venv/
.venv/
+docs/blog/atom.xml
+docs/release_notes/atom.xml
+docs/CNAME
+__pycache__/
+*.pyc
diff --git a/docs/CNAME b/docs/CNAME
deleted file mode 100644
index 83962e7c..00000000
--- a/docs/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-docs.peeringdb.com
diff --git a/docs/blogs.md b/docs/blogs.md
index 48a41f18..59f0c5ce 100644
--- a/docs/blogs.md
+++ b/docs/blogs.md
@@ -2,6 +2,8 @@
PeeringDB blogs provide deeper insight into the releases and product roadmap.
+Subscribe via [Atom feed](blog/atom.xml) to get notified of new posts.
+
## 2026
- [Do We Still Need Public Beta?](blog/public_beta.md) - July 26, 2026
- [Data Quality for Networks](blog/data_quality_for_networks.md) - July 1, 2026
diff --git a/docs/extra.css b/docs/extra.css
index 73cc638d..53b9bb3d 100644
--- a/docs/extra.css
+++ b/docs/extra.css
@@ -169,4 +169,46 @@ a:hover {
.note .admonition-title {
color: #00203e;
background-color: #f1f1f1;
+}
+
+/* 3.5rem matches the nav bar's own documented height (see mkdocs's base.css:
+ `scroll-padding-top: calc(3.5rem + 20px)`), which is exactly what .nav-link's
+ 1rem top + 1rem bottom padding plus Bootstrap's 1.5rem default line-height add
+ up to. Setting the banner to the same value keeps it visually equal-height
+ without measuring anything at runtime. */
+.fork-banner {
+ background-color: #e6e6fa;
+ color: #ff69b4;
+ font-family: "Comic Sans MS", "Comic Sans", cursive;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 3.5rem;
+ font-size: 1.1rem;
+ padding: 0 8px;
+ box-sizing: border-box;
+ overflow: hidden;
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1031; /* above Bootstrap's .navbar.fixed-top (1030), so it stays on top when both stick */
+}
+
+/* The nav bar normally sticks at the very top (base.css's .navbar.fixed-top
+ override). With the banner also stuck at top:0 above it, offset the nav down
+ by the banner's own height so they stack together instead of overlapping. */
+body.has-fork-banner .navbar.fixed-top {
+ top: 3.5rem;
+}
+
+.fork-banner-text {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 100%;
+}
+
+.fork-banner a {
+ color: #ff1493;
+ text-decoration: underline;
}
\ No newline at end of file
diff --git a/docs/release_notes/index.md b/docs/release_notes/index.md
index 6bd52a16..a315fa52 100644
--- a/docs/release_notes/index.md
+++ b/docs/release_notes/index.md
@@ -4,6 +4,8 @@ The release notes list the GitHub issues and a summary of what has changed in Pe
Each new release has a one week beta test period on the [beta server](https://beta.peeringdb.com/) before it goes live. The beta and new releases are announced on the [PeeringDB Announce Mailing List](https://lists.peeringdb.com/cgi-bin/mailman/listinfo/pdb-announce) and on [Facebook](https://www.facebook.com/peeringdb), [LinkedIn](https://www.linkedin.com/company/peeringdb) and [X](https://x.com/PeeringDB).
+Subscribe via [Atom feed](atom.xml) to get notified of new releases.
+
## Release schedule
This schedule provides planned dates for PeeringDB’s future releases. We are sharing these dates to help PeeringDB users plan ahead for testing new and improved features in beta. We also want to help volunteer developers know the date on which their code changes are needed for internal testing before beta release.
diff --git a/mkdocs.yml b/mkdocs.yml
index 6a91e2eb..84b67c4d 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1,5 +1,11 @@
site_name: PeeringDB Docs
site_url: https://docs.peeringdb.com/
+
+hooks:
+ - scripts/generate_blog_atom_feed.py
+ - scripts/generate_release_notes_atom_feed.py
+ - scripts/generate_cname.py
+ - scripts/generate_banner.py
# This line adds the "Edit on GitHub" link
#repo_url: https://github.com/peeringdb/docs
theme:
diff --git a/peeringdb_theme/base.html b/peeringdb_theme/base.html
new file mode 100644
index 00000000..e2e04794
--- /dev/null
+++ b/peeringdb_theme/base.html
@@ -0,0 +1,235 @@
+
+
+
+