Mountain Labs is a headless CMS with a GraphQL API that fits the way the App Router works. Fetch pages in Server Components, cache them with Cache Components, prerender every slug, and let editors preview drafts, with no GraphQL client shipped to the browser.
- Server Components first. A page is one GraphQL request made on the server, so your client bundle stays the size of your UI.
- Prerendered, then fresh.
generateStaticParamsbuilds every published page at deploy time, andcacheLifekeeps each one cached for as long as suits you. - Publish straight away. Tag your fetches with
cacheTagand clear them withrevalidateTagfrom a route you call after publishing. - Draft previews. With Draft Mode, editors see unpublished changes on your real site while everyone else gets the cached version.
Every page has a slug, so a catch-all route like app/[...slug]/page.tsx serves your whole site. Ask for the page and the sections you render:
query Page($slug: String!) { page(ref: { slug: $slug }) { title children { __typename slug ... on TextSection { markdown } } }}
Text sections are plain Markdown, so you render them with the components you already use, and your content is never tied to our editor.
Pages live in directories, and a page's slug is its path: /blog/hello is the page you serve at /blog/hello. Sections inside a page can nest, so a feature grid or an FAQ is a group of sections rather than a block of HTML. The Directories API gives you the content tree for navigation and sitemaps.
Editors work in a visual page editor with Markdown shortcuts, save drafts, and publish when they're ready. Permissions decide who can read, edit and publish each page, so a draft stays private until it goes live.
- Create a page and publish it. Hello, World takes a few minutes.
- Follow the Next.js guide to render it in an App Router site, with caching and draft previews.
- Pick a plan on the pricing page when you're ready to go live.