SIGN IN SIGN UP

SEO: restore the docs site and make it a dofollow backlink source (#373)

* docs: add SEO/backlink design spec

Documents the dead Pages site (legacy build_type since 0f87ab1),
the verified nofollow status of PyPI/GitHub surfaces, and the
design for restoring the docs site as the project's only dofollow
backlink source for eulerstream.com.

* docs: add SEO/backlink implementation plan

12 tasks, TDD-ordered around a verification script that asserts the SEO
invariants against built HTML and gates the docs build in CI.

* test: add SEO invariant verification script for built docs

* docs: derive version from __version__.py, add SEO title and baseurl

Kills the stale-title drift at the source: conf.py read manifest.json,
pinned at 6.6.5, so every page rendered 'TikTokLive v6.6.5'.

* docs: add sitemap.xml and Open Graph metadata

* docs: add unique homepage content above the README include

The homepage was a near-exact duplicate of the GitHub README rendering,
risking consolidation away from the only page whose dofollow links count.

* docs: add sitewide Euler Stream attribution blocks

Sidebar and footer dofollow links with varied anchor text. This is the
only surface in the project where we control link markup: PyPI and
GitHub both hard-code rel=nofollow.

* docs: add extra/ passthrough for Search Console verification

* build: expand PyPI project URLs, summary and classifiers

* ci: fail the docs build on SEO regressions

* docs: point footer attribution at a distinct Euler Stream page

Sidebar and footer both targeted the site root with different anchor
text on every page, which reads as anchor diversification to a single
URL rather than genuine variety.

* build: declare the modified AGPL license consistently

The classifier claimed MIT while the license field said AGPL. LICENSE is
AGPL-3.0 plus added Sections 19-21 (additional restrictions and excepted
parties), which is not OSI-approved, so it is declared as Other/Proprietary
pointing at the license text itself.

* ci: require a minimum eulerstream link count per page

A presence-only check would stay green if Furo restructured its footer
block and Jinja silently dropped our override, losing a third of the
sitewide link profile.

* docs: make og:description derive cleanly for social previews

sphinxext-opengraph always derives og:description from the doctree and
ignores per-page overrides (verified in 0.13.0 source: get_tags computes
it unconditionally; only og:image supports a field override). It also
concatenates paragraphs up to ogp_description_length.

The homepage previously rendered "...only a creator's@unique_id an..." --
a dropped space before an inline literal, plus a mid-word cut. Fixed at
the source: the opening paragraph is now a short self-contained sentence,
the length is sized to stop at its boundary, and the inline literal moved
out of the derived range.

* build: declare license as a short string, not the inlined file

license = { file = "LICENSE" } inlined all 37KB of license text into the
METADATA License field, which PyPI renders verbatim on the project page
(wheel METADATA was 69KB). The full text still ships via license-files.
I
Isaac Kogan committed
db329819fcb9763672d6cab3f1f54445d156bb9d
Parent: f64b516
Committed by GitHub <noreply@github.com> on 8/18/2026, 4:14:51 AM