Tutorial

How We Built 300+ SEO Pages from 4 JSON Files — The 0nmcp.com Content Engine

MM
Mike Mento
Founder, RocketOpp LLC
How We Built 300+ SEO Pages from 4 JSON Files — The 0nmcp.com Content Engine

How We Built 300+ SEO Pages from 4 JSON Files — The 0nmcp.com Content Engine

0nmcp.com has over 300 indexable pages. We don't use a CMS. We don't use a headless API. We don't use WordPress, Ghost, Contentful, or Sanity for content.

We use four JSON files and Next.js dynamic routes.

Here's exactly how — and why this approach outperforms traditional CMS-backed SEO.


The Architecture

Four data files in src/data/ power the entire programmatic SEO engine:

FileSizeItemsPages Generated
services.json50KB33 services33 integration pages + 33 Turn It 0n hubs
capabilities.json62KB80 capabilities80+ capability deep-dive pages
glossary.json33KB80 terms80 glossary definition pages
comparisons.json33KB12 competitors12 comparison landing pages
Plus the community system adds:

  • Forum thread pages (server-rendered, unlimited)
  • User profile pages
  • Group landing pages
  • Blog posts

Total: 300+ unique, indexable, structured-data-rich pages from a Next.js app with zero external content dependencies.


How Dynamic Routes Work

Next.js App Router's [slug] pattern combined with generateStaticParams() is the foundation. Each programmatic section follows the same pattern:

// src/app/integrations/[slug]/page.tsx

import servicesData from '@/data/services.json'

export function generateStaticParams() { return servicesData.services.map(s => ({ slug: s.slug })) }

export async function generateMetadata({ params }) { const { slug } = await params const service = servicesData.services.find(s => s.slug === slug) return { title: ${service.name} Integration — 0nMCP, description: service.seo_description, openGraph: { ... }, alternates: { canonical: https://0nmcp.com/integrations/${slug} }, } }

generateStaticParams() tells Next.js to pre-render every slug at build time. Each page gets its own URL, its own metadata, its own Open Graph tags, and its own JSON-LD structured data.


The JSON-LD Strategy

Every page type gets the most specific Schema.org type available:

Page TypeJSON-LD TypeWhy
Integration pagesHowTo + FAQPageGoogle shows rich snippets for how-to content
Glossary termsDefinedTermFeeds Google's knowledge panels
Comparison pagesProduct + FAQPageEnables product comparison rich results
Forum threadsDiscussionForumPostingForum-specific rich results in search
User profilesPersonPeople-based rich results
Turn It 0n hubsHowTo + FAQPageStep-by-step integration guides
All pagesBreadcrumbListBreadcrumb trail in search results
The JSON-LD is embedded directly in the page as a