Meta Tag Generator
Build a paste-ready <head> block — title, description, canonical and robots — with conflict checks, entirely on this device.
Do it offline:$
How to use it
- Write the title and the description; each counter reports its character count and whether it is short, inside the band, or long.
- Paste the absolute canonical address, set the language subtag, then choose the indexing and link-following directives.
- Read the notes beside a row — a missing description, a relative canonical or a zoom-blocking viewport is named before you copy.
- Copy the whole block, copy any single row, download it as an .html file, or share the form as a link.
Fill in the fields and a paste-ready head block assembles itself — title, description, canonical, robots, viewport, charset, theme-color and the html lang attribute, every value escaped as you type it. Counters show where the title and description sit against the commonly cited bands, as guidance only: Google measures snippet width in pixels, and rewrites both when another wording suits the query better.
How it works
Four rows carry search behaviour. The title element supplies the headline a result is built from; the description meta tag offers the snippet beneath it; a canonical link nominates one address when several URLs serve the same content; and the robots meta tag carries crawler directives as one comma-separated value — noindex, nofollow, noarchive, nosnippet, noimageindex, notranslate, max-snippet, max-image-preview, max-video-preview, unavailable_after. The rest are browser instructions: charset fixes byte-decoding, viewport controls layout width and pinch-zoom, theme-color tints browser chrome.
Placement matters in one way. The HTML Standard requires the character-encoding declaration to sit entirely inside the first 1024 bytes of the document, so charset comes first — nothing here can enforce that, because this page never sees the file you paste into. Rows are emitted in this order: charset, viewport, title, description, canonical, robots, theme-color, keywords. The language value gets its own labelled row: it is an attribute of the root html element, not a tag that lives in the head.
Examples
A guide page with the four basics<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Descaling an Espresso Machine at Home</title>
<meta name="description" content="A step-by-step descaling routine for home espresso machines, including how often to run it and which acids are safe for the boiler.">
<link rel="canonical" href="https://example.com/guides/descaling-espresso-machines">
<meta name="robots" content="index, follow">A 37-character title and a 131-character description land inside the cited bands, so no note appears. The lang value is reported separately as <html lang="en"> and never joins the block above.
Ampersands, angle brackets and a query string<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Fish & Chips: the <best> in Leeds</title>
<meta name="description" content="Where to eat proper fish and chips in Leeds — battered haddock, "scraps" on request, and the three shops that still fry in beef dripping.">
<link rel="canonical" href="https://example.com/search?q=fish+and+chips&page=2">
<meta name="robots" content="index, follow">
<meta name="theme-color" content="#0b5fff">Five characters are escaped on the way out — ampersand, less-than, greater-than, double quote and apostrophe — so the query separator becomes &page=2 without changing the address. The em dash and the curly quotes are left alone: ordinary UTF-8 text, which charset already covers.
Edge case: noindex plus a canonical<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Staging Copy of the Pricing Page</title>
<meta name="description" content="A staging duplicate kept out of the index while a canonical still points at the production page — the pairing that quietly loses rankings.">
<link rel="canonical" href="https://example.com/pricing">
<meta name="robots" content="noindex, follow">Both tags are emitted, and the live warning appears next to the canonical row: “A canonical URL is set while the page asks for `noindex` — these are conflicting signals: noindex asks for the page to be dropped while the canonical asks for signals to be consolidated onto it. Keep one.”
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
Pasted markup is treated as text
Drop <title>Hello</title> into the title field and you get <title>Hello</title>. Nothing here parses markup; every field is escaped as literal text, which is why a whole head block pasted in hits the character cap instead of being re-read.
Line breaks become spaces
A meta value is one line, so tabs, newlines and repeated spaces collapse to single spaces and the ends are trimmed. Control characters are removed outright. Both actions are reported, never silent.
Blocking zoom costs you an accessibility criterion
The no-zoom viewport writes maximum-scale=1, user-scalable=no. That stops pinch-zoom for low-vision readers and fails WCAG 2.2 success criterion 1.4.4, so it raises a standing warning.
Sharing cards and rich results are separate pages
Open Graph and Twitter-card properties decide how a link looks in a chat window — that is /open-graph-preview. JSON-LD structured data feeds rich results and lives on /schema-markup-generator. Neither is taught here.
Common errors
Title is empty — no `<title>` element was emitted; write one, because the title is the strongest single signal you control here (search engines may still rewrite it).- An empty field emits nothing rather than an empty tag, so the block stays valid and the pane keeps its size.
Canonical URL "/pricing" is relative — crawlers resolve it against whichever URL served the page, so it means something different on every variant; use the absolute https:// address.- Served from two hostnames, a relative canonical points each variant at itself — the opposite of consolidating them.
Canonical URL "ftp://example.com/page" uses the `ftp:` scheme — a canonical must be an absolute http or https URL.- A refusal, not a warning: an unusable canonical is the only field that stops the block being emitted at all.
`nosnippet` is set alongside `max-snippet` — nosnippet already removes the text snippet, so the length limit has nothing to apply to; keep one of the two.- Directive pairs that cancel each other are reported as you build them; the tag still carries both, and the choice is yours.
A keywords meta tag was emitted — Google has said publicly since 2009 that it ignores `meta name="keywords"` for ranking; it is here because you asked for it, not because it helps.- Keywords are off by default. Turning them on emits the tag and this note together, so nobody leaves believing it did something.
Input is larger than the 2000 characters limit for this tool.- Each field caps at 2,000 characters, the fields together at 8,000. Input is refused whole rather than truncated.
FAQ
How long should a title tag and meta description be?
The bands counted against here are 30–60 characters for the title and 70–160 for the description. Treat them as rules of thumb: Google truncates on rendered pixel width, so a line of capitals runs out sooner than the same count of narrow letters — and it rewrites either one when a different wording suits the query.
Will a meta description improve my rankings?
No. Google documents it as one input to the snippet shown under a result, not as a ranking factor, and often builds that snippet from page text instead. A good one earns clicks.
Can I use noindex and a canonical tag on the same page?
You can write both, and both are emitted, but they pull in opposite directions: noindex asks for the page to be dropped, while the canonical asks for its signals to be gathered onto another address. Google's guidance is to pick one.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Rebuild the head block from the current fields.
- ⌘/Ctrl + S
- Download the block as an .html file.
- ⌘/Ctrl + C
- Copy the whole block while nothing is selected.
- ⌘/Ctrl + Shift + C
- Copy the whole block even over a selection.
- t
- Cycle the color theme.
- ? or ⌘/Ctrl + /
- Open the shortcut help dialog.
- Esc
- Close the topmost dialog.