Install the Blog Plugin

Install @vitnode/blog, enable its API and TanStack Start integration, then publish your first article in AdminCP.

@vitnode/blog is the Content Engine reference plugin. It brings articles, categories, editorial screens, revisions, public delivery data, and search indexing—without making your host app impersonate a blog plugin.

Install the package

Install @vitnode/blog
bun add @vitnode/blog@canary
pnpm add @vitnode/blog@canary
npm install @vitnode/blog@canary

Enable the API plugin

For a Single App, edit apps/web/src/vitnode.api.config.ts; a split deployment uses the same change in apps/api/src/vitnode.api.config.ts.

apps/web/src/vitnode.api.config.ts
import { blogApiPlugin } from '@vitnode/blog/config.api'

export const vitNodeApiConfig = buildApiConfig({
  plugins: [
    blogApiPlugin(), 
  ],
})

Enable the web plugin and its messages

The host registers the lightweight plugin identity and static locale loaders:

apps/web/src/locales/packages.ts
import { CONFIG_PLUGIN as BLOG } from '@vitnode/blog/const'

export const packageMessages = {
  [BLOG.pluginId]: {
    en: async () => await import('@vitnode/blog/locales/en.json'),
  },
}
apps/web/src/vitnode.config.ts
import { blogPlugin } from '@vitnode/blog/config'

export const vitNodeConfig = buildConfig({
  plugins: [
    blogPlugin(), 
  ],
})

Migrate, run, and publish

Prepare and start the blog
bun run db:migrate
bun dev
pnpm db:migrate
pnpm dev
npm run db:migrate
npm run dev

In AdminCP, create a category at Blog → Categories, then publish an article at Blog → Articles. The plugin owns the editorial work so the host can stay boringly reliable.

Deliver it from a plugin

Build the public article page in a plugin too, then use the Content Engine delivery guide for loaders and SEO. That keeps the data model and its public URL together.