Previously

Seo Generator

seo-generator.vercel.app

This tool replaces that project. Same goal — turn a handful of facts about a page into metadata you can ship — rebuilt around one document model that compiles to every framework.

100 score

About head

head turns a handful of facts about a web page into the metadata search engines and social platforms read — then writes it out as code for the framework you actually ship.

One document, nine targets

Most metadata tools give you a block of HTML and leave the translation to you. This one keeps a single document and compiles it to each framework's own idiom: Next.js gets the Metadata API and the separate viewport export it requires for themeColor, Astro gets set:html, Nuxt gets useHead, React Router gets its meta export. The targets are HTML, Next.js as both a static export and generateMetadata, SvelteKit, Astro, React Helmet, Nuxt, React Router, and raw JSON.

Why it measures pixels

Search results truncate by rendered width, not by character count. WWWWW and iiiii are five characters each and nowhere near the same width, so a character counter tells you very little about whether your title will survive. head measures the string against the real budget — roughly 600 pixels for a title, 920 for a description — and shows you the exact text that gets shown.

Structured data you can defend

Twelve schema.org types compile into a single @graph: Organization, WebSite, Article, Product, BreadcrumbList, FAQPage, LocalBusiness, Person, Event, SoftwareApplication, VideoObject and HowTo. Empty blocks are dropped rather than emitted, and the editor is explicit that markup has to describe what a visitor can actually see — describing content that is not on the page is what gets a site penalised.

Questions

Does my data leave the browser?
No. The document you edit is kept in your browser’s local storage and never uploaded. The one exception is the AI drafting feature: when you ask for a draft, the brief you wrote is sent to Anthropic or OpenAI using a key you supply, through a proxy that uses it once and never stores it.
Which frameworks can it export to?
HTML, Next.js as both a static metadata export and generateMetadata, SvelteKit, Astro, React Helmet, Nuxt, React Router, and raw JSON. Each target is written in that framework’s own idiom rather than the same HTML in a wrapper.
Do I need an account or an API key?
No account, ever. An API key is only needed for AI drafting, you supply your own, and every other feature works without one.
Why does it measure titles in pixels instead of characters?
Because search results truncate by rendered width. “WWWWW” and “iiiii” are the same character count and nowhere near the same width, so a character counter tells you very little. The gauge measures the string and shows the exact text that survives the cut.
Is it open source?
Yes, under the MIT license. The source is at https://github.com/mrluisfer/seo-generator, and adding a framework target is a single entry in one file.

Contributing

Adding a framework target is one entry in a single file, and adding a schema.org type is one object in a registry — the form is generated from its field descriptors, so neither needs new interface code. The source is on GitHub under the MIT license.

Open the editor

Draft with AI

The model writes copy only. It never touches URLs, robots rules, or structured data.

Provider

Stored in this browser only, and sent to this app's server once per request so the call reaches Claude. It is never logged or persisted server-side. Get a key

The more specific this is, the less generic the copy. Write it in the output language.

Used only where they read naturally. Nothing gets stuffed.

Add a key to enable generation.

Export code

Pick a target and take the code. The same metadata, written the way each framework expects it.

Export index.html
Framework
Can't find your framework?

Paste inside <head>. Works anywhere. 129 lines

<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Pricing for growing engineering teams — Northbound</title>
<meta name="description" content="Flat per-seat pricing with no usage metering or overage bills. Compare the Team and Enterprise plans, or start a 14-day trial without a credit card." />
<meta name="keywords" content="pricing, per-seat billing, team plan, enterprise plan" />
<meta name="author" content="Northbound" />
<meta name="publisher" content="Northbound" />
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1" />
<meta name="referrer" content="strict-origin-when-cross-origin" />
<meta name="theme-color" content="#14161a" />
<meta name="color-scheme" content="light dark" />
<link rel="canonical" href="https://northbound.dev/pricing" />
<link rel="alternate" hreflang="en" href="https://northbound.dev/pricing" />
<link rel="alternate" hreflang="es-MX" href="https://northbound.dev/es/precios" />
<link rel="alternate" hreflang="x-default" href="https://northbound.dev/pricing" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Northbound pricing" />
<meta property="og:description" content="Flat per-seat pricing. No usage metering, no overage bills." />
<meta property="og:url" content="https://northbound.dev/pricing" />
<meta property="og:site_name" content="Northbound" />
<meta property="og:locale" content="en_US" />
<meta property="og:image" content="https://northbound.dev/og/pricing.png" />
<meta property="og:image:alt" content="A pricing table comparing the Team and Enterprise plans" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@northbound" />
<meta name="twitter:creator" content="@northbound" />
<meta name="twitter:title" content="Northbound pricing" />
<meta name="twitter:description" content="Per-seat, flat, and metered by nobody. 14-day trial, no card." />
<meta name="twitter:image" content="https://northbound.dev/og/pricing.png" />
<meta name="twitter:image:alt" content="A pricing table comparing the Team and Enterprise plans" />
<meta name="google-site-verification" content="replace-with-your-search-console-token" />
<meta name="msvalidate.01" content="replace-with-your-bing-token" />
<meta name="yandex-verification" content="replace-with-your-yandex-token" />
<meta name="p:domain_verify" content="replace-with-your-pinterest-token" />
<meta name="facebook-domain-verification" content="replace-with-your-facebook-token" />
<link rel="icon" href="/favicon.ico" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="mask-icon" href="/mask-icon.svg" color="#14161a" />
<script type="application/ld+json">
{
	"@context": "https://schema.org",
	"@graph": [
		{
			"@type": "Organization",
			"name": "Northbound",
			"url": "https://northbound.dev",
			"logo": "https://northbound.dev/logo-512.png",
			"description": "Deployment tooling for small engineering teams.",
			"email": "hello@northbound.dev",
			"telephone": "+52 55 1234 5678",
			"sameAs": [
				"https://github.com/northbound",
				"https://x.com/northbound",
				"https://www.linkedin.com/company/northbound"
			],
			"address": {
				"@type": "PostalAddress",
				"streetAddress": "Av. Álvaro Obregón 106",
				"addressLocality": "Ciudad de México",
				"addressRegion": "CDMX",
				"postalCode": "06700",
				"addressCountry": "MX"
			}
		},
		{
			"@type": "WebSite",
			"name": "Northbound",
			"url": "https://northbound.dev",
			"inLanguage": "en",
			"potentialAction": {
				"@type": "SearchAction",
				"target": {
					"@type": "EntryPoint",
					"urlTemplate": "https://northbound.dev/search?q={search_term_string}"
				},
				"query-input": "required name=search_term_string"
			}
		},
		{
			"@type": "BreadcrumbList",
			"itemListElement": [
				{
					"@type": "ListItem",
					"position": 1,
					"name": "Home",
					"item": "https://northbound.dev"
				},
				{
					"@type": "ListItem",
					"position": 2,
					"name": "Pricing"
				}
			]
		},
		{
			"@type": "FAQPage",
			"mainEntity": [
				{
					"@type": "Question",
					"name": "Is there a free trial?",
					"acceptedAnswer": {
						"@type": "Answer",
						"text": "Yes. Every plan includes a 14-day trial, and no credit card is required to start one."
					}
				},
				{
					"@type": "Question",
					"name": "How is a seat counted?",
					"acceptedAnswer": {
						"@type": "Answer",
						"text": "A seat is any teammate who signs in during the billing month. Members who never sign in are not billed."
					}
				},
				{
					"@type": "Question",
					"name": "Can we change plans later?",
					"acceptedAnswer": {
						"@type": "Answer",
						"text": "Yes. Changes take effect on your next invoice and the difference is prorated automatically."
					}
				}
			]
		}
	]
}
</script>