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