Skip to content

Menu & navigation

The header navigation comes from siteConfig.navigation in src/config/site.ts. Edit the list, save the file, and the header reloads.

src/config/site.ts
navigation: {
sticky: true,
links: [
{ label: "Features", url: "/features/" },
{ label: "Pricing", url: "/pricing/" },
{ label: "Customers", url: "/customers/" },
{ label: "Resources", url: "/resources/" },
{ label: "Blog", url: "/blog/" },
],
cta: {
label: "Contact",
url: "/contact/",
},
}
FieldWhat it controls
stickyIf true, the header stays pinned at the top while you scroll.
linksThe desktop nav links and the mobile drawer entries — same list.
ctaThe highlighted button on the right of the header. Optional.
{ label: "Features", url: "/features/" },
// →
{ label: "Product", url: "/features/" },

Append to the array:

links: [
// …existing links…
{ label: "Changelog", url: "/changelog/" },
],

The desktop nav and the mobile drawer both pick it up.

Delete or comment out the cta block:

navigation: {
sticky: true,
links: [/* … */],
// cta: { label: "Contact", url: "/contact/" },
}

Use a hash:

{ label: "Pricing", url: "/#pricing" },

This jumps to <section id="pricing"> on the home page — useful for single-page variants of the theme.

Just use a full URL:

{ label: "Docs", url: "https://docs.example.com" },

External links open in the same tab by default. If you want them in a new tab, edit src/components/Header.astro and add target="_blank" rel="noopener" on the <a> element rendering link.url.

Some themes also ship src/config/menu.json:

src/config/menu.json
{
"main": [
{ "label": "Features", "url": "/features/" },
{ "label": "Pricing", "url": "/pricing/" }
],
"cta": { "label": "Contact", "url": "/contact/" }
}

Same data as siteConfig.navigation, kept in JSON so a non-developer can edit it without touching TypeScript. Whichever your theme’s Header.astro imports is the source of truth — if both files exist, you can delete the one you’re not using.