Hello, and welcome to the new Cal.com blog. This first post is also our smoke test — if you're reading it rendered nicely, the whole pipeline works end to end.
What changed under the hood
We migrated the marketing site from Framer to a Next.js App Router codebase built on top of cossUI, Motion, and next-intl. The blog is the first feature delivered fully on the new stack.
- Posts live as plain Markdown files in
content/blog/*.md— no CMS, no database, no lock-in. - Front matter drives the metadata: title, excerpt, category, author, cover image.
- Category and UI chrome come from
messages/en.jsonso every string is localizable withlingo.devlater.
How a post is structured
The front matter is the contract. Everything below it is the article body, rendered through react-markdown with remark-gfm, so GitHub-flavored Markdown just works — tables, task lists, fenced code, the lot.
import { getAllPosts } from "@/lib/blog";
const posts = await getAllPosts();
Supported elements
- Headings
h1–h3get anchor IDs derived from the text for deep linking. - Lists, blockquotes, images, tables, and fenced code blocks are styled to match the marketing system.
- Inline
codeand block code share the same neutral palette.
Nothing about a great blog post should feel like a template. The scaffolding gets out of the way and lets the writing lead.
Where we're taking it next
A short roadmap, in order of appearance:
- Per-author pages, so readers can follow a single voice across posts.
- MDX components for embedded demos, pricing tables, and booking previews.
- Localized content pipelines through Lingo once we ship French and German marketing coverage.
Thanks for reading. If you'd like to try Cal.com, sign up for free — it takes less than a minute.