9.3 KiB
| title |
|---|
| Configuration |
Quartz is meant to be extremely configurable, even if you don't know any coding. Most of the configuration you should need can be done by just editing quartz.config.yaml.
Tip
If you edit
quartz.config.yamlusing a text-editor with YAML language support like VSCode, it will warn you when you've made an error in your configuration, helping you avoid configuration mistakes!
The configuration of Quartz can be broken down into two main parts:
configuration:
pageTitle: "My Site"
# ... general configuration
plugins:
- source: github:quartz-community/some-plugin
enabled: true
# ... plugin entries
General Configuration
This part of the configuration concerns anything that can affect the whole site. The following is a list breaking down all the things you can configure:
pageTitle: title of the site. This is also used when generating the RSS Feed for your site.pageTitleSuffix: a string added to the end of the page title. This only applies to the browser tab title, not the title shown at the top of the page.enableSPA: whether to enable SPA Routing on your site.enablePopovers: whether to enable popover previews on your site.analytics: what to use for analytics on your site. Values can benull: don't use analytics;{ provider: 'google', tagId: '<your-google-tag>' }: use Google Analytics;{ provider: 'plausible' }(managed) or{ provider: 'plausible', host: 'https://<your-plausible-host>' }(self-hosted, make sure to include thehttps://protocol prefix): use Plausible;{ provider: 'umami', host: '<your-umami-host>', websiteId: '<your-umami-website-id>' }: use Umami;{ provider: 'goatcounter', websiteId: 'my-goatcounter-id' }(managed) or{ provider: 'goatcounter', websiteId: 'my-goatcounter-id', host: 'my-goatcounter-domain.com', scriptSrc: 'https://my-url.to/counter.js' }(self-hosted) use GoatCounter;{ provider: 'posthog', apiKey: '<your-posthog-project-apiKey>', host: '<your-posthog-host>' }: use Posthog;{ provider: 'tinylytics', siteId: '<your-site-id>' }: use Tinylytics;{ provider: 'cabin' }or{ provider: 'cabin', host: 'https://cabin.example.com' }(custom domain): use Cabin;{provider: 'clarity', projectId: '<your-clarity-id-code' }: use Microsoft clarity. The project id can be found on top of the overview page.{ provider: 'matomo', siteId: '<your-matomo-id-code', host: 'matomo.example.com' }: use Matomo, without protocol.{ provider: 'vercel' }: use Vercel Web Analytics.{ provider: 'rybbit', siteId: 'my-rybbit-id' }(managed) or{ provider: 'rybbit', siteId: 'my-rybbit-id', host: 'my-rybbit-domain.com' }(self-hosted) use Rybbit;
locale: used for i18n and date formattingbaseUrl: this is used for sitemaps and RSS feeds that require an absolute URL to know where the canonical 'home' of your site lives. This is normally the deployed URL of your site (e.g.quartz.jzhao.xyzfor this site). Do not include the protocol (i.e.https://) or any leading or trailing slashes.- This should also include the subpath if you are hosting on GitHub pages without a custom domain. For example, if my repository is
jackyzha0/quartz, GitHub pages would deploy tohttps://jackyzha0.github.io/quartzand thebaseUrlwould bejackyzha0.github.io/quartz. - Note that Quartz 5 will avoid using this as much as possible and use relative URLs whenever it can to make sure your site works no matter where you end up actually deploying it.
- This should also include the subpath if you are hosting on GitHub pages without a custom domain. For example, if my repository is
ignorePatterns: a list of glob patterns that Quartz should ignore and not search through when looking for files inside thecontentfolder. See private pages for more details.defaultDateType: whether to use created, modified, or published as the default date to display on pages and page listings.theme: configure how the site looks.cdnCaching: iftrue(default), use Google CDN to cache the fonts. This will generally be faster. Disable (false) this if you want Quartz to download the fonts to be self-contained.typography: what fonts to use. Any font available on Google Fonts works here.title: font for the title of the site (optional, same asheaderby default)header: font to use for headerscode: font for inline and block quotesbody: font for everything
colors: controls the theming of the site.light: page backgroundlightgray: bordersgray: graph links, heavier bordersdarkgray: body textdark: header text and iconssecondary: link colour, current graph view nodetertiary: hover states and visited graph view nodeshighlight: internal link background, highlighted text, syntax highlightingtextHighlight: markdown highlighted text background
Plugins
You can think of Quartz plugins as a series of transformations over content.
plugins:
- source: github:quartz-community/created-modified-date
enabled: true
order: 10 # controls execution order
- source: github:quartz-community/syntax-highlighting
enabled: true
order: 20
# ... more plugins
Plugins are categorized by their type (transformer, filter, emitter, pageType) based on their manifest. The order field controls execution order within each category.
Note
For advanced TS override of plugin configuration, you can modify
quartz.ts:import { loadQuartzConfig, loadQuartzLayout } from "./quartz/plugins/loader/config-loader" const config = await loadQuartzConfig({ // override any configuration field here }) export default config export const layout = await loadQuartzLayout()
- tags/plugin/transformer map over content (e.g. parsing frontmatter, generating a description)
- tags/plugin/filter filter content (e.g. filtering out drafts)
- tags/plugin/emitter reduce over content (e.g. creating an RSS feed or pages that list all files with a specific tag)
- Page Types define how different types of pages are rendered (content pages, folder listings, tag listings)
Internal vs External Plugins
Quartz distinguishes between internal plugins that are bundled with Quartz and community plugins that are installed separately.
In quartz.config.yaml, community plugins are referenced by their GitHub source:
plugins:
- source: github:quartz-community/explorer
enabled: true
- source: github:quartz-community/syntax-highlighting
enabled: true
options:
theme:
light: github-light
dark: github-dark
Internal plugins (like FrontMatter) are bundled with Quartz. Community plugins are installed separately and referenced by their github:org/repo source.
Community Plugins
To install a community plugin, you can use the following command:
npx quartz plugin add github:quartz-community/explorer
This adds the plugin to quartz.config.yaml and installs it to .quartz/plugins/.
Usage
You can customize the behaviour of Quartz by adding, removing and reordering plugins in quartz.config.yaml. Each plugin entry specifies its source, whether it's enabled, execution order, and any options:
plugins:
- source: github:quartz-community/note-properties
enabled: true
options:
includeAll: false
includedProperties:
- description
- tags
- aliases
order: 5
- source: github:quartz-community/created-modified-date
enabled: true
options:
priority:
- frontmatter
- git
- filesystem
order: 10
- source: github:quartz-community/latex
enabled: true
options:
renderEngine: katex
order: 80
Note
For advanced options that require JavaScript (e.g. callback functions), use the TS override in
quartz.ts. See the plugin-specific documentation for details.
You can see a list of all plugins and their configuration options tags/plugin.
If you'd like to make your own plugins, see the making plugins guide.
Fonts
Fonts can be specified as a simple string or with advanced options in quartz.config.yaml:
configuration:
theme:
typography:
header: Schibsted Grotesk
body: Source Sans Pro
code: IBM Plex Mono
For more control over font weights and italics, use the TS override in quartz.ts:
import { loadQuartzConfig, loadQuartzLayout } from "./quartz/plugins/loader/config-loader"
const config = await loadQuartzConfig({
theme: {
typography: {
header: {
name: "Schibsted Grotesk",
weights: [400, 700],
includeItalic: true,
},
body: "Source Sans Pro",
code: "IBM Plex Mono",
},
},
})
export default config
export const layout = await loadQuartzLayout()
