Anton Bakulin

SEO and Metadata

Contents

OnyxFolio generates rich metadata for every page automatically — no plugins or third-party services required.


OpenGraph / Twitter Card

Every page gets <meta> tags for social sharing:

Meta tag Source
og:title / twitter:title Post title
og:description / twitter:description Post summary
og:image / twitter:image banner frontmatter URL
og:url Canonical URL of the page
og:type article for posts, website for homepage
twitter:card summary_large_image if banner set, else summary

These tags are injected in a {% block meta %} in base.html and overridden per page.


Add a banner image to any note:

banner: "https://example.com/photo.jpg"
banner_x: 0.5   # horizontal focal point, 0–1 (default: 0.5)
banner_y: 0.4   # vertical focal point, 0–1 (default: 0.5)

The banner is used as the OpenGraph / Twitter Card image. It also appears as a hero image at the top of the post page, with CSS object-position set from banner_x and banner_y so the focal point stays visible at any aspect ratio.


JSON-LD structured data

OnyxFolio injects a <script type="application/ld+json"> block on each page for Google rich results.

Article schema (regular posts)

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Post Title",
  "datePublished": "2026-04-16",
  "dateModified": "2026-04-20",
  "author": [{"@type": "Person", "name": "Jane Doe"}],
  "image": "https://example.com/banner.jpg"
}

Book schema (type: book posts)

{
  "@context": "https://schema.org",
  "@type": "Book",
  "name": "Book Title",
  "author": [{"@type": "Person", "name": "Jane Doe"}]
}

WebSite schema (homepage)

{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Site Name",
  "url": "https://example.com"
}

Author field

author: "Jane Doe"

Or multiple authors:

author:
  - Jane Doe
  - John Smith

Shown in post meta (below the title) and included in JSON-LD author array.


Updated date

updated: 2026-04-20

Shown as "Updated April 20, 2026" in post meta. Maps to dateModified in JSON-LD.


Reading time

Estimated reading time is computed at load time from word count (200 words per minute) and shown on post pages and listing cards.


Canonical URL

Each page's canonical URL is injected as <link rel="canonical"> using request.base_url (the URL without query parameters). This prevents duplicate-content issues with paginated listing pages.


Sitemap

All published URLs are listed in /sitemap.xml. See RSS and Sitemap for details.


See also