Skip to content

Audit & improve on-page SEO metadata (per-page meta descriptions, canonical URLs, structured data/JSON-LD) #1324

Description

@jonfroehlich

Motivation

The sitemap is now live and submitted to Google Search Console (#1252, #1313), so Google can discover our ~718 pages — but a sitemap doesn't affect ranking or how pages appear in results. The on-page metadata our templates emit is where the actual improvements live: accurate search snippets, correct canonicalization, and rich results. This issue audits what we emit today and fills the gaps.

Current state (quick audit, 2026-06-17)

Already in good shape:

  • Page titles — 10 of 11 page templates override {% block pagetitle %} (defined in website/templates/website/base.html:107), so most pages get a descriptive … | Makeability Lab title rather than the generic url_name fallback. (Audit should still spot-check title content for uniqueness/length, and catch pages that fall back — e.g. view_project_people.html hardcodes its own <title>Project People Viewer</title>.)
  • Open Graphproject.html, news_item.html, and member.html emit a fairly complete OG set (og:title/type/description/image/url, plus article:published_time, profile:first_name). Social-share previews are decent.

Gaps to address:

  1. No per-page <meta name="description">. Only one site-wide description exists (base.html:59); detail pages set og:description but not the standard meta description, so Google's snippet source is identical on every page. Add per-page descriptions sourced from real fields (person bio, project summary, news excerpt, publication abstract).

  2. No structured data (JSON-LD / schema.org) anywhere (grep for application/ld+json / itemtype returns nothing). Biggest opportunity for an academic lab. Candidates:

    • Publications → ScholarlyArticle (authors, datePublished, venue, PDF URL)
    • People → Person (affiliation, jobTitle, sameAs links to Scholar/ORCID/etc.)
    • Lab/site → Organization / university affiliation
    • News → Article / NewsArticle
    • Listing pages → BreadcrumbList / ItemList
  3. No rel=\"canonical\". Especially relevant because the same view is served at both /projects/<name>/ and /project/<name>/ (documented in CLAUDE.md). Without a canonical tag that's duplicate-content dilution. Add canonicals (project pages first).

  4. No Twitter Card tags (twitter:card, etc.). OG partially covers Twitter via fallback, but an explicit summary_large_image improves X/Twitter previews. Low priority.

  5. Minor / verify: og:description appears more than once in some templates (project.html, news_item.html, member.html) — likely {% if %}/{% else %} branches; confirm they're mutually exclusive and not double-emitted.

Proposed approach

  • Audit-first: enumerate every page type and record title / description / canonical / OG / structured-data status in a table (in this issue).
  • Then implement in small PRs, each its own branch per repo convention — likely:
    • (a) per-page <meta name="description"> + rel="canonical"
    • (b) JSON-LD for publications + people
    • (c) remaining types (news, projects, listings) + Twitter cards
  • Validate with Google's Rich Results Test and the Search Console Enhancements reports after each deploy.

Constraints

  • Vanilla Django templates; no new JS frameworks or build step (matches repo conventions).
  • Keep markup a11y-correct (overlaps with the semantic-HTML / a11y umbrella Improve accessibility of Makeability Lab website #1240).
  • Structured data must reflect real DB fields — no fabricated values.

Definition of done (audit portion)

  • A table in this issue capturing current title / description / canonical / OG / JSON-LD coverage per page type.
  • A prioritized list of concrete template changes, split into implementable sub-PRs.

Filed as the on-page-SEO complement to the sitemap work (#1252, #1313).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions