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:
- 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.
- 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
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()insrc/lib/jsonld/utils.tsdrops any frontmatter author value it cannot match toKNOWN_PERSONS/KNOWN_ORGANIZATIONS:resolveAuthorsFromFrontmatter()then falls back toREFERENCE.ETHEREUM_COMMUNITYalone, so the page emits noPersonor namedOrganizationnode at all.To reproduce
public/content/developers/tutorials/deploying-your-first-smart-contract/index.mdhasauthor: jdourlens. That name is rendered on the page:But the structured data credits only the community org:
No
Personnode 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:
jdourlensTrailofbits(Trail of Bits)Markus WaasElan HalpernSumi MudgilCoinMarketCap,WIRED,Microsoft Security,ETHGlobal,Blockdaemon,Devconnect,Nym,CBER Forum, othersCounts 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.tsxhandles the same situation correctly:The markdown route (
app/[locale]/[...slug]/page-jsonld.tsx) has no equivalent fallback.Two options, ideally both:
resolveAuthorsFromFrontmatter(or the markdown route), mirroring the video page. Recovers attribution on all ~58 pages with no curation work. An anonymousPersonwith just anameis valid schema.org.KNOWN_PERSONS/KNOWN_ORGANIZATIONSfor the repeat authors (Trail of Bits,jdourlens,Markus Waas), so they get the fullsameAs/descriptiontreatment 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
PersonorOrganizationin its JSON-LD/developers/tutorials/deploying-your-first-smart-contract/creditsjdourlens