Skip to content

fix(seo): named authors are shown on the page but dropped from JSON-LD (~58 pages) #18995

Description

@konopkja

Describe the bug

Named authors are displayed on the page but dropped from the page's JSON-LD, so crawlers are told the author is the generic community organization.

resolveKnownEntities() in src/lib/jsonld/utils.ts drops any frontmatter author value it cannot match to KNOWN_PERSONS / KNOWN_ORGANIZATIONS:

return list
  .map((v) => ENTITY_ALIASES[v.toLowerCase()] ?? null)
  .filter((e) => e !== null)      // <- unresolved authors are silently discarded

resolveAuthorsFromFrontmatter() then falls back to REFERENCE.ETHEREUM_COMMUNITY alone, so the page emits no Person or named Organization node at all.

To reproduce

public/content/developers/tutorials/deploying-your-first-smart-contract/index.md has author: jdourlens. That name is rendered on the page:

curl -s https://ethereum.org/developers/tutorials/deploying-your-first-smart-contract/ | grep -c jdourlens
# -> non-zero (visible on the page)

But the structured data credits only the community org:

curl -s https://ethereum.org/developers/tutorials/deploying-your-first-smart-contract/ \
  | grep -o '"author":\[[^]]*\]' | head -1
# -> "author":[{"@id":"https://ethereum.org/#community-organization"}]

No Person node appears anywhere in the graph. Verified on production.

Scale

Of the distinct author values across non-translated markdown frontmatter, roughly 37 of 62 do not resolve, affecting about 58 pages. Most-affected values:

Pages Author value
7 jdourlens
7 Trailofbits (Trail of Bits)
4 Markus Waas
3 Elan Halpern
3 Sumi Mudgil
1 each CoinMarketCap, WIRED, Microsoft Security, ETHGlobal, Blockdaemon, Devconnect, Nym, CBER Forum, others

Counts come from a regex parse of frontmatter so treat them as approximate, but the mechanism is confirmed by the live check above.

Note this is separate from the 198 pages with no author field, where falling back to the community org is correct.

Expected behavior

A page that displays a named author should credit that author in its structured data.

Suggested fix

The pattern already exists in this repo. app/[locale]/videos/[slug]/page-jsonld.tsx handles the same situation correctly:

const { authorGraphNodes } = resolveAuthorsFromFrontmatter(frontmatter.author)
const creator =
  authorGraphNodes.length > 0
    ? { "@id": authorGraphNodes[0]["@id"] }
    : { "@type": "Person", name: frontmatter.author }   // anonymous fallback

The markdown route (app/[locale]/[...slug]/page-jsonld.tsx) has no equivalent fallback.

Two options, ideally both:

  1. Add the anonymous fallback to resolveAuthorsFromFrontmatter (or the markdown route), mirroring the video page. Recovers attribution on all ~58 pages with no curation work. An anonymous Person with just a name is valid schema.org.
  2. Curate the recurring entities into KNOWN_PERSONS / KNOWN_ORGANIZATIONS for the repeat authors (Trail of Bits, jdourlens, Markus Waas), so they get the full sameAs / description treatment and a stable @id. The alias map already accepts profile key, display name, or GitHub handle, so this is additive.

Option 1 is the fix; option 2 is the upgrade for the long tail's top entries.

Why this matters

This is an accuracy problem rather than a ranking one: the markup contradicts the visible page. It is also the one item in the current structured-data batch that adds correct information rather than removing incorrect information. Tutorials are the pages where third-party author attribution matters most.

To set expectations honestly: do not expect a ranking or AI-citation change from this. Author markup has no demonstrated citation effect.

Acceptance criteria

  • Every page displaying a named author emits a matching Person or Organization in its JSON-LD
  • /developers/tutorials/deploying-your-first-smart-contract/ credits jdourlens
  • Pages with no author field still fall back to the community org
  • Unresolved authors no longer disappear without a trace (fallback node, or a Sentry warning as the alias-collision path already does)

Metadata

Metadata

Assignees

No one assigned

    Labels

    SEObug 🐛Something isn't workingdev requiredThis requires developer resources

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions