A modern <head> accumulates tags nobody has questioned in a decade. Here is what each one does now, sorted by whether it earns its place.
Google truncates displayed titles by pixel width, not character count, at roughly 580 px on desktop — which works out around 55–60 characters for typical mixed-case text. Wide characters eat that faster than narrow ones. Google also rewrites titles a substantial share of the time, most often when the tag is keyword-stuffed, boilerplate across the site, or contradicts the visible H1. Writing a title that matches the page's actual H1 is the most reliable way to have yours kept.
It has not been a ranking signal for many years. It is a click-through rate control. Search engines display roughly 155–160 characters on desktop and less on mobile, and will substitute their own snippet from page text whenever they think it matches the query better. Write one per page, put the specific answer in it, and treat a duplicated description across a template as a bug — it is one of the clearest thin-content signals a crawler can see.
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large">
<meta name="robots" content="noindex, follow">
index, follow is the default and specifying it changes nothing, though it is harmless documentation. max-snippet:-1 and max-image-preview:large genuinely matter: without them, EU publishers in particular get truncated snippets and thumbnail-sized images. noindex only works if the crawler can fetch the page, so never combine it with a robots.txt Disallow on the same URL. The header form, X-Robots-Tag, is the only way to apply this to PDFs and images.
<link rel="canonical" href="..."> tells search engines which URL to consolidate signals onto. Use absolute URLs. Self-referencing canonicals on every page are good practice. The failure that costs the most is a template emitting the same canonical on every page, which tells the engine your entire site is one document.
Four properties do nearly all the work: og:title, og:description, og:image and og:url. The image should be 1200×630 for a 1.91:1 card; under about 300×200 platforms fall back to a small thumbnail or nothing. Use an absolute HTTPS URL for the image — relative paths are the single most common reason a preview is blank — and keep the file under a few hundred kilobytes because scrapers time out. Add og:image:alt for accessibility in the platforms that surface it.
twitter:card with a value of summary or summary_large_image is all you need; the platform falls back to Open Graph for title, description and image. Duplicating every OG property into a twitter: equivalent is inherited boilerplate you can delete.
<meta name="viewport" content="width=device-width, initial-scale=1"> is not optional; without it a mobile browser renders at desktop width. <meta name="theme-color"> tints the browser chrome on mobile and inside some apps. <link rel="alternate" hreflang="..."> for multilingual sites must be reciprocal — every variant lists every other, including itself — or engines discard the whole set.
Templating meta tags is fine; the risk is a page slipping through with a missing or duplicated one. Add a build-time or CI check that every page has exactly one title, one description of 70–165 characters, one self-referencing canonical and an og:image that returns 200. That check takes an hour to write and catches the errors that would otherwise sit live for months.