MoveFast includes a complete SEO system and optional Google Analytics integration. Every page gets proper metadata, social sharing images, and search engine directives out of the box.
Metadata System
MoveFast uses Next.js built-in metadata API with a helper function that generates consistent SEO tags across all pages.
How It Works
The createMetadata() function in src/lib/seo/metadata.ts generates:
- Page title (with site name template)
- Meta description
- Keywords
- Canonical URL
- Open Graph tags (title, description, image, type)
- Twitter Card tags
- Robots directives (index/noindex)
Per-Page Metadata
Each page exports metadata using the helper:
import { createMetadata } from "@/lib/seo/metadata";
export const metadata = createMetadata({
title: "Your Page Title",
description: "A description for search engines and social sharing.",
path: "/your-page",
keywords: ["keyword1", "keyword2"],
});Available Options
interface SEOConfig {
title: string; // Page title
description: string; // Meta description
path?: string; // URL path (for canonical URL)
keywords?: string[]; // SEO keywords
image?: string; // OG image URL (defaults to /og-image.png)
noIndex?: boolean; // Set true to hide from search engines
type?: "website" | "article"; // OG type
publishedTime?: string; // For blog articles
modifiedTime?: string; // For blog articles
authors?: string[]; // For blog articles
}Pre-Built Page Metadata
Common pages already have metadata configured via pageMetadata:
import { pageMetadata } from "@/lib/seo/metadata";
// Use in your page:
export const metadata = pageMetadata.pricing();
export const metadata = pageMetadata.blog();
export const metadata = pageMetadata.contact();Open Graph Image
The default OG image is at public/og-image.png. This is the image shown when your site is shared on Twitter, LinkedIn, Facebook, etc.
To replace it:
- Create a 1200x630 pixel image
- Save it as
public/og-image.png(or any name) - If using a different filename, update
DEFAULT_OG_IMAGEinsrc/lib/seo/metadata.ts
Sitemap
MoveFast auto-generates a sitemap at /sitemap.xml. It includes:
- All public pages (home, pricing, contact, etc.)
- All published blog posts
- All published documentation pages
The sitemap is generated at build time by Next.js from src/app/sitemap.ts.
Robots.txt
The robots.txt file at /robots.txt tells search engines what to crawl. It is generated from src/app/robots.ts and:
- Allows all crawlers on public pages
- Blocks crawling of
/admin/*,/api/*, and other private routes - Points to the sitemap URL
Google Analytics
MoveFast supports Google Analytics 4 (GA4) through a dedicated component.
Setup
- Create a GA4 property at analytics.google.com
- Get your Measurement ID (starts with
G-) - Add it to your environment:
NEXT_PUBLIC_GA_MEASUREMENT_ID=G-XXXXXXXXXXThat is it. The analytics script loads automatically on all pages.
How It Works
The GoogleAnalytics component in src/components/analytics/GoogleAnalytics.tsx injects the GA4 script tag in the root layout. It only loads when NEXT_PUBLIC_GA_MEASUREMENT_ID is set and non-empty.
Disabling Analytics
To disable analytics (e.g., in development), simply do not set the NEXT_PUBLIC_GA_MEASUREMENT_ID variable, or leave it empty.
Page Titles
The root layout sets a title template:
title: {
default: "MoveFast",
template: "%s | MoveFast",
}This means:
- The home page title is just "MoveFast"
- Other pages are formatted as "Page Title | MoveFast"
To change the site name, update WEBSITE.NAME in src/constants/website.ts.
Legal Pages and noIndex
Legal pages (privacy policy, terms of service, cookie policy) are marked as noIndex: true so search engines do not index them. This keeps your search results clean and focused on product pages.
export const metadata = createMetadata({
title: "Privacy Policy",
description: "...",
noIndex: true, // Won't appear in search results
});Blog SEO
Blog posts get full article-type metadata including:
- Published date
- Modified date
- Author name
- Article-specific OG type
- Featured image as OG image
This is handled automatically from the blog post frontmatter (title, description, date, author, image fields).
Tips
- Always set unique
titleanddescriptionfor every page. Duplicate metadata hurts rankings. - Keep descriptions between 120-160 characters for best display in search results.
- Use descriptive, keyword-rich titles but keep them natural.
- Replace the default OG image with something branded. It is the first thing people see when your link is shared.
- Submit your sitemap to Google Search Console after deploying for faster indexing.
