Skip to content
✨ Publier v1 is live — a polished docs platform built for the open web.
On this page

full template

Docs, blog, changelog, and a marketing homepage in one starting template.

The full template combines a documentation section, a blog, a changelog, and a marketing homepage. Additional company, status, and knowledge-base routes are pages you author; YAML flags do not supply them.

Scaffold

Terminal window
publier new my-site --template full

Directory layout

my-site/
src/
pages/
index.astro # / — Hero + FeatureGrid + PricingTable + TestimonialCard + CtaBand
components/
CustomWidget.tsx # example custom Qwik component
content/
docs/ # /docs/<slug>
index.mdx
quick-start.mdx
blog/ # /blog/<slug>
welcome-to-the-blog.mdx
v1-architecture.mdx
changelog/ # /changelog entries
v0-9-0.mdx
v1-0-0.mdx
publier.config.yaml
theme.yaml
astro.config.ts
content.config.ts

astro.config.ts

Keep the generated integration array: docsShell() first, then Expressive Code, MDX, sitemap, Pagefind, and Qwik. These integrations are registered explicitly; the shell warns when one is missing and does not add it. See Configuration for the complete configuration and required order.

content.config.ts

src/content.config.ts
import { defineCollection } from 'astro:content';
import { blogLoader, contentLoader, docsLoader, pagesLoader } from '@publier/shell/loaders';
import { blogSchema, docsSchema, pagesSchema } from '@publier/shell/schemas';
export const collections = {
docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }),
blog: defineCollection({ loader: blogLoader(), schema: blogSchema }),
pages: defineCollection({ loader: pagesLoader(), schema: pagesSchema }),
press: defineCollection({
loader: contentLoader({ base: './src/content/press' }),
schema: blogSchema,
}),
team: defineCollection({
loader: contentLoader({ base: './src/content/team' }),
schema: blogSchema,
}),
careers: defineCollection({
loader: contentLoader({ base: './src/content/careers' }),
schema: blogSchema,
}),
changelog: defineCollection({
loader: contentLoader({ base: './src/content/changelog' }),
schema: blogSchema,
}),
};

publier.config.yaml

The project requires a site mapping with a non-empty site.name:

publier.config.yaml
site:
name: My Site
url: https://example.com
favicon: /favicon.svg

Keep the generated navigation, then customize it using Global settings. search.enabled controls the header trigger; the shortcut remains Cmd/Ctrl+K. The template’s pages: flags do not create or suppress routes. See Pages for the current route controls and limits.

Disabling surfaces

The shell’s routes integration option controls injected docs, blog, changelog, 404, and feed routes. It does not remove your own src/pages/ files, and pages: YAML flags have no routing effect. See Pages for the supported controls; maintain navigation links to match the routes you publish.

Custom Qwik components

The template includes src/components/CustomWidget.tsx as a starter. Add your own Qwik component$() components there and import them in any .mdx or .astro file:

import { CustomWidget } from '../components/CustomWidget';
<CustomWidget />