@rolino/nextjs-blog
v0.13.1
Published
Server-only Next.js 16 client for published Rolino Blog Studio content
Readme
@rolino/nextjs-blog
Server-only helpers for a Next.js 16 App Router site that reads published Blog Studio articles. New slugs resolve on their first request. The package does not use generateStaticParams, raw HTML, or a client-side injection script.
Configure ROLINO_URL, ROLINO_BLOG_SITE_ID, ROLINO_BLOG_DELIVERY_TOKEN, and ROLINO_BLOG_WEBHOOK_SECRET on the website server. Never expose these values with a NEXT_PUBLIC_ prefix.
// lib/blog.ts
import { createRolinoBlogClient } from "@rolino/nextjs-blog"
export const blog = createRolinoBlogClient()// app/blog/page.tsx
import Link from "next/link"
import { getPublishedArticles } from "@rolino/nextjs-blog"
import { blog } from "@/lib/blog"
export default async function BlogPage() {
const articles = await getPublishedArticles(blog)
if (!articles.length) return <p>No articles yet.</p>
return articles.map((article) => <article key={article.id}><h2><Link href={`/blog/${article.slug}`}>{article.title}</Link></h2><p>{article.excerpt}</p></article>)
}// app/blog/[slug]/page.tsx
import { notFound, permanentRedirect } from "next/navigation"
import { getPublishedArticle, renderSafeBlogArticle } from "@rolino/nextjs-blog"
import { blog } from "@/lib/blog"
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }) {
const result = await getPublishedArticle(blog, (await params).slug)
if ("redirect" in result) return {}
return { title: result.article.title, description: result.article.description, alternates: { canonical: result.article.publicUrl } }
}
export default async function ArticlePage({ params }: { params: Promise<{ slug: string }> }) {
const result = await getPublishedArticle(blog, (await params).slug)
if ("redirect" in result) permanentRedirect(`/blog/${result.redirect.to}`)
if (!result.article) notFound()
return renderSafeBlogArticle(result.article)
}// app/sitemap.ts
import { rolinoBlogSitemap } from "@rolino/nextjs-blog"
import { blog } from "@/lib/blog"
export default async function sitemap() { return rolinoBlogSitemap(blog) }
// app/api/rolino/revalidate/route.ts
import { createRolinoRevalidationHandler } from "@rolino/nextjs-blog"
export const POST = createRolinoRevalidationHandler()Use the returned image URL, alt text, width, and height with next/image. The safe reference renderer renders typed text blocks only. A website can replace it with its own renderer and theme.
