In this guide, you’ll learn how Oolvay builds page metadata, structured data, and the web app manifest, and how robots.ts and sitemap.ts control what gets indexed. Together these four pieces form a single SEO system, not four separate concerns.
Oolvay sets a sitewide metadata default, then layers page-specific metadata and structured data on top of it per route. Search engines and social platforms read this layered output to decide how a page is titled, described, and previewed. The sitemap is database-driven, pulling published posts, categories, and authors at request time, alongside all docs pages sourced from the content layer.
| Piece | File | What it controls |
|---|---|---|
| Metadata | lib/metadata.ts, lib/seo/metadata/, lib/seo/jsonld/, lib/seo/schema/ | Page titles, descriptions, Open Graph and Twitter cards, and structured data (JSON-LD) |
| Manifest | app/manifest.json | How the app behaves when installed as a PWA, name, icons, theme color |
| Indexing | app/robots.ts, app/sitemap.ts | Which routes search engines are allowed to crawl, which URLs get submitted to them, and the sitemap URL crawlers are pointed to |
Each has its own dedicated page in this section. This page covers how they connect.
Every page on the site starts from one base, baseMetadata in lib/metadata.ts. This sets the fallback title, description, Open Graph image, icons, and robots directives that apply unless a specific page overrides them. It also sets applicationName, authors, creator, publisher, search engine verification tags for Google and Bing, full Open Graph fields including locale and siteName, a full Twitter card, and googleBot crawl directives.
0 / 2,000 characters
export const baseMetadata: Metadata = {
metadataBase: new URL(siteConfig.brand.url),
title: {
default: siteConfig.seo.metaData.home.title,
template: `%s | ${siteConfig.brand.name}`,
},
// ...
}This is wired into the root layout once.
export const metadata: Metadata = baseMetadataAny page that exports its own metadata or generateMetadata overrides this default for that route alone. The %s | {siteConfig.brand.name} template means a page titled "Pricing" renders as Pricing | {siteConfig.brand.name} in the browser tab and in search results, without every page needing to repeat the brand name.
Changing the home title or description in one place updates both the browser
tab and what shows up in search results and social previews, since
baseMetadata reads from siteConfig.seo.metaData.home. The blog index,
individual posts, categories, and author pages are included in the sitemap
automatically. Draft posts, edit routes, and the /blog/categories management
route are blocked in robots.ts and never submitted.
Metadata (title, description, Open Graph tags) tells browsers and crawlers what to show humans. Structured data, JSON-LD scripts in the page’s HTML, tells search engines what the page actually is, an article, a product, an organization, so they can render richer results.
Oolvay runs a sitewide JSON-LD graph on every page, then adds a page-specific graph on top for routes that warrant it. The Metadata page covers exactly how these two layers combine.