Skip to content

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

@jonfroehlich

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions