{"owner":"jackyzha0","repo":"quartz","hasSkills":true,"totalSkillsCount":51,"totalTokensCount":28890,"categories":["anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":["docs/plugins/AliasRedirects.md","docs/plugins/ArticleTitle.md","docs/plugins/Assets.md","docs/plugins/Backlinks.md","docs/plugins/BasesPage.md","docs/plugins/Breadcrumbs.md","docs/plugins/CNAME.md","docs/plugins/CanvasPage.md","docs/plugins/Citations.md","docs/plugins/Comments.md","docs/plugins/ComponentResources.md","docs/plugins/ContentIndex.md","docs/plugins/ContentMeta.md","docs/plugins/ContentPage.md","docs/plugins/CrawlLinks.md","docs/plugins/CreatedModifiedDate.md","docs/plugins/CustomOgImages.md","docs/plugins/Darkmode.md","docs/plugins/Description.md","docs/plugins/EncryptedPages Demo.md","docs/plugins/EncryptedPages.md","docs/plugins/ExplicitPublish.md","docs/plugins/Explorer.md","docs/plugins/Favicon.md","docs/plugins/FolderPage.md","docs/plugins/Fonts.md","docs/plugins/Footer.md","docs/plugins/Frontmatter.md","docs/plugins/GitHubFlavoredMarkdown.md","docs/plugins/Graph.md","docs/plugins/HardLineBreaks.md","docs/plugins/Latex.md","docs/plugins/NotFoundPage.md","docs/plugins/NoteProperties.md","docs/plugins/ObsidianFlavoredMarkdown.md","docs/plugins/OxHugoFlavoredMarkdown.md","docs/plugins/PageTitle.md","docs/plugins/ReaderMode.md","docs/plugins/RecentNotes.md","docs/plugins/RemoveDrafts.md","docs/plugins/RoamFlavoredMarkdown.md","docs/plugins/Search.md","docs/plugins/Spacer.md","docs/plugins/StackedPages.md","docs/plugins/Static.md","docs/plugins/SyntaxHighlighting.md","docs/plugins/TableOfContents.md","docs/plugins/TagList.md","docs/plugins/TagPage.md","docs/plugins/UnlistedPages.md","docs/plugins/index.md"],"skills":{"docs/plugins/AliasRedirects.md":"---\ntitle: AliasRedirects\ndescription: Generates redirect pages from frontmatter aliases and case-preserving URLs.\ntags:\n  - plugin/emitter\nimage: https://images.unsplash.com/photo-1601735479770-bb5de9dbe844\nrepository: \"[quartz-community/alias-redirects](https://github.com/quartz-community/alias-redirects)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits HTML redirect pages so that old URLs redirect to the canonical page. It handles two types of redirects:\n\n1. **Frontmatter aliases**: Redirect pages for aliases defined in your content's frontmatter.\n2. **Case-preserving redirects**: Automatic redirect pages for URLs that changed due to Quartz v5's lowercase slug normalization.\n\n### Frontmatter Aliases\n\nIf `foo.md` has the following frontmatter:\n\n```md title=\"foo.md\"\n---\ntitle: \"Foo\"\naliases:\n  - \"bar\"\n---\n```\n\nThe target `host.me/bar` will be permanently redirected to `host.me/foo`.\n\nThe emitter supports the following frontmatter fields:\n\n- `aliases`\n- `alias`\n\n### Case-Preserving Redirects\n\nQuartz v5 normalizes all URLs to lowercase. If you are migrating from v4 (which preserved the original casing), previously indexed URLs containing uppercase letters (e.g. `/Diary/My-Note`) would return 404 errors.\n\nWhen `enableCaseRedirects` is enabled (the default), this plugin automatically detects files whose original path differs from the lowercased slug and generates redirect pages at the original-case URL. For example, if your content directory contains `Diary/2026-01-01.md`, the plugin generates:\n\n- The canonical page at `/diary/2026-01-01` (produced by the normal build)\n- A redirect page at `/Diary/2026-01-01` (produced by this plugin)\n\nThe redirect page includes proper SEO signals:\n\n- `<meta http-equiv=\"refresh\" content=\"0; url=...\">` for an instant redirect\n- `<link rel=\"canonical\">` pointing to the lowercase URL\n- `<meta name=\"robots\" content=\"noindex\">` to prevent duplicate indexing\n\nThis preserves search engine rankings and ensures inbound links continue to work.\n\n> [!note]\n> Case-preserving redirects have no effect on case-insensitive filesystems (macOS, Windows) where the server already resolves either casing to the same file. The plugin automatically detects the filesystem type and skips redirect generation when unnecessary.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableCaseRedirects`: If `true` (default), automatically generates redirect pages for URLs that changed casing due to v5's lowercase normalization. Set to `false` to disable this behavior.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.AliasRedirects()`.\n- Source: [`quartz-community/alias-redirects`](https://github.com/quartz-community/alias-redirects)\n- Install: `npx quartz plugin add github:quartz-community/alias-redirects`\n","docs/plugins/ArticleTitle.md":"---\ntitle: ArticleTitle\ndescription: Renders the article title as an h1 heading.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/article-title](https://github.com/quartz-community/article-title)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders the article title from the page's frontmatter as an `<h1>` heading at the top of the page content. It reads the `title` field from frontmatter (falling back to the filename if no title is set).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ArticleTitle()`.\n- Source: [`quartz-community/article-title`](https://github.com/quartz-community/article-title)\n- Install: `npx quartz plugin add github:quartz-community/article-title`\n","docs/plugins/Assets.md":"---\ntitle: Assets\ntags:\n  - plugin/emitter\nimage: https://images.unsplash.com/photo-1526304640581-d334cdbbf45e\n---\n\nThis plugin emits all non-Markdown static assets in your content folder (like images, videos, HTML, etc). The plugin respects the `ignorePatterns` in the global [[configuration]].\n\nNote that all static assets will then be accessible through its path on your generated site, i.e: `host.me/path/to/static.pdf`\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.Assets()` (internal plugin).\n- Source: [`quartz/plugins/emitters/assets.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/assets.ts).\n","docs/plugins/Backlinks.md":"---\ntitle: Backlinks\ndescription: Shows pages that link to the current page.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/backlinks](https://github.com/quartz-community/backlinks)\"\nenabled: true\nrequired: false\n---\n\nShows pages that link to the current page.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Backlinks]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `hideWhenEmpty`: Hide the backlinks section if the current page has no backlinks. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/backlinks\n  enabled: true\n  options:\n    hideWhenEmpty: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Backlinks()`.\n- Source: [`quartz-community/backlinks`](https://github.com/quartz-community/backlinks)\n- Install: `npx quartz plugin add github:quartz-community/backlinks`\n","docs/plugins/BasesPage.md":"---\ntitle: BasesPage\ndescription: Renders Obsidian Bases files as database-style views.\ntags:\n  - plugin/pageType\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/bases-page](https://github.com/quartz-community/bases-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides support for [Obsidian Bases](https://obsidian.md/changelog/2025-04-15-desktop-v1.8.0/) (`.base` files) in Quartz. It reads `.base` files from your vault, resolves matching notes based on the query definition, and renders them as interactive database-like views with support for tables, lists, cards, and maps. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Features\n\n- **Table view**: Sortable columns with automatic type rendering (strings, numbers, booleans, arrays, links).\n- **List view**: Compact list with metadata chips for each entry.\n- **Cards view**: Card layout with optional image property support.\n- **Map view**: Placeholder for future map-based visualization.\n- **Multiple views**: A single `.base` file can define multiple views, displayed as switchable tabs.\n- **Filters**: Recursive filter trees with `and`/`or`/`not` operators.\n- **Formulas**: Computed properties via formula expressions.\n- **Summaries**: Column-level aggregations (Sum, Average, Min, Max, Median, etc.).\n- **Property configuration**: Custom display names for properties.\n- **Link rendering**: Wikilinks and Markdown links within cell values are rendered as clickable links.\n\n## Interaction with `unlisted` pages\n\n`BasesPage` respects the `file.data.unlisted` convention written by [[UnlistedPages]] and [[EncryptedPages]]. Pages marked `unlisted: true` (or encrypted pages with `stealth: true`) are excluded from every rendered base view — table, list, board, cards, gallery, and any custom view — regardless of whether the base's filter expression would match them. Unlisted pages also cannot be dereferenced from formulas on visible pages via `.asFile()`.\n\n> [!note]\n> Base views are **server-side rendered** HTML baked at build time. They do not update client-side after a visitor decrypts an encrypted page. Graph, explorer, and search all re-hydrate from the patched in-memory content index and show newly-unlocked pages for the rest of the browser session — base views do not, because they were materialized at build time with unlisted pages already excluded. A visitor who successfully decrypts a revealable encrypted page will see it appear in graph, explorer, and search, but **not** in any base view, until the site is rebuilt with that page listed. This is the same structural limitation that applies to backlinks, recent notes, folder listings, and tag listings.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `defaultViewType`: The default view type when none is specified in the `.base` file. Defaults to `\"table\"`.\n- `linkResolution`: How to resolve internal links in view renderers. Should match the `markdownLinkResolution` setting of the [[CrawlLinks]] plugin. Can be `\"absolute\"`, `\"relative\"`, or `\"shortest\"`. Defaults to `\"shortest\"`.\n- `customViews`: A map of custom view renderers. Keys are view type names. These override built-in renderers for the same type, or add new view types. Requires a TS override.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/bases-page\n  enabled: true\n```\n\nFor custom view renderers, use a TS override in `quartz.ts`:\n\n```ts title=\"quartz.ts (override)\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.BasesPage({\n  defaultViewType: \"table\",\n  customViews: {\n    myView: ({ entries, view, basesData, total, locale }) => {\n      // return JSX\n    },\n  },\n})\n```\n\n## API\n\n- Category: Page Type, Component\n- Function name: `ExternalPlugin.BasesPage()`.\n- Source: [`quartz-community/bases-page`](https://github.com/quartz-community/bases-page)\n- Install: `npx quartz plugin add github:quartz-community/bases-page`\n","docs/plugins/Breadcrumbs.md":"---\ntitle: Breadcrumbs\ndescription: Breadcrumb navigation trail.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/breadcrumbs](https://github.com/quartz-community/breadcrumbs)\"\nenabled: true\nrequired: false\n---\n\nNavigation breadcrumb trail.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Breadcrumbs]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `spacerSymbol`: The symbol to use between breadcrumb items. Defaults to `\"❯\"`.\n- `rootName`: The name of the root page. Defaults to `Home`.\n- `resolveFrontmatterTitle`: Whether to use the `title` frontmatter field for breadcrumb items. Defaults to `true`.\n- `showCurrentPage`: Whether to show the current page in the breadcrumb trail. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/breadcrumbs\n  enabled: true\n  options:\n    spacerSymbol: \"❯\"\n    rootName: Home\n    resolveFrontmatterTitle: true\n    showCurrentPage: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Breadcrumbs()`.\n- Source: [`quartz-community/breadcrumbs`](https://github.com/quartz-community/breadcrumbs)\n- Install: `npx quartz plugin add github:quartz-community/breadcrumbs`\n","docs/plugins/CNAME.md":"---\ntitle: CNAME\ndescription: Emits a CNAME file for custom domain deployment.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/cname](https://github.com/quartz-community/cname)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits a `CNAME` record that points your subdomain to the default domain of your site.\n\nIf you want to use a custom domain name like `quartz.example.com` for the site, then this is needed.\n\nSee [[hosting|Hosting]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.CNAME()`.\n- Source: [`quartz-community/cname`](https://github.com/quartz-community/cname)\n- Install: `npx quartz plugin add github:quartz-community/cname`\n","docs/plugins/CanvasPage.md":"---\ntitle: CanvasPage\ndescription: Renders JSON Canvas files as interactive, pannable pages.\ntags:\n  - plugin/pageType\nimage: \"#7852ee\"\nnew-in-v5: true\nrepository: \"[quartz-community/canvas-page](https://github.com/quartz-community/canvas-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that renders [JSON Canvas](https://jsoncanvas.org) (`.canvas`) files as interactive, pannable and zoomable canvas pages. It uses a custom `\"canvas\"` [[layout#Page Frames|page frame]] that provides a fullscreen, always-on canvas experience with a togglable left sidebar for navigation. It supports the full [JSON Canvas 1.0 spec](https://jsoncanvas.org/spec/1.0/), including text nodes with Markdown rendering, file nodes that link to other pages in your vault, link nodes for external URLs, and group nodes for visual organization. Edges between nodes are rendered as SVG paths with optional labels, arrow markers, and colors.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableInteraction`: Whether to enable pan and zoom interaction on the canvas. Default: `true{:ts}`.\n- `initialZoom`: The initial zoom level when the canvas is first displayed. Default: `1{:ts}`.\n- `minZoom`: The minimum zoom level allowed when zooming out. Default: `0.1{:ts}`.\n- `maxZoom`: The maximum zoom level allowed when zooming in. Default: `5{:ts}`.\n\n### Canvas Frame\n\nThe canvas-page plugin provides its own `\"canvas\"` page frame via the [[layout#Page Frames|Frame Registry]]. This frame:\n\n- Renders the canvas in **fullscreen mode** by default (100vw × 100vh), giving the canvas maximum screen space — leaning into the \"endless canvas\" concept of JSON Canvas.\n- Provides a **togglable left sidebar** that slides in from the left edge. This is the only layout slot available — it renders the same components as the `left` sidebar on content pages (e.g., Explorer, Search, Page Title).\n- The sidebar toggle button (hamburger/close icon) is positioned in the top-left corner.\n- Canvas controls (zoom in, zoom out, reset) are positioned on the right side.\n- On mobile, the sidebar overlays the canvas rather than pushing it aside.\n\nUsers can override this frame via `quartz.config.yaml` if needed:\n\n```yaml title=\"quartz.config.yaml\"\nlayout:\n  byPageType:\n    canvas:\n      template: default # Use standard three-column layout instead\n```\n\n### Features\n\n- **Text nodes**: Render Markdown content including headings, bold, italic, strikethrough, lists, links, and code blocks via [GFM](https://github.github.com/gfm/) support.\n- **File nodes**: Link to other pages in your vault. Supports popover previews on hover.\n- **Link nodes**: Reference external URLs.\n- **Group nodes**: Visual grouping containers with optional labels and background colors.\n- **Edges**: SVG connections between nodes with optional labels, arrow markers, and colors. Supports all four sides (top, right, bottom, left) and both preset colors (1–6) and custom hex colors.\n- **Togglable sidebar**: Hamburger button in the top-left corner toggles the left sidebar for navigation. Press `Escape` or click the close button to dismiss.\n- **Preset colors**: Six preset colors (red, orange, yellow, green, cyan, purple) plus custom hex colors (`#RRGGBB`) for nodes and edges.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.CanvasPage()`.\n- Source: [`quartz-community/canvas-page`](https://github.com/quartz-community/canvas-page)\n- Install: `npx quartz plugin add github:quartz-community/canvas-page`\n","docs/plugins/Citations.md":"---\ntitle: Citations\ndescription: Academic citation and bibliography support via BibTeX.\ntags:\n  - plugin/transformer\nimage: https://images.unsplash.com/photo-1582079133805-43655f026448\nrepository: \"[quartz-community/citations](https://github.com/quartz-community/citations)\"\nenabled: false\nrequired: false\n---\n\nThis plugin adds Citation support to Quartz.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `bibliographyFile`: the path to the bibliography file. Defaults to `./bibliography.bib`. This is relative to git source of your vault.\n- `suppressBibliography`: whether to suppress the bibliography at the end of the document. Defaults to `false`.\n- `linkCitations`: whether to link citations to the bibliography. Defaults to `false`.\n- `csl`: the citation style to use. Defaults to `apa`. Reference [rehype-citation](https://rehype-citation.netlify.app/custom-csl) for more options.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Citations()`.\n- Source: [`quartz-community/citations`](https://github.com/quartz-community/citations)\n- Install: `npx quartz plugin add github:quartz-community/citations`\n","docs/plugins/Comments.md":"---\ntitle: Comments\ndescription: Comment system integration (Giscus, Utterances, etc.).\ntags:\n  - plugin/component\nimage: \"[[giscus-results.png]]\"\nrepository: \"[quartz-community/comments](https://github.com/quartz-community/comments)\"\nenabled: false\nrequired: false\n---\n\nComment system (giscus, utterances, etc.).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Comments]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `provider`: The comment provider to use. Currently only `giscus` is supported.\n- `options`: Provider-specific options.\n  - `repo`: The GitHub repository to use for comments.\n  - `repoId`: The ID of the GitHub repository.\n  - `category`: The discussion category to use.\n  - `categoryId`: The ID of the discussion category.\n  - `lang`: The language for the comment system. Defaults to `en`.\n  - `themeUrl`: URL to a folder with custom themes.\n  - `lightTheme`: Filename for the light theme CSS file. Defaults to `light`.\n  - `darkTheme`: Filename for the dark theme CSS file. Defaults to `dark`.\n  - `mapping`: How to map pages to discussions. Defaults to `url`.\n  - `strict`: Use strict title matching. Defaults to `true`.\n  - `reactionsEnabled`: Whether to enable reactions for the main post. Defaults to `true`.\n  - `inputPosition`: Where to put the comment input box relative to the comments. Defaults to `bottom`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/comments\n  enabled: true\n  options:\n    provider: giscus\n    options:\n      repo: jackyzha0/quartz\n      repoId: MDEwOlJlcG9zaXRvcnkzODcyMTMyMDg\n      category: Announcements\n      categoryId: DIC_kwDOFxRnmM4B-Xg6\n      lang: en\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Comments()`.\n- Source: [`quartz-community/comments`](https://github.com/quartz-community/comments)\n- Install: `npx quartz plugin add github:quartz-community/comments`\n","docs/plugins/ComponentResources.md":"---\ntitle: ComponentResources\ntags:\n  - plugin/emitter\nimage:\n---\n\nThis plugin manages and emits the static resources required for the Quartz framework. This includes CSS stylesheets and JavaScript scripts that enhance the functionality and aesthetics of the generated site. See also the `cdnCaching` option in the `theme` section of the [[configuration]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.ComponentResources()` (internal plugin).\n- Source: [`quartz/plugins/emitters/componentResources.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/componentResources.ts).\n","docs/plugins/ContentIndex.md":"---\ntitle: ContentIndex\ndescription: Generates sitemap, RSS feed, and content index.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/content-index](https://github.com/quartz-community/content-index)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits both RSS and an XML sitemap for your site. The [[RSS Feed]] allows users to subscribe to content on your site and the sitemap allows search engines to better index your site. The plugin also emits a `contentIndex.json` file which is used by dynamic frontend components like search and graph.\n\nThis plugin emits a comprehensive index of the site's content, generating additional resources such as a sitemap, an RSS feed, and a\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableSiteMap`: If `true` (default), generates a sitemap XML file (`sitemap.xml`) listing all site URLs for search engines in content discovery.\n- `enableRSS`: If `true` (default), produces an RSS feed (`index.xml`) with recent content updates.\n- `rssLimit`: Defines the maximum number of entries to include in the RSS feed, helping to focus on the most recent or relevant content. Defaults to `10`.\n- `rssFullHtml`: If `true`, the RSS feed includes the full rendered HTML content of each page. Defaults to `false`.\n- `rssSlug`: Slug to the generated RSS feed XML file. Defaults to `\"index\"`.\n- `includeEmptyFiles`: If `true` (default), content files with no body text are included in the generated index and resources.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.ContentIndex()`.\n- Source: [`quartz-community/content-index`](https://github.com/quartz-community/content-index)\n- Install: `npx quartz plugin add github:quartz-community/content-index`\n","docs/plugins/ContentMeta.md":"---\ntitle: ContentMeta\ndescription: Displays creation date and reading time.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/content-meta](https://github.com/quartz-community/content-meta)\"\nenabled: true\nrequired: false\n---\n\nThis plugin displays content metadata below the article title, such as the creation date and estimated reading time.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `showReadingTime`: Whether to display the estimated reading time. Defaults to `true`.\n- `showComma`: Whether to display a comma between metadata items. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/content-meta\n  enabled: true\n  options:\n    showReadingTime: true\n    showComma: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ContentMeta()`.\n- Source: [`quartz-community/content-meta`](https://github.com/quartz-community/content-meta)\n- Install: `npx quartz plugin add github:quartz-community/content-meta`\n","docs/plugins/ContentPage.md":"---\ntitle: ContentPage\ndescription: Generates HTML pages for Markdown content.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/content-page](https://github.com/quartz-community/content-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin for the Quartz framework. It generates the HTML pages for each piece of Markdown content. It emits the full-page [[layout]], including headers, footers, and body content, among others. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). It is now configured in the `pageTypes` section of `quartz.config.yaml`.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.ContentPage()`.\n- Source: [`quartz-community/content-page`](https://github.com/quartz-community/content-page)\n- Install: `npx quartz plugin add github:quartz-community/content-page`\n","docs/plugins/CrawlLinks.md":"---\ntitle: CrawlLinks\ndescription: Parses and resolves internal links. Removing it is not recommended.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/crawl-links](https://github.com/quartz-community/crawl-links)\"\nenabled: true\nrequired: true\n---\n\nThis plugin parses links and processes them to point to the right places. It is also needed for embedded links (like images). See [[Obsidian compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `markdownLinkResolution`: Sets the strategy for resolving Markdown paths, can be `\"absolute\"` (default), `\"relative\"` or `\"shortest\"`. You should use the same setting here as in [[Obsidian compatibility|Obsidian]].\n  - `absolute`: Path relative to the root of the content folder.\n  - `relative`: Path relative to the file you are linking from.\n  - `shortest`: Name of the file. If this isn't enough to identify the file, use the full absolute path.\n- `prettyLinks`: If `true` (default), simplifies links by removing folder paths, making them more user friendly (e.g. `folder/deeply/nested/note` becomes `note`).\n- `openLinksInNewTab`: If `true`, configures external links to open in a new tab. Defaults to `false`.\n- `lazyLoad`: If `true`, adds lazy loading to resource elements (`img`, `video`, etc.) to improve page load performance. Defaults to `false`.\n- `externalLinkIcon`: Adds an icon next to external links when `true` (default) to visually distinguishing them from internal links.\n- `disableBrokenWikilinks`: If `true`, internal links whose resolved slug is not present in the site (i.e. no matching file under `markdownLinkResolution`) gain an additional `broken` CSS class alongside `internal`, so they can be styled distinctly. Defaults to `false`. Applies to both wikilinks and regular Markdown links, since both are indistinguishable `<a>` elements by the time this plugin runs.\n\n> [!warning]\n> Removing this plugin is _not_ recommended and will likely break the page.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.CrawlLinks()`.\n- Source: [`quartz-community/crawl-links`](https://github.com/quartz-community/crawl-links)\n- Install: `npx quartz plugin add github:quartz-community/crawl-links`\n","docs/plugins/CreatedModifiedDate.md":"---\ntitle: CreatedModifiedDate\ndescription: Determines creation and modification dates from frontmatter, git, or filesystem.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/created-modified-date](https://github.com/quartz-community/created-modified-date)\"\nenabled: true\nrequired: false\n---\n\nThis plugin determines the created, modified, and published dates for a document using three potential data sources: frontmatter metadata, Git history, and the filesystem. See [[authoring content#Syntax]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `priority`: The data sources to consult for date information. Highest priority first. Possible values are `\"frontmatter\"`, `\"git\"`, and `\"filesystem\"`. Defaults to `[\"frontmatter\", \"git\", \"filesystem\"]`.\n- `defaultDateType`: Which date type to use when displaying dates. Can be `\"created\"`, `\"modified\"`, or `\"published\"`. Defaults to `\"modified\"`.\n\nWhen loading the frontmatter, the value of [[Frontmatter#List]] is used.\n\n> [!warning]\n> If you rely on `git` for dates, make sure `defaultDateType` is set to `modified` in the plugin's options.\n>\n> Depending on how you [[hosting|host]] your Quartz, the `filesystem` dates of your local files may not match the final dates. In these cases, it may be better to use `git` or `frontmatter` to guarantee correct dates.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.CreatedModifiedDate()`.\n- Source: [`quartz-community/created-modified-date`](https://github.com/quartz-community/created-modified-date)\n- Install: `npx quartz plugin add github:quartz-community/created-modified-date`\n","docs/plugins/CustomOgImages.md":"---\ntitle: Custom OG Images\ndescription: Generates Open Graph social preview images.\ntags:\n  - feature/emitter\nimage: \"[[social-image-preview-dark.png]]\"\nrepository: \"[quartz-community/og-image](https://github.com/quartz-community/og-image)\"\nenabled: true\nrequired: false\n---\n\nThe Custom OG Images emitter plugin generates social media preview images for your pages. It uses [satori](https://github.com/vercel/satori) to convert HTML/CSS into images, allowing you to create beautiful and consistent social media preview cards for your content.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Features\n\n- Automatically generates social media preview images for each page\n- Supports both light and dark mode themes\n- Customizable through frontmatter properties\n- Fallback to default image when needed\n- Full control over image design through custom components\n\n## Configuration\n\n> [!info] Info\n>\n> The `baseUrl` property in your [[configuration]] must be set properly for social images to work correctly, as they require absolute paths.\n\nThis plugin accepts the following configuration options:\n\n```yaml title=\"quartz.config.yaml\"\nplugins:\n  - source: github:quartz-community/og-image\n    enabled: true\n    options:\n      colorScheme: lightMode # \"lightMode\" or \"darkMode\"\n      width: 1200\n      height: 630\n      excludeRoot: false\n```\n\nFor the TS override approach (needed for custom `imageStructure`):\n\n```ts title=\"quartz.ts (override)\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\nimport { defaultImage } from \"./quartz/plugins/emitters/ogImage\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.CustomOgImages({\n  colorScheme: \"lightMode\",\n  width: 1200,\n  height: 630,\n  excludeRoot: false,\n  imageStructure: defaultImage,\n})\n```\n\n### Configuration Options\n\n| Option               | Type      | Default                   | Description                                                       |\n| -------------------- | --------- | ------------------------- | ----------------------------------------------------------------- |\n| `colorScheme`        | string    | \"lightMode\"               | Theme to use for generating images (\"darkMode\" or \"lightMode\")    |\n| `width`              | number    | 1200                      | Width of the generated image in pixels                            |\n| `height`             | number    | 630                       | Height of the generated image in pixels                           |\n| `excludeRoot`        | boolean   | false                     | Whether to exclude the root index page from auto-generated images |\n| `defaultTitle`       | string    | \"Untitled\"                | Fallback title when a page has no title                           |\n| `defaultDescription` | string    | \"No description provided\" | Fallback description when a page has no description               |\n| `imageStructure`     | component | defaultImage              | Custom component to use for image generation                      |\n\n## Frontmatter Properties\n\nThe following properties can be used to customize your link previews:\n\n| Property            | Alias            | Summary                             |\n| ------------------- | ---------------- | ----------------------------------- |\n| `socialDescription` | `description`    | Description to be used for preview. |\n| `socialImage`       | `image`, `cover` | Link to preview image.              |\n\nThe `socialImage` property should contain a link to an image either relative to `quartz/static`, or a full URL. If you have a folder for all your images in `quartz/static/my-images`, an example for `socialImage` could be `\"my-images/cover.png\"`. Alternatively, you can use a fully qualified URL like `\"https://example.com/cover.png\"`.\n\n> [!info] Info\n>\n> The priority for what image will be used for the cover image looks like the following: `frontmatter property > generated image (if enabled) > default image`.\n>\n> The default image (`quartz/static/og-image.png`) will only be used as a fallback if nothing else is set. If the Custom OG Images emitter plugin is enabled, it will be treated as the new default per page, but can be overwritten by setting the `socialImage` frontmatter property for that page.\n\n## Customization\n\nYou can fully customize how the images being generated look by passing your own component to `imageStructure`. This component takes JSX + some page metadata/config options and converts it to an image using [satori](https://github.com/vercel/satori). Vercel provides an [online playground](https://og-playground.vercel.app/) that can be used to preview how your JSX looks like as a picture. This is ideal for prototyping your custom design.\n\n### Fonts\n\nYou will also be passed an array containing a header and a body font (where the first entry is header and the second is body). The fonts matches the ones selected in `theme.typography.header` and `theme.typography.body` from `quartz.config.yaml` and will be passed in the format required by [`satori`](https://github.com/vercel/satori). To use them in CSS, use the `.name` property (e.g. `fontFamily: fonts[1].name` to use the \"body\" font family).\n\nAn example of a component using the header font could look like this:\n\n```tsx title=\"socialImage.tsx\"\nexport const myImage: SocialImageOptions[\"imageStructure\"] = (...) => {\n  return <p style={{ fontFamily: fonts[0].name }}>Cool Header!</p>\n}\n```\n\n> [!example]- Local fonts\n>\n> For cases where you use a local fonts under `static` folder, make sure to set the correct `@font-face` in `custom.scss`\n>\n> ```scss title=\"custom.scss\"\n> @font-face {\n>   font-family: \"Newsreader\";\n>   font-style: normal;\n>   font-weight: normal;\n>   font-display: swap;\n>   src: url(\"/static/Newsreader.woff2\") format(\"woff2\");\n> }\n> ```\n>\n> Then in `quartz/util/og.tsx`, you can load the Satori fonts like so:\n>\n> ```tsx title=\"quartz/util/og.tsx\"\n> import { joinSegments, QUARTZ } from \"../path\"\n> import fs from \"fs\"\n> import path from \"path\"\n>\n> const newsreaderFontPath = joinSegments(QUARTZ, \"static\", \"Newsreader.woff2\")\n> export async function getSatoriFonts(headerFont: FontSpecification, bodyFont: FontSpecification) {\n>   // ... rest of implementation remains same\n>   const fonts: SatoriOptions[\"fonts\"] = [\n>     ...headerFontData.map((data, idx) => ({\n>       name: headerFontName,\n>       data,\n>       weight: headerWeights[idx],\n>       style: \"normal\" as const,\n>     })),\n>     ...bodyFontData.map((data, idx) => ({\n>       name: bodyFontName,\n>       data,\n>       weight: bodyWeights[idx],\n>       style: \"normal\" as const,\n>     })),\n>     {\n>       name: \"Newsreader\",\n>       data: await fs.promises.readFile(path.resolve(newsreaderFontPath)),\n>       weight: 400,\n>       style: \"normal\" as const,\n>     },\n>   ]\n>\n>   return fonts\n> }\n> ```\n>\n> This font then can be used with your custom structure.\n\n## Examples\n\nHere are some example image components you can use as a starting point:\n\n### Basic Example\n\nThis example will generate images that look as follows:\n\n| Light                                      | Dark                                      |\n| ------------------------------------------ | ----------------------------------------- |\n| ![[custom-social-image-preview-light.png]] | ![[custom-social-image-preview-dark.png]] |\n\n```tsx\nimport { SatoriOptions } from \"satori/wasm\"\nimport { GlobalConfiguration } from \"../cfg\"\nimport { SocialImageOptions, UserOpts } from \"./imageHelper\"\nimport { QuartzPluginData } from \"../plugins/vfile\"\n\nexport const customImage: SocialImageOptions[\"imageStructure\"] = (\n  cfg: GlobalConfiguration,\n  userOpts: UserOpts,\n  title: string,\n  description: string,\n  fonts: SatoriOptions[\"fonts\"],\n  fileData: QuartzPluginData,\n) => {\n  // How many characters are allowed before switching to smaller font\n  const fontBreakPoint = 22\n  const useSmallerFont = title.length > fontBreakPoint\n\n  const { colorScheme } = userOpts\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        flexDirection: \"row\",\n        justifyContent: \"flex-start\",\n        alignItems: \"center\",\n        height: \"100%\",\n        width: \"100%\",\n      }}\n    >\n      <div\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          height: \"100%\",\n          width: \"100%\",\n          backgroundColor: cfg.theme.colors[colorScheme].light,\n          flexDirection: \"column\",\n          gap: \"2.5rem\",\n          paddingTop: \"2rem\",\n          paddingBottom: \"2rem\",\n        }}\n      >\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].dark,\n            fontSize: useSmallerFont ? 70 : 82,\n            marginLeft: \"4rem\",\n            textAlign: \"center\",\n            marginRight: \"4rem\",\n            fontFamily: fonts[0].name,\n          }}\n        >\n          {title}\n        </p>\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].dark,\n            fontSize: 44,\n            marginLeft: \"8rem\",\n            marginRight: \"8rem\",\n            lineClamp: 3,\n            fontFamily: fonts[1].name,\n          }}\n        >\n          {description}\n        </p>\n      </div>\n      <div\n        style={{\n          height: \"100%\",\n          width: \"2vw\",\n          position: \"absolute\",\n          backgroundColor: cfg.theme.colors[colorScheme].tertiary,\n          opacity: 0.85,\n        }}\n      />\n    </div>\n  )\n}\n```\n\n### Advanced Example\n\nThe following example includes a customized social image with a custom background and formatted date:\n\n```typescript title=\"custom-og.tsx\"\nexport const og: SocialImageOptions[\"Component\"] = (\n  cfg: GlobalConfiguration,\n  fileData: QuartzPluginData,\n  { colorScheme }: Options,\n  title: string,\n  description: string,\n  fonts: SatoriOptions[\"fonts\"],\n) => {\n  let created: string | undefined\n  let reading: string | undefined\n  if (fileData.dates) {\n    created = formatDate(getDate(cfg, fileData)!, cfg.locale)\n  }\n  const { minutes, text: _timeTaken, words: _words } = readingTime(fileData.text!)\n  reading = i18n(cfg.locale).components.contentMeta.readingTime({\n    minutes: Math.ceil(minutes),\n  })\n\n  const Li = [created, reading]\n\n  return (\n    <div\n      style={{\n        position: \"relative\",\n        display: \"flex\",\n        flexDirection: \"row\",\n        alignItems: \"flex-start\",\n        height: \"100%\",\n        width: \"100%\",\n        backgroundImage: `url(\"https://${cfg.baseUrl}/static/og-image.jpeg\")`,\n        backgroundSize: \"100% 100%\",\n      }}\n    >\n      <div\n        style={{\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n          background: \"radial-gradient(circle at center, transparent, rgba(0, 0, 0, 0.4) 70%)\",\n        }}\n      />\n      <div\n        style={{\n          display: \"flex\",\n          height: \"100%\",\n          width: \"100%\",\n          flexDirection: \"column\",\n          justifyContent: \"flex-start\",\n          alignItems: \"flex-start\",\n          gap: \"1.5rem\",\n          paddingTop: \"4rem\",\n          paddingBottom: \"4rem\",\n          marginLeft: \"4rem\",\n        }}\n      >\n        <img\n          src={`\"https://${cfg.baseUrl}/static/icon.jpeg\"`}\n          style={{\n            position: \"relative\",\n            backgroundClip: \"border-box\",\n            borderRadius: \"6rem\",\n          }}\n          width={80}\n        />\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            textAlign: \"left\",\n            fontFamily: fonts[0].name,\n          }}\n        >\n          <h2\n            style={{\n              color: cfg.theme.colors[colorScheme].light,\n              fontSize: \"3rem\",\n              fontWeight: 700,\n              marginRight: \"4rem\",\n              fontFamily: fonts[0].name,\n            }}\n          >\n            {title}\n          </h2>\n          <ul\n            style={{\n              color: cfg.theme.colors[colorScheme].gray,\n              gap: \"1rem\",\n              fontSize: \"1.5rem\",\n              fontFamily: fonts[1].name,\n            }}\n          >\n            {Li.map((item, index) => {\n              if (item) {\n                return <li key={index}>{item}</li>\n              }\n            })}\n          </ul>\n        </div>\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].light,\n            fontSize: \"1.5rem\",\n            overflow: \"hidden\",\n            marginRight: \"8rem\",\n            textOverflow: \"ellipsis\",\n            display: \"-webkit-box\",\n            WebkitLineClamp: 7,\n            WebkitBoxOrient: \"vertical\",\n            lineClamp: 7,\n            fontFamily: fonts[1].name,\n          }}\n        >\n          {description}\n        </p>\n      </div>\n    </div>\n  )\n}\n```\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.CustomOgImages()`.\n- Source: [`quartz-community/og-image`](https://github.com/quartz-community/og-image)\n- Install: `npx quartz plugin add github:quartz-community/og-image`\n","docs/plugins/Darkmode.md":"---\ntitle: Darkmode\ndescription: Toggle between light and dark themes.\ntags:\n  - plugin/component\nimage: \"#0052cc\"\nrepository: \"[quartz-community/darkmode](https://github.com/quartz-community/darkmode)\"\nenabled: true\nrequired: false\n---\n\nDark mode toggle.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Darkmode]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enabled`: Whether to enable the dark mode toggle. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/darkmode\n  enabled: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Darkmode()`.\n- Source: [`quartz-community/darkmode`](https://github.com/quartz-community/darkmode)\n- Install: `npx quartz plugin add github:quartz-community/darkmode`\n","docs/plugins/Description.md":"---\ntitle: Description\ndescription: Generates page descriptions for metadata and previews.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/description](https://github.com/quartz-community/description)\"\nenabled: true\nrequired: false\n---\n\nThis plugin generates descriptions that are used as metadata for the HTML `head`, the [[RSS Feed]] and in [[folder and tag listings]] if there is no main body content, the description is used as the text between the title and the listing.\n\nIf the frontmatter contains a `description` property, it is used (see [[authoring content#Syntax]]). Otherwise, the plugin will do its best to use the first few sentences of the content to reach the target description length.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `descriptionLength`: the target length of the generated description. Default is 150 characters. The cut off happens after the first _sentence_ that ends after the given length.\n- `maxDescriptionLength`: the hard maximum length of the description. If the generated description exceeds this, it is truncated with an ellipsis. Default is 300 characters.\n- `replaceExternalLinks`: If `true` (default), replace external links with their domain and path in the description (e.g. `https://domain.tld/some_page/another_page?query=hello&target=world` is replaced with `domain.tld/some_page/another_page`).\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Description()`.\n- Source: [`quartz-community/description`](https://github.com/quartz-community/description)\n- Install: `npx quartz plugin add github:quartz-community/description`\n","docs/plugins/EncryptedPages Demo.md":"---\ntitle: Encrypted Pages Demo\npassword: quartz\nunlisted: true\ntags:\n  - plugin/transformer\nimage:\n---\n\nCongratulations! You've successfully decrypted this page. 🎉\n\nThis is a live demo of the [[EncryptedPages]] plugin. The content you're reading was encrypted at build time using AES-256-GCM and decrypted in your browser using the Web Crypto API. This page is also `unlisted: true`, which means it was hidden from every discovery surface on the site until you entered the password.\n\n## What just happened?\n\n1. At build time, the plugin read the `password` field from this page's frontmatter and encrypted all content below the title.\n2. Because this page is `unlisted: true`, the plugin emitted its metadata (slug, title, links, tags) to a separate `static/encryptedContentIndex.json` file, encrypted with this page's own password.\n3. When you visited this page, you were shown a password prompt instead of the content. The page was absent from the sidebar graph, explorer, search, RSS, sitemap, backlinks, tag listings, and bases views.\n4. After entering the correct password, the plugin derived an encryption key using PBKDF2 and decrypted the content client-side.\n5. The plugin then used the cached password to unlock this page's entry in the shadow content index and patched the in-memory content index in place. A `content-index-updated` event was dispatched, so graph, explorer, and search re-initialized with the newly unlocked entry — if you navigate back to any other page now, you will see this page in the sidebar, the graph, and search results. Server-side rendered listings (backlinks, recent notes, tag pages, folder listings, and [[BasesPage|bases views]]) were baked into HTML at build time and will not update within this session; they will only reflect decrypted pages on a fresh build of the site.\n\n## Password caching\n\nYour password has been cached in session storage. If there were other encrypted pages on this site with the same password, the plugin would automatically try this password on each one — unlocking its content as well as its entry in the shadow content index — so you'd only need to enter it once per session.\n\n## Try it yourself\n\nTo add encrypted pages to your own Quartz site, install the plugin and add a `password` field to any page's frontmatter. See [[EncryptedPages]] for full setup instructions.\n","docs/plugins/EncryptedPages.md":"---\ntitle: EncryptedPages\ndescription: Password-protected encrypted pages with shadow content index.\ntags:\n  - plugin/transformer\n  - plugin/emitter\nimage: \"#FF1493\"\nnew-in-v5: true\nrepository: \"[quartz-community/encrypted-pages](https://github.com/quartz-community/encrypted-pages)\"\nenabled: true\nrequired: false\n---\n\nPassword-protected encrypted pages. Encrypts page content at build time using AES-256-GCM and decrypts client-side with the Web Crypto API. Passwords are set per-page via frontmatter. A companion emitter writes an encrypted shadow content index so unlisted encrypted pages can be dynamically revealed in graph, explorer, and search after a successful decryption — without ever leaking their metadata to visitors who do not hold the password.\n\n> [!example] Live demo\n> Try it yourself: [[EncryptedPages Demo]]. The password is `quartz`.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nAdd a `password` field to any page's frontmatter to encrypt it:\n\n```yaml\n---\ntitle: My Secret Page\npassword: mysecretpassword\n---\n```\n\nThe page content will be encrypted at build time. Visitors must enter the correct password to view the content.\n\nSuccessful passwords are cached in the browser's session storage and automatically tried on other encrypted pages for convenience.\n\n### Hiding encrypted pages from discovery surfaces\n\nBy default, encrypted pages still appear in the graph, explorer, search, RSS, sitemap, and backlinks — visitors can see the page exists and its title, but cannot read the content without the password.\n\nTo hide an encrypted page entirely until a visitor successfully decrypts it, set `unlisted: true` in its frontmatter:\n\n```yaml\n---\ntitle: My Secret Page\npassword: mysecretpassword\nunlisted: true\n---\n```\n\nAn unlisted page:\n\n- Is **absent** from `contentIndex.json`, `sitemap.xml`, the RSS feed, backlinks, recent notes, folder listings, tag listings, bases views, graph, explorer, and search.\n- Is still emitted as HTML, so it remains accessible by direct URL.\n- Has its metadata (slug, title, links, tags) written to a separate `static/encryptedContentIndex.json` file, encrypted with the page's own password.\n- Is dynamically re-added to the in-memory content index when a visitor successfully decrypts it, so graph, explorer, and search reflect it for the rest of the browser session. Server-rendered listings — backlinks, recent notes, tag pages, folder listings, and [[BasesPage|bases views]] — remain statically hidden even after decryption because they are baked as HTML at build time.\n\nTo make this the default for every encrypted page on your site, set `unlistWhenEncrypted: true` in the plugin options. Individual pages can then opt back in with `unlisted: false`.\n\n> [!note]\n> The `unlisted: true` frontmatter field above only takes effect for encrypted pages when this plugin is installed. If you also want `unlisted: true` to work on **non-encrypted** pages across your site, install [[UnlistedPages]] alongside this one. The two plugins compose cleanly — when both are enabled, `unlisted: true` hides any page, encrypted or not, from every discovery surface that respects the `file.data.unlisted` convention.\n\n### Permanently hiding encrypted pages (`stealth`)\n\nBy default, an `unlisted: true` encrypted page is _revealed_ in graph, explorer, and search after a visitor successfully decrypts it. This is usually what you want: the user just proved they know the password, so showing them the page in the sidebar makes sense for the rest of their session.\n\nIf you instead want a page that stays permanently invisible — accessible only by direct URL, even to users who have successfully decrypted other pages on the same site — set `stealth: true` in its frontmatter:\n\n```yaml\n---\ntitle: Deep Secret\npassword: mysecretpassword\nstealth: true\n---\n```\n\nA stealth page:\n\n- Is **absent** from every discovery surface, same as any `unlisted` page.\n- Has **no entry** in the shadow content index (`encryptedContentIndex.json`). The plugin deliberately skips stealth pages when building the shadow index.\n- Stays hidden even after the visitor enters the correct password. Since there is no shadow-index entry to decrypt, there is nothing to patch into the in-memory content index — graph, explorer, and search never learn the page exists. Only the decrypted HTML is visible to the user on the page itself.\n- The password is still cached in session storage, so re-visiting the same stealth page will auto-unlock it.\n\n`stealth: true` implies `unlisted: true` — you do not need to set both, and if you write `stealth: true, unlisted: false` the stealth flag wins. On non-encrypted pages `stealth: true` has no effect (there is no shadow index to skip).\n\nUse stealth pages for \"secret door\" content that should only reach users who already know the exact URL: private notes linked from an external wiki, personal pages you send to specific people, or anything you never want to show up in a site-internal search even to authenticated readers.\n\n## Configuration\n\nThis plugin provides a transformer, an emitter, and a component. All options are set on a single config entry and shared between the transformer and the emitter — Quartz instantiates both automatically.\n\n- `iterations`: PBKDF2 iteration count for key derivation. Higher values are more secure but slower to unlock. Defaults to `600000`.\n- `passwordField`: Frontmatter field name that holds the page password. Shared by the transformer and the emitter. Defaults to `\"password\"`.\n- `unlistWhenEncrypted`: If `true`, every encrypted page is marked `unlisted` unless its frontmatter explicitly overrides it. Defaults to `false`.\n- `outputPath`: Output path for the shadow content index, relative to Quartz's output directory. Defaults to `\"static/encryptedContentIndex.json\"`.\n\n### Component options\n\n- `className`: CSS class for the component wrapper. Defaults to `\"encrypted-page-wrapper\"`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/encrypted-pages\n  enabled: true\n  options:\n    iterations: 600000\n    passwordField: password\n    unlistWhenEncrypted: false\n    outputPath: static/encryptedContentIndex.json\n```\n\n> [!warning]\n> The `EncryptedPages` transformer replaces the entire HAST tree of an encrypted page with an opaque ciphertext container. Any transformer that needs to read the real HTML — in particular [[CrawlLinks]], which populates the links used by backlinks and the shadow content index — must run **before** `EncryptedPages`. Use the `order` field in `quartz.config.yaml` to control this.\n\n## Security\n\n- Content is encrypted with AES-256-GCM using PBKDF2 SHA-256 key derivation.\n- Plaintext is stripped from search indices, RSS feeds, and the shadow content index regardless of visibility setting.\n- The shadow content index is a flat array of opaque encrypted blobs. An attacker who downloads it learns only the number of unlisted encrypted pages and the PBKDF2 iteration count — no slugs, titles, or link relationships leak.\n- Passwords are set per-page in frontmatter. Avoid committing passwords to public repositories.\n- This is client-side encryption of a static site. It protects against casual browsing but not against determined attackers with access to the page source.\n\n## API\n\n- Category: Transformer, Emitter\n- Function name: `ExternalPlugin.EncryptedPages()`, `ExternalPlugin.EncryptedContentIndex()`.\n- Source: [`quartz-community/encrypted-pages`](https://github.com/quartz-community/encrypted-pages)\n- Install: `npx quartz plugin add github:quartz-community/encrypted-pages`\n","docs/plugins/ExplicitPublish.md":"---\ntitle: ExplicitPublish\ndescription: \"Only publishes pages explicitly marked with publish: true.\"\ntags:\n  - plugin/filter\nimage:\nrepository: \"[quartz-community/explicit-publish](https://github.com/quartz-community/explicit-publish)\"\nenabled: false\nrequired: false\n---\n\nThis plugin filters content based on an explicit `publish` flag in the frontmatter, allowing only content that is explicitly marked for publication to pass through. It's the opt-in version of [[RemoveDrafts]]. See [[private pages]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Filter\n- Function name: `ExternalPlugin.ExplicitPublish()`.\n- Source: [`quartz-community/explicit-publish`](https://github.com/quartz-community/explicit-publish)\n- Install: `npx quartz plugin add github:quartz-community/explicit-publish`\n","docs/plugins/Explorer.md":"---\ntitle: Explorer\ndescription: File tree explorer sidebar.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/explorer](https://github.com/quartz-community/explorer)\"\nenabled: true\nrequired: false\n---\n\nFile tree explorer sidebar.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Explorer]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n**YAML options** (in `quartz.config.yaml`):\n\n- `title`: The title of the explorer. Defaults to `Explorer`.\n- `folderClickBehavior`: The behavior when a folder is clicked. Can be `\"link\"` to navigate or `\"collapse\"` to toggle. Defaults to `link`.\n- `folderDefaultState`: The default state of folders. Can be `\"collapsed\"` or `\"open\"`. Defaults to `collapsed`.\n- `useSavedState`: Whether to use local storage to save the state of the explorer. Defaults to `true`.\n\n**TS override options** (in `quartz.ts`, for callback functions that can't be expressed in YAML):\n\n- `sortFn`: Custom sort function for ordering files and folders.\n- `filterFn`: Custom filter function to exclude specific nodes.\n- `mapFn`: Custom map function to transform node properties (e.g. display names).\n- `order`: Array controlling the order of operations. Defaults to `[\"filter\", \"map\", \"sort\"]`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/explorer\n  enabled: true\n  options:\n    title: Explorer\n    folderClickBehavior: link\n    folderDefaultState: collapsed\n    useSavedState: true\n```\n\n### TS override example\n\n```ts title=\"quartz.ts\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.Explorer({\n  mapFn: (node) => {\n    node.displayName = node.displayName.toUpperCase()\n    return node\n  },\n})\n```\n\nSee [[features/explorer#Advanced customization]] for more examples.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Explorer()`.\n- Source: [`quartz-community/explorer`](https://github.com/quartz-community/explorer)\n- Install: `npx quartz plugin add github:quartz-community/explorer`\n","docs/plugins/Favicon.md":"---\ntitle: Favicon\ndescription: Emits the site favicon.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/favicon](https://github.com/quartz-community/favicon)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits a `favicon.ico` into the `public` folder. It creates the favicon from `icon.png` located in the `quartz/static` folder.\nThe plugin resizes `icon.png` to 48x48px to make it as small as possible.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.Favicon()`.\n- Source: [`quartz-community/favicon`](https://github.com/quartz-community/favicon)\n- Install: `npx quartz plugin add github:quartz-community/favicon`\n","docs/plugins/FolderPage.md":"---\ntitle: FolderPage\ndescription: Generates listing pages for folders.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/folder-page](https://github.com/quartz-community/folder-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that generates index pages for folders, creating a listing page for each folder that contains multiple content files. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). See [[folder and tag listings]] for more information.\n\nExample: [[advanced/|Advanced]]\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `showFolderCount`: Whether to display the number of pages in the folder. Defaults to `true`.\n- `showSubfolders`: Whether to include pages from subfolders in the listing. Defaults to `true`.\n- `sort`: A function of type `(f1: QuartzPluginData, f2: QuartzPluginData) => number{:ts}` used to sort entries. Defaults to sorting by date and tie-breaking on lexographical order. Requires a TS override.\n- `prefixFolders`: If `true`, generated folder page titles are prefixed with \"Folder: \" (e.g. \"Folder: notes\"). Defaults to `false`.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.FolderPage()`.\n- Source: [`quartz-community/folder-page`](https://github.com/quartz-community/folder-page)\n- Install: `npx quartz plugin add github:quartz-community/folder-page`\n","docs/plugins/Fonts.md":"---\ntitle: Fonts\ndescription: Fine-grained font control with per-heading support, Google Fonts integration, and theme font discovery.\ntags:\n  - plugin/transformer\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/fonts](https://github.com/quartz-community/fonts)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides fine-grained control over fonts in your Quartz site. It supports per-heading font families, automatic theme font discovery when used with [Quartz Themes](https://github.com/saberzero1/quartz-themes), Google Fonts integration with automatic weight and italic loading, and falls back to Obsidian's default system font stacks.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Why use Fonts?\n\nQuartz uses three CSS variables for fonts: `--headerFont`, `--bodyFont`, and `--codeFont`. Obsidian themes use a different system with per-heading variables (`--h1-font` through `--h6-font`), `--font-text`, and `--font-monospace`. These two systems don't bridge correctly, causing heading fonts to not render as themes intend.\n\nFonts solves this by:\n\n1. Bridging the Obsidian and Quartz font systems\n2. Emitting **unlayered** CSS that correctly overrides Quartz's base heading styles\n3. Providing per-heading font control that neither system offers alone\n4. Optionally loading fonts from Google Fonts with fine-grained weight and italic control\n\n## Configuration\n\nFont options accept either a CSS font-family string or an object with Google Fonts loading control:\n\n```yaml\n# String form\nbody: '\"Inter\", sans-serif'\n\n# Object form (for Google Fonts weight/italic control)\nbody:\n  name: Inter\n  weights: [400, 600, 700]\n  includeItalic: true\n```\n\nThis plugin accepts the following configuration options:\n\n| Option          | Type                | Default          | Description                                                                                                            |\n| --------------- | ------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------- |\n| `title`         | `FontSpecification` | `header` value   | Font family for the site title.                                                                                        |\n| `body`          | `FontSpecification` | Obsidian default | Font family for body text.                                                                                             |\n| `header`        | `FontSpecification` | Obsidian default | Default font family for all headings (h1-h6).                                                                          |\n| `code`          | `FontSpecification` | Obsidian default | Font family for code and monospace elements.                                                                           |\n| `interface`     | `FontSpecification` | Obsidian default | Font family for UI elements.                                                                                           |\n| `h1` – `h6`     | `FontSpecification` | `header` value   | Per-heading font family overrides.                                                                                     |\n| `useThemeFonts` | `boolean`           | `true`           | Use fonts from [Quartz Themes](https://github.com/saberzero1/quartz-themes) as defaults when it is installed.          |\n| `fontOrigin`    | `string`            | `\"googleFonts\"`  | `\"googleFonts\"` to load from Google Fonts CDN, `\"selfHosted\"` to download and serve locally, `\"local\"` for no loading. |\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    useThemeFonts: true\n    fontOrigin: googleFonts\n```\n\n### Font resolution\n\nFonts are resolved using a priority chain:\n\n```\nUser config (plugin options)\n  → Theme fonts (from Quartz Themes, if installed)\n    → Obsidian defaults (system font stacks)\n```\n\nFor individual headings:\n\n```\nh1 option → header option → theme --h1-font → theme font → Obsidian default\n```\n\nFor the site title:\n\n```\ntitle option → header option → theme font → Obsidian default\n```\n\n## Usage with Quartz Themes\n\nWhen [Quartz Themes](https://github.com/saberzero1/quartz-themes) is installed and enabled, Fonts automatically discovers the theme's font metadata and uses it as defaults. Any options you explicitly set in Fonts will override the theme fonts.\n\nFonts must run **after** Quartz Themes. This is handled automatically by plugin ordering (Quartz Themes = 10, Fonts = 60).\n\n> [!warning]\n> If Quartz Themes is enabled but hasn't run yet when Fonts executes, you'll see a warning in the console. Make sure Quartz Themes has a lower `defaultOrder` than Fonts.\n\n## Usage without Quartz Themes\n\nFonts works standalone. Without a theme, it falls back to Obsidian's default system font stacks. You can set fonts explicitly via the plugin options.\n\n## Examples\n\n```yaml title=\"quartz.config.yaml\"\n# Use theme fonts automatically (default behavior)\n- source: github:quartz-community/fonts\n  enabled: true\n\n# Override just the heading font\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    header: '\"Playfair Display\", serif'\n\n# Full control with per-heading fonts\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    body: '\"Inter\", sans-serif'\n    header: '\"Playfair Display\", serif'\n    code: '\"JetBrains Mono\", monospace'\n    h1: '\"Playfair Display\", serif'\n    h2: '\"Lora\", serif'\n\n# Load from Google Fonts automatically\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    body: Inter\n    header: Playfair Display\n    code: JetBrains Mono\n\n# Google Fonts with weight/italic control\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    body:\n      name: Inter\n      weights: [400, 600, 700]\n      includeItalic: true\n    header:\n      name: Playfair Display\n      weights: [400, 700]\n    code:\n      name: JetBrains Mono\n      weights: [400]\n\n# Custom title font (separate from header)\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    title: Abril Fatface\n    header: Playfair Display\n    body: Inter\n    code: JetBrains Mono\n\n# Self-hosted fonts (downloaded at build time, no external requests)\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: selfHosted\n    body: Inter\n    header: Playfair Display\n    code: JetBrains Mono\n\n# Ignore theme fonts entirely\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    useThemeFonts: false\n    body: '\"Inter\", sans-serif'\n```\n\n## Self-Hosted Fonts\n\nWhen `fontOrigin: selfHosted` is set, Fonts downloads fonts from Google Fonts during the build and serves them from your site's `static/fonts/` directory. This makes your site fully self-contained with no external requests to Google at runtime.\n\nAt build time, the plugin:\n\n1. Fetches the Google Fonts CSS for your configured fonts\n2. Downloads each font file (`.woff2`, `.woff`, etc.)\n3. Writes the font files to `static/fonts/` in your build output\n4. Generates a `quartz-fonts.css` file with `@font-face` rules pointing to the local files\n\n> [!note]\n> Self-hosted fonts require `baseUrl` to be set in your Quartz configuration, since font URLs in the CSS need an absolute path.\n\n```yaml title=\"quartz.config.yaml\"\nconfiguration:\n  baseUrl: \"example.com\"\n\nplugins:\n  - source: github:quartz-community/fonts\n    enabled: true\n    options:\n      fontOrigin: selfHosted\n      body: Inter\n      header: Playfair Display\n      code: JetBrains Mono\n```\n\n## Google Fonts Validation\n\nWhen `fontOrigin: googleFonts` is set and the optional [`google-font-metadata`](https://www.npmjs.com/package/google-font-metadata) package is installed, Fonts validates your font configuration at build time:\n\n- Checks that font family names exist in Google Fonts.\n- Warns if requested weights are not available for a font.\n- Warns if italic is requested but the font doesn't support it.\n\nInstall it to enable validation:\n\n```bash\nnpm install google-font-metadata\n```\n\nValidation warnings are logged to the console but do not block the build.\n\n## API\n\n- Category: Transformer, Emitter\n- Function name: `ExternalPlugin.Fonts()` (transformer), `ExternalPlugin.FontsEmitter()` (emitter).\n- Source: [`quartz-community/fonts`](https://github.com/quartz-community/fonts)\n- Install: `npx quartz plugin add github:quartz-community/fonts`\n","docs/plugins/Footer.md":"---\ntitle: Footer\ndescription: Page footer with configurable links.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/footer](https://github.com/quartz-community/footer)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders a footer at the bottom of the page with a \"Created with Quartz\" message and a set of configurable links.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `links`: A map of link labels to their URLs to display in the footer. Defaults to `{}`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/footer\n  enabled: true\n  options:\n    links:\n      GitHub: https://github.com/jackyzha0/quartz\n      Discord Community: https://discord.gg/cRFFHYye7t\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Footer()`.\n- Source: [`quartz-community/footer`](https://github.com/quartz-community/footer)\n- Install: `npx quartz plugin add github:quartz-community/footer`\n","docs/plugins/Frontmatter.md":"---\ntitle: Frontmatter\naliases:\n  - note-properties\n  - Note Properties\ndescription: Parses frontmatter and displays note properties in a collapsible panel.\ntags:\n  - plugin/transformer\n  - plugin/component\npublish: true\nenableToc: true\nimage:\nrepository: \"[quartz-community/note-properties](https://github.com/quartz-community/note-properties)\"\nenabled: true\nrequired: true\n---\n\nThis plugin parses the frontmatter of the page using the [gray-matter](https://github.com/jonschlinkert/gray-matter) library and optionally displays selected properties in a collapsible panel. See [[authoring content#Syntax]], [[Obsidian compatibility]] and [[OxHugo compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n> [!warning]\n> This plugin must not be removed, otherwise Quartz will break.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `delimiters`: the delimiters to use for the frontmatter. Can have one value (e.g. `\"---\"`) or separate values for opening and closing delimiters (e.g. `[\"---\", \"~~~\"]`). Defaults to `\"---\"`.\n- `language`: the language to use for parsing the frontmatter. Can be `yaml` (default) or `toml`.\n- `includeAll`: include all frontmatter properties in the properties panel. When `false`, only `includedProperties` are shown. Defaults to `false`.\n- `includedProperties`: properties to include when `includeAll` is `false`. Defaults to `[\"description\", \"tags\", \"aliases\"]`.\n- `excludedProperties`: properties to always exclude from display, even when `includeAll` is `true`. Defaults to `[]`.\n- `hidePropertiesView`: hide the visual properties panel while still processing frontmatter. Useful if you only need frontmatter parsing without the UI. Defaults to `false`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/note-properties\n  enabled: true\n  options:\n    includeAll: false\n    includedProperties:\n      - description\n      - tags\n      - aliases\n    excludedProperties: []\n    hidePropertiesView: false\n    delimiters: \"---\"\n    language: yaml\n```\n\n## Properties panel\n\nWhen enabled, this plugin renders a collapsible \"Properties\" panel before the page body. The panel displays selected frontmatter fields in a table with automatic type rendering:\n\n- **Strings** are shown as plain text. [[wikilinks]] and [markdown links](https://example.com) within strings are rendered as clickable links. Wikilink targets are slugified the same way as body-content links (e.g. `[[My Note]]` resolves to `my-note`) and matching is case-insensitive to mirror Obsidian's behavior, so `[[MyNote]]`, `[[mynote]]`, and `[[MYNOTE]]` all point to the same page.\n- **Arrays** are rendered as comma-separated lists.\n- **Booleans** are rendered as disabled checkboxes.\n- **Numbers** are rendered in a monospace font.\n- **Objects** are rendered as JSON in a code block.\n- **Tags** get special treatment: they are rendered as highlighted links that point to the corresponding tag page.\n- **Null/undefined** values are shown as an em-dash (—).\n\n### Per-note overrides\n\nYou can control the properties panel on a per-note basis using frontmatter keys:\n\n- `quartz-properties` (or `quartzProperties`): set to `true` to force-show the panel, or `false` to force-hide it, overriding the global `hidePropertiesView` setting.\n- `quartz-properties-collapse` (or `quartzPropertiesCollapse`): set to `true` to start the panel collapsed, or `false` to start it expanded, overriding the default collapse state.\n\nThese keys are automatically excluded from the visible properties table.\n\n```yaml title=\"Example frontmatter\"\n---\ntitle: My Note\nquartz-properties: true\nquartz-properties-collapse: false\n---\n```\n\n## Supported frontmatter\n\nQuartz supports the following frontmatter fields. Where multiple keys are listed, they are aliases — the first matching key is used.\n\n| Field              | Keys                                              | Description                                                                                                                                                                                                                        |\n| ------------------ | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Title              | `title`                                           | Page title. Falls back to filename if empty.                                                                                                                                                                                       |\n| Description        | `description`                                     | Page description for metadata and search.                                                                                                                                                                                          |\n| Tags               | `tags`, `tag`                                     | Categorization tags. Slugified the same way as file paths: spaces become `-`, `&` becomes `-and-`, `%` becomes `-percent`, and tags are lowercased so that `#MyTag` and `#mytag` resolve to the same tag page (matching Obsidian). |\n| Aliases            | `aliases`, `alias`                                | Alternative names for the page, used for link resolution.                                                                                                                                                                          |\n| Permalink          | `permalink`                                       | Custom URL slug. Also added to aliases.                                                                                                                                                                                            |\n| CSS classes        | `cssclasses`, `cssclass`                          | CSS classes applied to the page body.                                                                                                                                                                                              |\n| Social image       | `socialImage`, `image`, `cover`                   | Image used for social media previews.                                                                                                                                                                                              |\n| Social description | `socialDescription`                               | Description used specifically for social media previews.                                                                                                                                                                           |\n| Created date       | `created`, `date`                                 | When the note was created.                                                                                                                                                                                                         |\n| Modified date      | `modified`, `lastmod`, `updated`, `last-modified` | When the note was last modified. Falls back to `created` if unset.                                                                                                                                                                 |\n| Published date     | `published`, `publishDate`, `date`                | When the note was published.                                                                                                                                                                                                       |\n| Publish            | `publish`                                         | Whether the note should be published.                                                                                                                                                                                              |\n| Draft              | `draft`                                           | Whether the note is a draft.                                                                                                                                                                                                       |\n| Comments           | `comments`                                        | Whether comments are enabled for the note.                                                                                                                                                                                         |\n| Language           | `lang`                                            | Language code for the note.                                                                                                                                                                                                        |\n| Enable TOC         | `enableToc`                                       | Whether to show the table of contents.                                                                                                                                                                                             |\n\n## API\n\n- Category: Transformer, Component\n- Function name: `ExternalPlugin.NoteProperties()`.\n- Source: [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties)\n- Install: `npx quartz plugin add github:quartz-community/note-properties`\n","docs/plugins/GitHubFlavoredMarkdown.md":"---\ntitle: GitHubFlavoredMarkdown\ndescription: GitHub Flavored Markdown support (tables, task lists, footnotes, strikethrough).\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/github-flavored-markdown](https://github.com/quartz-community/github-flavored-markdown)\"\nenabled: true\nrequired: false\n---\n\nThis plugin enhances Markdown processing to support GitHub Flavored Markdown (GFM) which adds features like autolink literals, footnotes, strikethrough, tables and tasklists.\n\nIn addition, this plugin adds optional features for typographic refinement (such as converting straight quotes to curly quotes, dashes to en-dashes/em-dashes, and ellipses) and automatic heading links as a symbol that appears next to the heading on hover.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableSmartyPants`: When true, enables typographic enhancements. Default is true.\n- `linkHeadings`: When true, automatically adds links to headings. Default is true.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.GitHubFlavoredMarkdown()`.\n- Source: [`quartz-community/github-flavored-markdown`](https://github.com/quartz-community/github-flavored-markdown)\n- Install: `npx quartz plugin add github:quartz-community/github-flavored-markdown`\n","docs/plugins/Graph.md":"---\ntitle: Graph\ndescription: Interactive link graph visualization.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/graph](https://github.com/quartz-community/graph)\"\nenabled: true\nrequired: false\n---\n\nInteractive graph visualization.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[graph view]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `localGraph`: Options for the local graph view.\n- `globalGraph`: Options for the global graph view.\n\nBoth `localGraph` and `globalGraph` accept the following options:\n\n- `drag`: Enable dragging nodes. Defaults to `true`.\n- `zoom`: Enable zooming. Defaults to `true`.\n- `depth`: The depth of the graph. Defaults to `1` for local and `-1` for global.\n- `scale`: The initial scale of the graph. Defaults to `1.1` for local and `0.9` for global.\n- `repelForce`: The force that pushes nodes apart. Defaults to `0.5`.\n- `centerForce`: The force that pulls nodes to the center. Defaults to `0.3` for local and `0.2` for global.\n- `linkDistance`: The distance between linked nodes. Defaults to `30`.\n- `fontSize`: The font size of node labels. Defaults to `0.6`.\n- `opacityScale`: The scale of node opacity. Defaults to `1`.\n- `removeTags`: Tags to exclude from the graph. Defaults to `[]`.\n- `showTags`: Whether to show tags in the graph. Defaults to `true`.\n- `enableRadial`: Whether to enable radial layout. Defaults to `false` for local and `true` for global.\n- `focusOnHover`: Whether to focus on the hovered node. Defaults to `false` for local and `true` for global.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/graph\n  enabled: true\n  options:\n    localGraph:\n      drag: true\n      zoom: true\n      depth: 1\n      scale: 1.1\n      repelForce: 0.5\n      centerForce: 0.3\n      linkDistance: 30\n      fontSize: 0.6\n      opacityScale: 1\n      removeTags: []\n      showTags: true\n      focusOnHover: false\n      enableRadial: false\n    globalGraph:\n      drag: true\n      zoom: true\n      depth: -1\n      scale: 0.9\n      repelForce: 0.5\n      centerForce: 0.3\n      linkDistance: 30\n      fontSize: 0.6\n      opacityScale: 1\n      removeTags: []\n      showTags: true\n      focusOnHover: true\n      enableRadial: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Graph()`.\n- Source: [`quartz-community/graph`](https://github.com/quartz-community/graph)\n- Install: `npx quartz plugin add github:quartz-community/graph`\n","docs/plugins/HardLineBreaks.md":"---\ntitle: HardLineBreaks\ndescription: Treats single newlines as hard line breaks.\ntags:\n  - plugin/transformer\nimage: \"#ff8000\"\nrepository: \"[quartz-community/hard-line-breaks](https://github.com/quartz-community/hard-line-breaks)\"\nenabled: false\nrequired: false\n---\n\nThis plugin automatically converts single line breaks in Markdown text into hard line breaks in the HTML output. This plugin is not enabled by default as this doesn't follow the semantics of actual Markdown but you may enable it if you'd like parity with [[Obsidian compatibility|Obsidian]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.HardLineBreaks()`.\n- Source: [`quartz-community/hard-line-breaks`](https://github.com/quartz-community/hard-line-breaks)\n- Install: `npx quartz plugin add github:quartz-community/hard-line-breaks`\n","docs/plugins/Latex.md":"---\ntitle: Latex\ndescription: Renders LaTeX math expressions via KaTeX or Typst.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/latex](https://github.com/quartz-community/latex)\"\nenabled: true\nrequired: false\n---\n\nThis plugin adds LaTeX support to Quartz. See [[features/Latex|Latex]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `renderEngine`: the engine to use to render LaTeX equations. Can be `\"katex\"` for [KaTeX](https://katex.org/), `\"mathjax\"` for [MathJax](https://www.mathjax.org/) [SVG rendering](https://docs.mathjax.org/en/latest/output/svg.html), or `\"typst\"` for [Typst](https://typst.app/) (a new way to compose LaTeX equation). Defaults to KaTeX.\n- `customMacros`: custom macros for all LaTeX blocks. It takes the form of a key-value pair where the key is a new command name and the value is the expansion of the macro. For example: `{\"\\\\R\": \"\\\\mathbb{R}\"}`\n- `katexOptions`: Additional options passed to the KaTeX renderer. See the [KaTeX docs](https://katex.org/docs/options) for available options.\n- `mathJaxOptions`: Additional options passed to the MathJax renderer. See the [MathJax docs](https://docs.mathjax.org/en/latest/options/) for available options.\n- `typstOptions`: Additional options passed to the Typst renderer.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Latex()`.\n- Source: [`quartz-community/latex`](https://github.com/quartz-community/latex)\n- Install: `npx quartz plugin add github:quartz-community/latex`\n","docs/plugins/NotFoundPage.md":"---\ntitle: NotFoundPage\ntags:\n  - plugin/pageType\nimage:\n---\n\nThis plugin emits a 404 (Not Found) page for broken or non-existent URLs. It uses the `minimal` [[layout#Page Frames|page frame]] (no sidebars, no header or beforeBody chrome — only content and footer) to present a clean error page.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Page Type\n- Function name: `Plugin.NotFoundPage()` (internal plugin).\n- Source: [`quartz/plugins/pageTypes/404.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/pageTypes/404.ts)\n","docs/plugins/NoteProperties.md":"---\ntitle: NoteProperties\ndescription: Displays frontmatter properties in a collapsible panel.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/note-properties](https://github.com/quartz-community/note-properties)\"\nenabled: true\nrequired: true\n---\n\nThe NoteProperties plugin is documented under [[Frontmatter]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.NoteProperties()`.\n- Source: [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties)\n- Install: `npx quartz plugin add github:quartz-community/note-properties`\n","docs/plugins/ObsidianFlavoredMarkdown.md":"---\ntitle: ObsidianFlavoredMarkdown\ndescription: Obsidian-specific Markdown extensions (wikilinks, callouts, highlights, tags, embeds).\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/obsidian-flavored-markdown](https://github.com/quartz-community/obsidian-flavored-markdown)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides support for [[Obsidian compatibility]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `comments`: If `true` (default), enables parsing of `%%` style Obsidian comment blocks.\n- `highlight`: If `true` (default), enables parsing of `==` style highlights within content.\n- `wikilinks`:If `true` (default), turns [[wikilinks]] into regular links.\n- `callouts`: If `true` (default), adds support for [[callouts|callout]] blocks for emphasizing content.\n- `mermaid`: If `true` (default), enables [[Mermaid diagrams|Mermaid diagram]] rendering within Markdown files.\n- `parseTags`: If `true` (default), parses and links tags within the content.\n- `parseBlockReferences`: If `true` (default), handles block references, linking to specific content blocks.\n- `enableInHtmlEmbed`: If `true`, allows embedding of content directly within HTML. Defaults to `false`.\n- `enableYouTubeEmbed`: If `true` (default), enables the embedding of YouTube videos and playlists using external image Markdown syntax.\n- `enableTweetEmbed`: If `true` (default), enables the embedding of tweets as static blockquotes from Twitter/X URLs.\n- `enableVideoEmbed`: If `true` (default), enables the embedding of video files.\n- `enableCheckbox`: If `true`, adds support for interactive checkboxes in content, including custom task characters (e.g. `- [?]`, `- [!]`, `- [/]`). Defaults to `false`.\n- `enableObsidianUri`: If `true` (default), marks `obsidian://` protocol links with a CSS class and data attribute for custom styling.\n\n> [!note]\n> The `disableBrokenWikilinks` option previously lived on this plugin. It has moved to [[CrawlLinks]], which owns link resolution and can honor the configured `markdownLinkResolution` strategy when deciding whether a link is broken. Users upgrading from earlier Quartz v5 betas should move the option from `ObsidianFlavoredMarkdown` to `CrawlLinks`.\n\n> [!warning]\n> Don't remove this plugin if you're using [[Obsidian compatibility|Obsidian]] to author the content!\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.ObsidianFlavoredMarkdown()`.\n- Source: [`quartz-community/obsidian-flavored-markdown`](https://github.com/quartz-community/obsidian-flavored-markdown)\n- Install: `npx quartz plugin add github:quartz-community/obsidian-flavored-markdown`\n","docs/plugins/OxHugoFlavoredMarkdown.md":"---\ntitle: OxHugoFlavoredMarkdown\ndescription: Compatibility for ox-hugo exported Org-mode files.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/ox-hugo](https://github.com/quartz-community/ox-hugo)\"\nenabled: false\nrequired: false\n---\n\nThis plugin provides support for [ox-hugo](https://github.com/kaushalmodi/ox-hugo) compatibility. See [[OxHugo compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `wikilinks`: If `true` (default), converts Hugo `{{ relref }}` shortcodes to Quartz [[wikilinks]].\n- `removePredefinedAnchor`: If `true` (default), strips predefined anchors from headings.\n- `removeHugoShortcode`: If `true` (default), removes Hugo shortcode syntax (`{{}}`) from the content.\n- `replaceFigureWithMdImg`: If `true` (default), replaces `<figure/>` with `![]()`.\n- `replaceOrgLatex`: If `true` (default), converts Org-mode [[features/Latex|Latex]] fragments to Quartz-compatible LaTeX wrapped in `$` (for inline) and `$$` (for block equations).\n\n> [!warning]\n> While you can use this together with [[ObsidianFlavoredMarkdown]], it's not recommended because it might mutate the file in unexpected ways. Use with caution.\n>\n> If you use `toml` frontmatter, make sure to configure the [[Frontmatter]] plugin accordingly. See [[OxHugo compatibility]] for an example.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.OxHugoFlavoredMarkdown()`.\n- Source: [`quartz-community/ox-hugo`](https://github.com/quartz-community/ox-hugo)\n- Install: `npx quartz plugin add github:quartz-community/ox-hugo`\n","docs/plugins/PageTitle.md":"---\ntitle: PageTitle\ndescription: Renders the site title as a home link.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/page-title](https://github.com/quartz-community/page-title)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders the site-wide page title (configured via the `pageTitle` field in [[configuration]]) as a clickable link to the home page. It typically appears in the left sidebar.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options. The displayed title is controlled by the `pageTitle` field in `quartz.config.yaml`.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.PageTitle()`.\n- Source: [`quartz-community/page-title`](https://github.com/quartz-community/page-title)\n- Install: `npx quartz plugin add github:quartz-community/page-title`\n","docs/plugins/ReaderMode.md":"---\ntitle: ReaderMode\ndescription: Distraction-free reading mode toggle.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/reader-mode](https://github.com/quartz-community/reader-mode)\"\nenabled: true\nrequired: false\n---\n\nDistraction-free reading mode.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[reader mode]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enabled`: Whether to enable reader mode. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/reader-mode\n  enabled: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ReaderMode()`.\n- Source: [`quartz-community/reader-mode`](https://github.com/quartz-community/reader-mode)\n- Install: `npx quartz plugin add github:quartz-community/reader-mode`\n","docs/plugins/RecentNotes.md":"---\ntitle: RecentNotes\ndescription: Displays a list of recently modified notes.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/recent-notes](https://github.com/quartz-community/recent-notes)\"\nenabled: false\nrequired: false\n---\n\nShows recently modified notes.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[recent notes]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `title`: The title of the recent notes section. Defaults to `Recent notes`.\n- `limit`: The maximum number of recent notes to display. Defaults to `3`.\n- `showTags`: Whether to display the tags for each note. Defaults to `true`.\n- `linkToMore`: A slug to a page that shows more notes. Defaults to `false`.\n- `hideTagPages`: Whether to hide tag index pages from the list. Defaults to `false`.\n- `hideFolderPages`: Whether to hide folder index pages from the list. Defaults to `false`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/recent-notes\n  enabled: true\n  options:\n    limit: 3\n    showTags: true\n    hideTagPages: false\n    hideFolderPages: false\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.RecentNotes()`.\n- Source: [`quartz-community/recent-notes`](https://github.com/quartz-community/recent-notes)\n- Install: `npx quartz plugin add github:quartz-community/recent-notes`\n","docs/plugins/RemoveDrafts.md":"---\ntitle: RemoveDrafts\ndescription: Filters out pages marked as drafts.\ntags:\n  - plugin/filter\nimage:\nrepository: \"[quartz-community/remove-draft](https://github.com/quartz-community/remove-draft)\"\nenabled: true\nrequired: false\n---\n\nThis plugin filters out content from your vault, so that only finalized content is made available. This prevents [[private pages]] from being published. By default, it filters out all pages with `draft: true` in the frontmatter and leaves all other pages intact.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Filter\n- Function name: `ExternalPlugin.RemoveDrafts()`.\n- Source: [`quartz-community/remove-draft`](https://github.com/quartz-community/remove-draft)\n- Install: `npx quartz plugin add github:quartz-community/remove-draft`\n","docs/plugins/RoamFlavoredMarkdown.md":"---\ntitle: RoamFlavoredMarkdown\ndescription: Compatibility for Roam Research export format.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/roam](https://github.com/quartz-community/roam)\"\nenabled: false\nrequired: false\n---\n\nThis plugin provides support for [Roam Research](https://roamresearch.com) compatibility. See [[Roam Research compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `orComponent`: If `true` (default), converts Roam `{{ or:ONE|TWO|THREE }}` shortcodes into HTML Dropdown options.\n- `TODOComponent`: If `true` (default), converts Roam `{{[[TODO]]}}` shortcodes into HTML check boxes.\n- `DONEComponent`: If `true` (default), converts Roam `{{[[DONE]]}}` shortcodes into checked HTML check boxes.\n- `videoComponent`: If `true` (default), converts Roam `{{[[video]]:URL}}` shortcodes into embeded HTML video.\n- `audioComponent`: If `true` (default), converts Roam `{{[[audio]]:URL}}` shortcodes into embeded HTML audio.\n- `pdfComponent`: If `true` (default), converts Roam `{{[[pdf]]:URL}}` shortcodes into embeded HTML PDF viewer.\n- `blockquoteComponent`: If `true` (default), converts Roam `{{[[>]]}}` shortcodes into Quartz blockquotes.\n- `tableComponent`: If `true` (default), converts Roam table syntax into HTML tables.\n- `attributeComponent`: If `true` (default), converts Roam attribute syntax into rendered attributes.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.RoamFlavoredMarkdown()`.\n- Source: [`quartz-community/roam`](https://github.com/quartz-community/roam)\n- Install: `npx quartz plugin add github:quartz-community/roam`\n","docs/plugins/Search.md":"---\ntitle: Search\ndescription: Full-text search with tag filtering and keyboard navigation.\ntags:\n  - plugin/component\nimage: https://images.unsplash.com/photo-1516382799247-87df95d790b7\nrepository: \"[quartz-community/search](https://github.com/quartz-community/search)\"\nenabled: true\nrequired: false\n---\n\nFull-text search functionality.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[full-text search]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enablePreview`: Whether to show a preview of the page content in search results. Defaults to `true`.\n- `fieldPriority`: An array specifying the priority order for search fields. Defaults to `[\"title\", \"content\", \"tags\"]`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/search\n  enabled: true\n  options:\n    enablePreview: true\n    fieldPriority:\n      - title\n      - content\n      - tags\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Search()`.\n- Source: [`quartz-community/search`](https://github.com/quartz-community/search)\n- Install: `npx quartz plugin add github:quartz-community/search`\n","docs/plugins/Spacer.md":"---\ntitle: Spacer\ndescription: Flexible spacer for layout groups.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/spacer](https://github.com/quartz-community/spacer)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders a flexible spacer element that pushes adjacent components apart within a layout group. It uses CSS `flex: 2 1 auto` to fill available space, making it useful for spacing out items in toolbars or sidebars (for example, separating the search bar from the darkmode toggle in the left sidebar toolbar).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Spacer()`.\n- Source: [`quartz-community/spacer`](https://github.com/quartz-community/spacer)\n- Install: `npx quartz plugin add github:quartz-community/spacer`\n","docs/plugins/StackedPages.md":"---\ntitle: StackedPages\ndescription: Andy Matuschak-style stacked sliding panes.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/stacked-pages](https://github.com/quartz-community/stacked-pages)\"\nenabled: true\nrequired: false\n---\n\nAndy Matuschak-style stacked pages (sliding panes). Clicking internal links opens pages side by side in a horizontal stack, allowing you to trace your path through your notes. Each pane shows a full page and can be individually scrolled or closed.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nOnce enabled, clicking any internal link on a page opens the linked page as a new pane to the right instead of navigating away. The URL updates with a `#stacked=slug1,slug2` hash encoding your current stack, so you can share or bookmark a specific trail of pages.\n\nStacked pages are disabled on mobile by default (below 800px) since horizontal panning doesn't work well on small screens. On mobile, links navigate normally.\n\n### Interactions\n\n- **Click a link**: Opens the target page in a new pane to the right. If the maximum number of panes is reached, the leftmost pane is removed.\n- **Close a pane**: Click the × button in the pane header to remove it from the stack.\n- **Collapsed spines**: When panes overflow the viewport, earlier panes collapse to a thin vertical spine showing the page title. Click a spine to bring that pane back into focus.\n- **Browser back/forward**: The full stack state is stored in the URL hash and integrated with browser history, so back/forward navigation works as expected.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `maxTabs`: Maximum number of stacked panes visible at once. Defaults to `8`.\n- `mobileBreakpoint`: Viewport width (in pixels) below which stacked pages are disabled and links navigate normally. Defaults to `800`.\n- `showSpines`: Whether to show collapsed spine headers when panes overflow the viewport. Defaults to `true`.\n- `animateTransitions`: Whether to animate pane open/close transitions. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/stacked-pages\n  enabled: true\n  layout:\n    position: afterBody\n    priority: 50\n    display: all\n  options:\n    maxTabs: 8\n    mobileBreakpoint: 800\n    showSpines: true\n    animateTransitions: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.StackedPages()`.\n- Source: [`quartz-community/stacked-pages`](https://github.com/quartz-community/stacked-pages)\n- Install: `npx quartz plugin add github:quartz-community/stacked-pages`\n","docs/plugins/Static.md":"---\ntitle: Static\ntags:\n  - plugin/emitter\nimage:\n---\n\nThis plugin emits all static resources needed by Quartz. This is used, for example, for fonts and images that need a stable position, such as banners and icons. The plugin respects the `ignorePatterns` in the global [[configuration]].\n\n> [!important]\n> This is different from [[Assets]]. The resources from the [[Static]] plugin are located under `quartz/static`, whereas [[Assets]] renders all static resources under `content` and is used for images, videos, audio, etc. that are directly referenced by your markdown content.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.Static()` (internal plugin).\n- Source: [`quartz/plugins/emitters/static.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/static.ts).\n","docs/plugins/SyntaxHighlighting.md":"---\ntitle: SyntaxHighlighting\ndescription: Syntax highlighting for code blocks.\ntags:\n  - plugin/transformer\nimage: https://images.unsplash.com/photo-1580569214296-5cf2bffc5ccd\nrepository: \"[quartz-community/syntax-highlighting](https://github.com/quartz-community/syntax-highlighting)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is used to add syntax highlighting to code blocks in Quartz. See [[syntax highlighting]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `theme`: a separate id of one of the [themes bundled with Shikiji](https://shikiji.netlify.app/themes). One for light mode and one for dark mode. Defaults to `theme: { light: \"github-light\", dark: \"github-dark\" }`.\n- `keepBackground`: If set to `true`, the background of the Shikiji theme will be used. With `false` (default) the Quartz theme color for background will be used instead.\n- `clipboard`: Whether to add a copy-to-clipboard button to code blocks. Defaults to `true`.\n- `tokenClassification`: Whether to add semantic token classification CSS classes to code tokens. Defaults to `true`.\n\nIn addition, you can further override the colours in the `quartz/styles/syntax.scss` file.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.SyntaxHighlighting()`.\n- Source: [`quartz-community/syntax-highlighting`](https://github.com/quartz-community/syntax-highlighting)\n- Install: `npx quartz plugin add github:quartz-community/syntax-highlighting`\n","docs/plugins/TableOfContents.md":"---\ntitle: TableOfContents\ndescription: Generates and renders a table of contents from headings.\ntags:\n  - plugin/transformer\n  - plugin/component\nimage: https://images.unsplash.com/photo-1768527338896-3765921e992d\nrepository: \"[quartz-community/table-of-contents](https://github.com/quartz-community/table-of-contents)\"\nenabled: true\nrequired: false\n---\n\nThis plugin generates a table of contents (TOC) for Markdown documents. See [[table of contents]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `maxDepth`: Limits the depth of headings included in the TOC, ranging from `1` (top level headings only) to `6` (all heading levels). Default is `3`.\n- `minEntries`: The minimum number of heading entries required for the TOC to be displayed. Default is `1`.\n- `showByDefault`: If `true` (default), the TOC should be displayed by default. Can be overridden by frontmatter settings.\n- `collapseByDefault`: If `true`, the TOC will start in a collapsed state. Default is `false`.\n- `layout`: The visual layout of the TOC component. Can be `\"modern\"` or `\"legacy\"`. Default is `\"modern\"`.\n\n> [!warning]\n> This plugin needs the `Plugin.TableOfContents` component in `quartz.config.yaml` to determine where to display the TOC. Without it, nothing will be displayed. They should always be added or removed together.\n\n## API\n\n- Category: Transformer, Component\n- Function name: `ExternalPlugin.TableOfContentsTransformer()`.\n- Source: [`quartz-community/table-of-contents`](https://github.com/quartz-community/table-of-contents)\n- Install: `npx quartz plugin add github:quartz-community/table-of-contents`\n","docs/plugins/TagList.md":"---\ntitle: TagList\ndescription: Renders tags as clickable links.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/tag-list](https://github.com/quartz-community/tag-list)\"\nenabled: false\nrequired: false\n---\n\nThis plugin renders the page's tags as a list of clickable links. Each tag links to its corresponding [[TagPage|tag page]], making it easy for readers to browse related content by topic.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.TagList()`.\n- Source: [`quartz-community/tag-list`](https://github.com/quartz-community/tag-list)\n- Install: `npx quartz plugin add github:quartz-community/tag-list`\n","docs/plugins/TagPage.md":"---\ntitle: TagPage\ndescription: Generates listing pages for tags.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/tag-page](https://github.com/quartz-community/tag-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that emits dedicated pages for each tag used in the content. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). See [[folder and tag listings]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `numPages`: The maximum number of pages to display per tag before showing a \"see more\" link. Defaults to `10`.\n- `sort`: A function of type `(f1: QuartzPluginData, f2: QuartzPluginData) => number{:ts}` used to sort entries. Defaults to sorting by date and tie-breaking on lexographical order. Requires a TS override.\n- `prefixTags`: If `true`, generated tag page titles are prefixed with \"Tag: \" (e.g. \"Tag: recipes\"). Defaults to `false`.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.TagPage()`.\n- Source: [`quartz-community/tag-page`](https://github.com/quartz-community/tag-page)\n- Install: `npx quartz plugin add github:quartz-community/tag-page`\n","docs/plugins/UnlistedPages.md":"---\ntitle: UnlistedPages\ndescription: Hides pages from navigation and indexes while still publishing them.\ntags:\n  - plugin/transformer\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/unlisted-pages](https://github.com/quartz-community/unlisted-pages)\"\nenabled: true\nrequired: false\n---\n\nZero-config transformer that makes `unlisted: true` in a page's frontmatter a first-class way to opt out of every listing surface on your site. The page is still emitted as HTML and remains accessible by direct URL, but is absent from `contentIndex.json`, RSS, sitemap, graph, explorer, search, backlinks, recent notes, folder listings, and tag listings.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nAdd an `unlisted` field to any page's frontmatter:\n\n```yaml\n---\ntitle: My Draft\nunlisted: true\n---\n```\n\nThat's it. Every Quartz v5 plugin that respects the `file.data.unlisted` convention will then hide the page.\n\n## What each plugin does\n\n| Plugin         | Behavior when `unlisted: true`                                             |\n| -------------- | -------------------------------------------------------------------------- |\n| `ContentIndex` | Page absent from `contentIndex.json`, `sitemap.xml`, and the RSS feed.     |\n| `Search`       | Page absent from search results (derived from `contentIndex.json`).        |\n| `Graph`        | Page absent from graph nodes and edges (derived from `contentIndex.json`). |\n| `Explorer`     | Page absent from the sidebar file tree (derived from `contentIndex.json`). |\n| `Backlinks`    | Page never appears as a backlink source on other pages.                    |\n| `RecentNotes`  | Page absent from the recent notes list.                                    |\n| `FolderPage`   | Page absent from folder listings and folder discovery.                     |\n| `TagPage`      | Page absent from tag discovery and tag listings.                           |\n\nIn every case, the page's HTML is still emitted and accessible by direct URL.\n\n## Configuration\n\nZero options. Just enable it.\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/unlisted-pages\n  enabled: true\n```\n\n## Interaction with [[EncryptedPages]]\n\nThe [[EncryptedPages]] plugin also sets `file.data.unlisted` when its `unlistWhenEncrypted: true` option is set or when a page has `unlisted: true` in frontmatter. The two plugins compose cleanly:\n\n- If you install only `UnlistedPages`: any page with `unlisted: true` in frontmatter is hidden from listing surfaces. Encryption is independent.\n- If you install only `EncryptedPages`: `unlisted: true` only takes effect on pages that are also encrypted (have a password). Non-encrypted pages with `unlisted: true` are silently ignored.\n- If you install both: `unlisted: true` works for every page, encrypted or not. This is the recommended setup for sites that use encrypted pages.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.UnlistedPages()`.\n- Source: [`quartz-community/unlisted-pages`](https://github.com/quartz-community/unlisted-pages)\n- Install: `npx quartz plugin add github:quartz-community/unlisted-pages`\n","docs/plugins/index.md":"---\ntitle: Plugins\nimage:\n---\n\nQuartz's functionality is provided by a collection of first-party community plugins. Each plugin can be enabled, disabled, and configured via `quartz.config.yaml`. See [[configuration#Plugins|Configuration]] for details on how to manage plugins.\n\n> [!info] Internal vs Community Plugins\n> Quartz has two kinds of plugins:\n>\n> - **Community plugins** are standalone repositories under [`quartz-community`](https://github.com/quartz-community). In TS overrides, they use `ExternalPlugin.X()` (imported from `.quartz/plugins`).\n> - **Internal plugins** are built into Quartz core (Assets, Static, ComponentResources, NotFoundPage). In TS overrides, they use `Plugin.X()` (imported from `./quartz/plugins`).\n\n## Plugin types\n\nQuartz plugins fall into several categories:\n\n- **Transformers** process content during the build, e.g. parsing frontmatter, highlighting syntax, or resolving links.\n- **Filters** decide which content files to include or exclude from the output.\n- **Page Types** generate HTML pages — one per content file, folder, tag, canvas, or bases view.\n- **Components** render UI elements in the page layout (sidebars, headers, footers, etc.).\n\n## First-party plugins\n\n```base\nfilters:\n  and:\n    - file.ext == \"md\"\n    - file.inFolder(\"plugins\")\n    - \"!file.name.startsWith('index')\"\n    - \"!file.name.contains('Demo')\"\n    - \"!file.name.contains('Static')\"\n    - \"!file.name.contains('Assets')\"\n    - \"!file.name.contains('ComponentResources')\"\n    - \"!file.name.contains('NotFoundPage')\"\nformulas:\n  category: |\n    if(file.hasTag(\"plugin/transformer\"), \"Transformer\",\n    if(file.hasTag(\"plugin/filter\"), \"Filter\",\n    if(file.hasTag(\"plugin/pageType\"), \"Page Type\",\n    if(file.hasTag(\"plugin/emitter\"), \"Emitter\",\n    if(file.hasTag(\"plugin/component\"), \"Component\",\n    \"Other\")))))\nproperties:\n  title:\n    displayName: Plugin\n  repository:\n    displayName: Repository\n  enabled:\n    displayName: Enabled\n  required:\n    displayName: Required\n  description:\n    displayName: Description\nviews:\n  - type: table\n    name: All Plugins\n    groupBy:\n      property: formula.category\n      direction: ASC\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: formula.category\n        direction: ASC\n      - property: title\n        direction: ASC\n  - type: table\n    name: Transformers\n    filters:\n      and:\n        - file.hasTag(\"plugin/transformer\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Filters\n    filters:\n      and:\n        - file.hasTag(\"plugin/filter\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Page Types\n    filters:\n      and:\n        - file.hasTag(\"plugin/pageType\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Emitters\n    filters:\n      and:\n        - file.hasTag(\"plugin/emitter\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Components\n    filters:\n      and:\n        - file.hasTag(\"plugin/component\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n\n```\n\n> [!note] Multi-category plugins\n> Some plugins span multiple categories. **TableOfContents** is both a transformer and a component. **EncryptedPages** is a transformer, emitter, and component. They appear in each relevant category above.\n"},"files":{"docs/plugins/AliasRedirects.md":"---\ntitle: AliasRedirects\ndescription: Generates redirect pages from frontmatter aliases and case-preserving URLs.\ntags:\n  - plugin/emitter\nimage: https://images.unsplash.com/photo-1601735479770-bb5de9dbe844\nrepository: \"[quartz-community/alias-redirects](https://github.com/quartz-community/alias-redirects)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits HTML redirect pages so that old URLs redirect to the canonical page. It handles two types of redirects:\n\n1. **Frontmatter aliases**: Redirect pages for aliases defined in your content's frontmatter.\n2. **Case-preserving redirects**: Automatic redirect pages for URLs that changed due to Quartz v5's lowercase slug normalization.\n\n### Frontmatter Aliases\n\nIf `foo.md` has the following frontmatter:\n\n```md title=\"foo.md\"\n---\ntitle: \"Foo\"\naliases:\n  - \"bar\"\n---\n```\n\nThe target `host.me/bar` will be permanently redirected to `host.me/foo`.\n\nThe emitter supports the following frontmatter fields:\n\n- `aliases`\n- `alias`\n\n### Case-Preserving Redirects\n\nQuartz v5 normalizes all URLs to lowercase. If you are migrating from v4 (which preserved the original casing), previously indexed URLs containing uppercase letters (e.g. `/Diary/My-Note`) would return 404 errors.\n\nWhen `enableCaseRedirects` is enabled (the default), this plugin automatically detects files whose original path differs from the lowercased slug and generates redirect pages at the original-case URL. For example, if your content directory contains `Diary/2026-01-01.md`, the plugin generates:\n\n- The canonical page at `/diary/2026-01-01` (produced by the normal build)\n- A redirect page at `/Diary/2026-01-01` (produced by this plugin)\n\nThe redirect page includes proper SEO signals:\n\n- `<meta http-equiv=\"refresh\" content=\"0; url=...\">` for an instant redirect\n- `<link rel=\"canonical\">` pointing to the lowercase URL\n- `<meta name=\"robots\" content=\"noindex\">` to prevent duplicate indexing\n\nThis preserves search engine rankings and ensures inbound links continue to work.\n\n> [!note]\n> Case-preserving redirects have no effect on case-insensitive filesystems (macOS, Windows) where the server already resolves either casing to the same file. The plugin automatically detects the filesystem type and skips redirect generation when unnecessary.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableCaseRedirects`: If `true` (default), automatically generates redirect pages for URLs that changed casing due to v5's lowercase normalization. Set to `false` to disable this behavior.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.AliasRedirects()`.\n- Source: [`quartz-community/alias-redirects`](https://github.com/quartz-community/alias-redirects)\n- Install: `npx quartz plugin add github:quartz-community/alias-redirects`\n","docs/plugins/ArticleTitle.md":"---\ntitle: ArticleTitle\ndescription: Renders the article title as an h1 heading.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/article-title](https://github.com/quartz-community/article-title)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders the article title from the page's frontmatter as an `<h1>` heading at the top of the page content. It reads the `title` field from frontmatter (falling back to the filename if no title is set).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ArticleTitle()`.\n- Source: [`quartz-community/article-title`](https://github.com/quartz-community/article-title)\n- Install: `npx quartz plugin add github:quartz-community/article-title`\n","docs/plugins/Assets.md":"---\ntitle: Assets\ntags:\n  - plugin/emitter\nimage: https://images.unsplash.com/photo-1526304640581-d334cdbbf45e\n---\n\nThis plugin emits all non-Markdown static assets in your content folder (like images, videos, HTML, etc). The plugin respects the `ignorePatterns` in the global [[configuration]].\n\nNote that all static assets will then be accessible through its path on your generated site, i.e: `host.me/path/to/static.pdf`\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.Assets()` (internal plugin).\n- Source: [`quartz/plugins/emitters/assets.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/assets.ts).\n","docs/plugins/Backlinks.md":"---\ntitle: Backlinks\ndescription: Shows pages that link to the current page.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/backlinks](https://github.com/quartz-community/backlinks)\"\nenabled: true\nrequired: false\n---\n\nShows pages that link to the current page.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Backlinks]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `hideWhenEmpty`: Hide the backlinks section if the current page has no backlinks. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/backlinks\n  enabled: true\n  options:\n    hideWhenEmpty: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Backlinks()`.\n- Source: [`quartz-community/backlinks`](https://github.com/quartz-community/backlinks)\n- Install: `npx quartz plugin add github:quartz-community/backlinks`\n","docs/plugins/BasesPage.md":"---\ntitle: BasesPage\ndescription: Renders Obsidian Bases files as database-style views.\ntags:\n  - plugin/pageType\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/bases-page](https://github.com/quartz-community/bases-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides support for [Obsidian Bases](https://obsidian.md/changelog/2025-04-15-desktop-v1.8.0/) (`.base` files) in Quartz. It reads `.base` files from your vault, resolves matching notes based on the query definition, and renders them as interactive database-like views with support for tables, lists, cards, and maps. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Features\n\n- **Table view**: Sortable columns with automatic type rendering (strings, numbers, booleans, arrays, links).\n- **List view**: Compact list with metadata chips for each entry.\n- **Cards view**: Card layout with optional image property support.\n- **Map view**: Placeholder for future map-based visualization.\n- **Multiple views**: A single `.base` file can define multiple views, displayed as switchable tabs.\n- **Filters**: Recursive filter trees with `and`/`or`/`not` operators.\n- **Formulas**: Computed properties via formula expressions.\n- **Summaries**: Column-level aggregations (Sum, Average, Min, Max, Median, etc.).\n- **Property configuration**: Custom display names for properties.\n- **Link rendering**: Wikilinks and Markdown links within cell values are rendered as clickable links.\n\n## Interaction with `unlisted` pages\n\n`BasesPage` respects the `file.data.unlisted` convention written by [[UnlistedPages]] and [[EncryptedPages]]. Pages marked `unlisted: true` (or encrypted pages with `stealth: true`) are excluded from every rendered base view — table, list, board, cards, gallery, and any custom view — regardless of whether the base's filter expression would match them. Unlisted pages also cannot be dereferenced from formulas on visible pages via `.asFile()`.\n\n> [!note]\n> Base views are **server-side rendered** HTML baked at build time. They do not update client-side after a visitor decrypts an encrypted page. Graph, explorer, and search all re-hydrate from the patched in-memory content index and show newly-unlocked pages for the rest of the browser session — base views do not, because they were materialized at build time with unlisted pages already excluded. A visitor who successfully decrypts a revealable encrypted page will see it appear in graph, explorer, and search, but **not** in any base view, until the site is rebuilt with that page listed. This is the same structural limitation that applies to backlinks, recent notes, folder listings, and tag listings.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `defaultViewType`: The default view type when none is specified in the `.base` file. Defaults to `\"table\"`.\n- `linkResolution`: How to resolve internal links in view renderers. Should match the `markdownLinkResolution` setting of the [[CrawlLinks]] plugin. Can be `\"absolute\"`, `\"relative\"`, or `\"shortest\"`. Defaults to `\"shortest\"`.\n- `customViews`: A map of custom view renderers. Keys are view type names. These override built-in renderers for the same type, or add new view types. Requires a TS override.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/bases-page\n  enabled: true\n```\n\nFor custom view renderers, use a TS override in `quartz.ts`:\n\n```ts title=\"quartz.ts (override)\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.BasesPage({\n  defaultViewType: \"table\",\n  customViews: {\n    myView: ({ entries, view, basesData, total, locale }) => {\n      // return JSX\n    },\n  },\n})\n```\n\n## API\n\n- Category: Page Type, Component\n- Function name: `ExternalPlugin.BasesPage()`.\n- Source: [`quartz-community/bases-page`](https://github.com/quartz-community/bases-page)\n- Install: `npx quartz plugin add github:quartz-community/bases-page`\n","docs/plugins/Breadcrumbs.md":"---\ntitle: Breadcrumbs\ndescription: Breadcrumb navigation trail.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/breadcrumbs](https://github.com/quartz-community/breadcrumbs)\"\nenabled: true\nrequired: false\n---\n\nNavigation breadcrumb trail.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Breadcrumbs]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `spacerSymbol`: The symbol to use between breadcrumb items. Defaults to `\"❯\"`.\n- `rootName`: The name of the root page. Defaults to `Home`.\n- `resolveFrontmatterTitle`: Whether to use the `title` frontmatter field for breadcrumb items. Defaults to `true`.\n- `showCurrentPage`: Whether to show the current page in the breadcrumb trail. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/breadcrumbs\n  enabled: true\n  options:\n    spacerSymbol: \"❯\"\n    rootName: Home\n    resolveFrontmatterTitle: true\n    showCurrentPage: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Breadcrumbs()`.\n- Source: [`quartz-community/breadcrumbs`](https://github.com/quartz-community/breadcrumbs)\n- Install: `npx quartz plugin add github:quartz-community/breadcrumbs`\n","docs/plugins/CNAME.md":"---\ntitle: CNAME\ndescription: Emits a CNAME file for custom domain deployment.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/cname](https://github.com/quartz-community/cname)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits a `CNAME` record that points your subdomain to the default domain of your site.\n\nIf you want to use a custom domain name like `quartz.example.com` for the site, then this is needed.\n\nSee [[hosting|Hosting]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.CNAME()`.\n- Source: [`quartz-community/cname`](https://github.com/quartz-community/cname)\n- Install: `npx quartz plugin add github:quartz-community/cname`\n","docs/plugins/CanvasPage.md":"---\ntitle: CanvasPage\ndescription: Renders JSON Canvas files as interactive, pannable pages.\ntags:\n  - plugin/pageType\nimage: \"#7852ee\"\nnew-in-v5: true\nrepository: \"[quartz-community/canvas-page](https://github.com/quartz-community/canvas-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that renders [JSON Canvas](https://jsoncanvas.org) (`.canvas`) files as interactive, pannable and zoomable canvas pages. It uses a custom `\"canvas\"` [[layout#Page Frames|page frame]] that provides a fullscreen, always-on canvas experience with a togglable left sidebar for navigation. It supports the full [JSON Canvas 1.0 spec](https://jsoncanvas.org/spec/1.0/), including text nodes with Markdown rendering, file nodes that link to other pages in your vault, link nodes for external URLs, and group nodes for visual organization. Edges between nodes are rendered as SVG paths with optional labels, arrow markers, and colors.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableInteraction`: Whether to enable pan and zoom interaction on the canvas. Default: `true{:ts}`.\n- `initialZoom`: The initial zoom level when the canvas is first displayed. Default: `1{:ts}`.\n- `minZoom`: The minimum zoom level allowed when zooming out. Default: `0.1{:ts}`.\n- `maxZoom`: The maximum zoom level allowed when zooming in. Default: `5{:ts}`.\n\n### Canvas Frame\n\nThe canvas-page plugin provides its own `\"canvas\"` page frame via the [[layout#Page Frames|Frame Registry]]. This frame:\n\n- Renders the canvas in **fullscreen mode** by default (100vw × 100vh), giving the canvas maximum screen space — leaning into the \"endless canvas\" concept of JSON Canvas.\n- Provides a **togglable left sidebar** that slides in from the left edge. This is the only layout slot available — it renders the same components as the `left` sidebar on content pages (e.g., Explorer, Search, Page Title).\n- The sidebar toggle button (hamburger/close icon) is positioned in the top-left corner.\n- Canvas controls (zoom in, zoom out, reset) are positioned on the right side.\n- On mobile, the sidebar overlays the canvas rather than pushing it aside.\n\nUsers can override this frame via `quartz.config.yaml` if needed:\n\n```yaml title=\"quartz.config.yaml\"\nlayout:\n  byPageType:\n    canvas:\n      template: default # Use standard three-column layout instead\n```\n\n### Features\n\n- **Text nodes**: Render Markdown content including headings, bold, italic, strikethrough, lists, links, and code blocks via [GFM](https://github.github.com/gfm/) support.\n- **File nodes**: Link to other pages in your vault. Supports popover previews on hover.\n- **Link nodes**: Reference external URLs.\n- **Group nodes**: Visual grouping containers with optional labels and background colors.\n- **Edges**: SVG connections between nodes with optional labels, arrow markers, and colors. Supports all four sides (top, right, bottom, left) and both preset colors (1–6) and custom hex colors.\n- **Togglable sidebar**: Hamburger button in the top-left corner toggles the left sidebar for navigation. Press `Escape` or click the close button to dismiss.\n- **Preset colors**: Six preset colors (red, orange, yellow, green, cyan, purple) plus custom hex colors (`#RRGGBB`) for nodes and edges.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.CanvasPage()`.\n- Source: [`quartz-community/canvas-page`](https://github.com/quartz-community/canvas-page)\n- Install: `npx quartz plugin add github:quartz-community/canvas-page`\n","docs/plugins/Citations.md":"---\ntitle: Citations\ndescription: Academic citation and bibliography support via BibTeX.\ntags:\n  - plugin/transformer\nimage: https://images.unsplash.com/photo-1582079133805-43655f026448\nrepository: \"[quartz-community/citations](https://github.com/quartz-community/citations)\"\nenabled: false\nrequired: false\n---\n\nThis plugin adds Citation support to Quartz.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `bibliographyFile`: the path to the bibliography file. Defaults to `./bibliography.bib`. This is relative to git source of your vault.\n- `suppressBibliography`: whether to suppress the bibliography at the end of the document. Defaults to `false`.\n- `linkCitations`: whether to link citations to the bibliography. Defaults to `false`.\n- `csl`: the citation style to use. Defaults to `apa`. Reference [rehype-citation](https://rehype-citation.netlify.app/custom-csl) for more options.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Citations()`.\n- Source: [`quartz-community/citations`](https://github.com/quartz-community/citations)\n- Install: `npx quartz plugin add github:quartz-community/citations`\n","docs/plugins/Comments.md":"---\ntitle: Comments\ndescription: Comment system integration (Giscus, Utterances, etc.).\ntags:\n  - plugin/component\nimage: \"[[giscus-results.png]]\"\nrepository: \"[quartz-community/comments](https://github.com/quartz-community/comments)\"\nenabled: false\nrequired: false\n---\n\nComment system (giscus, utterances, etc.).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Comments]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `provider`: The comment provider to use. Currently only `giscus` is supported.\n- `options`: Provider-specific options.\n  - `repo`: The GitHub repository to use for comments.\n  - `repoId`: The ID of the GitHub repository.\n  - `category`: The discussion category to use.\n  - `categoryId`: The ID of the discussion category.\n  - `lang`: The language for the comment system. Defaults to `en`.\n  - `themeUrl`: URL to a folder with custom themes.\n  - `lightTheme`: Filename for the light theme CSS file. Defaults to `light`.\n  - `darkTheme`: Filename for the dark theme CSS file. Defaults to `dark`.\n  - `mapping`: How to map pages to discussions. Defaults to `url`.\n  - `strict`: Use strict title matching. Defaults to `true`.\n  - `reactionsEnabled`: Whether to enable reactions for the main post. Defaults to `true`.\n  - `inputPosition`: Where to put the comment input box relative to the comments. Defaults to `bottom`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/comments\n  enabled: true\n  options:\n    provider: giscus\n    options:\n      repo: jackyzha0/quartz\n      repoId: MDEwOlJlcG9zaXRvcnkzODcyMTMyMDg\n      category: Announcements\n      categoryId: DIC_kwDOFxRnmM4B-Xg6\n      lang: en\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Comments()`.\n- Source: [`quartz-community/comments`](https://github.com/quartz-community/comments)\n- Install: `npx quartz plugin add github:quartz-community/comments`\n","docs/plugins/ComponentResources.md":"---\ntitle: ComponentResources\ntags:\n  - plugin/emitter\nimage:\n---\n\nThis plugin manages and emits the static resources required for the Quartz framework. This includes CSS stylesheets and JavaScript scripts that enhance the functionality and aesthetics of the generated site. See also the `cdnCaching` option in the `theme` section of the [[configuration]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.ComponentResources()` (internal plugin).\n- Source: [`quartz/plugins/emitters/componentResources.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/componentResources.ts).\n","docs/plugins/ContentIndex.md":"---\ntitle: ContentIndex\ndescription: Generates sitemap, RSS feed, and content index.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/content-index](https://github.com/quartz-community/content-index)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits both RSS and an XML sitemap for your site. The [[RSS Feed]] allows users to subscribe to content on your site and the sitemap allows search engines to better index your site. The plugin also emits a `contentIndex.json` file which is used by dynamic frontend components like search and graph.\n\nThis plugin emits a comprehensive index of the site's content, generating additional resources such as a sitemap, an RSS feed, and a\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableSiteMap`: If `true` (default), generates a sitemap XML file (`sitemap.xml`) listing all site URLs for search engines in content discovery.\n- `enableRSS`: If `true` (default), produces an RSS feed (`index.xml`) with recent content updates.\n- `rssLimit`: Defines the maximum number of entries to include in the RSS feed, helping to focus on the most recent or relevant content. Defaults to `10`.\n- `rssFullHtml`: If `true`, the RSS feed includes the full rendered HTML content of each page. Defaults to `false`.\n- `rssSlug`: Slug to the generated RSS feed XML file. Defaults to `\"index\"`.\n- `includeEmptyFiles`: If `true` (default), content files with no body text are included in the generated index and resources.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.ContentIndex()`.\n- Source: [`quartz-community/content-index`](https://github.com/quartz-community/content-index)\n- Install: `npx quartz plugin add github:quartz-community/content-index`\n","docs/plugins/ContentMeta.md":"---\ntitle: ContentMeta\ndescription: Displays creation date and reading time.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/content-meta](https://github.com/quartz-community/content-meta)\"\nenabled: true\nrequired: false\n---\n\nThis plugin displays content metadata below the article title, such as the creation date and estimated reading time.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `showReadingTime`: Whether to display the estimated reading time. Defaults to `true`.\n- `showComma`: Whether to display a comma between metadata items. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/content-meta\n  enabled: true\n  options:\n    showReadingTime: true\n    showComma: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ContentMeta()`.\n- Source: [`quartz-community/content-meta`](https://github.com/quartz-community/content-meta)\n- Install: `npx quartz plugin add github:quartz-community/content-meta`\n","docs/plugins/ContentPage.md":"---\ntitle: ContentPage\ndescription: Generates HTML pages for Markdown content.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/content-page](https://github.com/quartz-community/content-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin for the Quartz framework. It generates the HTML pages for each piece of Markdown content. It emits the full-page [[layout]], including headers, footers, and body content, among others. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). It is now configured in the `pageTypes` section of `quartz.config.yaml`.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.ContentPage()`.\n- Source: [`quartz-community/content-page`](https://github.com/quartz-community/content-page)\n- Install: `npx quartz plugin add github:quartz-community/content-page`\n","docs/plugins/CrawlLinks.md":"---\ntitle: CrawlLinks\ndescription: Parses and resolves internal links. Removing it is not recommended.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/crawl-links](https://github.com/quartz-community/crawl-links)\"\nenabled: true\nrequired: true\n---\n\nThis plugin parses links and processes them to point to the right places. It is also needed for embedded links (like images). See [[Obsidian compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `markdownLinkResolution`: Sets the strategy for resolving Markdown paths, can be `\"absolute\"` (default), `\"relative\"` or `\"shortest\"`. You should use the same setting here as in [[Obsidian compatibility|Obsidian]].\n  - `absolute`: Path relative to the root of the content folder.\n  - `relative`: Path relative to the file you are linking from.\n  - `shortest`: Name of the file. If this isn't enough to identify the file, use the full absolute path.\n- `prettyLinks`: If `true` (default), simplifies links by removing folder paths, making them more user friendly (e.g. `folder/deeply/nested/note` becomes `note`).\n- `openLinksInNewTab`: If `true`, configures external links to open in a new tab. Defaults to `false`.\n- `lazyLoad`: If `true`, adds lazy loading to resource elements (`img`, `video`, etc.) to improve page load performance. Defaults to `false`.\n- `externalLinkIcon`: Adds an icon next to external links when `true` (default) to visually distinguishing them from internal links.\n- `disableBrokenWikilinks`: If `true`, internal links whose resolved slug is not present in the site (i.e. no matching file under `markdownLinkResolution`) gain an additional `broken` CSS class alongside `internal`, so they can be styled distinctly. Defaults to `false`. Applies to both wikilinks and regular Markdown links, since both are indistinguishable `<a>` elements by the time this plugin runs.\n\n> [!warning]\n> Removing this plugin is _not_ recommended and will likely break the page.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.CrawlLinks()`.\n- Source: [`quartz-community/crawl-links`](https://github.com/quartz-community/crawl-links)\n- Install: `npx quartz plugin add github:quartz-community/crawl-links`\n","docs/plugins/CreatedModifiedDate.md":"---\ntitle: CreatedModifiedDate\ndescription: Determines creation and modification dates from frontmatter, git, or filesystem.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/created-modified-date](https://github.com/quartz-community/created-modified-date)\"\nenabled: true\nrequired: false\n---\n\nThis plugin determines the created, modified, and published dates for a document using three potential data sources: frontmatter metadata, Git history, and the filesystem. See [[authoring content#Syntax]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `priority`: The data sources to consult for date information. Highest priority first. Possible values are `\"frontmatter\"`, `\"git\"`, and `\"filesystem\"`. Defaults to `[\"frontmatter\", \"git\", \"filesystem\"]`.\n- `defaultDateType`: Which date type to use when displaying dates. Can be `\"created\"`, `\"modified\"`, or `\"published\"`. Defaults to `\"modified\"`.\n\nWhen loading the frontmatter, the value of [[Frontmatter#List]] is used.\n\n> [!warning]\n> If you rely on `git` for dates, make sure `defaultDateType` is set to `modified` in the plugin's options.\n>\n> Depending on how you [[hosting|host]] your Quartz, the `filesystem` dates of your local files may not match the final dates. In these cases, it may be better to use `git` or `frontmatter` to guarantee correct dates.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.CreatedModifiedDate()`.\n- Source: [`quartz-community/created-modified-date`](https://github.com/quartz-community/created-modified-date)\n- Install: `npx quartz plugin add github:quartz-community/created-modified-date`\n","docs/plugins/CustomOgImages.md":"---\ntitle: Custom OG Images\ndescription: Generates Open Graph social preview images.\ntags:\n  - feature/emitter\nimage: \"[[social-image-preview-dark.png]]\"\nrepository: \"[quartz-community/og-image](https://github.com/quartz-community/og-image)\"\nenabled: true\nrequired: false\n---\n\nThe Custom OG Images emitter plugin generates social media preview images for your pages. It uses [satori](https://github.com/vercel/satori) to convert HTML/CSS into images, allowing you to create beautiful and consistent social media preview cards for your content.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Features\n\n- Automatically generates social media preview images for each page\n- Supports both light and dark mode themes\n- Customizable through frontmatter properties\n- Fallback to default image when needed\n- Full control over image design through custom components\n\n## Configuration\n\n> [!info] Info\n>\n> The `baseUrl` property in your [[configuration]] must be set properly for social images to work correctly, as they require absolute paths.\n\nThis plugin accepts the following configuration options:\n\n```yaml title=\"quartz.config.yaml\"\nplugins:\n  - source: github:quartz-community/og-image\n    enabled: true\n    options:\n      colorScheme: lightMode # \"lightMode\" or \"darkMode\"\n      width: 1200\n      height: 630\n      excludeRoot: false\n```\n\nFor the TS override approach (needed for custom `imageStructure`):\n\n```ts title=\"quartz.ts (override)\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\nimport { defaultImage } from \"./quartz/plugins/emitters/ogImage\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.CustomOgImages({\n  colorScheme: \"lightMode\",\n  width: 1200,\n  height: 630,\n  excludeRoot: false,\n  imageStructure: defaultImage,\n})\n```\n\n### Configuration Options\n\n| Option               | Type      | Default                   | Description                                                       |\n| -------------------- | --------- | ------------------------- | ----------------------------------------------------------------- |\n| `colorScheme`        | string    | \"lightMode\"               | Theme to use for generating images (\"darkMode\" or \"lightMode\")    |\n| `width`              | number    | 1200                      | Width of the generated image in pixels                            |\n| `height`             | number    | 630                       | Height of the generated image in pixels                           |\n| `excludeRoot`        | boolean   | false                     | Whether to exclude the root index page from auto-generated images |\n| `defaultTitle`       | string    | \"Untitled\"                | Fallback title when a page has no title                           |\n| `defaultDescription` | string    | \"No description provided\" | Fallback description when a page has no description               |\n| `imageStructure`     | component | defaultImage              | Custom component to use for image generation                      |\n\n## Frontmatter Properties\n\nThe following properties can be used to customize your link previews:\n\n| Property            | Alias            | Summary                             |\n| ------------------- | ---------------- | ----------------------------------- |\n| `socialDescription` | `description`    | Description to be used for preview. |\n| `socialImage`       | `image`, `cover` | Link to preview image.              |\n\nThe `socialImage` property should contain a link to an image either relative to `quartz/static`, or a full URL. If you have a folder for all your images in `quartz/static/my-images`, an example for `socialImage` could be `\"my-images/cover.png\"`. Alternatively, you can use a fully qualified URL like `\"https://example.com/cover.png\"`.\n\n> [!info] Info\n>\n> The priority for what image will be used for the cover image looks like the following: `frontmatter property > generated image (if enabled) > default image`.\n>\n> The default image (`quartz/static/og-image.png`) will only be used as a fallback if nothing else is set. If the Custom OG Images emitter plugin is enabled, it will be treated as the new default per page, but can be overwritten by setting the `socialImage` frontmatter property for that page.\n\n## Customization\n\nYou can fully customize how the images being generated look by passing your own component to `imageStructure`. This component takes JSX + some page metadata/config options and converts it to an image using [satori](https://github.com/vercel/satori). Vercel provides an [online playground](https://og-playground.vercel.app/) that can be used to preview how your JSX looks like as a picture. This is ideal for prototyping your custom design.\n\n### Fonts\n\nYou will also be passed an array containing a header and a body font (where the first entry is header and the second is body). The fonts matches the ones selected in `theme.typography.header` and `theme.typography.body` from `quartz.config.yaml` and will be passed in the format required by [`satori`](https://github.com/vercel/satori). To use them in CSS, use the `.name` property (e.g. `fontFamily: fonts[1].name` to use the \"body\" font family).\n\nAn example of a component using the header font could look like this:\n\n```tsx title=\"socialImage.tsx\"\nexport const myImage: SocialImageOptions[\"imageStructure\"] = (...) => {\n  return <p style={{ fontFamily: fonts[0].name }}>Cool Header!</p>\n}\n```\n\n> [!example]- Local fonts\n>\n> For cases where you use a local fonts under `static` folder, make sure to set the correct `@font-face` in `custom.scss`\n>\n> ```scss title=\"custom.scss\"\n> @font-face {\n>   font-family: \"Newsreader\";\n>   font-style: normal;\n>   font-weight: normal;\n>   font-display: swap;\n>   src: url(\"/static/Newsreader.woff2\") format(\"woff2\");\n> }\n> ```\n>\n> Then in `quartz/util/og.tsx`, you can load the Satori fonts like so:\n>\n> ```tsx title=\"quartz/util/og.tsx\"\n> import { joinSegments, QUARTZ } from \"../path\"\n> import fs from \"fs\"\n> import path from \"path\"\n>\n> const newsreaderFontPath = joinSegments(QUARTZ, \"static\", \"Newsreader.woff2\")\n> export async function getSatoriFonts(headerFont: FontSpecification, bodyFont: FontSpecification) {\n>   // ... rest of implementation remains same\n>   const fonts: SatoriOptions[\"fonts\"] = [\n>     ...headerFontData.map((data, idx) => ({\n>       name: headerFontName,\n>       data,\n>       weight: headerWeights[idx],\n>       style: \"normal\" as const,\n>     })),\n>     ...bodyFontData.map((data, idx) => ({\n>       name: bodyFontName,\n>       data,\n>       weight: bodyWeights[idx],\n>       style: \"normal\" as const,\n>     })),\n>     {\n>       name: \"Newsreader\",\n>       data: await fs.promises.readFile(path.resolve(newsreaderFontPath)),\n>       weight: 400,\n>       style: \"normal\" as const,\n>     },\n>   ]\n>\n>   return fonts\n> }\n> ```\n>\n> This font then can be used with your custom structure.\n\n## Examples\n\nHere are some example image components you can use as a starting point:\n\n### Basic Example\n\nThis example will generate images that look as follows:\n\n| Light                                      | Dark                                      |\n| ------------------------------------------ | ----------------------------------------- |\n| ![[custom-social-image-preview-light.png]] | ![[custom-social-image-preview-dark.png]] |\n\n```tsx\nimport { SatoriOptions } from \"satori/wasm\"\nimport { GlobalConfiguration } from \"../cfg\"\nimport { SocialImageOptions, UserOpts } from \"./imageHelper\"\nimport { QuartzPluginData } from \"../plugins/vfile\"\n\nexport const customImage: SocialImageOptions[\"imageStructure\"] = (\n  cfg: GlobalConfiguration,\n  userOpts: UserOpts,\n  title: string,\n  description: string,\n  fonts: SatoriOptions[\"fonts\"],\n  fileData: QuartzPluginData,\n) => {\n  // How many characters are allowed before switching to smaller font\n  const fontBreakPoint = 22\n  const useSmallerFont = title.length > fontBreakPoint\n\n  const { colorScheme } = userOpts\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        flexDirection: \"row\",\n        justifyContent: \"flex-start\",\n        alignItems: \"center\",\n        height: \"100%\",\n        width: \"100%\",\n      }}\n    >\n      <div\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          height: \"100%\",\n          width: \"100%\",\n          backgroundColor: cfg.theme.colors[colorScheme].light,\n          flexDirection: \"column\",\n          gap: \"2.5rem\",\n          paddingTop: \"2rem\",\n          paddingBottom: \"2rem\",\n        }}\n      >\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].dark,\n            fontSize: useSmallerFont ? 70 : 82,\n            marginLeft: \"4rem\",\n            textAlign: \"center\",\n            marginRight: \"4rem\",\n            fontFamily: fonts[0].name,\n          }}\n        >\n          {title}\n        </p>\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].dark,\n            fontSize: 44,\n            marginLeft: \"8rem\",\n            marginRight: \"8rem\",\n            lineClamp: 3,\n            fontFamily: fonts[1].name,\n          }}\n        >\n          {description}\n        </p>\n      </div>\n      <div\n        style={{\n          height: \"100%\",\n          width: \"2vw\",\n          position: \"absolute\",\n          backgroundColor: cfg.theme.colors[colorScheme].tertiary,\n          opacity: 0.85,\n        }}\n      />\n    </div>\n  )\n}\n```\n\n### Advanced Example\n\nThe following example includes a customized social image with a custom background and formatted date:\n\n```typescript title=\"custom-og.tsx\"\nexport const og: SocialImageOptions[\"Component\"] = (\n  cfg: GlobalConfiguration,\n  fileData: QuartzPluginData,\n  { colorScheme }: Options,\n  title: string,\n  description: string,\n  fonts: SatoriOptions[\"fonts\"],\n) => {\n  let created: string | undefined\n  let reading: string | undefined\n  if (fileData.dates) {\n    created = formatDate(getDate(cfg, fileData)!, cfg.locale)\n  }\n  const { minutes, text: _timeTaken, words: _words } = readingTime(fileData.text!)\n  reading = i18n(cfg.locale).components.contentMeta.readingTime({\n    minutes: Math.ceil(minutes),\n  })\n\n  const Li = [created, reading]\n\n  return (\n    <div\n      style={{\n        position: \"relative\",\n        display: \"flex\",\n        flexDirection: \"row\",\n        alignItems: \"flex-start\",\n        height: \"100%\",\n        width: \"100%\",\n        backgroundImage: `url(\"https://${cfg.baseUrl}/static/og-image.jpeg\")`,\n        backgroundSize: \"100% 100%\",\n      }}\n    >\n      <div\n        style={{\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n          background: \"radial-gradient(circle at center, transparent, rgba(0, 0, 0, 0.4) 70%)\",\n        }}\n      />\n      <div\n        style={{\n          display: \"flex\",\n          height: \"100%\",\n          width: \"100%\",\n          flexDirection: \"column\",\n          justifyContent: \"flex-start\",\n          alignItems: \"flex-start\",\n          gap: \"1.5rem\",\n          paddingTop: \"4rem\",\n          paddingBottom: \"4rem\",\n          marginLeft: \"4rem\",\n        }}\n      >\n        <img\n          src={`\"https://${cfg.baseUrl}/static/icon.jpeg\"`}\n          style={{\n            position: \"relative\",\n            backgroundClip: \"border-box\",\n            borderRadius: \"6rem\",\n          }}\n          width={80}\n        />\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            textAlign: \"left\",\n            fontFamily: fonts[0].name,\n          }}\n        >\n          <h2\n            style={{\n              color: cfg.theme.colors[colorScheme].light,\n              fontSize: \"3rem\",\n              fontWeight: 700,\n              marginRight: \"4rem\",\n              fontFamily: fonts[0].name,\n            }}\n          >\n            {title}\n          </h2>\n          <ul\n            style={{\n              color: cfg.theme.colors[colorScheme].gray,\n              gap: \"1rem\",\n              fontSize: \"1.5rem\",\n              fontFamily: fonts[1].name,\n            }}\n          >\n            {Li.map((item, index) => {\n              if (item) {\n                return <li key={index}>{item}</li>\n              }\n            })}\n          </ul>\n        </div>\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].light,\n            fontSize: \"1.5rem\",\n            overflow: \"hidden\",\n            marginRight: \"8rem\",\n            textOverflow: \"ellipsis\",\n            display: \"-webkit-box\",\n            WebkitLineClamp: 7,\n            WebkitBoxOrient: \"vertical\",\n            lineClamp: 7,\n            fontFamily: fonts[1].name,\n          }}\n        >\n          {description}\n        </p>\n      </div>\n    </div>\n  )\n}\n```\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.CustomOgImages()`.\n- Source: [`quartz-community/og-image`](https://github.com/quartz-community/og-image)\n- Install: `npx quartz plugin add github:quartz-community/og-image`\n","docs/plugins/Darkmode.md":"---\ntitle: Darkmode\ndescription: Toggle between light and dark themes.\ntags:\n  - plugin/component\nimage: \"#0052cc\"\nrepository: \"[quartz-community/darkmode](https://github.com/quartz-community/darkmode)\"\nenabled: true\nrequired: false\n---\n\nDark mode toggle.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Darkmode]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enabled`: Whether to enable the dark mode toggle. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/darkmode\n  enabled: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Darkmode()`.\n- Source: [`quartz-community/darkmode`](https://github.com/quartz-community/darkmode)\n- Install: `npx quartz plugin add github:quartz-community/darkmode`\n","docs/plugins/Description.md":"---\ntitle: Description\ndescription: Generates page descriptions for metadata and previews.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/description](https://github.com/quartz-community/description)\"\nenabled: true\nrequired: false\n---\n\nThis plugin generates descriptions that are used as metadata for the HTML `head`, the [[RSS Feed]] and in [[folder and tag listings]] if there is no main body content, the description is used as the text between the title and the listing.\n\nIf the frontmatter contains a `description` property, it is used (see [[authoring content#Syntax]]). Otherwise, the plugin will do its best to use the first few sentences of the content to reach the target description length.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `descriptionLength`: the target length of the generated description. Default is 150 characters. The cut off happens after the first _sentence_ that ends after the given length.\n- `maxDescriptionLength`: the hard maximum length of the description. If the generated description exceeds this, it is truncated with an ellipsis. Default is 300 characters.\n- `replaceExternalLinks`: If `true` (default), replace external links with their domain and path in the description (e.g. `https://domain.tld/some_page/another_page?query=hello&target=world` is replaced with `domain.tld/some_page/another_page`).\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Description()`.\n- Source: [`quartz-community/description`](https://github.com/quartz-community/description)\n- Install: `npx quartz plugin add github:quartz-community/description`\n","docs/plugins/EncryptedPages Demo.md":"---\ntitle: Encrypted Pages Demo\npassword: quartz\nunlisted: true\ntags:\n  - plugin/transformer\nimage:\n---\n\nCongratulations! You've successfully decrypted this page. 🎉\n\nThis is a live demo of the [[EncryptedPages]] plugin. The content you're reading was encrypted at build time using AES-256-GCM and decrypted in your browser using the Web Crypto API. This page is also `unlisted: true`, which means it was hidden from every discovery surface on the site until you entered the password.\n\n## What just happened?\n\n1. At build time, the plugin read the `password` field from this page's frontmatter and encrypted all content below the title.\n2. Because this page is `unlisted: true`, the plugin emitted its metadata (slug, title, links, tags) to a separate `static/encryptedContentIndex.json` file, encrypted with this page's own password.\n3. When you visited this page, you were shown a password prompt instead of the content. The page was absent from the sidebar graph, explorer, search, RSS, sitemap, backlinks, tag listings, and bases views.\n4. After entering the correct password, the plugin derived an encryption key using PBKDF2 and decrypted the content client-side.\n5. The plugin then used the cached password to unlock this page's entry in the shadow content index and patched the in-memory content index in place. A `content-index-updated` event was dispatched, so graph, explorer, and search re-initialized with the newly unlocked entry — if you navigate back to any other page now, you will see this page in the sidebar, the graph, and search results. Server-side rendered listings (backlinks, recent notes, tag pages, folder listings, and [[BasesPage|bases views]]) were baked into HTML at build time and will not update within this session; they will only reflect decrypted pages on a fresh build of the site.\n\n## Password caching\n\nYour password has been cached in session storage. If there were other encrypted pages on this site with the same password, the plugin would automatically try this password on each one — unlocking its content as well as its entry in the shadow content index — so you'd only need to enter it once per session.\n\n## Try it yourself\n\nTo add encrypted pages to your own Quartz site, install the plugin and add a `password` field to any page's frontmatter. See [[EncryptedPages]] for full setup instructions.\n","docs/plugins/EncryptedPages.md":"---\ntitle: EncryptedPages\ndescription: Password-protected encrypted pages with shadow content index.\ntags:\n  - plugin/transformer\n  - plugin/emitter\nimage: \"#FF1493\"\nnew-in-v5: true\nrepository: \"[quartz-community/encrypted-pages](https://github.com/quartz-community/encrypted-pages)\"\nenabled: true\nrequired: false\n---\n\nPassword-protected encrypted pages. Encrypts page content at build time using AES-256-GCM and decrypts client-side with the Web Crypto API. Passwords are set per-page via frontmatter. A companion emitter writes an encrypted shadow content index so unlisted encrypted pages can be dynamically revealed in graph, explorer, and search after a successful decryption — without ever leaking their metadata to visitors who do not hold the password.\n\n> [!example] Live demo\n> Try it yourself: [[EncryptedPages Demo]]. The password is `quartz`.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nAdd a `password` field to any page's frontmatter to encrypt it:\n\n```yaml\n---\ntitle: My Secret Page\npassword: mysecretpassword\n---\n```\n\nThe page content will be encrypted at build time. Visitors must enter the correct password to view the content.\n\nSuccessful passwords are cached in the browser's session storage and automatically tried on other encrypted pages for convenience.\n\n### Hiding encrypted pages from discovery surfaces\n\nBy default, encrypted pages still appear in the graph, explorer, search, RSS, sitemap, and backlinks — visitors can see the page exists and its title, but cannot read the content without the password.\n\nTo hide an encrypted page entirely until a visitor successfully decrypts it, set `unlisted: true` in its frontmatter:\n\n```yaml\n---\ntitle: My Secret Page\npassword: mysecretpassword\nunlisted: true\n---\n```\n\nAn unlisted page:\n\n- Is **absent** from `contentIndex.json`, `sitemap.xml`, the RSS feed, backlinks, recent notes, folder listings, tag listings, bases views, graph, explorer, and search.\n- Is still emitted as HTML, so it remains accessible by direct URL.\n- Has its metadata (slug, title, links, tags) written to a separate `static/encryptedContentIndex.json` file, encrypted with the page's own password.\n- Is dynamically re-added to the in-memory content index when a visitor successfully decrypts it, so graph, explorer, and search reflect it for the rest of the browser session. Server-rendered listings — backlinks, recent notes, tag pages, folder listings, and [[BasesPage|bases views]] — remain statically hidden even after decryption because they are baked as HTML at build time.\n\nTo make this the default for every encrypted page on your site, set `unlistWhenEncrypted: true` in the plugin options. Individual pages can then opt back in with `unlisted: false`.\n\n> [!note]\n> The `unlisted: true` frontmatter field above only takes effect for encrypted pages when this plugin is installed. If you also want `unlisted: true` to work on **non-encrypted** pages across your site, install [[UnlistedPages]] alongside this one. The two plugins compose cleanly — when both are enabled, `unlisted: true` hides any page, encrypted or not, from every discovery surface that respects the `file.data.unlisted` convention.\n\n### Permanently hiding encrypted pages (`stealth`)\n\nBy default, an `unlisted: true` encrypted page is _revealed_ in graph, explorer, and search after a visitor successfully decrypts it. This is usually what you want: the user just proved they know the password, so showing them the page in the sidebar makes sense for the rest of their session.\n\nIf you instead want a page that stays permanently invisible — accessible only by direct URL, even to users who have successfully decrypted other pages on the same site — set `stealth: true` in its frontmatter:\n\n```yaml\n---\ntitle: Deep Secret\npassword: mysecretpassword\nstealth: true\n---\n```\n\nA stealth page:\n\n- Is **absent** from every discovery surface, same as any `unlisted` page.\n- Has **no entry** in the shadow content index (`encryptedContentIndex.json`). The plugin deliberately skips stealth pages when building the shadow index.\n- Stays hidden even after the visitor enters the correct password. Since there is no shadow-index entry to decrypt, there is nothing to patch into the in-memory content index — graph, explorer, and search never learn the page exists. Only the decrypted HTML is visible to the user on the page itself.\n- The password is still cached in session storage, so re-visiting the same stealth page will auto-unlock it.\n\n`stealth: true` implies `unlisted: true` — you do not need to set both, and if you write `stealth: true, unlisted: false` the stealth flag wins. On non-encrypted pages `stealth: true` has no effect (there is no shadow index to skip).\n\nUse stealth pages for \"secret door\" content that should only reach users who already know the exact URL: private notes linked from an external wiki, personal pages you send to specific people, or anything you never want to show up in a site-internal search even to authenticated readers.\n\n## Configuration\n\nThis plugin provides a transformer, an emitter, and a component. All options are set on a single config entry and shared between the transformer and the emitter — Quartz instantiates both automatically.\n\n- `iterations`: PBKDF2 iteration count for key derivation. Higher values are more secure but slower to unlock. Defaults to `600000`.\n- `passwordField`: Frontmatter field name that holds the page password. Shared by the transformer and the emitter. Defaults to `\"password\"`.\n- `unlistWhenEncrypted`: If `true`, every encrypted page is marked `unlisted` unless its frontmatter explicitly overrides it. Defaults to `false`.\n- `outputPath`: Output path for the shadow content index, relative to Quartz's output directory. Defaults to `\"static/encryptedContentIndex.json\"`.\n\n### Component options\n\n- `className`: CSS class for the component wrapper. Defaults to `\"encrypted-page-wrapper\"`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/encrypted-pages\n  enabled: true\n  options:\n    iterations: 600000\n    passwordField: password\n    unlistWhenEncrypted: false\n    outputPath: static/encryptedContentIndex.json\n```\n\n> [!warning]\n> The `EncryptedPages` transformer replaces the entire HAST tree of an encrypted page with an opaque ciphertext container. Any transformer that needs to read the real HTML — in particular [[CrawlLinks]], which populates the links used by backlinks and the shadow content index — must run **before** `EncryptedPages`. Use the `order` field in `quartz.config.yaml` to control this.\n\n## Security\n\n- Content is encrypted with AES-256-GCM using PBKDF2 SHA-256 key derivation.\n- Plaintext is stripped from search indices, RSS feeds, and the shadow content index regardless of visibility setting.\n- The shadow content index is a flat array of opaque encrypted blobs. An attacker who downloads it learns only the number of unlisted encrypted pages and the PBKDF2 iteration count — no slugs, titles, or link relationships leak.\n- Passwords are set per-page in frontmatter. Avoid committing passwords to public repositories.\n- This is client-side encryption of a static site. It protects against casual browsing but not against determined attackers with access to the page source.\n\n## API\n\n- Category: Transformer, Emitter\n- Function name: `ExternalPlugin.EncryptedPages()`, `ExternalPlugin.EncryptedContentIndex()`.\n- Source: [`quartz-community/encrypted-pages`](https://github.com/quartz-community/encrypted-pages)\n- Install: `npx quartz plugin add github:quartz-community/encrypted-pages`\n","docs/plugins/ExplicitPublish.md":"---\ntitle: ExplicitPublish\ndescription: \"Only publishes pages explicitly marked with publish: true.\"\ntags:\n  - plugin/filter\nimage:\nrepository: \"[quartz-community/explicit-publish](https://github.com/quartz-community/explicit-publish)\"\nenabled: false\nrequired: false\n---\n\nThis plugin filters content based on an explicit `publish` flag in the frontmatter, allowing only content that is explicitly marked for publication to pass through. It's the opt-in version of [[RemoveDrafts]]. See [[private pages]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Filter\n- Function name: `ExternalPlugin.ExplicitPublish()`.\n- Source: [`quartz-community/explicit-publish`](https://github.com/quartz-community/explicit-publish)\n- Install: `npx quartz plugin add github:quartz-community/explicit-publish`\n","docs/plugins/Explorer.md":"---\ntitle: Explorer\ndescription: File tree explorer sidebar.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/explorer](https://github.com/quartz-community/explorer)\"\nenabled: true\nrequired: false\n---\n\nFile tree explorer sidebar.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Explorer]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n**YAML options** (in `quartz.config.yaml`):\n\n- `title`: The title of the explorer. Defaults to `Explorer`.\n- `folderClickBehavior`: The behavior when a folder is clicked. Can be `\"link\"` to navigate or `\"collapse\"` to toggle. Defaults to `link`.\n- `folderDefaultState`: The default state of folders. Can be `\"collapsed\"` or `\"open\"`. Defaults to `collapsed`.\n- `useSavedState`: Whether to use local storage to save the state of the explorer. Defaults to `true`.\n\n**TS override options** (in `quartz.ts`, for callback functions that can't be expressed in YAML):\n\n- `sortFn`: Custom sort function for ordering files and folders.\n- `filterFn`: Custom filter function to exclude specific nodes.\n- `mapFn`: Custom map function to transform node properties (e.g. display names).\n- `order`: Array controlling the order of operations. Defaults to `[\"filter\", \"map\", \"sort\"]`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/explorer\n  enabled: true\n  options:\n    title: Explorer\n    folderClickBehavior: link\n    folderDefaultState: collapsed\n    useSavedState: true\n```\n\n### TS override example\n\n```ts title=\"quartz.ts\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.Explorer({\n  mapFn: (node) => {\n    node.displayName = node.displayName.toUpperCase()\n    return node\n  },\n})\n```\n\nSee [[features/explorer#Advanced customization]] for more examples.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Explorer()`.\n- Source: [`quartz-community/explorer`](https://github.com/quartz-community/explorer)\n- Install: `npx quartz plugin add github:quartz-community/explorer`\n","docs/plugins/Favicon.md":"---\ntitle: Favicon\ndescription: Emits the site favicon.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/favicon](https://github.com/quartz-community/favicon)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits a `favicon.ico` into the `public` folder. It creates the favicon from `icon.png` located in the `quartz/static` folder.\nThe plugin resizes `icon.png` to 48x48px to make it as small as possible.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.Favicon()`.\n- Source: [`quartz-community/favicon`](https://github.com/quartz-community/favicon)\n- Install: `npx quartz plugin add github:quartz-community/favicon`\n","docs/plugins/FolderPage.md":"---\ntitle: FolderPage\ndescription: Generates listing pages for folders.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/folder-page](https://github.com/quartz-community/folder-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that generates index pages for folders, creating a listing page for each folder that contains multiple content files. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). See [[folder and tag listings]] for more information.\n\nExample: [[advanced/|Advanced]]\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `showFolderCount`: Whether to display the number of pages in the folder. Defaults to `true`.\n- `showSubfolders`: Whether to include pages from subfolders in the listing. Defaults to `true`.\n- `sort`: A function of type `(f1: QuartzPluginData, f2: QuartzPluginData) => number{:ts}` used to sort entries. Defaults to sorting by date and tie-breaking on lexographical order. Requires a TS override.\n- `prefixFolders`: If `true`, generated folder page titles are prefixed with \"Folder: \" (e.g. \"Folder: notes\"). Defaults to `false`.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.FolderPage()`.\n- Source: [`quartz-community/folder-page`](https://github.com/quartz-community/folder-page)\n- Install: `npx quartz plugin add github:quartz-community/folder-page`\n","docs/plugins/Fonts.md":"---\ntitle: Fonts\ndescription: Fine-grained font control with per-heading support, Google Fonts integration, and theme font discovery.\ntags:\n  - plugin/transformer\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/fonts](https://github.com/quartz-community/fonts)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides fine-grained control over fonts in your Quartz site. It supports per-heading font families, automatic theme font discovery when used with [Quartz Themes](https://github.com/saberzero1/quartz-themes), Google Fonts integration with automatic weight and italic loading, and falls back to Obsidian's default system font stacks.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Why use Fonts?\n\nQuartz uses three CSS variables for fonts: `--headerFont`, `--bodyFont`, and `--codeFont`. Obsidian themes use a different system with per-heading variables (`--h1-font` through `--h6-font`), `--font-text`, and `--font-monospace`. These two systems don't bridge correctly, causing heading fonts to not render as themes intend.\n\nFonts solves this by:\n\n1. Bridging the Obsidian and Quartz font systems\n2. Emitting **unlayered** CSS that correctly overrides Quartz's base heading styles\n3. Providing per-heading font control that neither system offers alone\n4. Optionally loading fonts from Google Fonts with fine-grained weight and italic control\n\n## Configuration\n\nFont options accept either a CSS font-family string or an object with Google Fonts loading control:\n\n```yaml\n# String form\nbody: '\"Inter\", sans-serif'\n\n# Object form (for Google Fonts weight/italic control)\nbody:\n  name: Inter\n  weights: [400, 600, 700]\n  includeItalic: true\n```\n\nThis plugin accepts the following configuration options:\n\n| Option          | Type                | Default          | Description                                                                                                            |\n| --------------- | ------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------- |\n| `title`         | `FontSpecification` | `header` value   | Font family for the site title.                                                                                        |\n| `body`          | `FontSpecification` | Obsidian default | Font family for body text.                                                                                             |\n| `header`        | `FontSpecification` | Obsidian default | Default font family for all headings (h1-h6).                                                                          |\n| `code`          | `FontSpecification` | Obsidian default | Font family for code and monospace elements.                                                                           |\n| `interface`     | `FontSpecification` | Obsidian default | Font family for UI elements.                                                                                           |\n| `h1` – `h6`     | `FontSpecification` | `header` value   | Per-heading font family overrides.                                                                                     |\n| `useThemeFonts` | `boolean`           | `true`           | Use fonts from [Quartz Themes](https://github.com/saberzero1/quartz-themes) as defaults when it is installed.          |\n| `fontOrigin`    | `string`            | `\"googleFonts\"`  | `\"googleFonts\"` to load from Google Fonts CDN, `\"selfHosted\"` to download and serve locally, `\"local\"` for no loading. |\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    useThemeFonts: true\n    fontOrigin: googleFonts\n```\n\n### Font resolution\n\nFonts are resolved using a priority chain:\n\n```\nUser config (plugin options)\n  → Theme fonts (from Quartz Themes, if installed)\n    → Obsidian defaults (system font stacks)\n```\n\nFor individual headings:\n\n```\nh1 option → header option → theme --h1-font → theme font → Obsidian default\n```\n\nFor the site title:\n\n```\ntitle option → header option → theme font → Obsidian default\n```\n\n## Usage with Quartz Themes\n\nWhen [Quartz Themes](https://github.com/saberzero1/quartz-themes) is installed and enabled, Fonts automatically discovers the theme's font metadata and uses it as defaults. Any options you explicitly set in Fonts will override the theme fonts.\n\nFonts must run **after** Quartz Themes. This is handled automatically by plugin ordering (Quartz Themes = 10, Fonts = 60).\n\n> [!warning]\n> If Quartz Themes is enabled but hasn't run yet when Fonts executes, you'll see a warning in the console. Make sure Quartz Themes has a lower `defaultOrder` than Fonts.\n\n## Usage without Quartz Themes\n\nFonts works standalone. Without a theme, it falls back to Obsidian's default system font stacks. You can set fonts explicitly via the plugin options.\n\n## Examples\n\n```yaml title=\"quartz.config.yaml\"\n# Use theme fonts automatically (default behavior)\n- source: github:quartz-community/fonts\n  enabled: true\n\n# Override just the heading font\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    header: '\"Playfair Display\", serif'\n\n# Full control with per-heading fonts\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    body: '\"Inter\", sans-serif'\n    header: '\"Playfair Display\", serif'\n    code: '\"JetBrains Mono\", monospace'\n    h1: '\"Playfair Display\", serif'\n    h2: '\"Lora\", serif'\n\n# Load from Google Fonts automatically\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    body: Inter\n    header: Playfair Display\n    code: JetBrains Mono\n\n# Google Fonts with weight/italic control\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    body:\n      name: Inter\n      weights: [400, 600, 700]\n      includeItalic: true\n    header:\n      name: Playfair Display\n      weights: [400, 700]\n    code:\n      name: JetBrains Mono\n      weights: [400]\n\n# Custom title font (separate from header)\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    title: Abril Fatface\n    header: Playfair Display\n    body: Inter\n    code: JetBrains Mono\n\n# Self-hosted fonts (downloaded at build time, no external requests)\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: selfHosted\n    body: Inter\n    header: Playfair Display\n    code: JetBrains Mono\n\n# Ignore theme fonts entirely\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    useThemeFonts: false\n    body: '\"Inter\", sans-serif'\n```\n\n## Self-Hosted Fonts\n\nWhen `fontOrigin: selfHosted` is set, Fonts downloads fonts from Google Fonts during the build and serves them from your site's `static/fonts/` directory. This makes your site fully self-contained with no external requests to Google at runtime.\n\nAt build time, the plugin:\n\n1. Fetches the Google Fonts CSS for your configured fonts\n2. Downloads each font file (`.woff2`, `.woff`, etc.)\n3. Writes the font files to `static/fonts/` in your build output\n4. Generates a `quartz-fonts.css` file with `@font-face` rules pointing to the local files\n\n> [!note]\n> Self-hosted fonts require `baseUrl` to be set in your Quartz configuration, since font URLs in the CSS need an absolute path.\n\n```yaml title=\"quartz.config.yaml\"\nconfiguration:\n  baseUrl: \"example.com\"\n\nplugins:\n  - source: github:quartz-community/fonts\n    enabled: true\n    options:\n      fontOrigin: selfHosted\n      body: Inter\n      header: Playfair Display\n      code: JetBrains Mono\n```\n\n## Google Fonts Validation\n\nWhen `fontOrigin: googleFonts` is set and the optional [`google-font-metadata`](https://www.npmjs.com/package/google-font-metadata) package is installed, Fonts validates your font configuration at build time:\n\n- Checks that font family names exist in Google Fonts.\n- Warns if requested weights are not available for a font.\n- Warns if italic is requested but the font doesn't support it.\n\nInstall it to enable validation:\n\n```bash\nnpm install google-font-metadata\n```\n\nValidation warnings are logged to the console but do not block the build.\n\n## API\n\n- Category: Transformer, Emitter\n- Function name: `ExternalPlugin.Fonts()` (transformer), `ExternalPlugin.FontsEmitter()` (emitter).\n- Source: [`quartz-community/fonts`](https://github.com/quartz-community/fonts)\n- Install: `npx quartz plugin add github:quartz-community/fonts`\n","docs/plugins/Footer.md":"---\ntitle: Footer\ndescription: Page footer with configurable links.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/footer](https://github.com/quartz-community/footer)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders a footer at the bottom of the page with a \"Created with Quartz\" message and a set of configurable links.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `links`: A map of link labels to their URLs to display in the footer. Defaults to `{}`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/footer\n  enabled: true\n  options:\n    links:\n      GitHub: https://github.com/jackyzha0/quartz\n      Discord Community: https://discord.gg/cRFFHYye7t\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Footer()`.\n- Source: [`quartz-community/footer`](https://github.com/quartz-community/footer)\n- Install: `npx quartz plugin add github:quartz-community/footer`\n","docs/plugins/Frontmatter.md":"---\ntitle: Frontmatter\naliases:\n  - note-properties\n  - Note Properties\ndescription: Parses frontmatter and displays note properties in a collapsible panel.\ntags:\n  - plugin/transformer\n  - plugin/component\npublish: true\nenableToc: true\nimage:\nrepository: \"[quartz-community/note-properties](https://github.com/quartz-community/note-properties)\"\nenabled: true\nrequired: true\n---\n\nThis plugin parses the frontmatter of the page using the [gray-matter](https://github.com/jonschlinkert/gray-matter) library and optionally displays selected properties in a collapsible panel. See [[authoring content#Syntax]], [[Obsidian compatibility]] and [[OxHugo compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n> [!warning]\n> This plugin must not be removed, otherwise Quartz will break.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `delimiters`: the delimiters to use for the frontmatter. Can have one value (e.g. `\"---\"`) or separate values for opening and closing delimiters (e.g. `[\"---\", \"~~~\"]`). Defaults to `\"---\"`.\n- `language`: the language to use for parsing the frontmatter. Can be `yaml` (default) or `toml`.\n- `includeAll`: include all frontmatter properties in the properties panel. When `false`, only `includedProperties` are shown. Defaults to `false`.\n- `includedProperties`: properties to include when `includeAll` is `false`. Defaults to `[\"description\", \"tags\", \"aliases\"]`.\n- `excludedProperties`: properties to always exclude from display, even when `includeAll` is `true`. Defaults to `[]`.\n- `hidePropertiesView`: hide the visual properties panel while still processing frontmatter. Useful if you only need frontmatter parsing without the UI. Defaults to `false`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/note-properties\n  enabled: true\n  options:\n    includeAll: false\n    includedProperties:\n      - description\n      - tags\n      - aliases\n    excludedProperties: []\n    hidePropertiesView: false\n    delimiters: \"---\"\n    language: yaml\n```\n\n## Properties panel\n\nWhen enabled, this plugin renders a collapsible \"Properties\" panel before the page body. The panel displays selected frontmatter fields in a table with automatic type rendering:\n\n- **Strings** are shown as plain text. [[wikilinks]] and [markdown links](https://example.com) within strings are rendered as clickable links. Wikilink targets are slugified the same way as body-content links (e.g. `[[My Note]]` resolves to `my-note`) and matching is case-insensitive to mirror Obsidian's behavior, so `[[MyNote]]`, `[[mynote]]`, and `[[MYNOTE]]` all point to the same page.\n- **Arrays** are rendered as comma-separated lists.\n- **Booleans** are rendered as disabled checkboxes.\n- **Numbers** are rendered in a monospace font.\n- **Objects** are rendered as JSON in a code block.\n- **Tags** get special treatment: they are rendered as highlighted links that point to the corresponding tag page.\n- **Null/undefined** values are shown as an em-dash (—).\n\n### Per-note overrides\n\nYou can control the properties panel on a per-note basis using frontmatter keys:\n\n- `quartz-properties` (or `quartzProperties`): set to `true` to force-show the panel, or `false` to force-hide it, overriding the global `hidePropertiesView` setting.\n- `quartz-properties-collapse` (or `quartzPropertiesCollapse`): set to `true` to start the panel collapsed, or `false` to start it expanded, overriding the default collapse state.\n\nThese keys are automatically excluded from the visible properties table.\n\n```yaml title=\"Example frontmatter\"\n---\ntitle: My Note\nquartz-properties: true\nquartz-properties-collapse: false\n---\n```\n\n## Supported frontmatter\n\nQuartz supports the following frontmatter fields. Where multiple keys are listed, they are aliases — the first matching key is used.\n\n| Field              | Keys                                              | Description                                                                                                                                                                                                                        |\n| ------------------ | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Title              | `title`                                           | Page title. Falls back to filename if empty.                                                                                                                                                                                       |\n| Description        | `description`                                     | Page description for metadata and search.                                                                                                                                                                                          |\n| Tags               | `tags`, `tag`                                     | Categorization tags. Slugified the same way as file paths: spaces become `-`, `&` becomes `-and-`, `%` becomes `-percent`, and tags are lowercased so that `#MyTag` and `#mytag` resolve to the same tag page (matching Obsidian). |\n| Aliases            | `aliases`, `alias`                                | Alternative names for the page, used for link resolution.                                                                                                                                                                          |\n| Permalink          | `permalink`                                       | Custom URL slug. Also added to aliases.                                                                                                                                                                                            |\n| CSS classes        | `cssclasses`, `cssclass`                          | CSS classes applied to the page body.                                                                                                                                                                                              |\n| Social image       | `socialImage`, `image`, `cover`                   | Image used for social media previews.                                                                                                                                                                                              |\n| Social description | `socialDescription`                               | Description used specifically for social media previews.                                                                                                                                                                           |\n| Created date       | `created`, `date`                                 | When the note was created.                                                                                                                                                                                                         |\n| Modified date      | `modified`, `lastmod`, `updated`, `last-modified` | When the note was last modified. Falls back to `created` if unset.                                                                                                                                                                 |\n| Published date     | `published`, `publishDate`, `date`                | When the note was published.                                                                                                                                                                                                       |\n| Publish            | `publish`                                         | Whether the note should be published.                                                                                                                                                                                              |\n| Draft              | `draft`                                           | Whether the note is a draft.                                                                                                                                                                                                       |\n| Comments           | `comments`                                        | Whether comments are enabled for the note.                                                                                                                                                                                         |\n| Language           | `lang`                                            | Language code for the note.                                                                                                                                                                                                        |\n| Enable TOC         | `enableToc`                                       | Whether to show the table of contents.                                                                                                                                                                                             |\n\n## API\n\n- Category: Transformer, Component\n- Function name: `ExternalPlugin.NoteProperties()`.\n- Source: [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties)\n- Install: `npx quartz plugin add github:quartz-community/note-properties`\n","docs/plugins/GitHubFlavoredMarkdown.md":"---\ntitle: GitHubFlavoredMarkdown\ndescription: GitHub Flavored Markdown support (tables, task lists, footnotes, strikethrough).\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/github-flavored-markdown](https://github.com/quartz-community/github-flavored-markdown)\"\nenabled: true\nrequired: false\n---\n\nThis plugin enhances Markdown processing to support GitHub Flavored Markdown (GFM) which adds features like autolink literals, footnotes, strikethrough, tables and tasklists.\n\nIn addition, this plugin adds optional features for typographic refinement (such as converting straight quotes to curly quotes, dashes to en-dashes/em-dashes, and ellipses) and automatic heading links as a symbol that appears next to the heading on hover.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableSmartyPants`: When true, enables typographic enhancements. Default is true.\n- `linkHeadings`: When true, automatically adds links to headings. Default is true.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.GitHubFlavoredMarkdown()`.\n- Source: [`quartz-community/github-flavored-markdown`](https://github.com/quartz-community/github-flavored-markdown)\n- Install: `npx quartz plugin add github:quartz-community/github-flavored-markdown`\n","docs/plugins/Graph.md":"---\ntitle: Graph\ndescription: Interactive link graph visualization.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/graph](https://github.com/quartz-community/graph)\"\nenabled: true\nrequired: false\n---\n\nInteractive graph visualization.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[graph view]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `localGraph`: Options for the local graph view.\n- `globalGraph`: Options for the global graph view.\n\nBoth `localGraph` and `globalGraph` accept the following options:\n\n- `drag`: Enable dragging nodes. Defaults to `true`.\n- `zoom`: Enable zooming. Defaults to `true`.\n- `depth`: The depth of the graph. Defaults to `1` for local and `-1` for global.\n- `scale`: The initial scale of the graph. Defaults to `1.1` for local and `0.9` for global.\n- `repelForce`: The force that pushes nodes apart. Defaults to `0.5`.\n- `centerForce`: The force that pulls nodes to the center. Defaults to `0.3` for local and `0.2` for global.\n- `linkDistance`: The distance between linked nodes. Defaults to `30`.\n- `fontSize`: The font size of node labels. Defaults to `0.6`.\n- `opacityScale`: The scale of node opacity. Defaults to `1`.\n- `removeTags`: Tags to exclude from the graph. Defaults to `[]`.\n- `showTags`: Whether to show tags in the graph. Defaults to `true`.\n- `enableRadial`: Whether to enable radial layout. Defaults to `false` for local and `true` for global.\n- `focusOnHover`: Whether to focus on the hovered node. Defaults to `false` for local and `true` for global.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/graph\n  enabled: true\n  options:\n    localGraph:\n      drag: true\n      zoom: true\n      depth: 1\n      scale: 1.1\n      repelForce: 0.5\n      centerForce: 0.3\n      linkDistance: 30\n      fontSize: 0.6\n      opacityScale: 1\n      removeTags: []\n      showTags: true\n      focusOnHover: false\n      enableRadial: false\n    globalGraph:\n      drag: true\n      zoom: true\n      depth: -1\n      scale: 0.9\n      repelForce: 0.5\n      centerForce: 0.3\n      linkDistance: 30\n      fontSize: 0.6\n      opacityScale: 1\n      removeTags: []\n      showTags: true\n      focusOnHover: true\n      enableRadial: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Graph()`.\n- Source: [`quartz-community/graph`](https://github.com/quartz-community/graph)\n- Install: `npx quartz plugin add github:quartz-community/graph`\n","docs/plugins/HardLineBreaks.md":"---\ntitle: HardLineBreaks\ndescription: Treats single newlines as hard line breaks.\ntags:\n  - plugin/transformer\nimage: \"#ff8000\"\nrepository: \"[quartz-community/hard-line-breaks](https://github.com/quartz-community/hard-line-breaks)\"\nenabled: false\nrequired: false\n---\n\nThis plugin automatically converts single line breaks in Markdown text into hard line breaks in the HTML output. This plugin is not enabled by default as this doesn't follow the semantics of actual Markdown but you may enable it if you'd like parity with [[Obsidian compatibility|Obsidian]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.HardLineBreaks()`.\n- Source: [`quartz-community/hard-line-breaks`](https://github.com/quartz-community/hard-line-breaks)\n- Install: `npx quartz plugin add github:quartz-community/hard-line-breaks`\n","docs/plugins/Latex.md":"---\ntitle: Latex\ndescription: Renders LaTeX math expressions via KaTeX or Typst.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/latex](https://github.com/quartz-community/latex)\"\nenabled: true\nrequired: false\n---\n\nThis plugin adds LaTeX support to Quartz. See [[features/Latex|Latex]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `renderEngine`: the engine to use to render LaTeX equations. Can be `\"katex\"` for [KaTeX](https://katex.org/), `\"mathjax\"` for [MathJax](https://www.mathjax.org/) [SVG rendering](https://docs.mathjax.org/en/latest/output/svg.html), or `\"typst\"` for [Typst](https://typst.app/) (a new way to compose LaTeX equation). Defaults to KaTeX.\n- `customMacros`: custom macros for all LaTeX blocks. It takes the form of a key-value pair where the key is a new command name and the value is the expansion of the macro. For example: `{\"\\\\R\": \"\\\\mathbb{R}\"}`\n- `katexOptions`: Additional options passed to the KaTeX renderer. See the [KaTeX docs](https://katex.org/docs/options) for available options.\n- `mathJaxOptions`: Additional options passed to the MathJax renderer. See the [MathJax docs](https://docs.mathjax.org/en/latest/options/) for available options.\n- `typstOptions`: Additional options passed to the Typst renderer.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Latex()`.\n- Source: [`quartz-community/latex`](https://github.com/quartz-community/latex)\n- Install: `npx quartz plugin add github:quartz-community/latex`\n","docs/plugins/NotFoundPage.md":"---\ntitle: NotFoundPage\ntags:\n  - plugin/pageType\nimage:\n---\n\nThis plugin emits a 404 (Not Found) page for broken or non-existent URLs. It uses the `minimal` [[layout#Page Frames|page frame]] (no sidebars, no header or beforeBody chrome — only content and footer) to present a clean error page.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Page Type\n- Function name: `Plugin.NotFoundPage()` (internal plugin).\n- Source: [`quartz/plugins/pageTypes/404.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/pageTypes/404.ts)\n","docs/plugins/NoteProperties.md":"---\ntitle: NoteProperties\ndescription: Displays frontmatter properties in a collapsible panel.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/note-properties](https://github.com/quartz-community/note-properties)\"\nenabled: true\nrequired: true\n---\n\nThe NoteProperties plugin is documented under [[Frontmatter]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.NoteProperties()`.\n- Source: [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties)\n- Install: `npx quartz plugin add github:quartz-community/note-properties`\n","docs/plugins/ObsidianFlavoredMarkdown.md":"---\ntitle: ObsidianFlavoredMarkdown\ndescription: Obsidian-specific Markdown extensions (wikilinks, callouts, highlights, tags, embeds).\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/obsidian-flavored-markdown](https://github.com/quartz-community/obsidian-flavored-markdown)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides support for [[Obsidian compatibility]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `comments`: If `true` (default), enables parsing of `%%` style Obsidian comment blocks.\n- `highlight`: If `true` (default), enables parsing of `==` style highlights within content.\n- `wikilinks`:If `true` (default), turns [[wikilinks]] into regular links.\n- `callouts`: If `true` (default), adds support for [[callouts|callout]] blocks for emphasizing content.\n- `mermaid`: If `true` (default), enables [[Mermaid diagrams|Mermaid diagram]] rendering within Markdown files.\n- `parseTags`: If `true` (default), parses and links tags within the content.\n- `parseBlockReferences`: If `true` (default), handles block references, linking to specific content blocks.\n- `enableInHtmlEmbed`: If `true`, allows embedding of content directly within HTML. Defaults to `false`.\n- `enableYouTubeEmbed`: If `true` (default), enables the embedding of YouTube videos and playlists using external image Markdown syntax.\n- `enableTweetEmbed`: If `true` (default), enables the embedding of tweets as static blockquotes from Twitter/X URLs.\n- `enableVideoEmbed`: If `true` (default), enables the embedding of video files.\n- `enableCheckbox`: If `true`, adds support for interactive checkboxes in content, including custom task characters (e.g. `- [?]`, `- [!]`, `- [/]`). Defaults to `false`.\n- `enableObsidianUri`: If `true` (default), marks `obsidian://` protocol links with a CSS class and data attribute for custom styling.\n\n> [!note]\n> The `disableBrokenWikilinks` option previously lived on this plugin. It has moved to [[CrawlLinks]], which owns link resolution and can honor the configured `markdownLinkResolution` strategy when deciding whether a link is broken. Users upgrading from earlier Quartz v5 betas should move the option from `ObsidianFlavoredMarkdown` to `CrawlLinks`.\n\n> [!warning]\n> Don't remove this plugin if you're using [[Obsidian compatibility|Obsidian]] to author the content!\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.ObsidianFlavoredMarkdown()`.\n- Source: [`quartz-community/obsidian-flavored-markdown`](https://github.com/quartz-community/obsidian-flavored-markdown)\n- Install: `npx quartz plugin add github:quartz-community/obsidian-flavored-markdown`\n","docs/plugins/OxHugoFlavoredMarkdown.md":"---\ntitle: OxHugoFlavoredMarkdown\ndescription: Compatibility for ox-hugo exported Org-mode files.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/ox-hugo](https://github.com/quartz-community/ox-hugo)\"\nenabled: false\nrequired: false\n---\n\nThis plugin provides support for [ox-hugo](https://github.com/kaushalmodi/ox-hugo) compatibility. See [[OxHugo compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `wikilinks`: If `true` (default), converts Hugo `{{ relref }}` shortcodes to Quartz [[wikilinks]].\n- `removePredefinedAnchor`: If `true` (default), strips predefined anchors from headings.\n- `removeHugoShortcode`: If `true` (default), removes Hugo shortcode syntax (`{{}}`) from the content.\n- `replaceFigureWithMdImg`: If `true` (default), replaces `<figure/>` with `![]()`.\n- `replaceOrgLatex`: If `true` (default), converts Org-mode [[features/Latex|Latex]] fragments to Quartz-compatible LaTeX wrapped in `$` (for inline) and `$$` (for block equations).\n\n> [!warning]\n> While you can use this together with [[ObsidianFlavoredMarkdown]], it's not recommended because it might mutate the file in unexpected ways. Use with caution.\n>\n> If you use `toml` frontmatter, make sure to configure the [[Frontmatter]] plugin accordingly. See [[OxHugo compatibility]] for an example.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.OxHugoFlavoredMarkdown()`.\n- Source: [`quartz-community/ox-hugo`](https://github.com/quartz-community/ox-hugo)\n- Install: `npx quartz plugin add github:quartz-community/ox-hugo`\n","docs/plugins/PageTitle.md":"---\ntitle: PageTitle\ndescription: Renders the site title as a home link.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/page-title](https://github.com/quartz-community/page-title)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders the site-wide page title (configured via the `pageTitle` field in [[configuration]]) as a clickable link to the home page. It typically appears in the left sidebar.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options. The displayed title is controlled by the `pageTitle` field in `quartz.config.yaml`.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.PageTitle()`.\n- Source: [`quartz-community/page-title`](https://github.com/quartz-community/page-title)\n- Install: `npx quartz plugin add github:quartz-community/page-title`\n","docs/plugins/ReaderMode.md":"---\ntitle: ReaderMode\ndescription: Distraction-free reading mode toggle.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/reader-mode](https://github.com/quartz-community/reader-mode)\"\nenabled: true\nrequired: false\n---\n\nDistraction-free reading mode.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[reader mode]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enabled`: Whether to enable reader mode. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/reader-mode\n  enabled: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ReaderMode()`.\n- Source: [`quartz-community/reader-mode`](https://github.com/quartz-community/reader-mode)\n- Install: `npx quartz plugin add github:quartz-community/reader-mode`\n","docs/plugins/RecentNotes.md":"---\ntitle: RecentNotes\ndescription: Displays a list of recently modified notes.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/recent-notes](https://github.com/quartz-community/recent-notes)\"\nenabled: false\nrequired: false\n---\n\nShows recently modified notes.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[recent notes]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `title`: The title of the recent notes section. Defaults to `Recent notes`.\n- `limit`: The maximum number of recent notes to display. Defaults to `3`.\n- `showTags`: Whether to display the tags for each note. Defaults to `true`.\n- `linkToMore`: A slug to a page that shows more notes. Defaults to `false`.\n- `hideTagPages`: Whether to hide tag index pages from the list. Defaults to `false`.\n- `hideFolderPages`: Whether to hide folder index pages from the list. Defaults to `false`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/recent-notes\n  enabled: true\n  options:\n    limit: 3\n    showTags: true\n    hideTagPages: false\n    hideFolderPages: false\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.RecentNotes()`.\n- Source: [`quartz-community/recent-notes`](https://github.com/quartz-community/recent-notes)\n- Install: `npx quartz plugin add github:quartz-community/recent-notes`\n","docs/plugins/RemoveDrafts.md":"---\ntitle: RemoveDrafts\ndescription: Filters out pages marked as drafts.\ntags:\n  - plugin/filter\nimage:\nrepository: \"[quartz-community/remove-draft](https://github.com/quartz-community/remove-draft)\"\nenabled: true\nrequired: false\n---\n\nThis plugin filters out content from your vault, so that only finalized content is made available. This prevents [[private pages]] from being published. By default, it filters out all pages with `draft: true` in the frontmatter and leaves all other pages intact.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Filter\n- Function name: `ExternalPlugin.RemoveDrafts()`.\n- Source: [`quartz-community/remove-draft`](https://github.com/quartz-community/remove-draft)\n- Install: `npx quartz plugin add github:quartz-community/remove-draft`\n","docs/plugins/RoamFlavoredMarkdown.md":"---\ntitle: RoamFlavoredMarkdown\ndescription: Compatibility for Roam Research export format.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/roam](https://github.com/quartz-community/roam)\"\nenabled: false\nrequired: false\n---\n\nThis plugin provides support for [Roam Research](https://roamresearch.com) compatibility. See [[Roam Research compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `orComponent`: If `true` (default), converts Roam `{{ or:ONE|TWO|THREE }}` shortcodes into HTML Dropdown options.\n- `TODOComponent`: If `true` (default), converts Roam `{{[[TODO]]}}` shortcodes into HTML check boxes.\n- `DONEComponent`: If `true` (default), converts Roam `{{[[DONE]]}}` shortcodes into checked HTML check boxes.\n- `videoComponent`: If `true` (default), converts Roam `{{[[video]]:URL}}` shortcodes into embeded HTML video.\n- `audioComponent`: If `true` (default), converts Roam `{{[[audio]]:URL}}` shortcodes into embeded HTML audio.\n- `pdfComponent`: If `true` (default), converts Roam `{{[[pdf]]:URL}}` shortcodes into embeded HTML PDF viewer.\n- `blockquoteComponent`: If `true` (default), converts Roam `{{[[>]]}}` shortcodes into Quartz blockquotes.\n- `tableComponent`: If `true` (default), converts Roam table syntax into HTML tables.\n- `attributeComponent`: If `true` (default), converts Roam attribute syntax into rendered attributes.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.RoamFlavoredMarkdown()`.\n- Source: [`quartz-community/roam`](https://github.com/quartz-community/roam)\n- Install: `npx quartz plugin add github:quartz-community/roam`\n","docs/plugins/Search.md":"---\ntitle: Search\ndescription: Full-text search with tag filtering and keyboard navigation.\ntags:\n  - plugin/component\nimage: https://images.unsplash.com/photo-1516382799247-87df95d790b7\nrepository: \"[quartz-community/search](https://github.com/quartz-community/search)\"\nenabled: true\nrequired: false\n---\n\nFull-text search functionality.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[full-text search]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enablePreview`: Whether to show a preview of the page content in search results. Defaults to `true`.\n- `fieldPriority`: An array specifying the priority order for search fields. Defaults to `[\"title\", \"content\", \"tags\"]`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/search\n  enabled: true\n  options:\n    enablePreview: true\n    fieldPriority:\n      - title\n      - content\n      - tags\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Search()`.\n- Source: [`quartz-community/search`](https://github.com/quartz-community/search)\n- Install: `npx quartz plugin add github:quartz-community/search`\n","docs/plugins/Spacer.md":"---\ntitle: Spacer\ndescription: Flexible spacer for layout groups.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/spacer](https://github.com/quartz-community/spacer)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders a flexible spacer element that pushes adjacent components apart within a layout group. It uses CSS `flex: 2 1 auto` to fill available space, making it useful for spacing out items in toolbars or sidebars (for example, separating the search bar from the darkmode toggle in the left sidebar toolbar).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Spacer()`.\n- Source: [`quartz-community/spacer`](https://github.com/quartz-community/spacer)\n- Install: `npx quartz plugin add github:quartz-community/spacer`\n","docs/plugins/StackedPages.md":"---\ntitle: StackedPages\ndescription: Andy Matuschak-style stacked sliding panes.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/stacked-pages](https://github.com/quartz-community/stacked-pages)\"\nenabled: true\nrequired: false\n---\n\nAndy Matuschak-style stacked pages (sliding panes). Clicking internal links opens pages side by side in a horizontal stack, allowing you to trace your path through your notes. Each pane shows a full page and can be individually scrolled or closed.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nOnce enabled, clicking any internal link on a page opens the linked page as a new pane to the right instead of navigating away. The URL updates with a `#stacked=slug1,slug2` hash encoding your current stack, so you can share or bookmark a specific trail of pages.\n\nStacked pages are disabled on mobile by default (below 800px) since horizontal panning doesn't work well on small screens. On mobile, links navigate normally.\n\n### Interactions\n\n- **Click a link**: Opens the target page in a new pane to the right. If the maximum number of panes is reached, the leftmost pane is removed.\n- **Close a pane**: Click the × button in the pane header to remove it from the stack.\n- **Collapsed spines**: When panes overflow the viewport, earlier panes collapse to a thin vertical spine showing the page title. Click a spine to bring that pane back into focus.\n- **Browser back/forward**: The full stack state is stored in the URL hash and integrated with browser history, so back/forward navigation works as expected.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `maxTabs`: Maximum number of stacked panes visible at once. Defaults to `8`.\n- `mobileBreakpoint`: Viewport width (in pixels) below which stacked pages are disabled and links navigate normally. Defaults to `800`.\n- `showSpines`: Whether to show collapsed spine headers when panes overflow the viewport. Defaults to `true`.\n- `animateTransitions`: Whether to animate pane open/close transitions. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/stacked-pages\n  enabled: true\n  layout:\n    position: afterBody\n    priority: 50\n    display: all\n  options:\n    maxTabs: 8\n    mobileBreakpoint: 800\n    showSpines: true\n    animateTransitions: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.StackedPages()`.\n- Source: [`quartz-community/stacked-pages`](https://github.com/quartz-community/stacked-pages)\n- Install: `npx quartz plugin add github:quartz-community/stacked-pages`\n","docs/plugins/Static.md":"---\ntitle: Static\ntags:\n  - plugin/emitter\nimage:\n---\n\nThis plugin emits all static resources needed by Quartz. This is used, for example, for fonts and images that need a stable position, such as banners and icons. The plugin respects the `ignorePatterns` in the global [[configuration]].\n\n> [!important]\n> This is different from [[Assets]]. The resources from the [[Static]] plugin are located under `quartz/static`, whereas [[Assets]] renders all static resources under `content` and is used for images, videos, audio, etc. that are directly referenced by your markdown content.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.Static()` (internal plugin).\n- Source: [`quartz/plugins/emitters/static.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/static.ts).\n","docs/plugins/SyntaxHighlighting.md":"---\ntitle: SyntaxHighlighting\ndescription: Syntax highlighting for code blocks.\ntags:\n  - plugin/transformer\nimage: https://images.unsplash.com/photo-1580569214296-5cf2bffc5ccd\nrepository: \"[quartz-community/syntax-highlighting](https://github.com/quartz-community/syntax-highlighting)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is used to add syntax highlighting to code blocks in Quartz. See [[syntax highlighting]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `theme`: a separate id of one of the [themes bundled with Shikiji](https://shikiji.netlify.app/themes). One for light mode and one for dark mode. Defaults to `theme: { light: \"github-light\", dark: \"github-dark\" }`.\n- `keepBackground`: If set to `true`, the background of the Shikiji theme will be used. With `false` (default) the Quartz theme color for background will be used instead.\n- `clipboard`: Whether to add a copy-to-clipboard button to code blocks. Defaults to `true`.\n- `tokenClassification`: Whether to add semantic token classification CSS classes to code tokens. Defaults to `true`.\n\nIn addition, you can further override the colours in the `quartz/styles/syntax.scss` file.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.SyntaxHighlighting()`.\n- Source: [`quartz-community/syntax-highlighting`](https://github.com/quartz-community/syntax-highlighting)\n- Install: `npx quartz plugin add github:quartz-community/syntax-highlighting`\n","docs/plugins/TableOfContents.md":"---\ntitle: TableOfContents\ndescription: Generates and renders a table of contents from headings.\ntags:\n  - plugin/transformer\n  - plugin/component\nimage: https://images.unsplash.com/photo-1768527338896-3765921e992d\nrepository: \"[quartz-community/table-of-contents](https://github.com/quartz-community/table-of-contents)\"\nenabled: true\nrequired: false\n---\n\nThis plugin generates a table of contents (TOC) for Markdown documents. See [[table of contents]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `maxDepth`: Limits the depth of headings included in the TOC, ranging from `1` (top level headings only) to `6` (all heading levels). Default is `3`.\n- `minEntries`: The minimum number of heading entries required for the TOC to be displayed. Default is `1`.\n- `showByDefault`: If `true` (default), the TOC should be displayed by default. Can be overridden by frontmatter settings.\n- `collapseByDefault`: If `true`, the TOC will start in a collapsed state. Default is `false`.\n- `layout`: The visual layout of the TOC component. Can be `\"modern\"` or `\"legacy\"`. Default is `\"modern\"`.\n\n> [!warning]\n> This plugin needs the `Plugin.TableOfContents` component in `quartz.config.yaml` to determine where to display the TOC. Without it, nothing will be displayed. They should always be added or removed together.\n\n## API\n\n- Category: Transformer, Component\n- Function name: `ExternalPlugin.TableOfContentsTransformer()`.\n- Source: [`quartz-community/table-of-contents`](https://github.com/quartz-community/table-of-contents)\n- Install: `npx quartz plugin add github:quartz-community/table-of-contents`\n","docs/plugins/TagList.md":"---\ntitle: TagList\ndescription: Renders tags as clickable links.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/tag-list](https://github.com/quartz-community/tag-list)\"\nenabled: false\nrequired: false\n---\n\nThis plugin renders the page's tags as a list of clickable links. Each tag links to its corresponding [[TagPage|tag page]], making it easy for readers to browse related content by topic.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.TagList()`.\n- Source: [`quartz-community/tag-list`](https://github.com/quartz-community/tag-list)\n- Install: `npx quartz plugin add github:quartz-community/tag-list`\n","docs/plugins/TagPage.md":"---\ntitle: TagPage\ndescription: Generates listing pages for tags.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/tag-page](https://github.com/quartz-community/tag-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that emits dedicated pages for each tag used in the content. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). See [[folder and tag listings]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `numPages`: The maximum number of pages to display per tag before showing a \"see more\" link. Defaults to `10`.\n- `sort`: A function of type `(f1: QuartzPluginData, f2: QuartzPluginData) => number{:ts}` used to sort entries. Defaults to sorting by date and tie-breaking on lexographical order. Requires a TS override.\n- `prefixTags`: If `true`, generated tag page titles are prefixed with \"Tag: \" (e.g. \"Tag: recipes\"). Defaults to `false`.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.TagPage()`.\n- Source: [`quartz-community/tag-page`](https://github.com/quartz-community/tag-page)\n- Install: `npx quartz plugin add github:quartz-community/tag-page`\n","docs/plugins/UnlistedPages.md":"---\ntitle: UnlistedPages\ndescription: Hides pages from navigation and indexes while still publishing them.\ntags:\n  - plugin/transformer\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/unlisted-pages](https://github.com/quartz-community/unlisted-pages)\"\nenabled: true\nrequired: false\n---\n\nZero-config transformer that makes `unlisted: true` in a page's frontmatter a first-class way to opt out of every listing surface on your site. The page is still emitted as HTML and remains accessible by direct URL, but is absent from `contentIndex.json`, RSS, sitemap, graph, explorer, search, backlinks, recent notes, folder listings, and tag listings.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nAdd an `unlisted` field to any page's frontmatter:\n\n```yaml\n---\ntitle: My Draft\nunlisted: true\n---\n```\n\nThat's it. Every Quartz v5 plugin that respects the `file.data.unlisted` convention will then hide the page.\n\n## What each plugin does\n\n| Plugin         | Behavior when `unlisted: true`                                             |\n| -------------- | -------------------------------------------------------------------------- |\n| `ContentIndex` | Page absent from `contentIndex.json`, `sitemap.xml`, and the RSS feed.     |\n| `Search`       | Page absent from search results (derived from `contentIndex.json`).        |\n| `Graph`        | Page absent from graph nodes and edges (derived from `contentIndex.json`). |\n| `Explorer`     | Page absent from the sidebar file tree (derived from `contentIndex.json`). |\n| `Backlinks`    | Page never appears as a backlink source on other pages.                    |\n| `RecentNotes`  | Page absent from the recent notes list.                                    |\n| `FolderPage`   | Page absent from folder listings and folder discovery.                     |\n| `TagPage`      | Page absent from tag discovery and tag listings.                           |\n\nIn every case, the page's HTML is still emitted and accessible by direct URL.\n\n## Configuration\n\nZero options. Just enable it.\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/unlisted-pages\n  enabled: true\n```\n\n## Interaction with [[EncryptedPages]]\n\nThe [[EncryptedPages]] plugin also sets `file.data.unlisted` when its `unlistWhenEncrypted: true` option is set or when a page has `unlisted: true` in frontmatter. The two plugins compose cleanly:\n\n- If you install only `UnlistedPages`: any page with `unlisted: true` in frontmatter is hidden from listing surfaces. Encryption is independent.\n- If you install only `EncryptedPages`: `unlisted: true` only takes effect on pages that are also encrypted (have a password). Non-encrypted pages with `unlisted: true` are silently ignored.\n- If you install both: `unlisted: true` works for every page, encrypted or not. This is the recommended setup for sites that use encrypted pages.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.UnlistedPages()`.\n- Source: [`quartz-community/unlisted-pages`](https://github.com/quartz-community/unlisted-pages)\n- Install: `npx quartz plugin add github:quartz-community/unlisted-pages`\n","docs/plugins/index.md":"---\ntitle: Plugins\nimage:\n---\n\nQuartz's functionality is provided by a collection of first-party community plugins. Each plugin can be enabled, disabled, and configured via `quartz.config.yaml`. See [[configuration#Plugins|Configuration]] for details on how to manage plugins.\n\n> [!info] Internal vs Community Plugins\n> Quartz has two kinds of plugins:\n>\n> - **Community plugins** are standalone repositories under [`quartz-community`](https://github.com/quartz-community). In TS overrides, they use `ExternalPlugin.X()` (imported from `.quartz/plugins`).\n> - **Internal plugins** are built into Quartz core (Assets, Static, ComponentResources, NotFoundPage). In TS overrides, they use `Plugin.X()` (imported from `./quartz/plugins`).\n\n## Plugin types\n\nQuartz plugins fall into several categories:\n\n- **Transformers** process content during the build, e.g. parsing frontmatter, highlighting syntax, or resolving links.\n- **Filters** decide which content files to include or exclude from the output.\n- **Page Types** generate HTML pages — one per content file, folder, tag, canvas, or bases view.\n- **Components** render UI elements in the page layout (sidebars, headers, footers, etc.).\n\n## First-party plugins\n\n```base\nfilters:\n  and:\n    - file.ext == \"md\"\n    - file.inFolder(\"plugins\")\n    - \"!file.name.startsWith('index')\"\n    - \"!file.name.contains('Demo')\"\n    - \"!file.name.contains('Static')\"\n    - \"!file.name.contains('Assets')\"\n    - \"!file.name.contains('ComponentResources')\"\n    - \"!file.name.contains('NotFoundPage')\"\nformulas:\n  category: |\n    if(file.hasTag(\"plugin/transformer\"), \"Transformer\",\n    if(file.hasTag(\"plugin/filter\"), \"Filter\",\n    if(file.hasTag(\"plugin/pageType\"), \"Page Type\",\n    if(file.hasTag(\"plugin/emitter\"), \"Emitter\",\n    if(file.hasTag(\"plugin/component\"), \"Component\",\n    \"Other\")))))\nproperties:\n  title:\n    displayName: Plugin\n  repository:\n    displayName: Repository\n  enabled:\n    displayName: Enabled\n  required:\n    displayName: Required\n  description:\n    displayName: Description\nviews:\n  - type: table\n    name: All Plugins\n    groupBy:\n      property: formula.category\n      direction: ASC\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: formula.category\n        direction: ASC\n      - property: title\n        direction: ASC\n  - type: table\n    name: Transformers\n    filters:\n      and:\n        - file.hasTag(\"plugin/transformer\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Filters\n    filters:\n      and:\n        - file.hasTag(\"plugin/filter\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Page Types\n    filters:\n      and:\n        - file.hasTag(\"plugin/pageType\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Emitters\n    filters:\n      and:\n        - file.hasTag(\"plugin/emitter\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Components\n    filters:\n      and:\n        - file.hasTag(\"plugin/component\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n\n```\n\n> [!note] Multi-category plugins\n> Some plugins span multiple categories. **TableOfContents** is both a transformer and a component. **EncryptedPages** is a transformer, emitter, and component. They appear in each relevant category above.\n"},"items":[{"name":"AliasRedirects.md","path":"docs/plugins/AliasRedirects.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/AliasRedirects.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: AliasRedirects\ndescription: Generates redirect pages from frontmatter aliases and case-preserving URLs.\ntags:\n  - plugin/emitter\nimage: https://images.unsplash.com/photo-1601735479770-bb5de9dbe844\nrepository: \"[quartz-community/alias-redirects](https://github.com/quartz-community/alias-redirects)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits HTML redirect pages so that old URLs redirect to the canonical page. It handles two types of redirects:\n\n1. **Frontmatter aliases**: Redirect pages for aliases defined in your content's frontmatter.\n2. **Case-preserving redirects**: Automatic redirect pages for URLs that changed due to Quartz v5's lowercase slug normalization.\n\n### Frontmatter Aliases\n\nIf `foo.md` has the following frontmatter:\n\n```md title=\"foo.md\"\n---\ntitle: \"Foo\"\naliases:\n  - \"bar\"\n---\n```\n\nThe target `host.me/bar` will be permanently redirected to `host.me/foo`.\n\nThe emitter supports the following frontmatter fields:\n\n- `aliases`\n- `alias`\n\n### Case-Preserving Redirects\n\nQuartz v5 normalizes all URLs to lowercase. If you are migrating from v4 (which preserved the original casing), previously indexed URLs containing uppercase letters (e.g. `/Diary/My-Note`) would return 404 errors.\n\nWhen `enableCaseRedirects` is enabled (the default), this plugin automatically detects files whose original path differs from the lowercased slug and generates redirect pages at the original-case URL. For example, if your content directory contains `Diary/2026-01-01.md`, the plugin generates:\n\n- The canonical page at `/diary/2026-01-01` (produced by the normal build)\n- A redirect page at `/Diary/2026-01-01` (produced by this plugin)\n\nThe redirect page includes proper SEO signals:\n\n- `<meta http-equiv=\"refresh\" content=\"0; url=...\">` for an instant redirect\n- `<link rel=\"canonical\">` pointing to the lowercase URL\n- `<meta name=\"robots\" content=\"noindex\">` to prevent duplicate indexing\n\nThis preserves search engine rankings and ensures inbound links continue to work.\n\n> [!note]\n> Case-preserving redirects have no effect on case-insensitive filesystems (macOS, Windows) where the server already resolves either casing to the same file. The plugin automatically detects the filesystem type and skips redirect generation when unnecessary.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableCaseRedirects`: If `true` (default), automatically generates redirect pages for URLs that changed casing due to v5's lowercase normalization. Set to `false` to disable this behavior.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.AliasRedirects()`.\n- Source: [`quartz-community/alias-redirects`](https://github.com/quartz-community/alias-redirects)\n- Install: `npx quartz plugin add github:quartz-community/alias-redirects`\n","frontmatter":{"title":"AliasRedirects","description":"Generates redirect pages from frontmatter aliases and case-preserving URLs.","tags":["plugin/emitter"],"image":"https://images.unsplash.com/photo-1601735479770-bb5de9dbe844","repository":"[quartz-community/alias-redirects](https://github.com/quartz-community/alias-redirects)","enabled":true,"required":false},"isInternal":false,"tokens":727,"sizeBytes":2908},{"name":"ArticleTitle.md","path":"docs/plugins/ArticleTitle.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/ArticleTitle.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: ArticleTitle\ndescription: Renders the article title as an h1 heading.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/article-title](https://github.com/quartz-community/article-title)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders the article title from the page's frontmatter as an `<h1>` heading at the top of the page content. It reads the `title` field from frontmatter (falling back to the filename if no title is set).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ArticleTitle()`.\n- Source: [`quartz-community/article-title`](https://github.com/quartz-community/article-title)\n- Install: `npx quartz plugin add github:quartz-community/article-title`\n","frontmatter":{"title":"ArticleTitle","description":"Renders the article title as an h1 heading.","tags":["plugin/component"],"repository":"[quartz-community/article-title](https://github.com/quartz-community/article-title)","enabled":true,"required":false},"isInternal":false,"tokens":221,"sizeBytes":882},{"name":"Assets.md","path":"docs/plugins/Assets.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Assets.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Assets\ntags:\n  - plugin/emitter\nimage: https://images.unsplash.com/photo-1526304640581-d334cdbbf45e\n---\n\nThis plugin emits all non-Markdown static assets in your content folder (like images, videos, HTML, etc). The plugin respects the `ignorePatterns` in the global [[configuration]].\n\nNote that all static assets will then be accessible through its path on your generated site, i.e: `host.me/path/to/static.pdf`\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.Assets()` (internal plugin).\n- Source: [`quartz/plugins/emitters/assets.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/assets.ts).\n","frontmatter":{"title":"Assets","tags":["plugin/emitter"],"image":"https://images.unsplash.com/photo-1526304640581-d334cdbbf45e"},"isInternal":false,"tokens":202,"sizeBytes":805},{"name":"Backlinks.md","path":"docs/plugins/Backlinks.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Backlinks.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Backlinks\ndescription: Shows pages that link to the current page.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/backlinks](https://github.com/quartz-community/backlinks)\"\nenabled: true\nrequired: false\n---\n\nShows pages that link to the current page.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Backlinks]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `hideWhenEmpty`: Hide the backlinks section if the current page has no backlinks. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/backlinks\n  enabled: true\n  options:\n    hideWhenEmpty: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Backlinks()`.\n- Source: [`quartz-community/backlinks`](https://github.com/quartz-community/backlinks)\n- Install: `npx quartz plugin add github:quartz-community/backlinks`\n","frontmatter":{"title":"Backlinks","description":"Shows pages that link to the current page.","tags":["plugin/component"],"repository":"[quartz-community/backlinks](https://github.com/quartz-community/backlinks)","enabled":true,"required":false},"isInternal":false,"tokens":260,"sizeBytes":1037},{"name":"BasesPage.md","path":"docs/plugins/BasesPage.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/BasesPage.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: BasesPage\ndescription: Renders Obsidian Bases files as database-style views.\ntags:\n  - plugin/pageType\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/bases-page](https://github.com/quartz-community/bases-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides support for [Obsidian Bases](https://obsidian.md/changelog/2025-04-15-desktop-v1.8.0/) (`.base` files) in Quartz. It reads `.base` files from your vault, resolves matching notes based on the query definition, and renders them as interactive database-like views with support for tables, lists, cards, and maps. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Features\n\n- **Table view**: Sortable columns with automatic type rendering (strings, numbers, booleans, arrays, links).\n- **List view**: Compact list with metadata chips for each entry.\n- **Cards view**: Card layout with optional image property support.\n- **Map view**: Placeholder for future map-based visualization.\n- **Multiple views**: A single `.base` file can define multiple views, displayed as switchable tabs.\n- **Filters**: Recursive filter trees with `and`/`or`/`not` operators.\n- **Formulas**: Computed properties via formula expressions.\n- **Summaries**: Column-level aggregations (Sum, Average, Min, Max, Median, etc.).\n- **Property configuration**: Custom display names for properties.\n- **Link rendering**: Wikilinks and Markdown links within cell values are rendered as clickable links.\n\n## Interaction with `unlisted` pages\n\n`BasesPage` respects the `file.data.unlisted` convention written by [[UnlistedPages]] and [[EncryptedPages]]. Pages marked `unlisted: true` (or encrypted pages with `stealth: true`) are excluded from every rendered base view — table, list, board, cards, gallery, and any custom view — regardless of whether the base's filter expression would match them. Unlisted pages also cannot be dereferenced from formulas on visible pages via `.asFile()`.\n\n> [!note]\n> Base views are **server-side rendered** HTML baked at build time. They do not update client-side after a visitor decrypts an encrypted page. Graph, explorer, and search all re-hydrate from the patched in-memory content index and show newly-unlocked pages for the rest of the browser session — base views do not, because they were materialized at build time with unlisted pages already excluded. A visitor who successfully decrypts a revealable encrypted page will see it appear in graph, explorer, and search, but **not** in any base view, until the site is rebuilt with that page listed. This is the same structural limitation that applies to backlinks, recent notes, folder listings, and tag listings.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `defaultViewType`: The default view type when none is specified in the `.base` file. Defaults to `\"table\"`.\n- `linkResolution`: How to resolve internal links in view renderers. Should match the `markdownLinkResolution` setting of the [[CrawlLinks]] plugin. Can be `\"absolute\"`, `\"relative\"`, or `\"shortest\"`. Defaults to `\"shortest\"`.\n- `customViews`: A map of custom view renderers. Keys are view type names. These override built-in renderers for the same type, or add new view types. Requires a TS override.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/bases-page\n  enabled: true\n```\n\nFor custom view renderers, use a TS override in `quartz.ts`:\n\n```ts title=\"quartz.ts (override)\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.BasesPage({\n  defaultViewType: \"table\",\n  customViews: {\n    myView: ({ entries, view, basesData, total, locale }) => {\n      // return JSX\n    },\n  },\n})\n```\n\n## API\n\n- Category: Page Type, Component\n- Function name: `ExternalPlugin.BasesPage()`.\n- Source: [`quartz-community/bases-page`](https://github.com/quartz-community/bases-page)\n- Install: `npx quartz plugin add github:quartz-community/bases-page`\n","frontmatter":{"title":"BasesPage","description":"Renders Obsidian Bases files as database-style views.","tags":["plugin/pageType","plugin/component"],"new-in-v5":true,"repository":"[quartz-community/bases-page](https://github.com/quartz-community/bases-page)","enabled":true,"required":false},"isInternal":false,"tokens":1044,"sizeBytes":4180},{"name":"Breadcrumbs.md","path":"docs/plugins/Breadcrumbs.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Breadcrumbs.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Breadcrumbs\ndescription: Breadcrumb navigation trail.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/breadcrumbs](https://github.com/quartz-community/breadcrumbs)\"\nenabled: true\nrequired: false\n---\n\nNavigation breadcrumb trail.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Breadcrumbs]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `spacerSymbol`: The symbol to use between breadcrumb items. Defaults to `\"❯\"`.\n- `rootName`: The name of the root page. Defaults to `Home`.\n- `resolveFrontmatterTitle`: Whether to use the `title` frontmatter field for breadcrumb items. Defaults to `true`.\n- `showCurrentPage`: Whether to show the current page in the breadcrumb trail. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/breadcrumbs\n  enabled: true\n  options:\n    spacerSymbol: \"❯\"\n    rootName: Home\n    resolveFrontmatterTitle: true\n    showCurrentPage: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Breadcrumbs()`.\n- Source: [`quartz-community/breadcrumbs`](https://github.com/quartz-community/breadcrumbs)\n- Install: `npx quartz plugin add github:quartz-community/breadcrumbs`\n","frontmatter":{"title":"Breadcrumbs","description":"Breadcrumb navigation trail.","tags":["plugin/component"],"repository":"[quartz-community/breadcrumbs](https://github.com/quartz-community/breadcrumbs)","enabled":true,"required":false},"isInternal":false,"tokens":340,"sizeBytes":1361},{"name":"CanvasPage.md","path":"docs/plugins/CanvasPage.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/CanvasPage.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: CanvasPage\ndescription: Renders JSON Canvas files as interactive, pannable pages.\ntags:\n  - plugin/pageType\nimage: \"#7852ee\"\nnew-in-v5: true\nrepository: \"[quartz-community/canvas-page](https://github.com/quartz-community/canvas-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that renders [JSON Canvas](https://jsoncanvas.org) (`.canvas`) files as interactive, pannable and zoomable canvas pages. It uses a custom `\"canvas\"` [[layout#Page Frames|page frame]] that provides a fullscreen, always-on canvas experience with a togglable left sidebar for navigation. It supports the full [JSON Canvas 1.0 spec](https://jsoncanvas.org/spec/1.0/), including text nodes with Markdown rendering, file nodes that link to other pages in your vault, link nodes for external URLs, and group nodes for visual organization. Edges between nodes are rendered as SVG paths with optional labels, arrow markers, and colors.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableInteraction`: Whether to enable pan and zoom interaction on the canvas. Default: `true{:ts}`.\n- `initialZoom`: The initial zoom level when the canvas is first displayed. Default: `1{:ts}`.\n- `minZoom`: The minimum zoom level allowed when zooming out. Default: `0.1{:ts}`.\n- `maxZoom`: The maximum zoom level allowed when zooming in. Default: `5{:ts}`.\n\n### Canvas Frame\n\nThe canvas-page plugin provides its own `\"canvas\"` page frame via the [[layout#Page Frames|Frame Registry]]. This frame:\n\n- Renders the canvas in **fullscreen mode** by default (100vw × 100vh), giving the canvas maximum screen space — leaning into the \"endless canvas\" concept of JSON Canvas.\n- Provides a **togglable left sidebar** that slides in from the left edge. This is the only layout slot available — it renders the same components as the `left` sidebar on content pages (e.g., Explorer, Search, Page Title).\n- The sidebar toggle button (hamburger/close icon) is positioned in the top-left corner.\n- Canvas controls (zoom in, zoom out, reset) are positioned on the right side.\n- On mobile, the sidebar overlays the canvas rather than pushing it aside.\n\nUsers can override this frame via `quartz.config.yaml` if needed:\n\n```yaml title=\"quartz.config.yaml\"\nlayout:\n  byPageType:\n    canvas:\n      template: default # Use standard three-column layout instead\n```\n\n### Features\n\n- **Text nodes**: Render Markdown content including headings, bold, italic, strikethrough, lists, links, and code blocks via [GFM](https://github.github.com/gfm/) support.\n- **File nodes**: Link to other pages in your vault. Supports popover previews on hover.\n- **Link nodes**: Reference external URLs.\n- **Group nodes**: Visual grouping containers with optional labels and background colors.\n- **Edges**: SVG connections between nodes with optional labels, arrow markers, and colors. Supports all four sides (top, right, bottom, left) and both preset colors (1–6) and custom hex colors.\n- **Togglable sidebar**: Hamburger button in the top-left corner toggles the left sidebar for navigation. Press `Escape` or click the close button to dismiss.\n- **Preset colors**: Six preset colors (red, orange, yellow, green, cyan, purple) plus custom hex colors (`#RRGGBB`) for nodes and edges.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.CanvasPage()`.\n- Source: [`quartz-community/canvas-page`](https://github.com/quartz-community/canvas-page)\n- Install: `npx quartz plugin add github:quartz-community/canvas-page`\n","frontmatter":{"title":"CanvasPage","description":"Renders JSON Canvas files as interactive, pannable pages.","tags":["plugin/pageType"],"image":"#7852ee","new-in-v5":true,"repository":"[quartz-community/canvas-page](https://github.com/quartz-community/canvas-page)","enabled":true,"required":false},"isInternal":false,"tokens":905,"sizeBytes":3626},{"name":"Citations.md","path":"docs/plugins/Citations.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Citations.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Citations\ndescription: Academic citation and bibliography support via BibTeX.\ntags:\n  - plugin/transformer\nimage: https://images.unsplash.com/photo-1582079133805-43655f026448\nrepository: \"[quartz-community/citations](https://github.com/quartz-community/citations)\"\nenabled: false\nrequired: false\n---\n\nThis plugin adds Citation support to Quartz.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `bibliographyFile`: the path to the bibliography file. Defaults to `./bibliography.bib`. This is relative to git source of your vault.\n- `suppressBibliography`: whether to suppress the bibliography at the end of the document. Defaults to `false`.\n- `linkCitations`: whether to link citations to the bibliography. Defaults to `false`.\n- `csl`: the citation style to use. Defaults to `apa`. Reference [rehype-citation](https://rehype-citation.netlify.app/custom-csl) for more options.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Citations()`.\n- Source: [`quartz-community/citations`](https://github.com/quartz-community/citations)\n- Install: `npx quartz plugin add github:quartz-community/citations`\n","frontmatter":{"title":"Citations","description":"Academic citation and bibliography support via BibTeX.","tags":["plugin/transformer"],"image":"https://images.unsplash.com/photo-1582079133805-43655f026448","repository":"[quartz-community/citations](https://github.com/quartz-community/citations)","enabled":false,"required":false},"isInternal":false,"tokens":317,"sizeBytes":1265},{"name":"CNAME.md","path":"docs/plugins/CNAME.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/CNAME.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: CNAME\ndescription: Emits a CNAME file for custom domain deployment.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/cname](https://github.com/quartz-community/cname)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits a `CNAME` record that points your subdomain to the default domain of your site.\n\nIf you want to use a custom domain name like `quartz.example.com` for the site, then this is needed.\n\nSee [[hosting|Hosting]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.CNAME()`.\n- Source: [`quartz-community/cname`](https://github.com/quartz-community/cname)\n- Install: `npx quartz plugin add github:quartz-community/cname`\n","frontmatter":{"title":"CNAME","description":"Emits a CNAME file for custom domain deployment.","tags":["plugin/emitter"],"repository":"[quartz-community/cname](https://github.com/quartz-community/cname)","enabled":true,"required":false},"isInternal":false,"tokens":216,"sizeBytes":862},{"name":"Comments.md","path":"docs/plugins/Comments.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Comments.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Comments\ndescription: Comment system integration (Giscus, Utterances, etc.).\ntags:\n  - plugin/component\nimage: \"[[giscus-results.png]]\"\nrepository: \"[quartz-community/comments](https://github.com/quartz-community/comments)\"\nenabled: false\nrequired: false\n---\n\nComment system (giscus, utterances, etc.).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Comments]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `provider`: The comment provider to use. Currently only `giscus` is supported.\n- `options`: Provider-specific options.\n  - `repo`: The GitHub repository to use for comments.\n  - `repoId`: The ID of the GitHub repository.\n  - `category`: The discussion category to use.\n  - `categoryId`: The ID of the discussion category.\n  - `lang`: The language for the comment system. Defaults to `en`.\n  - `themeUrl`: URL to a folder with custom themes.\n  - `lightTheme`: Filename for the light theme CSS file. Defaults to `light`.\n  - `darkTheme`: Filename for the dark theme CSS file. Defaults to `dark`.\n  - `mapping`: How to map pages to discussions. Defaults to `url`.\n  - `strict`: Use strict title matching. Defaults to `true`.\n  - `reactionsEnabled`: Whether to enable reactions for the main post. Defaults to `true`.\n  - `inputPosition`: Where to put the comment input box relative to the comments. Defaults to `bottom`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/comments\n  enabled: true\n  options:\n    provider: giscus\n    options:\n      repo: jackyzha0/quartz\n      repoId: MDEwOlJlcG9zaXRvcnkzODcyMTMyMDg\n      category: Announcements\n      categoryId: DIC_kwDOFxRnmM4B-Xg6\n      lang: en\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Comments()`.\n- Source: [`quartz-community/comments`](https://github.com/quartz-community/comments)\n- Install: `npx quartz plugin add github:quartz-community/comments`\n","frontmatter":{"title":"Comments","description":"Comment system integration (Giscus, Utterances, etc.).","tags":["plugin/component"],"image":"[[giscus-results.png]]","repository":"[quartz-community/comments](https://github.com/quartz-community/comments)","enabled":false,"required":false},"isInternal":false,"tokens":513,"sizeBytes":2050},{"name":"ComponentResources.md","path":"docs/plugins/ComponentResources.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/ComponentResources.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: ComponentResources\ntags:\n  - plugin/emitter\nimage:\n---\n\nThis plugin manages and emits the static resources required for the Quartz framework. This includes CSS stylesheets and JavaScript scripts that enhance the functionality and aesthetics of the generated site. See also the `cdnCaching` option in the `theme` section of the [[configuration]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.ComponentResources()` (internal plugin).\n- Source: [`quartz/plugins/emitters/componentResources.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/componentResources.ts).\n","frontmatter":{"title":"ComponentResources","tags":["plugin/emitter"]},"isInternal":false,"tokens":194,"sizeBytes":774},{"name":"ContentIndex.md","path":"docs/plugins/ContentIndex.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/ContentIndex.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: ContentIndex\ndescription: Generates sitemap, RSS feed, and content index.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/content-index](https://github.com/quartz-community/content-index)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits both RSS and an XML sitemap for your site. The [[RSS Feed]] allows users to subscribe to content on your site and the sitemap allows search engines to better index your site. The plugin also emits a `contentIndex.json` file which is used by dynamic frontend components like search and graph.\n\nThis plugin emits a comprehensive index of the site's content, generating additional resources such as a sitemap, an RSS feed, and a\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableSiteMap`: If `true` (default), generates a sitemap XML file (`sitemap.xml`) listing all site URLs for search engines in content discovery.\n- `enableRSS`: If `true` (default), produces an RSS feed (`index.xml`) with recent content updates.\n- `rssLimit`: Defines the maximum number of entries to include in the RSS feed, helping to focus on the most recent or relevant content. Defaults to `10`.\n- `rssFullHtml`: If `true`, the RSS feed includes the full rendered HTML content of each page. Defaults to `false`.\n- `rssSlug`: Slug to the generated RSS feed XML file. Defaults to `\"index\"`.\n- `includeEmptyFiles`: If `true` (default), content files with no body text are included in the generated index and resources.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.ContentIndex()`.\n- Source: [`quartz-community/content-index`](https://github.com/quartz-community/content-index)\n- Install: `npx quartz plugin add github:quartz-community/content-index`\n","frontmatter":{"title":"ContentIndex","description":"Generates sitemap, RSS feed, and content index.","tags":["plugin/emitter"],"repository":"[quartz-community/content-index](https://github.com/quartz-community/content-index)","enabled":true,"required":false},"isInternal":false,"tokens":463,"sizeBytes":1851},{"name":"ContentMeta.md","path":"docs/plugins/ContentMeta.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/ContentMeta.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: ContentMeta\ndescription: Displays creation date and reading time.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/content-meta](https://github.com/quartz-community/content-meta)\"\nenabled: true\nrequired: false\n---\n\nThis plugin displays content metadata below the article title, such as the creation date and estimated reading time.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `showReadingTime`: Whether to display the estimated reading time. Defaults to `true`.\n- `showComma`: Whether to display a comma between metadata items. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/content-meta\n  enabled: true\n  options:\n    showReadingTime: true\n    showComma: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ContentMeta()`.\n- Source: [`quartz-community/content-meta`](https://github.com/quartz-community/content-meta)\n- Install: `npx quartz plugin add github:quartz-community/content-meta`\n","frontmatter":{"title":"ContentMeta","description":"Displays creation date and reading time.","tags":["plugin/component"],"repository":"[quartz-community/content-meta](https://github.com/quartz-community/content-meta)","enabled":true,"required":false},"isInternal":false,"tokens":291,"sizeBytes":1164},{"name":"ContentPage.md","path":"docs/plugins/ContentPage.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/ContentPage.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: ContentPage\ndescription: Generates HTML pages for Markdown content.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/content-page](https://github.com/quartz-community/content-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin for the Quartz framework. It generates the HTML pages for each piece of Markdown content. It emits the full-page [[layout]], including headers, footers, and body content, among others. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). It is now configured in the `pageTypes` section of `quartz.config.yaml`.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.ContentPage()`.\n- Source: [`quartz-community/content-page`](https://github.com/quartz-community/content-page)\n- Install: `npx quartz plugin add github:quartz-community/content-page`\n","frontmatter":{"title":"ContentPage","description":"Generates HTML pages for Markdown content.","tags":["plugin/pageType"],"repository":"[quartz-community/content-page](https://github.com/quartz-community/content-page)","enabled":true,"required":false},"isInternal":false,"tokens":261,"sizeBytes":1044},{"name":"CrawlLinks.md","path":"docs/plugins/CrawlLinks.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/CrawlLinks.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: CrawlLinks\ndescription: Parses and resolves internal links. Removing it is not recommended.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/crawl-links](https://github.com/quartz-community/crawl-links)\"\nenabled: true\nrequired: true\n---\n\nThis plugin parses links and processes them to point to the right places. It is also needed for embedded links (like images). See [[Obsidian compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `markdownLinkResolution`: Sets the strategy for resolving Markdown paths, can be `\"absolute\"` (default), `\"relative\"` or `\"shortest\"`. You should use the same setting here as in [[Obsidian compatibility|Obsidian]].\n  - `absolute`: Path relative to the root of the content folder.\n  - `relative`: Path relative to the file you are linking from.\n  - `shortest`: Name of the file. If this isn't enough to identify the file, use the full absolute path.\n- `prettyLinks`: If `true` (default), simplifies links by removing folder paths, making them more user friendly (e.g. `folder/deeply/nested/note` becomes `note`).\n- `openLinksInNewTab`: If `true`, configures external links to open in a new tab. Defaults to `false`.\n- `lazyLoad`: If `true`, adds lazy loading to resource elements (`img`, `video`, etc.) to improve page load performance. Defaults to `false`.\n- `externalLinkIcon`: Adds an icon next to external links when `true` (default) to visually distinguishing them from internal links.\n- `disableBrokenWikilinks`: If `true`, internal links whose resolved slug is not present in the site (i.e. no matching file under `markdownLinkResolution`) gain an additional `broken` CSS class alongside `internal`, so they can be styled distinctly. Defaults to `false`. Applies to both wikilinks and regular Markdown links, since both are indistinguishable `<a>` elements by the time this plugin runs.\n\n> [!warning]\n> Removing this plugin is _not_ recommended and will likely break the page.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.CrawlLinks()`.\n- Source: [`quartz-community/crawl-links`](https://github.com/quartz-community/crawl-links)\n- Install: `npx quartz plugin add github:quartz-community/crawl-links`\n","frontmatter":{"title":"CrawlLinks","description":"Parses and resolves internal links. Removing it is not recommended.","tags":["plugin/transformer"],"repository":"[quartz-community/crawl-links](https://github.com/quartz-community/crawl-links)","enabled":true,"required":true},"isInternal":false,"tokens":591,"sizeBytes":2361},{"name":"CreatedModifiedDate.md","path":"docs/plugins/CreatedModifiedDate.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/CreatedModifiedDate.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: CreatedModifiedDate\ndescription: Determines creation and modification dates from frontmatter, git, or filesystem.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/created-modified-date](https://github.com/quartz-community/created-modified-date)\"\nenabled: true\nrequired: false\n---\n\nThis plugin determines the created, modified, and published dates for a document using three potential data sources: frontmatter metadata, Git history, and the filesystem. See [[authoring content#Syntax]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `priority`: The data sources to consult for date information. Highest priority first. Possible values are `\"frontmatter\"`, `\"git\"`, and `\"filesystem\"`. Defaults to `[\"frontmatter\", \"git\", \"filesystem\"]`.\n- `defaultDateType`: Which date type to use when displaying dates. Can be `\"created\"`, `\"modified\"`, or `\"published\"`. Defaults to `\"modified\"`.\n\nWhen loading the frontmatter, the value of [[Frontmatter#List]] is used.\n\n> [!warning]\n> If you rely on `git` for dates, make sure `defaultDateType` is set to `modified` in the plugin's options.\n>\n> Depending on how you [[hosting|host]] your Quartz, the `filesystem` dates of your local files may not match the final dates. In these cases, it may be better to use `git` or `frontmatter` to guarantee correct dates.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.CreatedModifiedDate()`.\n- Source: [`quartz-community/created-modified-date`](https://github.com/quartz-community/created-modified-date)\n- Install: `npx quartz plugin add github:quartz-community/created-modified-date`\n","frontmatter":{"title":"CreatedModifiedDate","description":"Determines creation and modification dates from frontmatter, git, or filesystem.","tags":["plugin/transformer"],"repository":"[quartz-community/created-modified-date](https://github.com/quartz-community/created-modified-date)","enabled":true,"required":false},"isInternal":false,"tokens":444,"sizeBytes":1773},{"name":"CustomOgImages.md","path":"docs/plugins/CustomOgImages.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/CustomOgImages.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Custom OG Images\ndescription: Generates Open Graph social preview images.\ntags:\n  - feature/emitter\nimage: \"[[social-image-preview-dark.png]]\"\nrepository: \"[quartz-community/og-image](https://github.com/quartz-community/og-image)\"\nenabled: true\nrequired: false\n---\n\nThe Custom OG Images emitter plugin generates social media preview images for your pages. It uses [satori](https://github.com/vercel/satori) to convert HTML/CSS into images, allowing you to create beautiful and consistent social media preview cards for your content.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Features\n\n- Automatically generates social media preview images for each page\n- Supports both light and dark mode themes\n- Customizable through frontmatter properties\n- Fallback to default image when needed\n- Full control over image design through custom components\n\n## Configuration\n\n> [!info] Info\n>\n> The `baseUrl` property in your [[configuration]] must be set properly for social images to work correctly, as they require absolute paths.\n\nThis plugin accepts the following configuration options:\n\n```yaml title=\"quartz.config.yaml\"\nplugins:\n  - source: github:quartz-community/og-image\n    enabled: true\n    options:\n      colorScheme: lightMode # \"lightMode\" or \"darkMode\"\n      width: 1200\n      height: 630\n      excludeRoot: false\n```\n\nFor the TS override approach (needed for custom `imageStructure`):\n\n```ts title=\"quartz.ts (override)\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\nimport { defaultImage } from \"./quartz/plugins/emitters/ogImage\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.CustomOgImages({\n  colorScheme: \"lightMode\",\n  width: 1200,\n  height: 630,\n  excludeRoot: false,\n  imageStructure: defaultImage,\n})\n```\n\n### Configuration Options\n\n| Option               | Type      | Default                   | Description                                                       |\n| -------------------- | --------- | ------------------------- | ----------------------------------------------------------------- |\n| `colorScheme`        | string    | \"lightMode\"               | Theme to use for generating images (\"darkMode\" or \"lightMode\")    |\n| `width`              | number    | 1200                      | Width of the generated image in pixels                            |\n| `height`             | number    | 630                       | Height of the generated image in pixels                           |\n| `excludeRoot`        | boolean   | false                     | Whether to exclude the root index page from auto-generated images |\n| `defaultTitle`       | string    | \"Untitled\"                | Fallback title when a page has no title                           |\n| `defaultDescription` | string    | \"No description provided\" | Fallback description when a page has no description               |\n| `imageStructure`     | component | defaultImage              | Custom component to use for image generation                      |\n\n## Frontmatter Properties\n\nThe following properties can be used to customize your link previews:\n\n| Property            | Alias            | Summary                             |\n| ------------------- | ---------------- | ----------------------------------- |\n| `socialDescription` | `description`    | Description to be used for preview. |\n| `socialImage`       | `image`, `cover` | Link to preview image.              |\n\nThe `socialImage` property should contain a link to an image either relative to `quartz/static`, or a full URL. If you have a folder for all your images in `quartz/static/my-images`, an example for `socialImage` could be `\"my-images/cover.png\"`. Alternatively, you can use a fully qualified URL like `\"https://example.com/cover.png\"`.\n\n> [!info] Info\n>\n> The priority for what image will be used for the cover image looks like the following: `frontmatter property > generated image (if enabled) > default image`.\n>\n> The default image (`quartz/static/og-image.png`) will only be used as a fallback if nothing else is set. If the Custom OG Images emitter plugin is enabled, it will be treated as the new default per page, but can be overwritten by setting the `socialImage` frontmatter property for that page.\n\n## Customization\n\nYou can fully customize how the images being generated look by passing your own component to `imageStructure`. This component takes JSX + some page metadata/config options and converts it to an image using [satori](https://github.com/vercel/satori). Vercel provides an [online playground](https://og-playground.vercel.app/) that can be used to preview how your JSX looks like as a picture. This is ideal for prototyping your custom design.\n\n### Fonts\n\nYou will also be passed an array containing a header and a body font (where the first entry is header and the second is body). The fonts matches the ones selected in `theme.typography.header` and `theme.typography.body` from `quartz.config.yaml` and will be passed in the format required by [`satori`](https://github.com/vercel/satori). To use them in CSS, use the `.name` property (e.g. `fontFamily: fonts[1].name` to use the \"body\" font family).\n\nAn example of a component using the header font could look like this:\n\n```tsx title=\"socialImage.tsx\"\nexport const myImage: SocialImageOptions[\"imageStructure\"] = (...) => {\n  return <p style={{ fontFamily: fonts[0].name }}>Cool Header!</p>\n}\n```\n\n> [!example]- Local fonts\n>\n> For cases where you use a local fonts under `static` folder, make sure to set the correct `@font-face` in `custom.scss`\n>\n> ```scss title=\"custom.scss\"\n> @font-face {\n>   font-family: \"Newsreader\";\n>   font-style: normal;\n>   font-weight: normal;\n>   font-display: swap;\n>   src: url(\"/static/Newsreader.woff2\") format(\"woff2\");\n> }\n> ```\n>\n> Then in `quartz/util/og.tsx`, you can load the Satori fonts like so:\n>\n> ```tsx title=\"quartz/util/og.tsx\"\n> import { joinSegments, QUARTZ } from \"../path\"\n> import fs from \"fs\"\n> import path from \"path\"\n>\n> const newsreaderFontPath = joinSegments(QUARTZ, \"static\", \"Newsreader.woff2\")\n> export async function getSatoriFonts(headerFont: FontSpecification, bodyFont: FontSpecification) {\n>   // ... rest of implementation remains same\n>   const fonts: SatoriOptions[\"fonts\"] = [\n>     ...headerFontData.map((data, idx) => ({\n>       name: headerFontName,\n>       data,\n>       weight: headerWeights[idx],\n>       style: \"normal\" as const,\n>     })),\n>     ...bodyFontData.map((data, idx) => ({\n>       name: bodyFontName,\n>       data,\n>       weight: bodyWeights[idx],\n>       style: \"normal\" as const,\n>     })),\n>     {\n>       name: \"Newsreader\",\n>       data: await fs.promises.readFile(path.resolve(newsreaderFontPath)),\n>       weight: 400,\n>       style: \"normal\" as const,\n>     },\n>   ]\n>\n>   return fonts\n> }\n> ```\n>\n> This font then can be used with your custom structure.\n\n## Examples\n\nHere are some example image components you can use as a starting point:\n\n### Basic Example\n\nThis example will generate images that look as follows:\n\n| Light                                      | Dark                                      |\n| ------------------------------------------ | ----------------------------------------- |\n| ![[custom-social-image-preview-light.png]] | ![[custom-social-image-preview-dark.png]] |\n\n```tsx\nimport { SatoriOptions } from \"satori/wasm\"\nimport { GlobalConfiguration } from \"../cfg\"\nimport { SocialImageOptions, UserOpts } from \"./imageHelper\"\nimport { QuartzPluginData } from \"../plugins/vfile\"\n\nexport const customImage: SocialImageOptions[\"imageStructure\"] = (\n  cfg: GlobalConfiguration,\n  userOpts: UserOpts,\n  title: string,\n  description: string,\n  fonts: SatoriOptions[\"fonts\"],\n  fileData: QuartzPluginData,\n) => {\n  // How many characters are allowed before switching to smaller font\n  const fontBreakPoint = 22\n  const useSmallerFont = title.length > fontBreakPoint\n\n  const { colorScheme } = userOpts\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        flexDirection: \"row\",\n        justifyContent: \"flex-start\",\n        alignItems: \"center\",\n        height: \"100%\",\n        width: \"100%\",\n      }}\n    >\n      <div\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          height: \"100%\",\n          width: \"100%\",\n          backgroundColor: cfg.theme.colors[colorScheme].light,\n          flexDirection: \"column\",\n          gap: \"2.5rem\",\n          paddingTop: \"2rem\",\n          paddingBottom: \"2rem\",\n        }}\n      >\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].dark,\n            fontSize: useSmallerFont ? 70 : 82,\n            marginLeft: \"4rem\",\n            textAlign: \"center\",\n            marginRight: \"4rem\",\n            fontFamily: fonts[0].name,\n          }}\n        >\n          {title}\n        </p>\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].dark,\n            fontSize: 44,\n            marginLeft: \"8rem\",\n            marginRight: \"8rem\",\n            lineClamp: 3,\n            fontFamily: fonts[1].name,\n          }}\n        >\n          {description}\n        </p>\n      </div>\n      <div\n        style={{\n          height: \"100%\",\n          width: \"2vw\",\n          position: \"absolute\",\n          backgroundColor: cfg.theme.colors[colorScheme].tertiary,\n          opacity: 0.85,\n        }}\n      />\n    </div>\n  )\n}\n```\n\n### Advanced Example\n\nThe following example includes a customized social image with a custom background and formatted date:\n\n```typescript title=\"custom-og.tsx\"\nexport const og: SocialImageOptions[\"Component\"] = (\n  cfg: GlobalConfiguration,\n  fileData: QuartzPluginData,\n  { colorScheme }: Options,\n  title: string,\n  description: string,\n  fonts: SatoriOptions[\"fonts\"],\n) => {\n  let created: string | undefined\n  let reading: string | undefined\n  if (fileData.dates) {\n    created = formatDate(getDate(cfg, fileData)!, cfg.locale)\n  }\n  const { minutes, text: _timeTaken, words: _words } = readingTime(fileData.text!)\n  reading = i18n(cfg.locale).components.contentMeta.readingTime({\n    minutes: Math.ceil(minutes),\n  })\n\n  const Li = [created, reading]\n\n  return (\n    <div\n      style={{\n        position: \"relative\",\n        display: \"flex\",\n        flexDirection: \"row\",\n        alignItems: \"flex-start\",\n        height: \"100%\",\n        width: \"100%\",\n        backgroundImage: `url(\"https://${cfg.baseUrl}/static/og-image.jpeg\")`,\n        backgroundSize: \"100% 100%\",\n      }}\n    >\n      <div\n        style={{\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n          background: \"radial-gradient(circle at center, transparent, rgba(0, 0, 0, 0.4) 70%)\",\n        }}\n      />\n      <div\n        style={{\n          display: \"flex\",\n          height: \"100%\",\n          width: \"100%\",\n          flexDirection: \"column\",\n          justifyContent: \"flex-start\",\n          alignItems: \"flex-start\",\n          gap: \"1.5rem\",\n          paddingTop: \"4rem\",\n          paddingBottom: \"4rem\",\n          marginLeft: \"4rem\",\n        }}\n      >\n        <img\n          src={`\"https://${cfg.baseUrl}/static/icon.jpeg\"`}\n          style={{\n            position: \"relative\",\n            backgroundClip: \"border-box\",\n            borderRadius: \"6rem\",\n          }}\n          width={80}\n        />\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            textAlign: \"left\",\n            fontFamily: fonts[0].name,\n          }}\n        >\n          <h2\n            style={{\n              color: cfg.theme.colors[colorScheme].light,\n              fontSize: \"3rem\",\n              fontWeight: 700,\n              marginRight: \"4rem\",\n              fontFamily: fonts[0].name,\n            }}\n          >\n            {title}\n          </h2>\n          <ul\n            style={{\n              color: cfg.theme.colors[colorScheme].gray,\n              gap: \"1rem\",\n              fontSize: \"1.5rem\",\n              fontFamily: fonts[1].name,\n            }}\n          >\n            {Li.map((item, index) => {\n              if (item) {\n                return <li key={index}>{item}</li>\n              }\n            })}\n          </ul>\n        </div>\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].light,\n            fontSize: \"1.5rem\",\n            overflow: \"hidden\",\n            marginRight: \"8rem\",\n            textOverflow: \"ellipsis\",\n            display: \"-webkit-box\",\n            WebkitLineClamp: 7,\n            WebkitBoxOrient: \"vertical\",\n            lineClamp: 7,\n            fontFamily: fonts[1].name,\n          }}\n        >\n          {description}\n        </p>\n      </div>\n    </div>\n  )\n}\n```\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.CustomOgImages()`.\n- Source: [`quartz-community/og-image`](https://github.com/quartz-community/og-image)\n- Install: `npx quartz plugin add github:quartz-community/og-image`\n","frontmatter":{"title":"Custom OG Images","description":"Generates Open Graph social preview images.","tags":["feature/emitter"],"image":"[[social-image-preview-dark.png]]","repository":"[quartz-community/og-image](https://github.com/quartz-community/og-image)","enabled":true,"required":false},"isInternal":false,"tokens":3255,"sizeBytes":13020},{"name":"Darkmode.md","path":"docs/plugins/Darkmode.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Darkmode.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Darkmode\ndescription: Toggle between light and dark themes.\ntags:\n  - plugin/component\nimage: \"#0052cc\"\nrepository: \"[quartz-community/darkmode](https://github.com/quartz-community/darkmode)\"\nenabled: true\nrequired: false\n---\n\nDark mode toggle.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Darkmode]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enabled`: Whether to enable the dark mode toggle. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/darkmode\n  enabled: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Darkmode()`.\n- Source: [`quartz-community/darkmode`](https://github.com/quartz-community/darkmode)\n- Install: `npx quartz plugin add github:quartz-community/darkmode`\n","frontmatter":{"title":"Darkmode","description":"Toggle between light and dark themes.","tags":["plugin/component"],"image":"#0052cc","repository":"[quartz-community/darkmode](https://github.com/quartz-community/darkmode)","enabled":true,"required":false},"isInternal":false,"tokens":236,"sizeBytes":942},{"name":"Description.md","path":"docs/plugins/Description.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Description.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Description\ndescription: Generates page descriptions for metadata and previews.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/description](https://github.com/quartz-community/description)\"\nenabled: true\nrequired: false\n---\n\nThis plugin generates descriptions that are used as metadata for the HTML `head`, the [[RSS Feed]] and in [[folder and tag listings]] if there is no main body content, the description is used as the text between the title and the listing.\n\nIf the frontmatter contains a `description` property, it is used (see [[authoring content#Syntax]]). Otherwise, the plugin will do its best to use the first few sentences of the content to reach the target description length.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `descriptionLength`: the target length of the generated description. Default is 150 characters. The cut off happens after the first _sentence_ that ends after the given length.\n- `maxDescriptionLength`: the hard maximum length of the description. If the generated description exceeds this, it is truncated with an ellipsis. Default is 300 characters.\n- `replaceExternalLinks`: If `true` (default), replace external links with their domain and path in the description (e.g. `https://domain.tld/some_page/another_page?query=hello&target=world` is replaced with `domain.tld/some_page/another_page`).\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Description()`.\n- Source: [`quartz-community/description`](https://github.com/quartz-community/description)\n- Install: `npx quartz plugin add github:quartz-community/description`\n","frontmatter":{"title":"Description","description":"Generates page descriptions for metadata and previews.","tags":["plugin/transformer"],"repository":"[quartz-community/description](https://github.com/quartz-community/description)","enabled":true,"required":false},"isInternal":false,"tokens":438,"sizeBytes":1752},{"name":"EncryptedPages Demo.md","path":"docs/plugins/EncryptedPages Demo.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/EncryptedPages Demo.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Encrypted Pages Demo\npassword: quartz\nunlisted: true\ntags:\n  - plugin/transformer\nimage:\n---\n\nCongratulations! You've successfully decrypted this page. 🎉\n\nThis is a live demo of the [[EncryptedPages]] plugin. The content you're reading was encrypted at build time using AES-256-GCM and decrypted in your browser using the Web Crypto API. This page is also `unlisted: true`, which means it was hidden from every discovery surface on the site until you entered the password.\n\n## What just happened?\n\n1. At build time, the plugin read the `password` field from this page's frontmatter and encrypted all content below the title.\n2. Because this page is `unlisted: true`, the plugin emitted its metadata (slug, title, links, tags) to a separate `static/encryptedContentIndex.json` file, encrypted with this page's own password.\n3. When you visited this page, you were shown a password prompt instead of the content. The page was absent from the sidebar graph, explorer, search, RSS, sitemap, backlinks, tag listings, and bases views.\n4. After entering the correct password, the plugin derived an encryption key using PBKDF2 and decrypted the content client-side.\n5. The plugin then used the cached password to unlock this page's entry in the shadow content index and patched the in-memory content index in place. A `content-index-updated` event was dispatched, so graph, explorer, and search re-initialized with the newly unlocked entry — if you navigate back to any other page now, you will see this page in the sidebar, the graph, and search results. Server-side rendered listings (backlinks, recent notes, tag pages, folder listings, and [[BasesPage|bases views]]) were baked into HTML at build time and will not update within this session; they will only reflect decrypted pages on a fresh build of the site.\n\n## Password caching\n\nYour password has been cached in session storage. If there were other encrypted pages on this site with the same password, the plugin would automatically try this password on each one — unlocking its content as well as its entry in the shadow content index — so you'd only need to enter it once per session.\n\n## Try it yourself\n\nTo add encrypted pages to your own Quartz site, install the plugin and add a `password` field to any page's frontmatter. See [[EncryptedPages]] for full setup instructions.\n","frontmatter":{"title":"Encrypted Pages Demo","password":"quartz","unlisted":true,"tags":["plugin/transformer"]},"isInternal":false,"tokens":586,"sizeBytes":2352},{"name":"EncryptedPages.md","path":"docs/plugins/EncryptedPages.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/EncryptedPages.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: EncryptedPages\ndescription: Password-protected encrypted pages with shadow content index.\ntags:\n  - plugin/transformer\n  - plugin/emitter\nimage: \"#FF1493\"\nnew-in-v5: true\nrepository: \"[quartz-community/encrypted-pages](https://github.com/quartz-community/encrypted-pages)\"\nenabled: true\nrequired: false\n---\n\nPassword-protected encrypted pages. Encrypts page content at build time using AES-256-GCM and decrypts client-side with the Web Crypto API. Passwords are set per-page via frontmatter. A companion emitter writes an encrypted shadow content index so unlisted encrypted pages can be dynamically revealed in graph, explorer, and search after a successful decryption — without ever leaking their metadata to visitors who do not hold the password.\n\n> [!example] Live demo\n> Try it yourself: [[EncryptedPages Demo]]. The password is `quartz`.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nAdd a `password` field to any page's frontmatter to encrypt it:\n\n```yaml\n---\ntitle: My Secret Page\npassword: mysecretpassword\n---\n```\n\nThe page content will be encrypted at build time. Visitors must enter the correct password to view the content.\n\nSuccessful passwords are cached in the browser's session storage and automatically tried on other encrypted pages for convenience.\n\n### Hiding encrypted pages from discovery surfaces\n\nBy default, encrypted pages still appear in the graph, explorer, search, RSS, sitemap, and backlinks — visitors can see the page exists and its title, but cannot read the content without the password.\n\nTo hide an encrypted page entirely until a visitor successfully decrypts it, set `unlisted: true` in its frontmatter:\n\n```yaml\n---\ntitle: My Secret Page\npassword: mysecretpassword\nunlisted: true\n---\n```\n\nAn unlisted page:\n\n- Is **absent** from `contentIndex.json`, `sitemap.xml`, the RSS feed, backlinks, recent notes, folder listings, tag listings, bases views, graph, explorer, and search.\n- Is still emitted as HTML, so it remains accessible by direct URL.\n- Has its metadata (slug, title, links, tags) written to a separate `static/encryptedContentIndex.json` file, encrypted with the page's own password.\n- Is dynamically re-added to the in-memory content index when a visitor successfully decrypts it, so graph, explorer, and search reflect it for the rest of the browser session. Server-rendered listings — backlinks, recent notes, tag pages, folder listings, and [[BasesPage|bases views]] — remain statically hidden even after decryption because they are baked as HTML at build time.\n\nTo make this the default for every encrypted page on your site, set `unlistWhenEncrypted: true` in the plugin options. Individual pages can then opt back in with `unlisted: false`.\n\n> [!note]\n> The `unlisted: true` frontmatter field above only takes effect for encrypted pages when this plugin is installed. If you also want `unlisted: true` to work on **non-encrypted** pages across your site, install [[UnlistedPages]] alongside this one. The two plugins compose cleanly — when both are enabled, `unlisted: true` hides any page, encrypted or not, from every discovery surface that respects the `file.data.unlisted` convention.\n\n### Permanently hiding encrypted pages (`stealth`)\n\nBy default, an `unlisted: true` encrypted page is _revealed_ in graph, explorer, and search after a visitor successfully decrypts it. This is usually what you want: the user just proved they know the password, so showing them the page in the sidebar makes sense for the rest of their session.\n\nIf you instead want a page that stays permanently invisible — accessible only by direct URL, even to users who have successfully decrypted other pages on the same site — set `stealth: true` in its frontmatter:\n\n```yaml\n---\ntitle: Deep Secret\npassword: mysecretpassword\nstealth: true\n---\n```\n\nA stealth page:\n\n- Is **absent** from every discovery surface, same as any `unlisted` page.\n- Has **no entry** in the shadow content index (`encryptedContentIndex.json`). The plugin deliberately skips stealth pages when building the shadow index.\n- Stays hidden even after the visitor enters the correct password. Since there is no shadow-index entry to decrypt, there is nothing to patch into the in-memory content index — graph, explorer, and search never learn the page exists. Only the decrypted HTML is visible to the user on the page itself.\n- The password is still cached in session storage, so re-visiting the same stealth page will auto-unlock it.\n\n`stealth: true` implies `unlisted: true` — you do not need to set both, and if you write `stealth: true, unlisted: false` the stealth flag wins. On non-encrypted pages `stealth: true` has no effect (there is no shadow index to skip).\n\nUse stealth pages for \"secret door\" content that should only reach users who already know the exact URL: private notes linked from an external wiki, personal pages you send to specific people, or anything you never want to show up in a site-internal search even to authenticated readers.\n\n## Configuration\n\nThis plugin provides a transformer, an emitter, and a component. All options are set on a single config entry and shared between the transformer and the emitter — Quartz instantiates both automatically.\n\n- `iterations`: PBKDF2 iteration count for key derivation. Higher values are more secure but slower to unlock. Defaults to `600000`.\n- `passwordField`: Frontmatter field name that holds the page password. Shared by the transformer and the emitter. Defaults to `\"password\"`.\n- `unlistWhenEncrypted`: If `true`, every encrypted page is marked `unlisted` unless its frontmatter explicitly overrides it. Defaults to `false`.\n- `outputPath`: Output path for the shadow content index, relative to Quartz's output directory. Defaults to `\"static/encryptedContentIndex.json\"`.\n\n### Component options\n\n- `className`: CSS class for the component wrapper. Defaults to `\"encrypted-page-wrapper\"`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/encrypted-pages\n  enabled: true\n  options:\n    iterations: 600000\n    passwordField: password\n    unlistWhenEncrypted: false\n    outputPath: static/encryptedContentIndex.json\n```\n\n> [!warning]\n> The `EncryptedPages` transformer replaces the entire HAST tree of an encrypted page with an opaque ciphertext container. Any transformer that needs to read the real HTML — in particular [[CrawlLinks]], which populates the links used by backlinks and the shadow content index — must run **before** `EncryptedPages`. Use the `order` field in `quartz.config.yaml` to control this.\n\n## Security\n\n- Content is encrypted with AES-256-GCM using PBKDF2 SHA-256 key derivation.\n- Plaintext is stripped from search indices, RSS feeds, and the shadow content index regardless of visibility setting.\n- The shadow content index is a flat array of opaque encrypted blobs. An attacker who downloads it learns only the number of unlisted encrypted pages and the PBKDF2 iteration count — no slugs, titles, or link relationships leak.\n- Passwords are set per-page in frontmatter. Avoid committing passwords to public repositories.\n- This is client-side encryption of a static site. It protects against casual browsing but not against determined attackers with access to the page source.\n\n## API\n\n- Category: Transformer, Emitter\n- Function name: `ExternalPlugin.EncryptedPages()`, `ExternalPlugin.EncryptedContentIndex()`.\n- Source: [`quartz-community/encrypted-pages`](https://github.com/quartz-community/encrypted-pages)\n- Install: `npx quartz plugin add github:quartz-community/encrypted-pages`\n","frontmatter":{"title":"EncryptedPages","description":"Password-protected encrypted pages with shadow content index.","tags":["plugin/transformer","plugin/emitter"],"image":"#FF1493","new-in-v5":true,"repository":"[quartz-community/encrypted-pages](https://github.com/quartz-community/encrypted-pages)","enabled":true,"required":false},"isInternal":false,"tokens":1911,"sizeBytes":7669},{"name":"ExplicitPublish.md","path":"docs/plugins/ExplicitPublish.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/ExplicitPublish.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: ExplicitPublish\ndescription: \"Only publishes pages explicitly marked with publish: true.\"\ntags:\n  - plugin/filter\nimage:\nrepository: \"[quartz-community/explicit-publish](https://github.com/quartz-community/explicit-publish)\"\nenabled: false\nrequired: false\n---\n\nThis plugin filters content based on an explicit `publish` flag in the frontmatter, allowing only content that is explicitly marked for publication to pass through. It's the opt-in version of [[RemoveDrafts]]. See [[private pages]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Filter\n- Function name: `ExternalPlugin.ExplicitPublish()`.\n- Source: [`quartz-community/explicit-publish`](https://github.com/quartz-community/explicit-publish)\n- Install: `npx quartz plugin add github:quartz-community/explicit-publish`\n","frontmatter":{"title":"ExplicitPublish","description":"Only publishes pages explicitly marked with publish: true.","tags":["plugin/filter"],"repository":"[quartz-community/explicit-publish](https://github.com/quartz-community/explicit-publish)","enabled":false,"required":false},"isInternal":false,"tokens":239,"sizeBytes":955},{"name":"Explorer.md","path":"docs/plugins/Explorer.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Explorer.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Explorer\ndescription: File tree explorer sidebar.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/explorer](https://github.com/quartz-community/explorer)\"\nenabled: true\nrequired: false\n---\n\nFile tree explorer sidebar.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Explorer]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n**YAML options** (in `quartz.config.yaml`):\n\n- `title`: The title of the explorer. Defaults to `Explorer`.\n- `folderClickBehavior`: The behavior when a folder is clicked. Can be `\"link\"` to navigate or `\"collapse\"` to toggle. Defaults to `link`.\n- `folderDefaultState`: The default state of folders. Can be `\"collapsed\"` or `\"open\"`. Defaults to `collapsed`.\n- `useSavedState`: Whether to use local storage to save the state of the explorer. Defaults to `true`.\n\n**TS override options** (in `quartz.ts`, for callback functions that can't be expressed in YAML):\n\n- `sortFn`: Custom sort function for ordering files and folders.\n- `filterFn`: Custom filter function to exclude specific nodes.\n- `mapFn`: Custom map function to transform node properties (e.g. display names).\n- `order`: Array controlling the order of operations. Defaults to `[\"filter\", \"map\", \"sort\"]`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/explorer\n  enabled: true\n  options:\n    title: Explorer\n    folderClickBehavior: link\n    folderDefaultState: collapsed\n    useSavedState: true\n```\n\n### TS override example\n\n```ts title=\"quartz.ts\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.Explorer({\n  mapFn: (node) => {\n    node.displayName = node.displayName.toUpperCase()\n    return node\n  },\n})\n```\n\nSee [[features/explorer#Advanced customization]] for more examples.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Explorer()`.\n- Source: [`quartz-community/explorer`](https://github.com/quartz-community/explorer)\n- Install: `npx quartz plugin add github:quartz-community/explorer`\n","frontmatter":{"title":"Explorer","description":"File tree explorer sidebar.","tags":["plugin/component"],"repository":"[quartz-community/explorer](https://github.com/quartz-community/explorer)","enabled":true,"required":false},"isInternal":false,"tokens":548,"sizeBytes":2191},{"name":"Favicon.md","path":"docs/plugins/Favicon.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Favicon.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Favicon\ndescription: Emits the site favicon.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/favicon](https://github.com/quartz-community/favicon)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits a `favicon.ico` into the `public` folder. It creates the favicon from `icon.png` located in the `quartz/static` folder.\nThe plugin resizes `icon.png` to 48x48px to make it as small as possible.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.Favicon()`.\n- Source: [`quartz-community/favicon`](https://github.com/quartz-community/favicon)\n- Install: `npx quartz plugin add github:quartz-community/favicon`\n","frontmatter":{"title":"Favicon","description":"Emits the site favicon.","tags":["plugin/emitter"],"repository":"[quartz-community/favicon](https://github.com/quartz-community/favicon)","enabled":true,"required":false},"isInternal":false,"tokens":204,"sizeBytes":816},{"name":"FolderPage.md","path":"docs/plugins/FolderPage.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/FolderPage.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: FolderPage\ndescription: Generates listing pages for folders.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/folder-page](https://github.com/quartz-community/folder-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that generates index pages for folders, creating a listing page for each folder that contains multiple content files. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). See [[folder and tag listings]] for more information.\n\nExample: [[advanced/|Advanced]]\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `showFolderCount`: Whether to display the number of pages in the folder. Defaults to `true`.\n- `showSubfolders`: Whether to include pages from subfolders in the listing. Defaults to `true`.\n- `sort`: A function of type `(f1: QuartzPluginData, f2: QuartzPluginData) => number{:ts}` used to sort entries. Defaults to sorting by date and tie-breaking on lexographical order. Requires a TS override.\n- `prefixFolders`: If `true`, generated folder page titles are prefixed with \"Folder: \" (e.g. \"Folder: notes\"). Defaults to `false`.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.FolderPage()`.\n- Source: [`quartz-community/folder-page`](https://github.com/quartz-community/folder-page)\n- Install: `npx quartz plugin add github:quartz-community/folder-page`\n","frontmatter":{"title":"FolderPage","description":"Generates listing pages for folders.","tags":["plugin/pageType"],"repository":"[quartz-community/folder-page](https://github.com/quartz-community/folder-page)","enabled":true,"required":false},"isInternal":false,"tokens":382,"sizeBytes":1525},{"name":"Fonts.md","path":"docs/plugins/Fonts.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Fonts.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Fonts\ndescription: Fine-grained font control with per-heading support, Google Fonts integration, and theme font discovery.\ntags:\n  - plugin/transformer\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/fonts](https://github.com/quartz-community/fonts)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides fine-grained control over fonts in your Quartz site. It supports per-heading font families, automatic theme font discovery when used with [Quartz Themes](https://github.com/saberzero1/quartz-themes), Google Fonts integration with automatic weight and italic loading, and falls back to Obsidian's default system font stacks.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Why use Fonts?\n\nQuartz uses three CSS variables for fonts: `--headerFont`, `--bodyFont`, and `--codeFont`. Obsidian themes use a different system with per-heading variables (`--h1-font` through `--h6-font`), `--font-text`, and `--font-monospace`. These two systems don't bridge correctly, causing heading fonts to not render as themes intend.\n\nFonts solves this by:\n\n1. Bridging the Obsidian and Quartz font systems\n2. Emitting **unlayered** CSS that correctly overrides Quartz's base heading styles\n3. Providing per-heading font control that neither system offers alone\n4. Optionally loading fonts from Google Fonts with fine-grained weight and italic control\n\n## Configuration\n\nFont options accept either a CSS font-family string or an object with Google Fonts loading control:\n\n```yaml\n# String form\nbody: '\"Inter\", sans-serif'\n\n# Object form (for Google Fonts weight/italic control)\nbody:\n  name: Inter\n  weights: [400, 600, 700]\n  includeItalic: true\n```\n\nThis plugin accepts the following configuration options:\n\n| Option          | Type                | Default          | Description                                                                                                            |\n| --------------- | ------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------- |\n| `title`         | `FontSpecification` | `header` value   | Font family for the site title.                                                                                        |\n| `body`          | `FontSpecification` | Obsidian default | Font family for body text.                                                                                             |\n| `header`        | `FontSpecification` | Obsidian default | Default font family for all headings (h1-h6).                                                                          |\n| `code`          | `FontSpecification` | Obsidian default | Font family for code and monospace elements.                                                                           |\n| `interface`     | `FontSpecification` | Obsidian default | Font family for UI elements.                                                                                           |\n| `h1` – `h6`     | `FontSpecification` | `header` value   | Per-heading font family overrides.                                                                                     |\n| `useThemeFonts` | `boolean`           | `true`           | Use fonts from [Quartz Themes](https://github.com/saberzero1/quartz-themes) as defaults when it is installed.          |\n| `fontOrigin`    | `string`            | `\"googleFonts\"`  | `\"googleFonts\"` to load from Google Fonts CDN, `\"selfHosted\"` to download and serve locally, `\"local\"` for no loading. |\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    useThemeFonts: true\n    fontOrigin: googleFonts\n```\n\n### Font resolution\n\nFonts are resolved using a priority chain:\n\n```\nUser config (plugin options)\n  → Theme fonts (from Quartz Themes, if installed)\n    → Obsidian defaults (system font stacks)\n```\n\nFor individual headings:\n\n```\nh1 option → header option → theme --h1-font → theme font → Obsidian default\n```\n\nFor the site title:\n\n```\ntitle option → header option → theme font → Obsidian default\n```\n\n## Usage with Quartz Themes\n\nWhen [Quartz Themes](https://github.com/saberzero1/quartz-themes) is installed and enabled, Fonts automatically discovers the theme's font metadata and uses it as defaults. Any options you explicitly set in Fonts will override the theme fonts.\n\nFonts must run **after** Quartz Themes. This is handled automatically by plugin ordering (Quartz Themes = 10, Fonts = 60).\n\n> [!warning]\n> If Quartz Themes is enabled but hasn't run yet when Fonts executes, you'll see a warning in the console. Make sure Quartz Themes has a lower `defaultOrder` than Fonts.\n\n## Usage without Quartz Themes\n\nFonts works standalone. Without a theme, it falls back to Obsidian's default system font stacks. You can set fonts explicitly via the plugin options.\n\n## Examples\n\n```yaml title=\"quartz.config.yaml\"\n# Use theme fonts automatically (default behavior)\n- source: github:quartz-community/fonts\n  enabled: true\n\n# Override just the heading font\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    header: '\"Playfair Display\", serif'\n\n# Full control with per-heading fonts\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    body: '\"Inter\", sans-serif'\n    header: '\"Playfair Display\", serif'\n    code: '\"JetBrains Mono\", monospace'\n    h1: '\"Playfair Display\", serif'\n    h2: '\"Lora\", serif'\n\n# Load from Google Fonts automatically\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    body: Inter\n    header: Playfair Display\n    code: JetBrains Mono\n\n# Google Fonts with weight/italic control\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    body:\n      name: Inter\n      weights: [400, 600, 700]\n      includeItalic: true\n    header:\n      name: Playfair Display\n      weights: [400, 700]\n    code:\n      name: JetBrains Mono\n      weights: [400]\n\n# Custom title font (separate from header)\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    title: Abril Fatface\n    header: Playfair Display\n    body: Inter\n    code: JetBrains Mono\n\n# Self-hosted fonts (downloaded at build time, no external requests)\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: selfHosted\n    body: Inter\n    header: Playfair Display\n    code: JetBrains Mono\n\n# Ignore theme fonts entirely\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    useThemeFonts: false\n    body: '\"Inter\", sans-serif'\n```\n\n## Self-Hosted Fonts\n\nWhen `fontOrigin: selfHosted` is set, Fonts downloads fonts from Google Fonts during the build and serves them from your site's `static/fonts/` directory. This makes your site fully self-contained with no external requests to Google at runtime.\n\nAt build time, the plugin:\n\n1. Fetches the Google Fonts CSS for your configured fonts\n2. Downloads each font file (`.woff2`, `.woff`, etc.)\n3. Writes the font files to `static/fonts/` in your build output\n4. Generates a `quartz-fonts.css` file with `@font-face` rules pointing to the local files\n\n> [!note]\n> Self-hosted fonts require `baseUrl` to be set in your Quartz configuration, since font URLs in the CSS need an absolute path.\n\n```yaml title=\"quartz.config.yaml\"\nconfiguration:\n  baseUrl: \"example.com\"\n\nplugins:\n  - source: github:quartz-community/fonts\n    enabled: true\n    options:\n      fontOrigin: selfHosted\n      body: Inter\n      header: Playfair Display\n      code: JetBrains Mono\n```\n\n## Google Fonts Validation\n\nWhen `fontOrigin: googleFonts` is set and the optional [`google-font-metadata`](https://www.npmjs.com/package/google-font-metadata) package is installed, Fonts validates your font configuration at build time:\n\n- Checks that font family names exist in Google Fonts.\n- Warns if requested weights are not available for a font.\n- Warns if italic is requested but the font doesn't support it.\n\nInstall it to enable validation:\n\n```bash\nnpm install google-font-metadata\n```\n\nValidation warnings are logged to the console but do not block the build.\n\n## API\n\n- Category: Transformer, Emitter\n- Function name: `ExternalPlugin.Fonts()` (transformer), `ExternalPlugin.FontsEmitter()` (emitter).\n- Source: [`quartz-community/fonts`](https://github.com/quartz-community/fonts)\n- Install: `npx quartz plugin add github:quartz-community/fonts`\n","frontmatter":{"title":"Fonts","description":"Fine-grained font control with per-heading support, Google Fonts integration, and theme font discovery.","tags":["plugin/transformer","plugin/emitter"],"repository":"[quartz-community/fonts](https://github.com/quartz-community/fonts)","enabled":true,"required":false},"isInternal":false,"tokens":2139,"sizeBytes":8573},{"name":"Footer.md","path":"docs/plugins/Footer.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Footer.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Footer\ndescription: Page footer with configurable links.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/footer](https://github.com/quartz-community/footer)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders a footer at the bottom of the page with a \"Created with Quartz\" message and a set of configurable links.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `links`: A map of link labels to their URLs to display in the footer. Defaults to `{}`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/footer\n  enabled: true\n  options:\n    links:\n      GitHub: https://github.com/jackyzha0/quartz\n      Discord Community: https://discord.gg/cRFFHYye7t\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Footer()`.\n- Source: [`quartz-community/footer`](https://github.com/quartz-community/footer)\n- Install: `npx quartz plugin add github:quartz-community/footer`\n","frontmatter":{"title":"Footer","description":"Page footer with configurable links.","tags":["plugin/component"],"repository":"[quartz-community/footer](https://github.com/quartz-community/footer)","enabled":true,"required":false},"isInternal":false,"tokens":277,"sizeBytes":1108},{"name":"Frontmatter.md","path":"docs/plugins/Frontmatter.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Frontmatter.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Frontmatter\naliases:\n  - note-properties\n  - Note Properties\ndescription: Parses frontmatter and displays note properties in a collapsible panel.\ntags:\n  - plugin/transformer\n  - plugin/component\npublish: true\nenableToc: true\nimage:\nrepository: \"[quartz-community/note-properties](https://github.com/quartz-community/note-properties)\"\nenabled: true\nrequired: true\n---\n\nThis plugin parses the frontmatter of the page using the [gray-matter](https://github.com/jonschlinkert/gray-matter) library and optionally displays selected properties in a collapsible panel. See [[authoring content#Syntax]], [[Obsidian compatibility]] and [[OxHugo compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n> [!warning]\n> This plugin must not be removed, otherwise Quartz will break.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `delimiters`: the delimiters to use for the frontmatter. Can have one value (e.g. `\"---\"`) or separate values for opening and closing delimiters (e.g. `[\"---\", \"~~~\"]`). Defaults to `\"---\"`.\n- `language`: the language to use for parsing the frontmatter. Can be `yaml` (default) or `toml`.\n- `includeAll`: include all frontmatter properties in the properties panel. When `false`, only `includedProperties` are shown. Defaults to `false`.\n- `includedProperties`: properties to include when `includeAll` is `false`. Defaults to `[\"description\", \"tags\", \"aliases\"]`.\n- `excludedProperties`: properties to always exclude from display, even when `includeAll` is `true`. Defaults to `[]`.\n- `hidePropertiesView`: hide the visual properties panel while still processing frontmatter. Useful if you only need frontmatter parsing without the UI. Defaults to `false`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/note-properties\n  enabled: true\n  options:\n    includeAll: false\n    includedProperties:\n      - description\n      - tags\n      - aliases\n    excludedProperties: []\n    hidePropertiesView: false\n    delimiters: \"---\"\n    language: yaml\n```\n\n## Properties panel\n\nWhen enabled, this plugin renders a collapsible \"Properties\" panel before the page body. The panel displays selected frontmatter fields in a table with automatic type rendering:\n\n- **Strings** are shown as plain text. [[wikilinks]] and [markdown links](https://example.com) within strings are rendered as clickable links. Wikilink targets are slugified the same way as body-content links (e.g. `[[My Note]]` resolves to `my-note`) and matching is case-insensitive to mirror Obsidian's behavior, so `[[MyNote]]`, `[[mynote]]`, and `[[MYNOTE]]` all point to the same page.\n- **Arrays** are rendered as comma-separated lists.\n- **Booleans** are rendered as disabled checkboxes.\n- **Numbers** are rendered in a monospace font.\n- **Objects** are rendered as JSON in a code block.\n- **Tags** get special treatment: they are rendered as highlighted links that point to the corresponding tag page.\n- **Null/undefined** values are shown as an em-dash (—).\n\n### Per-note overrides\n\nYou can control the properties panel on a per-note basis using frontmatter keys:\n\n- `quartz-properties` (or `quartzProperties`): set to `true` to force-show the panel, or `false` to force-hide it, overriding the global `hidePropertiesView` setting.\n- `quartz-properties-collapse` (or `quartzPropertiesCollapse`): set to `true` to start the panel collapsed, or `false` to start it expanded, overriding the default collapse state.\n\nThese keys are automatically excluded from the visible properties table.\n\n```yaml title=\"Example frontmatter\"\n---\ntitle: My Note\nquartz-properties: true\nquartz-properties-collapse: false\n---\n```\n\n## Supported frontmatter\n\nQuartz supports the following frontmatter fields. Where multiple keys are listed, they are aliases — the first matching key is used.\n\n| Field              | Keys                                              | Description                                                                                                                                                                                                                        |\n| ------------------ | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Title              | `title`                                           | Page title. Falls back to filename if empty.                                                                                                                                                                                       |\n| Description        | `description`                                     | Page description for metadata and search.                                                                                                                                                                                          |\n| Tags               | `tags`, `tag`                                     | Categorization tags. Slugified the same way as file paths: spaces become `-`, `&` becomes `-and-`, `%` becomes `-percent`, and tags are lowercased so that `#MyTag` and `#mytag` resolve to the same tag page (matching Obsidian). |\n| Aliases            | `aliases`, `alias`                                | Alternative names for the page, used for link resolution.                                                                                                                                                                          |\n| Permalink          | `permalink`                                       | Custom URL slug. Also added to aliases.                                                                                                                                                                                            |\n| CSS classes        | `cssclasses`, `cssclass`                          | CSS classes applied to the page body.                                                                                                                                                                                              |\n| Social image       | `socialImage`, `image`, `cover`                   | Image used for social media previews.                                                                                                                                                                                              |\n| Social description | `socialDescription`                               | Description used specifically for social media previews.                                                                                                                                                                           |\n| Created date       | `created`, `date`                                 | When the note was created.                                                                                                                                                                                                         |\n| Modified date      | `modified`, `lastmod`, `updated`, `last-modified` | When the note was last modified. Falls back to `created` if unset.                                                                                                                                                                 |\n| Published date     | `published`, `publishDate`, `date`                | When the note was published.                                                                                                                                                                                                       |\n| Publish            | `publish`                                         | Whether the note should be published.                                                                                                                                                                                              |\n| Draft              | `draft`                                           | Whether the note is a draft.                                                                                                                                                                                                       |\n| Comments           | `comments`                                        | Whether comments are enabled for the note.                                                                                                                                                                                         |\n| Language           | `lang`                                            | Language code for the note.                                                                                                                                                                                                        |\n| Enable TOC         | `enableToc`                                       | Whether to show the table of contents.                                                                                                                                                                                             |\n\n## API\n\n- Category: Transformer, Component\n- Function name: `ExternalPlugin.NoteProperties()`.\n- Source: [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties)\n- Install: `npx quartz plugin add github:quartz-community/note-properties`\n","frontmatter":{"title":"Frontmatter","aliases":["note-properties","Note Properties"],"description":"Parses frontmatter and displays note properties in a collapsible panel.","tags":["plugin/transformer","plugin/component"],"publish":true,"enableToc":true,"repository":"[quartz-community/note-properties](https://github.com/quartz-community/note-properties)","enabled":true,"required":true},"isInternal":false,"tokens":2420,"sizeBytes":9683},{"name":"GitHubFlavoredMarkdown.md","path":"docs/plugins/GitHubFlavoredMarkdown.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/GitHubFlavoredMarkdown.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: GitHubFlavoredMarkdown\ndescription: GitHub Flavored Markdown support (tables, task lists, footnotes, strikethrough).\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/github-flavored-markdown](https://github.com/quartz-community/github-flavored-markdown)\"\nenabled: true\nrequired: false\n---\n\nThis plugin enhances Markdown processing to support GitHub Flavored Markdown (GFM) which adds features like autolink literals, footnotes, strikethrough, tables and tasklists.\n\nIn addition, this plugin adds optional features for typographic refinement (such as converting straight quotes to curly quotes, dashes to en-dashes/em-dashes, and ellipses) and automatic heading links as a symbol that appears next to the heading on hover.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableSmartyPants`: When true, enables typographic enhancements. Default is true.\n- `linkHeadings`: When true, automatically adds links to headings. Default is true.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.GitHubFlavoredMarkdown()`.\n- Source: [`quartz-community/github-flavored-markdown`](https://github.com/quartz-community/github-flavored-markdown)\n- Install: `npx quartz plugin add github:quartz-community/github-flavored-markdown`\n","frontmatter":{"title":"GitHubFlavoredMarkdown","description":"GitHub Flavored Markdown support (tables, task lists, footnotes, strikethrough).","tags":["plugin/transformer"],"repository":"[quartz-community/github-flavored-markdown](https://github.com/quartz-community/github-flavored-markdown)","enabled":true,"required":false},"isInternal":false,"tokens":351,"sizeBytes":1401},{"name":"Graph.md","path":"docs/plugins/Graph.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Graph.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Graph\ndescription: Interactive link graph visualization.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/graph](https://github.com/quartz-community/graph)\"\nenabled: true\nrequired: false\n---\n\nInteractive graph visualization.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[graph view]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `localGraph`: Options for the local graph view.\n- `globalGraph`: Options for the global graph view.\n\nBoth `localGraph` and `globalGraph` accept the following options:\n\n- `drag`: Enable dragging nodes. Defaults to `true`.\n- `zoom`: Enable zooming. Defaults to `true`.\n- `depth`: The depth of the graph. Defaults to `1` for local and `-1` for global.\n- `scale`: The initial scale of the graph. Defaults to `1.1` for local and `0.9` for global.\n- `repelForce`: The force that pushes nodes apart. Defaults to `0.5`.\n- `centerForce`: The force that pulls nodes to the center. Defaults to `0.3` for local and `0.2` for global.\n- `linkDistance`: The distance between linked nodes. Defaults to `30`.\n- `fontSize`: The font size of node labels. Defaults to `0.6`.\n- `opacityScale`: The scale of node opacity. Defaults to `1`.\n- `removeTags`: Tags to exclude from the graph. Defaults to `[]`.\n- `showTags`: Whether to show tags in the graph. Defaults to `true`.\n- `enableRadial`: Whether to enable radial layout. Defaults to `false` for local and `true` for global.\n- `focusOnHover`: Whether to focus on the hovered node. Defaults to `false` for local and `true` for global.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/graph\n  enabled: true\n  options:\n    localGraph:\n      drag: true\n      zoom: true\n      depth: 1\n      scale: 1.1\n      repelForce: 0.5\n      centerForce: 0.3\n      linkDistance: 30\n      fontSize: 0.6\n      opacityScale: 1\n      removeTags: []\n      showTags: true\n      focusOnHover: false\n      enableRadial: false\n    globalGraph:\n      drag: true\n      zoom: true\n      depth: -1\n      scale: 0.9\n      repelForce: 0.5\n      centerForce: 0.3\n      linkDistance: 30\n      fontSize: 0.6\n      opacityScale: 1\n      removeTags: []\n      showTags: true\n      focusOnHover: true\n      enableRadial: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Graph()`.\n- Source: [`quartz-community/graph`](https://github.com/quartz-community/graph)\n- Install: `npx quartz plugin add github:quartz-community/graph`\n","frontmatter":{"title":"Graph","description":"Interactive link graph visualization.","tags":["plugin/component"],"repository":"[quartz-community/graph](https://github.com/quartz-community/graph)","enabled":true,"required":false},"isInternal":false,"tokens":649,"sizeBytes":2594},{"name":"HardLineBreaks.md","path":"docs/plugins/HardLineBreaks.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/HardLineBreaks.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: HardLineBreaks\ndescription: Treats single newlines as hard line breaks.\ntags:\n  - plugin/transformer\nimage: \"#ff8000\"\nrepository: \"[quartz-community/hard-line-breaks](https://github.com/quartz-community/hard-line-breaks)\"\nenabled: false\nrequired: false\n---\n\nThis plugin automatically converts single line breaks in Markdown text into hard line breaks in the HTML output. This plugin is not enabled by default as this doesn't follow the semantics of actual Markdown but you may enable it if you'd like parity with [[Obsidian compatibility|Obsidian]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.HardLineBreaks()`.\n- Source: [`quartz-community/hard-line-breaks`](https://github.com/quartz-community/hard-line-breaks)\n- Install: `npx quartz plugin add github:quartz-community/hard-line-breaks`\n","frontmatter":{"title":"HardLineBreaks","description":"Treats single newlines as hard line breaks.","tags":["plugin/transformer"],"image":"#ff8000","repository":"[quartz-community/hard-line-breaks](https://github.com/quartz-community/hard-line-breaks)","enabled":false,"required":false},"isInternal":false,"tokens":249,"sizeBytes":994},{"name":"index.md","path":"docs/plugins/index.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/index.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Plugins\nimage:\n---\n\nQuartz's functionality is provided by a collection of first-party community plugins. Each plugin can be enabled, disabled, and configured via `quartz.config.yaml`. See [[configuration#Plugins|Configuration]] for details on how to manage plugins.\n\n> [!info] Internal vs Community Plugins\n> Quartz has two kinds of plugins:\n>\n> - **Community plugins** are standalone repositories under [`quartz-community`](https://github.com/quartz-community). In TS overrides, they use `ExternalPlugin.X()` (imported from `.quartz/plugins`).\n> - **Internal plugins** are built into Quartz core (Assets, Static, ComponentResources, NotFoundPage). In TS overrides, they use `Plugin.X()` (imported from `./quartz/plugins`).\n\n## Plugin types\n\nQuartz plugins fall into several categories:\n\n- **Transformers** process content during the build, e.g. parsing frontmatter, highlighting syntax, or resolving links.\n- **Filters** decide which content files to include or exclude from the output.\n- **Page Types** generate HTML pages — one per content file, folder, tag, canvas, or bases view.\n- **Components** render UI elements in the page layout (sidebars, headers, footers, etc.).\n\n## First-party plugins\n\n```base\nfilters:\n  and:\n    - file.ext == \"md\"\n    - file.inFolder(\"plugins\")\n    - \"!file.name.startsWith('index')\"\n    - \"!file.name.contains('Demo')\"\n    - \"!file.name.contains('Static')\"\n    - \"!file.name.contains('Assets')\"\n    - \"!file.name.contains('ComponentResources')\"\n    - \"!file.name.contains('NotFoundPage')\"\nformulas:\n  category: |\n    if(file.hasTag(\"plugin/transformer\"), \"Transformer\",\n    if(file.hasTag(\"plugin/filter\"), \"Filter\",\n    if(file.hasTag(\"plugin/pageType\"), \"Page Type\",\n    if(file.hasTag(\"plugin/emitter\"), \"Emitter\",\n    if(file.hasTag(\"plugin/component\"), \"Component\",\n    \"Other\")))))\nproperties:\n  title:\n    displayName: Plugin\n  repository:\n    displayName: Repository\n  enabled:\n    displayName: Enabled\n  required:\n    displayName: Required\n  description:\n    displayName: Description\nviews:\n  - type: table\n    name: All Plugins\n    groupBy:\n      property: formula.category\n      direction: ASC\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: formula.category\n        direction: ASC\n      - property: title\n        direction: ASC\n  - type: table\n    name: Transformers\n    filters:\n      and:\n        - file.hasTag(\"plugin/transformer\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Filters\n    filters:\n      and:\n        - file.hasTag(\"plugin/filter\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Page Types\n    filters:\n      and:\n        - file.hasTag(\"plugin/pageType\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Emitters\n    filters:\n      and:\n        - file.hasTag(\"plugin/emitter\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Components\n    filters:\n      and:\n        - file.hasTag(\"plugin/component\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n\n```\n\n> [!note] Multi-category plugins\n> Some plugins span multiple categories. **TableOfContents** is both a transformer and a component. **EncryptedPages** is a transformer, emitter, and component. They appear in each relevant category above.\n","frontmatter":{"title":"Plugins"},"isInternal":false,"tokens":972,"sizeBytes":3888},{"name":"Latex.md","path":"docs/plugins/Latex.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Latex.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Latex\ndescription: Renders LaTeX math expressions via KaTeX or Typst.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/latex](https://github.com/quartz-community/latex)\"\nenabled: true\nrequired: false\n---\n\nThis plugin adds LaTeX support to Quartz. See [[features/Latex|Latex]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `renderEngine`: the engine to use to render LaTeX equations. Can be `\"katex\"` for [KaTeX](https://katex.org/), `\"mathjax\"` for [MathJax](https://www.mathjax.org/) [SVG rendering](https://docs.mathjax.org/en/latest/output/svg.html), or `\"typst\"` for [Typst](https://typst.app/) (a new way to compose LaTeX equation). Defaults to KaTeX.\n- `customMacros`: custom macros for all LaTeX blocks. It takes the form of a key-value pair where the key is a new command name and the value is the expansion of the macro. For example: `{\"\\\\R\": \"\\\\mathbb{R}\"}`\n- `katexOptions`: Additional options passed to the KaTeX renderer. See the [KaTeX docs](https://katex.org/docs/options) for available options.\n- `mathJaxOptions`: Additional options passed to the MathJax renderer. See the [MathJax docs](https://docs.mathjax.org/en/latest/options/) for available options.\n- `typstOptions`: Additional options passed to the Typst renderer.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Latex()`.\n- Source: [`quartz-community/latex`](https://github.com/quartz-community/latex)\n- Install: `npx quartz plugin add github:quartz-community/latex`\n","frontmatter":{"title":"Latex","description":"Renders LaTeX math expressions via KaTeX or Typst.","tags":["plugin/transformer"],"repository":"[quartz-community/latex](https://github.com/quartz-community/latex)","enabled":true,"required":false},"isInternal":false,"tokens":414,"sizeBytes":1654},{"name":"NoteProperties.md","path":"docs/plugins/NoteProperties.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/NoteProperties.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: NoteProperties\ndescription: Displays frontmatter properties in a collapsible panel.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/note-properties](https://github.com/quartz-community/note-properties)\"\nenabled: true\nrequired: true\n---\n\nThe NoteProperties plugin is documented under [[Frontmatter]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.NoteProperties()`.\n- Source: [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties)\n- Install: `npx quartz plugin add github:quartz-community/note-properties`\n","frontmatter":{"title":"NoteProperties","description":"Displays frontmatter properties in a collapsible panel.","tags":["plugin/component"],"new-in-v5":true,"repository":"[quartz-community/note-properties](https://github.com/quartz-community/note-properties)","enabled":true,"required":true},"isInternal":false,"tokens":183,"sizeBytes":729},{"name":"NotFoundPage.md","path":"docs/plugins/NotFoundPage.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/NotFoundPage.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: NotFoundPage\ntags:\n  - plugin/pageType\nimage:\n---\n\nThis plugin emits a 404 (Not Found) page for broken or non-existent URLs. It uses the `minimal` [[layout#Page Frames|page frame]] (no sidebars, no header or beforeBody chrome — only content and footer) to present a clean error page.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Page Type\n- Function name: `Plugin.NotFoundPage()` (internal plugin).\n- Source: [`quartz/plugins/pageTypes/404.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/pageTypes/404.ts)\n","frontmatter":{"title":"NotFoundPage","tags":["plugin/pageType"]},"isInternal":false,"tokens":170,"sizeBytes":681},{"name":"ObsidianFlavoredMarkdown.md","path":"docs/plugins/ObsidianFlavoredMarkdown.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/ObsidianFlavoredMarkdown.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: ObsidianFlavoredMarkdown\ndescription: Obsidian-specific Markdown extensions (wikilinks, callouts, highlights, tags, embeds).\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/obsidian-flavored-markdown](https://github.com/quartz-community/obsidian-flavored-markdown)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides support for [[Obsidian compatibility]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `comments`: If `true` (default), enables parsing of `%%` style Obsidian comment blocks.\n- `highlight`: If `true` (default), enables parsing of `==` style highlights within content.\n- `wikilinks`:If `true` (default), turns [[wikilinks]] into regular links.\n- `callouts`: If `true` (default), adds support for [[callouts|callout]] blocks for emphasizing content.\n- `mermaid`: If `true` (default), enables [[Mermaid diagrams|Mermaid diagram]] rendering within Markdown files.\n- `parseTags`: If `true` (default), parses and links tags within the content.\n- `parseBlockReferences`: If `true` (default), handles block references, linking to specific content blocks.\n- `enableInHtmlEmbed`: If `true`, allows embedding of content directly within HTML. Defaults to `false`.\n- `enableYouTubeEmbed`: If `true` (default), enables the embedding of YouTube videos and playlists using external image Markdown syntax.\n- `enableTweetEmbed`: If `true` (default), enables the embedding of tweets as static blockquotes from Twitter/X URLs.\n- `enableVideoEmbed`: If `true` (default), enables the embedding of video files.\n- `enableCheckbox`: If `true`, adds support for interactive checkboxes in content, including custom task characters (e.g. `- [?]`, `- [!]`, `- [/]`). Defaults to `false`.\n- `enableObsidianUri`: If `true` (default), marks `obsidian://` protocol links with a CSS class and data attribute for custom styling.\n\n> [!note]\n> The `disableBrokenWikilinks` option previously lived on this plugin. It has moved to [[CrawlLinks]], which owns link resolution and can honor the configured `markdownLinkResolution` strategy when deciding whether a link is broken. Users upgrading from earlier Quartz v5 betas should move the option from `ObsidianFlavoredMarkdown` to `CrawlLinks`.\n\n> [!warning]\n> Don't remove this plugin if you're using [[Obsidian compatibility|Obsidian]] to author the content!\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.ObsidianFlavoredMarkdown()`.\n- Source: [`quartz-community/obsidian-flavored-markdown`](https://github.com/quartz-community/obsidian-flavored-markdown)\n- Install: `npx quartz plugin add github:quartz-community/obsidian-flavored-markdown`\n","frontmatter":{"title":"ObsidianFlavoredMarkdown","description":"Obsidian-specific Markdown extensions (wikilinks, callouts, highlights, tags, embeds).","tags":["plugin/transformer"],"repository":"[quartz-community/obsidian-flavored-markdown](https://github.com/quartz-community/obsidian-flavored-markdown)","enabled":true,"required":false},"isInternal":false,"tokens":692,"sizeBytes":2767},{"name":"OxHugoFlavoredMarkdown.md","path":"docs/plugins/OxHugoFlavoredMarkdown.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/OxHugoFlavoredMarkdown.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: OxHugoFlavoredMarkdown\ndescription: Compatibility for ox-hugo exported Org-mode files.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/ox-hugo](https://github.com/quartz-community/ox-hugo)\"\nenabled: false\nrequired: false\n---\n\nThis plugin provides support for [ox-hugo](https://github.com/kaushalmodi/ox-hugo) compatibility. See [[OxHugo compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `wikilinks`: If `true` (default), converts Hugo `{{ relref }}` shortcodes to Quartz [[wikilinks]].\n- `removePredefinedAnchor`: If `true` (default), strips predefined anchors from headings.\n- `removeHugoShortcode`: If `true` (default), removes Hugo shortcode syntax (`{{}}`) from the content.\n- `replaceFigureWithMdImg`: If `true` (default), replaces `<figure/>` with `![]()`.\n- `replaceOrgLatex`: If `true` (default), converts Org-mode [[features/Latex|Latex]] fragments to Quartz-compatible LaTeX wrapped in `$` (for inline) and `$$` (for block equations).\n\n> [!warning]\n> While you can use this together with [[ObsidianFlavoredMarkdown]], it's not recommended because it might mutate the file in unexpected ways. Use with caution.\n>\n> If you use `toml` frontmatter, make sure to configure the [[Frontmatter]] plugin accordingly. See [[OxHugo compatibility]] for an example.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.OxHugoFlavoredMarkdown()`.\n- Source: [`quartz-community/ox-hugo`](https://github.com/quartz-community/ox-hugo)\n- Install: `npx quartz plugin add github:quartz-community/ox-hugo`\n","frontmatter":{"title":"OxHugoFlavoredMarkdown","description":"Compatibility for ox-hugo exported Org-mode files.","tags":["plugin/transformer"],"repository":"[quartz-community/ox-hugo](https://github.com/quartz-community/ox-hugo)","enabled":false,"required":false},"isInternal":false,"tokens":429,"sizeBytes":1713},{"name":"PageTitle.md","path":"docs/plugins/PageTitle.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/PageTitle.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: PageTitle\ndescription: Renders the site title as a home link.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/page-title](https://github.com/quartz-community/page-title)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders the site-wide page title (configured via the `pageTitle` field in [[configuration]]) as a clickable link to the home page. It typically appears in the left sidebar.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options. The displayed title is controlled by the `pageTitle` field in `quartz.config.yaml`.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.PageTitle()`.\n- Source: [`quartz-community/page-title`](https://github.com/quartz-community/page-title)\n- Install: `npx quartz plugin add github:quartz-community/page-title`\n","frontmatter":{"title":"PageTitle","description":"Renders the site title as a home link.","tags":["plugin/component"],"repository":"[quartz-community/page-title](https://github.com/quartz-community/page-title)","enabled":true,"required":false},"isInternal":false,"tokens":228,"sizeBytes":911},{"name":"ReaderMode.md","path":"docs/plugins/ReaderMode.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/ReaderMode.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: ReaderMode\ndescription: Distraction-free reading mode toggle.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/reader-mode](https://github.com/quartz-community/reader-mode)\"\nenabled: true\nrequired: false\n---\n\nDistraction-free reading mode.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[reader mode]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enabled`: Whether to enable reader mode. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/reader-mode\n  enabled: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ReaderMode()`.\n- Source: [`quartz-community/reader-mode`](https://github.com/quartz-community/reader-mode)\n- Install: `npx quartz plugin add github:quartz-community/reader-mode`\n","frontmatter":{"title":"ReaderMode","description":"Distraction-free reading mode toggle.","tags":["plugin/component"],"new-in-v5":true,"repository":"[quartz-community/reader-mode](https://github.com/quartz-community/reader-mode)","enabled":true,"required":false},"isInternal":false,"tokens":243,"sizeBytes":969},{"name":"RecentNotes.md","path":"docs/plugins/RecentNotes.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/RecentNotes.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: RecentNotes\ndescription: Displays a list of recently modified notes.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/recent-notes](https://github.com/quartz-community/recent-notes)\"\nenabled: false\nrequired: false\n---\n\nShows recently modified notes.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[recent notes]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `title`: The title of the recent notes section. Defaults to `Recent notes`.\n- `limit`: The maximum number of recent notes to display. Defaults to `3`.\n- `showTags`: Whether to display the tags for each note. Defaults to `true`.\n- `linkToMore`: A slug to a page that shows more notes. Defaults to `false`.\n- `hideTagPages`: Whether to hide tag index pages from the list. Defaults to `false`.\n- `hideFolderPages`: Whether to hide folder index pages from the list. Defaults to `false`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/recent-notes\n  enabled: true\n  options:\n    limit: 3\n    showTags: true\n    hideTagPages: false\n    hideFolderPages: false\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.RecentNotes()`.\n- Source: [`quartz-community/recent-notes`](https://github.com/quartz-community/recent-notes)\n- Install: `npx quartz plugin add github:quartz-community/recent-notes`\n","frontmatter":{"title":"RecentNotes","description":"Displays a list of recently modified notes.","tags":["plugin/component"],"repository":"[quartz-community/recent-notes](https://github.com/quartz-community/recent-notes)","enabled":false,"required":false},"isInternal":false,"tokens":371,"sizeBytes":1484},{"name":"RemoveDrafts.md","path":"docs/plugins/RemoveDrafts.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/RemoveDrafts.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: RemoveDrafts\ndescription: Filters out pages marked as drafts.\ntags:\n  - plugin/filter\nimage:\nrepository: \"[quartz-community/remove-draft](https://github.com/quartz-community/remove-draft)\"\nenabled: true\nrequired: false\n---\n\nThis plugin filters out content from your vault, so that only finalized content is made available. This prevents [[private pages]] from being published. By default, it filters out all pages with `draft: true` in the frontmatter and leaves all other pages intact.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Filter\n- Function name: `ExternalPlugin.RemoveDrafts()`.\n- Source: [`quartz-community/remove-draft`](https://github.com/quartz-community/remove-draft)\n- Install: `npx quartz plugin add github:quartz-community/remove-draft`\n","frontmatter":{"title":"RemoveDrafts","description":"Filters out pages marked as drafts.","tags":["plugin/filter"],"repository":"[quartz-community/remove-draft](https://github.com/quartz-community/remove-draft)","enabled":true,"required":false},"isInternal":false,"tokens":228,"sizeBytes":912},{"name":"RoamFlavoredMarkdown.md","path":"docs/plugins/RoamFlavoredMarkdown.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/RoamFlavoredMarkdown.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: RoamFlavoredMarkdown\ndescription: Compatibility for Roam Research export format.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/roam](https://github.com/quartz-community/roam)\"\nenabled: false\nrequired: false\n---\n\nThis plugin provides support for [Roam Research](https://roamresearch.com) compatibility. See [[Roam Research compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `orComponent`: If `true` (default), converts Roam `{{ or:ONE|TWO|THREE }}` shortcodes into HTML Dropdown options.\n- `TODOComponent`: If `true` (default), converts Roam `{{[[TODO]]}}` shortcodes into HTML check boxes.\n- `DONEComponent`: If `true` (default), converts Roam `{{[[DONE]]}}` shortcodes into checked HTML check boxes.\n- `videoComponent`: If `true` (default), converts Roam `{{[[video]]:URL}}` shortcodes into embeded HTML video.\n- `audioComponent`: If `true` (default), converts Roam `{{[[audio]]:URL}}` shortcodes into embeded HTML audio.\n- `pdfComponent`: If `true` (default), converts Roam `{{[[pdf]]:URL}}` shortcodes into embeded HTML PDF viewer.\n- `blockquoteComponent`: If `true` (default), converts Roam `{{[[>]]}}` shortcodes into Quartz blockquotes.\n- `tableComponent`: If `true` (default), converts Roam table syntax into HTML tables.\n- `attributeComponent`: If `true` (default), converts Roam attribute syntax into rendered attributes.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.RoamFlavoredMarkdown()`.\n- Source: [`quartz-community/roam`](https://github.com/quartz-community/roam)\n- Install: `npx quartz plugin add github:quartz-community/roam`\n","frontmatter":{"title":"RoamFlavoredMarkdown","description":"Compatibility for Roam Research export format.","tags":["plugin/transformer"],"repository":"[quartz-community/roam](https://github.com/quartz-community/roam)","enabled":false,"required":false},"isInternal":false,"tokens":443,"sizeBytes":1771},{"name":"Search.md","path":"docs/plugins/Search.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Search.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Search\ndescription: Full-text search with tag filtering and keyboard navigation.\ntags:\n  - plugin/component\nimage: https://images.unsplash.com/photo-1516382799247-87df95d790b7\nrepository: \"[quartz-community/search](https://github.com/quartz-community/search)\"\nenabled: true\nrequired: false\n---\n\nFull-text search functionality.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[full-text search]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enablePreview`: Whether to show a preview of the page content in search results. Defaults to `true`.\n- `fieldPriority`: An array specifying the priority order for search fields. Defaults to `[\"title\", \"content\", \"tags\"]`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/search\n  enabled: true\n  options:\n    enablePreview: true\n    fieldPriority:\n      - title\n      - content\n      - tags\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Search()`.\n- Source: [`quartz-community/search`](https://github.com/quartz-community/search)\n- Install: `npx quartz plugin add github:quartz-community/search`\n","frontmatter":{"title":"Search","description":"Full-text search with tag filtering and keyboard navigation.","tags":["plugin/component"],"image":"https://images.unsplash.com/photo-1516382799247-87df95d790b7","repository":"[quartz-community/search](https://github.com/quartz-community/search)","enabled":true,"required":false},"isInternal":false,"tokens":316,"sizeBytes":1263},{"name":"Spacer.md","path":"docs/plugins/Spacer.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Spacer.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Spacer\ndescription: Flexible spacer for layout groups.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/spacer](https://github.com/quartz-community/spacer)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders a flexible spacer element that pushes adjacent components apart within a layout group. It uses CSS `flex: 2 1 auto` to fill available space, making it useful for spacing out items in toolbars or sidebars (for example, separating the search bar from the darkmode toggle in the left sidebar toolbar).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Spacer()`.\n- Source: [`quartz-community/spacer`](https://github.com/quartz-community/spacer)\n- Install: `npx quartz plugin add github:quartz-community/spacer`\n","frontmatter":{"title":"Spacer","description":"Flexible spacer for layout groups.","tags":["plugin/component"],"new-in-v5":true,"repository":"[quartz-community/spacer](https://github.com/quartz-community/spacer)","enabled":true,"required":false},"isInternal":false,"tokens":237,"sizeBytes":947},{"name":"StackedPages.md","path":"docs/plugins/StackedPages.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/StackedPages.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: StackedPages\ndescription: Andy Matuschak-style stacked sliding panes.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/stacked-pages](https://github.com/quartz-community/stacked-pages)\"\nenabled: true\nrequired: false\n---\n\nAndy Matuschak-style stacked pages (sliding panes). Clicking internal links opens pages side by side in a horizontal stack, allowing you to trace your path through your notes. Each pane shows a full page and can be individually scrolled or closed.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nOnce enabled, clicking any internal link on a page opens the linked page as a new pane to the right instead of navigating away. The URL updates with a `#stacked=slug1,slug2` hash encoding your current stack, so you can share or bookmark a specific trail of pages.\n\nStacked pages are disabled on mobile by default (below 800px) since horizontal panning doesn't work well on small screens. On mobile, links navigate normally.\n\n### Interactions\n\n- **Click a link**: Opens the target page in a new pane to the right. If the maximum number of panes is reached, the leftmost pane is removed.\n- **Close a pane**: Click the × button in the pane header to remove it from the stack.\n- **Collapsed spines**: When panes overflow the viewport, earlier panes collapse to a thin vertical spine showing the page title. Click a spine to bring that pane back into focus.\n- **Browser back/forward**: The full stack state is stored in the URL hash and integrated with browser history, so back/forward navigation works as expected.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `maxTabs`: Maximum number of stacked panes visible at once. Defaults to `8`.\n- `mobileBreakpoint`: Viewport width (in pixels) below which stacked pages are disabled and links navigate normally. Defaults to `800`.\n- `showSpines`: Whether to show collapsed spine headers when panes overflow the viewport. Defaults to `true`.\n- `animateTransitions`: Whether to animate pane open/close transitions. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/stacked-pages\n  enabled: true\n  layout:\n    position: afterBody\n    priority: 50\n    display: all\n  options:\n    maxTabs: 8\n    mobileBreakpoint: 800\n    showSpines: true\n    animateTransitions: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.StackedPages()`.\n- Source: [`quartz-community/stacked-pages`](https://github.com/quartz-community/stacked-pages)\n- Install: `npx quartz plugin add github:quartz-community/stacked-pages`\n","frontmatter":{"title":"StackedPages","description":"Andy Matuschak-style stacked sliding panes.","tags":["plugin/component"],"new-in-v5":true,"repository":"[quartz-community/stacked-pages](https://github.com/quartz-community/stacked-pages)","enabled":true,"required":false},"isInternal":false,"tokens":675,"sizeBytes":2701},{"name":"Static.md","path":"docs/plugins/Static.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/Static.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: Static\ntags:\n  - plugin/emitter\nimage:\n---\n\nThis plugin emits all static resources needed by Quartz. This is used, for example, for fonts and images that need a stable position, such as banners and icons. The plugin respects the `ignorePatterns` in the global [[configuration]].\n\n> [!important]\n> This is different from [[Assets]]. The resources from the [[Static]] plugin are located under `quartz/static`, whereas [[Assets]] renders all static resources under `content` and is used for images, videos, audio, etc. that are directly referenced by your markdown content.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.Static()` (internal plugin).\n- Source: [`quartz/plugins/emitters/static.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/static.ts).\n","frontmatter":{"title":"Static","tags":["plugin/emitter"]},"isInternal":false,"tokens":241,"sizeBytes":963},{"name":"SyntaxHighlighting.md","path":"docs/plugins/SyntaxHighlighting.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/SyntaxHighlighting.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: SyntaxHighlighting\ndescription: Syntax highlighting for code blocks.\ntags:\n  - plugin/transformer\nimage: https://images.unsplash.com/photo-1580569214296-5cf2bffc5ccd\nrepository: \"[quartz-community/syntax-highlighting](https://github.com/quartz-community/syntax-highlighting)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is used to add syntax highlighting to code blocks in Quartz. See [[syntax highlighting]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `theme`: a separate id of one of the [themes bundled with Shikiji](https://shikiji.netlify.app/themes). One for light mode and one for dark mode. Defaults to `theme: { light: \"github-light\", dark: \"github-dark\" }`.\n- `keepBackground`: If set to `true`, the background of the Shikiji theme will be used. With `false` (default) the Quartz theme color for background will be used instead.\n- `clipboard`: Whether to add a copy-to-clipboard button to code blocks. Defaults to `true`.\n- `tokenClassification`: Whether to add semantic token classification CSS classes to code tokens. Defaults to `true`.\n\nIn addition, you can further override the colours in the `quartz/styles/syntax.scss` file.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.SyntaxHighlighting()`.\n- Source: [`quartz-community/syntax-highlighting`](https://github.com/quartz-community/syntax-highlighting)\n- Install: `npx quartz plugin add github:quartz-community/syntax-highlighting`\n","frontmatter":{"title":"SyntaxHighlighting","description":"Syntax highlighting for code blocks.","tags":["plugin/transformer"],"image":"https://images.unsplash.com/photo-1580569214296-5cf2bffc5ccd","repository":"[quartz-community/syntax-highlighting](https://github.com/quartz-community/syntax-highlighting)","enabled":true,"required":false},"isInternal":false,"tokens":400,"sizeBytes":1598},{"name":"TableOfContents.md","path":"docs/plugins/TableOfContents.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/TableOfContents.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: TableOfContents\ndescription: Generates and renders a table of contents from headings.\ntags:\n  - plugin/transformer\n  - plugin/component\nimage: https://images.unsplash.com/photo-1768527338896-3765921e992d\nrepository: \"[quartz-community/table-of-contents](https://github.com/quartz-community/table-of-contents)\"\nenabled: true\nrequired: false\n---\n\nThis plugin generates a table of contents (TOC) for Markdown documents. See [[table of contents]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `maxDepth`: Limits the depth of headings included in the TOC, ranging from `1` (top level headings only) to `6` (all heading levels). Default is `3`.\n- `minEntries`: The minimum number of heading entries required for the TOC to be displayed. Default is `1`.\n- `showByDefault`: If `true` (default), the TOC should be displayed by default. Can be overridden by frontmatter settings.\n- `collapseByDefault`: If `true`, the TOC will start in a collapsed state. Default is `false`.\n- `layout`: The visual layout of the TOC component. Can be `\"modern\"` or `\"legacy\"`. Default is `\"modern\"`.\n\n> [!warning]\n> This plugin needs the `Plugin.TableOfContents` component in `quartz.config.yaml` to determine where to display the TOC. Without it, nothing will be displayed. They should always be added or removed together.\n\n## API\n\n- Category: Transformer, Component\n- Function name: `ExternalPlugin.TableOfContentsTransformer()`.\n- Source: [`quartz-community/table-of-contents`](https://github.com/quartz-community/table-of-contents)\n- Install: `npx quartz plugin add github:quartz-community/table-of-contents`\n","frontmatter":{"title":"TableOfContents","description":"Generates and renders a table of contents from headings.","tags":["plugin/transformer","plugin/component"],"image":"https://images.unsplash.com/photo-1768527338896-3765921e992d","repository":"[quartz-community/table-of-contents](https://github.com/quartz-community/table-of-contents)","enabled":true,"required":false},"isInternal":false,"tokens":441,"sizeBytes":1761},{"name":"TagList.md","path":"docs/plugins/TagList.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/TagList.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: TagList\ndescription: Renders tags as clickable links.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/tag-list](https://github.com/quartz-community/tag-list)\"\nenabled: false\nrequired: false\n---\n\nThis plugin renders the page's tags as a list of clickable links. Each tag links to its corresponding [[TagPage|tag page]], making it easy for readers to browse related content by topic.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.TagList()`.\n- Source: [`quartz-community/tag-list`](https://github.com/quartz-community/tag-list)\n- Install: `npx quartz plugin add github:quartz-community/tag-list`\n","frontmatter":{"title":"TagList","description":"Renders tags as clickable links.","tags":["plugin/component"],"repository":"[quartz-community/tag-list](https://github.com/quartz-community/tag-list)","enabled":false,"required":false},"isInternal":false,"tokens":203,"sizeBytes":810},{"name":"TagPage.md","path":"docs/plugins/TagPage.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/TagPage.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: TagPage\ndescription: Generates listing pages for tags.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/tag-page](https://github.com/quartz-community/tag-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that emits dedicated pages for each tag used in the content. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). See [[folder and tag listings]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `numPages`: The maximum number of pages to display per tag before showing a \"see more\" link. Defaults to `10`.\n- `sort`: A function of type `(f1: QuartzPluginData, f2: QuartzPluginData) => number{:ts}` used to sort entries. Defaults to sorting by date and tie-breaking on lexographical order. Requires a TS override.\n- `prefixTags`: If `true`, generated tag page titles are prefixed with \"Tag: \" (e.g. \"Tag: recipes\"). Defaults to `false`.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.TagPage()`.\n- Source: [`quartz-community/tag-page`](https://github.com/quartz-community/tag-page)\n- Install: `npx quartz plugin add github:quartz-community/tag-page`\n","frontmatter":{"title":"TagPage","description":"Generates listing pages for tags.","tags":["plugin/pageType"],"repository":"[quartz-community/tag-page](https://github.com/quartz-community/tag-page)","enabled":true,"required":false},"isInternal":false,"tokens":331,"sizeBytes":1322},{"name":"UnlistedPages.md","path":"docs/plugins/UnlistedPages.md","rawUrl":"https://raw.githubusercontent.com/jackyzha0/quartz/HEAD/docs/plugins/UnlistedPages.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\ntitle: UnlistedPages\ndescription: Hides pages from navigation and indexes while still publishing them.\ntags:\n  - plugin/transformer\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/unlisted-pages](https://github.com/quartz-community/unlisted-pages)\"\nenabled: true\nrequired: false\n---\n\nZero-config transformer that makes `unlisted: true` in a page's frontmatter a first-class way to opt out of every listing surface on your site. The page is still emitted as HTML and remains accessible by direct URL, but is absent from `contentIndex.json`, RSS, sitemap, graph, explorer, search, backlinks, recent notes, folder listings, and tag listings.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nAdd an `unlisted` field to any page's frontmatter:\n\n```yaml\n---\ntitle: My Draft\nunlisted: true\n---\n```\n\nThat's it. Every Quartz v5 plugin that respects the `file.data.unlisted` convention will then hide the page.\n\n## What each plugin does\n\n| Plugin         | Behavior when `unlisted: true`                                             |\n| -------------- | -------------------------------------------------------------------------- |\n| `ContentIndex` | Page absent from `contentIndex.json`, `sitemap.xml`, and the RSS feed.     |\n| `Search`       | Page absent from search results (derived from `contentIndex.json`).        |\n| `Graph`        | Page absent from graph nodes and edges (derived from `contentIndex.json`). |\n| `Explorer`     | Page absent from the sidebar file tree (derived from `contentIndex.json`). |\n| `Backlinks`    | Page never appears as a backlink source on other pages.                    |\n| `RecentNotes`  | Page absent from the recent notes list.                                    |\n| `FolderPage`   | Page absent from folder listings and folder discovery.                     |\n| `TagPage`      | Page absent from tag discovery and tag listings.                           |\n\nIn every case, the page's HTML is still emitted and accessible by direct URL.\n\n## Configuration\n\nZero options. Just enable it.\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/unlisted-pages\n  enabled: true\n```\n\n## Interaction with [[EncryptedPages]]\n\nThe [[EncryptedPages]] plugin also sets `file.data.unlisted` when its `unlistWhenEncrypted: true` option is set or when a page has `unlisted: true` in frontmatter. The two plugins compose cleanly:\n\n- If you install only `UnlistedPages`: any page with `unlisted: true` in frontmatter is hidden from listing surfaces. Encryption is independent.\n- If you install only `EncryptedPages`: `unlisted: true` only takes effect on pages that are also encrypted (have a password). Non-encrypted pages with `unlisted: true` are silently ignored.\n- If you install both: `unlisted: true` works for every page, encrypted or not. This is the recommended setup for sites that use encrypted pages.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.UnlistedPages()`.\n- Source: [`quartz-community/unlisted-pages`](https://github.com/quartz-community/unlisted-pages)\n- Install: `npx quartz plugin add github:quartz-community/unlisted-pages`\n","frontmatter":{"title":"UnlistedPages","description":"Hides pages from navigation and indexes while still publishing them.","tags":["plugin/transformer"],"new-in-v5":true,"repository":"[quartz-community/unlisted-pages](https://github.com/quartz-community/unlisted-pages)","enabled":true,"required":false},"isInternal":false,"tokens":800,"sizeBytes":3197}],"systemPromptSnippet":"<agent_rules repository=\"jackyzha0/quartz\">\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/AliasRedirects.md) -->\n---\ntitle: AliasRedirects\ndescription: Generates redirect pages from frontmatter aliases and case-preserving URLs.\ntags:\n  - plugin/emitter\nimage: https://images.unsplash.com/photo-1601735479770-bb5de9dbe844\nrepository: \"[quartz-community/alias-redirects](https://github.com/quartz-community/alias-redirects)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits HTML redirect pages so that old URLs redirect to the canonical page. It handles two types of redirects:\n\n1. **Frontmatter aliases**: Redirect pages for aliases defined in your content's frontmatter.\n2. **Case-preserving redirects**: Automatic redirect pages for URLs that changed due to Quartz v5's lowercase slug normalization.\n\n### Frontmatter Aliases\n\nIf `foo.md` has the following frontmatter:\n\n```md title=\"foo.md\"\n---\ntitle: \"Foo\"\naliases:\n  - \"bar\"\n---\n```\n\nThe target `host.me/bar` will be permanently redirected to `host.me/foo`.\n\nThe emitter supports the following frontmatter fields:\n\n- `aliases`\n- `alias`\n\n### Case-Preserving Redirects\n\nQuartz v5 normalizes all URLs to lowercase. If you are migrating from v4 (which preserved the original casing), previously indexed URLs containing uppercase letters (e.g. `/Diary/My-Note`) would return 404 errors.\n\nWhen `enableCaseRedirects` is enabled (the default), this plugin automatically detects files whose original path differs from the lowercased slug and generates redirect pages at the original-case URL. For example, if your content directory contains `Diary/2026-01-01.md`, the plugin generates:\n\n- The canonical page at `/diary/2026-01-01` (produced by the normal build)\n- A redirect page at `/Diary/2026-01-01` (produced by this plugin)\n\nThe redirect page includes proper SEO signals:\n\n- `<meta http-equiv=\"refresh\" content=\"0; url=...\">` for an instant redirect\n- `<link rel=\"canonical\">` pointing to the lowercase URL\n- `<meta name=\"robots\" content=\"noindex\">` to prevent duplicate indexing\n\nThis preserves search engine rankings and ensures inbound links continue to work.\n\n> [!note]\n> Case-preserving redirects have no effect on case-insensitive filesystems (macOS, Windows) where the server already resolves either casing to the same file. The plugin automatically detects the filesystem type and skips redirect generation when unnecessary.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableCaseRedirects`: If `true` (default), automatically generates redirect pages for URLs that changed casing due to v5's lowercase normalization. Set to `false` to disable this behavior.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.AliasRedirects()`.\n- Source: [`quartz-community/alias-redirects`](https://github.com/quartz-community/alias-redirects)\n- Install: `npx quartz plugin add github:quartz-community/alias-redirects`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/ArticleTitle.md) -->\n---\ntitle: ArticleTitle\ndescription: Renders the article title as an h1 heading.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/article-title](https://github.com/quartz-community/article-title)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders the article title from the page's frontmatter as an `<h1>` heading at the top of the page content. It reads the `title` field from frontmatter (falling back to the filename if no title is set).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ArticleTitle()`.\n- Source: [`quartz-community/article-title`](https://github.com/quartz-community/article-title)\n- Install: `npx quartz plugin add github:quartz-community/article-title`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Assets.md) -->\n---\ntitle: Assets\ntags:\n  - plugin/emitter\nimage: https://images.unsplash.com/photo-1526304640581-d334cdbbf45e\n---\n\nThis plugin emits all non-Markdown static assets in your content folder (like images, videos, HTML, etc). The plugin respects the `ignorePatterns` in the global [[configuration]].\n\nNote that all static assets will then be accessible through its path on your generated site, i.e: `host.me/path/to/static.pdf`\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.Assets()` (internal plugin).\n- Source: [`quartz/plugins/emitters/assets.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/assets.ts).\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Backlinks.md) -->\n---\ntitle: Backlinks\ndescription: Shows pages that link to the current page.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/backlinks](https://github.com/quartz-community/backlinks)\"\nenabled: true\nrequired: false\n---\n\nShows pages that link to the current page.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Backlinks]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `hideWhenEmpty`: Hide the backlinks section if the current page has no backlinks. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/backlinks\n  enabled: true\n  options:\n    hideWhenEmpty: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Backlinks()`.\n- Source: [`quartz-community/backlinks`](https://github.com/quartz-community/backlinks)\n- Install: `npx quartz plugin add github:quartz-community/backlinks`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/BasesPage.md) -->\n---\ntitle: BasesPage\ndescription: Renders Obsidian Bases files as database-style views.\ntags:\n  - plugin/pageType\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/bases-page](https://github.com/quartz-community/bases-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides support for [Obsidian Bases](https://obsidian.md/changelog/2025-04-15-desktop-v1.8.0/) (`.base` files) in Quartz. It reads `.base` files from your vault, resolves matching notes based on the query definition, and renders them as interactive database-like views with support for tables, lists, cards, and maps. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Features\n\n- **Table view**: Sortable columns with automatic type rendering (strings, numbers, booleans, arrays, links).\n- **List view**: Compact list with metadata chips for each entry.\n- **Cards view**: Card layout with optional image property support.\n- **Map view**: Placeholder for future map-based visualization.\n- **Multiple views**: A single `.base` file can define multiple views, displayed as switchable tabs.\n- **Filters**: Recursive filter trees with `and`/`or`/`not` operators.\n- **Formulas**: Computed properties via formula expressions.\n- **Summaries**: Column-level aggregations (Sum, Average, Min, Max, Median, etc.).\n- **Property configuration**: Custom display names for properties.\n- **Link rendering**: Wikilinks and Markdown links within cell values are rendered as clickable links.\n\n## Interaction with `unlisted` pages\n\n`BasesPage` respects the `file.data.unlisted` convention written by [[UnlistedPages]] and [[EncryptedPages]]. Pages marked `unlisted: true` (or encrypted pages with `stealth: true`) are excluded from every rendered base view — table, list, board, cards, gallery, and any custom view — regardless of whether the base's filter expression would match them. Unlisted pages also cannot be dereferenced from formulas on visible pages via `.asFile()`.\n\n> [!note]\n> Base views are **server-side rendered** HTML baked at build time. They do not update client-side after a visitor decrypts an encrypted page. Graph, explorer, and search all re-hydrate from the patched in-memory content index and show newly-unlocked pages for the rest of the browser session — base views do not, because they were materialized at build time with unlisted pages already excluded. A visitor who successfully decrypts a revealable encrypted page will see it appear in graph, explorer, and search, but **not** in any base view, until the site is rebuilt with that page listed. This is the same structural limitation that applies to backlinks, recent notes, folder listings, and tag listings.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `defaultViewType`: The default view type when none is specified in the `.base` file. Defaults to `\"table\"`.\n- `linkResolution`: How to resolve internal links in view renderers. Should match the `markdownLinkResolution` setting of the [[CrawlLinks]] plugin. Can be `\"absolute\"`, `\"relative\"`, or `\"shortest\"`. Defaults to `\"shortest\"`.\n- `customViews`: A map of custom view renderers. Keys are view type names. These override built-in renderers for the same type, or add new view types. Requires a TS override.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/bases-page\n  enabled: true\n```\n\nFor custom view renderers, use a TS override in `quartz.ts`:\n\n```ts title=\"quartz.ts (override)\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.BasesPage({\n  defaultViewType: \"table\",\n  customViews: {\n    myView: ({ entries, view, basesData, total, locale }) => {\n      // return JSX\n    },\n  },\n})\n```\n\n## API\n\n- Category: Page Type, Component\n- Function name: `ExternalPlugin.BasesPage()`.\n- Source: [`quartz-community/bases-page`](https://github.com/quartz-community/bases-page)\n- Install: `npx quartz plugin add github:quartz-community/bases-page`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Breadcrumbs.md) -->\n---\ntitle: Breadcrumbs\ndescription: Breadcrumb navigation trail.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/breadcrumbs](https://github.com/quartz-community/breadcrumbs)\"\nenabled: true\nrequired: false\n---\n\nNavigation breadcrumb trail.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Breadcrumbs]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `spacerSymbol`: The symbol to use between breadcrumb items. Defaults to `\"❯\"`.\n- `rootName`: The name of the root page. Defaults to `Home`.\n- `resolveFrontmatterTitle`: Whether to use the `title` frontmatter field for breadcrumb items. Defaults to `true`.\n- `showCurrentPage`: Whether to show the current page in the breadcrumb trail. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/breadcrumbs\n  enabled: true\n  options:\n    spacerSymbol: \"❯\"\n    rootName: Home\n    resolveFrontmatterTitle: true\n    showCurrentPage: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Breadcrumbs()`.\n- Source: [`quartz-community/breadcrumbs`](https://github.com/quartz-community/breadcrumbs)\n- Install: `npx quartz plugin add github:quartz-community/breadcrumbs`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/CanvasPage.md) -->\n---\ntitle: CanvasPage\ndescription: Renders JSON Canvas files as interactive, pannable pages.\ntags:\n  - plugin/pageType\nimage: \"#7852ee\"\nnew-in-v5: true\nrepository: \"[quartz-community/canvas-page](https://github.com/quartz-community/canvas-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that renders [JSON Canvas](https://jsoncanvas.org) (`.canvas`) files as interactive, pannable and zoomable canvas pages. It uses a custom `\"canvas\"` [[layout#Page Frames|page frame]] that provides a fullscreen, always-on canvas experience with a togglable left sidebar for navigation. It supports the full [JSON Canvas 1.0 spec](https://jsoncanvas.org/spec/1.0/), including text nodes with Markdown rendering, file nodes that link to other pages in your vault, link nodes for external URLs, and group nodes for visual organization. Edges between nodes are rendered as SVG paths with optional labels, arrow markers, and colors.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableInteraction`: Whether to enable pan and zoom interaction on the canvas. Default: `true{:ts}`.\n- `initialZoom`: The initial zoom level when the canvas is first displayed. Default: `1{:ts}`.\n- `minZoom`: The minimum zoom level allowed when zooming out. Default: `0.1{:ts}`.\n- `maxZoom`: The maximum zoom level allowed when zooming in. Default: `5{:ts}`.\n\n### Canvas Frame\n\nThe canvas-page plugin provides its own `\"canvas\"` page frame via the [[layout#Page Frames|Frame Registry]]. This frame:\n\n- Renders the canvas in **fullscreen mode** by default (100vw × 100vh), giving the canvas maximum screen space — leaning into the \"endless canvas\" concept of JSON Canvas.\n- Provides a **togglable left sidebar** that slides in from the left edge. This is the only layout slot available — it renders the same components as the `left` sidebar on content pages (e.g., Explorer, Search, Page Title).\n- The sidebar toggle button (hamburger/close icon) is positioned in the top-left corner.\n- Canvas controls (zoom in, zoom out, reset) are positioned on the right side.\n- On mobile, the sidebar overlays the canvas rather than pushing it aside.\n\nUsers can override this frame via `quartz.config.yaml` if needed:\n\n```yaml title=\"quartz.config.yaml\"\nlayout:\n  byPageType:\n    canvas:\n      template: default # Use standard three-column layout instead\n```\n\n### Features\n\n- **Text nodes**: Render Markdown content including headings, bold, italic, strikethrough, lists, links, and code blocks via [GFM](https://github.github.com/gfm/) support.\n- **File nodes**: Link to other pages in your vault. Supports popover previews on hover.\n- **Link nodes**: Reference external URLs.\n- **Group nodes**: Visual grouping containers with optional labels and background colors.\n- **Edges**: SVG connections between nodes with optional labels, arrow markers, and colors. Supports all four sides (top, right, bottom, left) and both preset colors (1–6) and custom hex colors.\n- **Togglable sidebar**: Hamburger button in the top-left corner toggles the left sidebar for navigation. Press `Escape` or click the close button to dismiss.\n- **Preset colors**: Six preset colors (red, orange, yellow, green, cyan, purple) plus custom hex colors (`#RRGGBB`) for nodes and edges.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.CanvasPage()`.\n- Source: [`quartz-community/canvas-page`](https://github.com/quartz-community/canvas-page)\n- Install: `npx quartz plugin add github:quartz-community/canvas-page`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Citations.md) -->\n---\ntitle: Citations\ndescription: Academic citation and bibliography support via BibTeX.\ntags:\n  - plugin/transformer\nimage: https://images.unsplash.com/photo-1582079133805-43655f026448\nrepository: \"[quartz-community/citations](https://github.com/quartz-community/citations)\"\nenabled: false\nrequired: false\n---\n\nThis plugin adds Citation support to Quartz.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `bibliographyFile`: the path to the bibliography file. Defaults to `./bibliography.bib`. This is relative to git source of your vault.\n- `suppressBibliography`: whether to suppress the bibliography at the end of the document. Defaults to `false`.\n- `linkCitations`: whether to link citations to the bibliography. Defaults to `false`.\n- `csl`: the citation style to use. Defaults to `apa`. Reference [rehype-citation](https://rehype-citation.netlify.app/custom-csl) for more options.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Citations()`.\n- Source: [`quartz-community/citations`](https://github.com/quartz-community/citations)\n- Install: `npx quartz plugin add github:quartz-community/citations`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/CNAME.md) -->\n---\ntitle: CNAME\ndescription: Emits a CNAME file for custom domain deployment.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/cname](https://github.com/quartz-community/cname)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits a `CNAME` record that points your subdomain to the default domain of your site.\n\nIf you want to use a custom domain name like `quartz.example.com` for the site, then this is needed.\n\nSee [[hosting|Hosting]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.CNAME()`.\n- Source: [`quartz-community/cname`](https://github.com/quartz-community/cname)\n- Install: `npx quartz plugin add github:quartz-community/cname`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Comments.md) -->\n---\ntitle: Comments\ndescription: Comment system integration (Giscus, Utterances, etc.).\ntags:\n  - plugin/component\nimage: \"[[giscus-results.png]]\"\nrepository: \"[quartz-community/comments](https://github.com/quartz-community/comments)\"\nenabled: false\nrequired: false\n---\n\nComment system (giscus, utterances, etc.).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Comments]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `provider`: The comment provider to use. Currently only `giscus` is supported.\n- `options`: Provider-specific options.\n  - `repo`: The GitHub repository to use for comments.\n  - `repoId`: The ID of the GitHub repository.\n  - `category`: The discussion category to use.\n  - `categoryId`: The ID of the discussion category.\n  - `lang`: The language for the comment system. Defaults to `en`.\n  - `themeUrl`: URL to a folder with custom themes.\n  - `lightTheme`: Filename for the light theme CSS file. Defaults to `light`.\n  - `darkTheme`: Filename for the dark theme CSS file. Defaults to `dark`.\n  - `mapping`: How to map pages to discussions. Defaults to `url`.\n  - `strict`: Use strict title matching. Defaults to `true`.\n  - `reactionsEnabled`: Whether to enable reactions for the main post. Defaults to `true`.\n  - `inputPosition`: Where to put the comment input box relative to the comments. Defaults to `bottom`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/comments\n  enabled: true\n  options:\n    provider: giscus\n    options:\n      repo: jackyzha0/quartz\n      repoId: MDEwOlJlcG9zaXRvcnkzODcyMTMyMDg\n      category: Announcements\n      categoryId: DIC_kwDOFxRnmM4B-Xg6\n      lang: en\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Comments()`.\n- Source: [`quartz-community/comments`](https://github.com/quartz-community/comments)\n- Install: `npx quartz plugin add github:quartz-community/comments`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/ComponentResources.md) -->\n---\ntitle: ComponentResources\ntags:\n  - plugin/emitter\nimage:\n---\n\nThis plugin manages and emits the static resources required for the Quartz framework. This includes CSS stylesheets and JavaScript scripts that enhance the functionality and aesthetics of the generated site. See also the `cdnCaching` option in the `theme` section of the [[configuration]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.ComponentResources()` (internal plugin).\n- Source: [`quartz/plugins/emitters/componentResources.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/componentResources.ts).\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/ContentIndex.md) -->\n---\ntitle: ContentIndex\ndescription: Generates sitemap, RSS feed, and content index.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/content-index](https://github.com/quartz-community/content-index)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits both RSS and an XML sitemap for your site. The [[RSS Feed]] allows users to subscribe to content on your site and the sitemap allows search engines to better index your site. The plugin also emits a `contentIndex.json` file which is used by dynamic frontend components like search and graph.\n\nThis plugin emits a comprehensive index of the site's content, generating additional resources such as a sitemap, an RSS feed, and a\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableSiteMap`: If `true` (default), generates a sitemap XML file (`sitemap.xml`) listing all site URLs for search engines in content discovery.\n- `enableRSS`: If `true` (default), produces an RSS feed (`index.xml`) with recent content updates.\n- `rssLimit`: Defines the maximum number of entries to include in the RSS feed, helping to focus on the most recent or relevant content. Defaults to `10`.\n- `rssFullHtml`: If `true`, the RSS feed includes the full rendered HTML content of each page. Defaults to `false`.\n- `rssSlug`: Slug to the generated RSS feed XML file. Defaults to `\"index\"`.\n- `includeEmptyFiles`: If `true` (default), content files with no body text are included in the generated index and resources.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.ContentIndex()`.\n- Source: [`quartz-community/content-index`](https://github.com/quartz-community/content-index)\n- Install: `npx quartz plugin add github:quartz-community/content-index`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/ContentMeta.md) -->\n---\ntitle: ContentMeta\ndescription: Displays creation date and reading time.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/content-meta](https://github.com/quartz-community/content-meta)\"\nenabled: true\nrequired: false\n---\n\nThis plugin displays content metadata below the article title, such as the creation date and estimated reading time.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `showReadingTime`: Whether to display the estimated reading time. Defaults to `true`.\n- `showComma`: Whether to display a comma between metadata items. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/content-meta\n  enabled: true\n  options:\n    showReadingTime: true\n    showComma: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ContentMeta()`.\n- Source: [`quartz-community/content-meta`](https://github.com/quartz-community/content-meta)\n- Install: `npx quartz plugin add github:quartz-community/content-meta`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/ContentPage.md) -->\n---\ntitle: ContentPage\ndescription: Generates HTML pages for Markdown content.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/content-page](https://github.com/quartz-community/content-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin for the Quartz framework. It generates the HTML pages for each piece of Markdown content. It emits the full-page [[layout]], including headers, footers, and body content, among others. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). It is now configured in the `pageTypes` section of `quartz.config.yaml`.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.ContentPage()`.\n- Source: [`quartz-community/content-page`](https://github.com/quartz-community/content-page)\n- Install: `npx quartz plugin add github:quartz-community/content-page`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/CrawlLinks.md) -->\n---\ntitle: CrawlLinks\ndescription: Parses and resolves internal links. Removing it is not recommended.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/crawl-links](https://github.com/quartz-community/crawl-links)\"\nenabled: true\nrequired: true\n---\n\nThis plugin parses links and processes them to point to the right places. It is also needed for embedded links (like images). See [[Obsidian compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `markdownLinkResolution`: Sets the strategy for resolving Markdown paths, can be `\"absolute\"` (default), `\"relative\"` or `\"shortest\"`. You should use the same setting here as in [[Obsidian compatibility|Obsidian]].\n  - `absolute`: Path relative to the root of the content folder.\n  - `relative`: Path relative to the file you are linking from.\n  - `shortest`: Name of the file. If this isn't enough to identify the file, use the full absolute path.\n- `prettyLinks`: If `true` (default), simplifies links by removing folder paths, making them more user friendly (e.g. `folder/deeply/nested/note` becomes `note`).\n- `openLinksInNewTab`: If `true`, configures external links to open in a new tab. Defaults to `false`.\n- `lazyLoad`: If `true`, adds lazy loading to resource elements (`img`, `video`, etc.) to improve page load performance. Defaults to `false`.\n- `externalLinkIcon`: Adds an icon next to external links when `true` (default) to visually distinguishing them from internal links.\n- `disableBrokenWikilinks`: If `true`, internal links whose resolved slug is not present in the site (i.e. no matching file under `markdownLinkResolution`) gain an additional `broken` CSS class alongside `internal`, so they can be styled distinctly. Defaults to `false`. Applies to both wikilinks and regular Markdown links, since both are indistinguishable `<a>` elements by the time this plugin runs.\n\n> [!warning]\n> Removing this plugin is _not_ recommended and will likely break the page.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.CrawlLinks()`.\n- Source: [`quartz-community/crawl-links`](https://github.com/quartz-community/crawl-links)\n- Install: `npx quartz plugin add github:quartz-community/crawl-links`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/CreatedModifiedDate.md) -->\n---\ntitle: CreatedModifiedDate\ndescription: Determines creation and modification dates from frontmatter, git, or filesystem.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/created-modified-date](https://github.com/quartz-community/created-modified-date)\"\nenabled: true\nrequired: false\n---\n\nThis plugin determines the created, modified, and published dates for a document using three potential data sources: frontmatter metadata, Git history, and the filesystem. See [[authoring content#Syntax]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `priority`: The data sources to consult for date information. Highest priority first. Possible values are `\"frontmatter\"`, `\"git\"`, and `\"filesystem\"`. Defaults to `[\"frontmatter\", \"git\", \"filesystem\"]`.\n- `defaultDateType`: Which date type to use when displaying dates. Can be `\"created\"`, `\"modified\"`, or `\"published\"`. Defaults to `\"modified\"`.\n\nWhen loading the frontmatter, the value of [[Frontmatter#List]] is used.\n\n> [!warning]\n> If you rely on `git` for dates, make sure `defaultDateType` is set to `modified` in the plugin's options.\n>\n> Depending on how you [[hosting|host]] your Quartz, the `filesystem` dates of your local files may not match the final dates. In these cases, it may be better to use `git` or `frontmatter` to guarantee correct dates.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.CreatedModifiedDate()`.\n- Source: [`quartz-community/created-modified-date`](https://github.com/quartz-community/created-modified-date)\n- Install: `npx quartz plugin add github:quartz-community/created-modified-date`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/CustomOgImages.md) -->\n---\ntitle: Custom OG Images\ndescription: Generates Open Graph social preview images.\ntags:\n  - feature/emitter\nimage: \"[[social-image-preview-dark.png]]\"\nrepository: \"[quartz-community/og-image](https://github.com/quartz-community/og-image)\"\nenabled: true\nrequired: false\n---\n\nThe Custom OG Images emitter plugin generates social media preview images for your pages. It uses [satori](https://github.com/vercel/satori) to convert HTML/CSS into images, allowing you to create beautiful and consistent social media preview cards for your content.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Features\n\n- Automatically generates social media preview images for each page\n- Supports both light and dark mode themes\n- Customizable through frontmatter properties\n- Fallback to default image when needed\n- Full control over image design through custom components\n\n## Configuration\n\n> [!info] Info\n>\n> The `baseUrl` property in your [[configuration]] must be set properly for social images to work correctly, as they require absolute paths.\n\nThis plugin accepts the following configuration options:\n\n```yaml title=\"quartz.config.yaml\"\nplugins:\n  - source: github:quartz-community/og-image\n    enabled: true\n    options:\n      colorScheme: lightMode # \"lightMode\" or \"darkMode\"\n      width: 1200\n      height: 630\n      excludeRoot: false\n```\n\nFor the TS override approach (needed for custom `imageStructure`):\n\n```ts title=\"quartz.ts (override)\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\nimport { defaultImage } from \"./quartz/plugins/emitters/ogImage\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.CustomOgImages({\n  colorScheme: \"lightMode\",\n  width: 1200,\n  height: 630,\n  excludeRoot: false,\n  imageStructure: defaultImage,\n})\n```\n\n### Configuration Options\n\n| Option               | Type      | Default                   | Description                                                       |\n| -------------------- | --------- | ------------------------- | ----------------------------------------------------------------- |\n| `colorScheme`        | string    | \"lightMode\"               | Theme to use for generating images (\"darkMode\" or \"lightMode\")    |\n| `width`              | number    | 1200                      | Width of the generated image in pixels                            |\n| `height`             | number    | 630                       | Height of the generated image in pixels                           |\n| `excludeRoot`        | boolean   | false                     | Whether to exclude the root index page from auto-generated images |\n| `defaultTitle`       | string    | \"Untitled\"                | Fallback title when a page has no title                           |\n| `defaultDescription` | string    | \"No description provided\" | Fallback description when a page has no description               |\n| `imageStructure`     | component | defaultImage              | Custom component to use for image generation                      |\n\n## Frontmatter Properties\n\nThe following properties can be used to customize your link previews:\n\n| Property            | Alias            | Summary                             |\n| ------------------- | ---------------- | ----------------------------------- |\n| `socialDescription` | `description`    | Description to be used for preview. |\n| `socialImage`       | `image`, `cover` | Link to preview image.              |\n\nThe `socialImage` property should contain a link to an image either relative to `quartz/static`, or a full URL. If you have a folder for all your images in `quartz/static/my-images`, an example for `socialImage` could be `\"my-images/cover.png\"`. Alternatively, you can use a fully qualified URL like `\"https://example.com/cover.png\"`.\n\n> [!info] Info\n>\n> The priority for what image will be used for the cover image looks like the following: `frontmatter property > generated image (if enabled) > default image`.\n>\n> The default image (`quartz/static/og-image.png`) will only be used as a fallback if nothing else is set. If the Custom OG Images emitter plugin is enabled, it will be treated as the new default per page, but can be overwritten by setting the `socialImage` frontmatter property for that page.\n\n## Customization\n\nYou can fully customize how the images being generated look by passing your own component to `imageStructure`. This component takes JSX + some page metadata/config options and converts it to an image using [satori](https://github.com/vercel/satori). Vercel provides an [online playground](https://og-playground.vercel.app/) that can be used to preview how your JSX looks like as a picture. This is ideal for prototyping your custom design.\n\n### Fonts\n\nYou will also be passed an array containing a header and a body font (where the first entry is header and the second is body). The fonts matches the ones selected in `theme.typography.header` and `theme.typography.body` from `quartz.config.yaml` and will be passed in the format required by [`satori`](https://github.com/vercel/satori). To use them in CSS, use the `.name` property (e.g. `fontFamily: fonts[1].name` to use the \"body\" font family).\n\nAn example of a component using the header font could look like this:\n\n```tsx title=\"socialImage.tsx\"\nexport const myImage: SocialImageOptions[\"imageStructure\"] = (...) => {\n  return <p style={{ fontFamily: fonts[0].name }}>Cool Header!</p>\n}\n```\n\n> [!example]- Local fonts\n>\n> For cases where you use a local fonts under `static` folder, make sure to set the correct `@font-face` in `custom.scss`\n>\n> ```scss title=\"custom.scss\"\n> @font-face {\n>   font-family: \"Newsreader\";\n>   font-style: normal;\n>   font-weight: normal;\n>   font-display: swap;\n>   src: url(\"/static/Newsreader.woff2\") format(\"woff2\");\n> }\n> ```\n>\n> Then in `quartz/util/og.tsx`, you can load the Satori fonts like so:\n>\n> ```tsx title=\"quartz/util/og.tsx\"\n> import { joinSegments, QUARTZ } from \"../path\"\n> import fs from \"fs\"\n> import path from \"path\"\n>\n> const newsreaderFontPath = joinSegments(QUARTZ, \"static\", \"Newsreader.woff2\")\n> export async function getSatoriFonts(headerFont: FontSpecification, bodyFont: FontSpecification) {\n>   // ... rest of implementation remains same\n>   const fonts: SatoriOptions[\"fonts\"] = [\n>     ...headerFontData.map((data, idx) => ({\n>       name: headerFontName,\n>       data,\n>       weight: headerWeights[idx],\n>       style: \"normal\" as const,\n>     })),\n>     ...bodyFontData.map((data, idx) => ({\n>       name: bodyFontName,\n>       data,\n>       weight: bodyWeights[idx],\n>       style: \"normal\" as const,\n>     })),\n>     {\n>       name: \"Newsreader\",\n>       data: await fs.promises.readFile(path.resolve(newsreaderFontPath)),\n>       weight: 400,\n>       style: \"normal\" as const,\n>     },\n>   ]\n>\n>   return fonts\n> }\n> ```\n>\n> This font then can be used with your custom structure.\n\n## Examples\n\nHere are some example image components you can use as a starting point:\n\n### Basic Example\n\nThis example will generate images that look as follows:\n\n| Light                                      | Dark                                      |\n| ------------------------------------------ | ----------------------------------------- |\n| ![[custom-social-image-preview-light.png]] | ![[custom-social-image-preview-dark.png]] |\n\n```tsx\nimport { SatoriOptions } from \"satori/wasm\"\nimport { GlobalConfiguration } from \"../cfg\"\nimport { SocialImageOptions, UserOpts } from \"./imageHelper\"\nimport { QuartzPluginData } from \"../plugins/vfile\"\n\nexport const customImage: SocialImageOptions[\"imageStructure\"] = (\n  cfg: GlobalConfiguration,\n  userOpts: UserOpts,\n  title: string,\n  description: string,\n  fonts: SatoriOptions[\"fonts\"],\n  fileData: QuartzPluginData,\n) => {\n  // How many characters are allowed before switching to smaller font\n  const fontBreakPoint = 22\n  const useSmallerFont = title.length > fontBreakPoint\n\n  const { colorScheme } = userOpts\n  return (\n    <div\n      style={{\n        display: \"flex\",\n        flexDirection: \"row\",\n        justifyContent: \"flex-start\",\n        alignItems: \"center\",\n        height: \"100%\",\n        width: \"100%\",\n      }}\n    >\n      <div\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          height: \"100%\",\n          width: \"100%\",\n          backgroundColor: cfg.theme.colors[colorScheme].light,\n          flexDirection: \"column\",\n          gap: \"2.5rem\",\n          paddingTop: \"2rem\",\n          paddingBottom: \"2rem\",\n        }}\n      >\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].dark,\n            fontSize: useSmallerFont ? 70 : 82,\n            marginLeft: \"4rem\",\n            textAlign: \"center\",\n            marginRight: \"4rem\",\n            fontFamily: fonts[0].name,\n          }}\n        >\n          {title}\n        </p>\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].dark,\n            fontSize: 44,\n            marginLeft: \"8rem\",\n            marginRight: \"8rem\",\n            lineClamp: 3,\n            fontFamily: fonts[1].name,\n          }}\n        >\n          {description}\n        </p>\n      </div>\n      <div\n        style={{\n          height: \"100%\",\n          width: \"2vw\",\n          position: \"absolute\",\n          backgroundColor: cfg.theme.colors[colorScheme].tertiary,\n          opacity: 0.85,\n        }}\n      />\n    </div>\n  )\n}\n```\n\n### Advanced Example\n\nThe following example includes a customized social image with a custom background and formatted date:\n\n```typescript title=\"custom-og.tsx\"\nexport const og: SocialImageOptions[\"Component\"] = (\n  cfg: GlobalConfiguration,\n  fileData: QuartzPluginData,\n  { colorScheme }: Options,\n  title: string,\n  description: string,\n  fonts: SatoriOptions[\"fonts\"],\n) => {\n  let created: string | undefined\n  let reading: string | undefined\n  if (fileData.dates) {\n    created = formatDate(getDate(cfg, fileData)!, cfg.locale)\n  }\n  const { minutes, text: _timeTaken, words: _words } = readingTime(fileData.text!)\n  reading = i18n(cfg.locale).components.contentMeta.readingTime({\n    minutes: Math.ceil(minutes),\n  })\n\n  const Li = [created, reading]\n\n  return (\n    <div\n      style={{\n        position: \"relative\",\n        display: \"flex\",\n        flexDirection: \"row\",\n        alignItems: \"flex-start\",\n        height: \"100%\",\n        width: \"100%\",\n        backgroundImage: `url(\"https://${cfg.baseUrl}/static/og-image.jpeg\")`,\n        backgroundSize: \"100% 100%\",\n      }}\n    >\n      <div\n        style={{\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n          background: \"radial-gradient(circle at center, transparent, rgba(0, 0, 0, 0.4) 70%)\",\n        }}\n      />\n      <div\n        style={{\n          display: \"flex\",\n          height: \"100%\",\n          width: \"100%\",\n          flexDirection: \"column\",\n          justifyContent: \"flex-start\",\n          alignItems: \"flex-start\",\n          gap: \"1.5rem\",\n          paddingTop: \"4rem\",\n          paddingBottom: \"4rem\",\n          marginLeft: \"4rem\",\n        }}\n      >\n        <img\n          src={`\"https://${cfg.baseUrl}/static/icon.jpeg\"`}\n          style={{\n            position: \"relative\",\n            backgroundClip: \"border-box\",\n            borderRadius: \"6rem\",\n          }}\n          width={80}\n        />\n        <div\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            textAlign: \"left\",\n            fontFamily: fonts[0].name,\n          }}\n        >\n          <h2\n            style={{\n              color: cfg.theme.colors[colorScheme].light,\n              fontSize: \"3rem\",\n              fontWeight: 700,\n              marginRight: \"4rem\",\n              fontFamily: fonts[0].name,\n            }}\n          >\n            {title}\n          </h2>\n          <ul\n            style={{\n              color: cfg.theme.colors[colorScheme].gray,\n              gap: \"1rem\",\n              fontSize: \"1.5rem\",\n              fontFamily: fonts[1].name,\n            }}\n          >\n            {Li.map((item, index) => {\n              if (item) {\n                return <li key={index}>{item}</li>\n              }\n            })}\n          </ul>\n        </div>\n        <p\n          style={{\n            color: cfg.theme.colors[colorScheme].light,\n            fontSize: \"1.5rem\",\n            overflow: \"hidden\",\n            marginRight: \"8rem\",\n            textOverflow: \"ellipsis\",\n            display: \"-webkit-box\",\n            WebkitLineClamp: 7,\n            WebkitBoxOrient: \"vertical\",\n            lineClamp: 7,\n            fontFamily: fonts[1].name,\n          }}\n        >\n          {description}\n        </p>\n      </div>\n    </div>\n  )\n}\n```\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.CustomOgImages()`.\n- Source: [`quartz-community/og-image`](https://github.com/quartz-community/og-image)\n- Install: `npx quartz plugin add github:quartz-community/og-image`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Darkmode.md) -->\n---\ntitle: Darkmode\ndescription: Toggle between light and dark themes.\ntags:\n  - plugin/component\nimage: \"#0052cc\"\nrepository: \"[quartz-community/darkmode](https://github.com/quartz-community/darkmode)\"\nenabled: true\nrequired: false\n---\n\nDark mode toggle.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Darkmode]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enabled`: Whether to enable the dark mode toggle. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/darkmode\n  enabled: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Darkmode()`.\n- Source: [`quartz-community/darkmode`](https://github.com/quartz-community/darkmode)\n- Install: `npx quartz plugin add github:quartz-community/darkmode`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Description.md) -->\n---\ntitle: Description\ndescription: Generates page descriptions for metadata and previews.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/description](https://github.com/quartz-community/description)\"\nenabled: true\nrequired: false\n---\n\nThis plugin generates descriptions that are used as metadata for the HTML `head`, the [[RSS Feed]] and in [[folder and tag listings]] if there is no main body content, the description is used as the text between the title and the listing.\n\nIf the frontmatter contains a `description` property, it is used (see [[authoring content#Syntax]]). Otherwise, the plugin will do its best to use the first few sentences of the content to reach the target description length.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `descriptionLength`: the target length of the generated description. Default is 150 characters. The cut off happens after the first _sentence_ that ends after the given length.\n- `maxDescriptionLength`: the hard maximum length of the description. If the generated description exceeds this, it is truncated with an ellipsis. Default is 300 characters.\n- `replaceExternalLinks`: If `true` (default), replace external links with their domain and path in the description (e.g. `https://domain.tld/some_page/another_page?query=hello&target=world` is replaced with `domain.tld/some_page/another_page`).\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Description()`.\n- Source: [`quartz-community/description`](https://github.com/quartz-community/description)\n- Install: `npx quartz plugin add github:quartz-community/description`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/EncryptedPages Demo.md) -->\n---\ntitle: Encrypted Pages Demo\npassword: quartz\nunlisted: true\ntags:\n  - plugin/transformer\nimage:\n---\n\nCongratulations! You've successfully decrypted this page. 🎉\n\nThis is a live demo of the [[EncryptedPages]] plugin. The content you're reading was encrypted at build time using AES-256-GCM and decrypted in your browser using the Web Crypto API. This page is also `unlisted: true`, which means it was hidden from every discovery surface on the site until you entered the password.\n\n## What just happened?\n\n1. At build time, the plugin read the `password` field from this page's frontmatter and encrypted all content below the title.\n2. Because this page is `unlisted: true`, the plugin emitted its metadata (slug, title, links, tags) to a separate `static/encryptedContentIndex.json` file, encrypted with this page's own password.\n3. When you visited this page, you were shown a password prompt instead of the content. The page was absent from the sidebar graph, explorer, search, RSS, sitemap, backlinks, tag listings, and bases views.\n4. After entering the correct password, the plugin derived an encryption key using PBKDF2 and decrypted the content client-side.\n5. The plugin then used the cached password to unlock this page's entry in the shadow content index and patched the in-memory content index in place. A `content-index-updated` event was dispatched, so graph, explorer, and search re-initialized with the newly unlocked entry — if you navigate back to any other page now, you will see this page in the sidebar, the graph, and search results. Server-side rendered listings (backlinks, recent notes, tag pages, folder listings, and [[BasesPage|bases views]]) were baked into HTML at build time and will not update within this session; they will only reflect decrypted pages on a fresh build of the site.\n\n## Password caching\n\nYour password has been cached in session storage. If there were other encrypted pages on this site with the same password, the plugin would automatically try this password on each one — unlocking its content as well as its entry in the shadow content index — so you'd only need to enter it once per session.\n\n## Try it yourself\n\nTo add encrypted pages to your own Quartz site, install the plugin and add a `password` field to any page's frontmatter. See [[EncryptedPages]] for full setup instructions.\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/EncryptedPages.md) -->\n---\ntitle: EncryptedPages\ndescription: Password-protected encrypted pages with shadow content index.\ntags:\n  - plugin/transformer\n  - plugin/emitter\nimage: \"#FF1493\"\nnew-in-v5: true\nrepository: \"[quartz-community/encrypted-pages](https://github.com/quartz-community/encrypted-pages)\"\nenabled: true\nrequired: false\n---\n\nPassword-protected encrypted pages. Encrypts page content at build time using AES-256-GCM and decrypts client-side with the Web Crypto API. Passwords are set per-page via frontmatter. A companion emitter writes an encrypted shadow content index so unlisted encrypted pages can be dynamically revealed in graph, explorer, and search after a successful decryption — without ever leaking their metadata to visitors who do not hold the password.\n\n> [!example] Live demo\n> Try it yourself: [[EncryptedPages Demo]]. The password is `quartz`.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nAdd a `password` field to any page's frontmatter to encrypt it:\n\n```yaml\n---\ntitle: My Secret Page\npassword: mysecretpassword\n---\n```\n\nThe page content will be encrypted at build time. Visitors must enter the correct password to view the content.\n\nSuccessful passwords are cached in the browser's session storage and automatically tried on other encrypted pages for convenience.\n\n### Hiding encrypted pages from discovery surfaces\n\nBy default, encrypted pages still appear in the graph, explorer, search, RSS, sitemap, and backlinks — visitors can see the page exists and its title, but cannot read the content without the password.\n\nTo hide an encrypted page entirely until a visitor successfully decrypts it, set `unlisted: true` in its frontmatter:\n\n```yaml\n---\ntitle: My Secret Page\npassword: mysecretpassword\nunlisted: true\n---\n```\n\nAn unlisted page:\n\n- Is **absent** from `contentIndex.json`, `sitemap.xml`, the RSS feed, backlinks, recent notes, folder listings, tag listings, bases views, graph, explorer, and search.\n- Is still emitted as HTML, so it remains accessible by direct URL.\n- Has its metadata (slug, title, links, tags) written to a separate `static/encryptedContentIndex.json` file, encrypted with the page's own password.\n- Is dynamically re-added to the in-memory content index when a visitor successfully decrypts it, so graph, explorer, and search reflect it for the rest of the browser session. Server-rendered listings — backlinks, recent notes, tag pages, folder listings, and [[BasesPage|bases views]] — remain statically hidden even after decryption because they are baked as HTML at build time.\n\nTo make this the default for every encrypted page on your site, set `unlistWhenEncrypted: true` in the plugin options. Individual pages can then opt back in with `unlisted: false`.\n\n> [!note]\n> The `unlisted: true` frontmatter field above only takes effect for encrypted pages when this plugin is installed. If you also want `unlisted: true` to work on **non-encrypted** pages across your site, install [[UnlistedPages]] alongside this one. The two plugins compose cleanly — when both are enabled, `unlisted: true` hides any page, encrypted or not, from every discovery surface that respects the `file.data.unlisted` convention.\n\n### Permanently hiding encrypted pages (`stealth`)\n\nBy default, an `unlisted: true` encrypted page is _revealed_ in graph, explorer, and search after a visitor successfully decrypts it. This is usually what you want: the user just proved they know the password, so showing them the page in the sidebar makes sense for the rest of their session.\n\nIf you instead want a page that stays permanently invisible — accessible only by direct URL, even to users who have successfully decrypted other pages on the same site — set `stealth: true` in its frontmatter:\n\n```yaml\n---\ntitle: Deep Secret\npassword: mysecretpassword\nstealth: true\n---\n```\n\nA stealth page:\n\n- Is **absent** from every discovery surface, same as any `unlisted` page.\n- Has **no entry** in the shadow content index (`encryptedContentIndex.json`). The plugin deliberately skips stealth pages when building the shadow index.\n- Stays hidden even after the visitor enters the correct password. Since there is no shadow-index entry to decrypt, there is nothing to patch into the in-memory content index — graph, explorer, and search never learn the page exists. Only the decrypted HTML is visible to the user on the page itself.\n- The password is still cached in session storage, so re-visiting the same stealth page will auto-unlock it.\n\n`stealth: true` implies `unlisted: true` — you do not need to set both, and if you write `stealth: true, unlisted: false` the stealth flag wins. On non-encrypted pages `stealth: true` has no effect (there is no shadow index to skip).\n\nUse stealth pages for \"secret door\" content that should only reach users who already know the exact URL: private notes linked from an external wiki, personal pages you send to specific people, or anything you never want to show up in a site-internal search even to authenticated readers.\n\n## Configuration\n\nThis plugin provides a transformer, an emitter, and a component. All options are set on a single config entry and shared between the transformer and the emitter — Quartz instantiates both automatically.\n\n- `iterations`: PBKDF2 iteration count for key derivation. Higher values are more secure but slower to unlock. Defaults to `600000`.\n- `passwordField`: Frontmatter field name that holds the page password. Shared by the transformer and the emitter. Defaults to `\"password\"`.\n- `unlistWhenEncrypted`: If `true`, every encrypted page is marked `unlisted` unless its frontmatter explicitly overrides it. Defaults to `false`.\n- `outputPath`: Output path for the shadow content index, relative to Quartz's output directory. Defaults to `\"static/encryptedContentIndex.json\"`.\n\n### Component options\n\n- `className`: CSS class for the component wrapper. Defaults to `\"encrypted-page-wrapper\"`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/encrypted-pages\n  enabled: true\n  options:\n    iterations: 600000\n    passwordField: password\n    unlistWhenEncrypted: false\n    outputPath: static/encryptedContentIndex.json\n```\n\n> [!warning]\n> The `EncryptedPages` transformer replaces the entire HAST tree of an encrypted page with an opaque ciphertext container. Any transformer that needs to read the real HTML — in particular [[CrawlLinks]], which populates the links used by backlinks and the shadow content index — must run **before** `EncryptedPages`. Use the `order` field in `quartz.config.yaml` to control this.\n\n## Security\n\n- Content is encrypted with AES-256-GCM using PBKDF2 SHA-256 key derivation.\n- Plaintext is stripped from search indices, RSS feeds, and the shadow content index regardless of visibility setting.\n- The shadow content index is a flat array of opaque encrypted blobs. An attacker who downloads it learns only the number of unlisted encrypted pages and the PBKDF2 iteration count — no slugs, titles, or link relationships leak.\n- Passwords are set per-page in frontmatter. Avoid committing passwords to public repositories.\n- This is client-side encryption of a static site. It protects against casual browsing but not against determined attackers with access to the page source.\n\n## API\n\n- Category: Transformer, Emitter\n- Function name: `ExternalPlugin.EncryptedPages()`, `ExternalPlugin.EncryptedContentIndex()`.\n- Source: [`quartz-community/encrypted-pages`](https://github.com/quartz-community/encrypted-pages)\n- Install: `npx quartz plugin add github:quartz-community/encrypted-pages`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/ExplicitPublish.md) -->\n---\ntitle: ExplicitPublish\ndescription: \"Only publishes pages explicitly marked with publish: true.\"\ntags:\n  - plugin/filter\nimage:\nrepository: \"[quartz-community/explicit-publish](https://github.com/quartz-community/explicit-publish)\"\nenabled: false\nrequired: false\n---\n\nThis plugin filters content based on an explicit `publish` flag in the frontmatter, allowing only content that is explicitly marked for publication to pass through. It's the opt-in version of [[RemoveDrafts]]. See [[private pages]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Filter\n- Function name: `ExternalPlugin.ExplicitPublish()`.\n- Source: [`quartz-community/explicit-publish`](https://github.com/quartz-community/explicit-publish)\n- Install: `npx quartz plugin add github:quartz-community/explicit-publish`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Explorer.md) -->\n---\ntitle: Explorer\ndescription: File tree explorer sidebar.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/explorer](https://github.com/quartz-community/explorer)\"\nenabled: true\nrequired: false\n---\n\nFile tree explorer sidebar.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[plugins/Explorer]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n**YAML options** (in `quartz.config.yaml`):\n\n- `title`: The title of the explorer. Defaults to `Explorer`.\n- `folderClickBehavior`: The behavior when a folder is clicked. Can be `\"link\"` to navigate or `\"collapse\"` to toggle. Defaults to `link`.\n- `folderDefaultState`: The default state of folders. Can be `\"collapsed\"` or `\"open\"`. Defaults to `collapsed`.\n- `useSavedState`: Whether to use local storage to save the state of the explorer. Defaults to `true`.\n\n**TS override options** (in `quartz.ts`, for callback functions that can't be expressed in YAML):\n\n- `sortFn`: Custom sort function for ordering files and folders.\n- `filterFn`: Custom filter function to exclude specific nodes.\n- `mapFn`: Custom map function to transform node properties (e.g. display names).\n- `order`: Array controlling the order of operations. Defaults to `[\"filter\", \"map\", \"sort\"]`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/explorer\n  enabled: true\n  options:\n    title: Explorer\n    folderClickBehavior: link\n    folderDefaultState: collapsed\n    useSavedState: true\n```\n\n### TS override example\n\n```ts title=\"quartz.ts\"\nimport * as ExternalPlugin from \"./.quartz/plugins\"\n\n// Must be placed before loadQuartzConfig()\nExternalPlugin.Explorer({\n  mapFn: (node) => {\n    node.displayName = node.displayName.toUpperCase()\n    return node\n  },\n})\n```\n\nSee [[features/explorer#Advanced customization]] for more examples.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Explorer()`.\n- Source: [`quartz-community/explorer`](https://github.com/quartz-community/explorer)\n- Install: `npx quartz plugin add github:quartz-community/explorer`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Favicon.md) -->\n---\ntitle: Favicon\ndescription: Emits the site favicon.\ntags:\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/favicon](https://github.com/quartz-community/favicon)\"\nenabled: true\nrequired: false\n---\n\nThis plugin emits a `favicon.ico` into the `public` folder. It creates the favicon from `icon.png` located in the `quartz/static` folder.\nThe plugin resizes `icon.png` to 48x48px to make it as small as possible.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `ExternalPlugin.Favicon()`.\n- Source: [`quartz-community/favicon`](https://github.com/quartz-community/favicon)\n- Install: `npx quartz plugin add github:quartz-community/favicon`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/FolderPage.md) -->\n---\ntitle: FolderPage\ndescription: Generates listing pages for folders.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/folder-page](https://github.com/quartz-community/folder-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that generates index pages for folders, creating a listing page for each folder that contains multiple content files. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). See [[folder and tag listings]] for more information.\n\nExample: [[advanced/|Advanced]]\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `showFolderCount`: Whether to display the number of pages in the folder. Defaults to `true`.\n- `showSubfolders`: Whether to include pages from subfolders in the listing. Defaults to `true`.\n- `sort`: A function of type `(f1: QuartzPluginData, f2: QuartzPluginData) => number{:ts}` used to sort entries. Defaults to sorting by date and tie-breaking on lexographical order. Requires a TS override.\n- `prefixFolders`: If `true`, generated folder page titles are prefixed with \"Folder: \" (e.g. \"Folder: notes\"). Defaults to `false`.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.FolderPage()`.\n- Source: [`quartz-community/folder-page`](https://github.com/quartz-community/folder-page)\n- Install: `npx quartz plugin add github:quartz-community/folder-page`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Fonts.md) -->\n---\ntitle: Fonts\ndescription: Fine-grained font control with per-heading support, Google Fonts integration, and theme font discovery.\ntags:\n  - plugin/transformer\n  - plugin/emitter\nimage:\nrepository: \"[quartz-community/fonts](https://github.com/quartz-community/fonts)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides fine-grained control over fonts in your Quartz site. It supports per-heading font families, automatic theme font discovery when used with [Quartz Themes](https://github.com/saberzero1/quartz-themes), Google Fonts integration with automatic weight and italic loading, and falls back to Obsidian's default system font stacks.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Why use Fonts?\n\nQuartz uses three CSS variables for fonts: `--headerFont`, `--bodyFont`, and `--codeFont`. Obsidian themes use a different system with per-heading variables (`--h1-font` through `--h6-font`), `--font-text`, and `--font-monospace`. These two systems don't bridge correctly, causing heading fonts to not render as themes intend.\n\nFonts solves this by:\n\n1. Bridging the Obsidian and Quartz font systems\n2. Emitting **unlayered** CSS that correctly overrides Quartz's base heading styles\n3. Providing per-heading font control that neither system offers alone\n4. Optionally loading fonts from Google Fonts with fine-grained weight and italic control\n\n## Configuration\n\nFont options accept either a CSS font-family string or an object with Google Fonts loading control:\n\n```yaml\n# String form\nbody: '\"Inter\", sans-serif'\n\n# Object form (for Google Fonts weight/italic control)\nbody:\n  name: Inter\n  weights: [400, 600, 700]\n  includeItalic: true\n```\n\nThis plugin accepts the following configuration options:\n\n| Option          | Type                | Default          | Description                                                                                                            |\n| --------------- | ------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------- |\n| `title`         | `FontSpecification` | `header` value   | Font family for the site title.                                                                                        |\n| `body`          | `FontSpecification` | Obsidian default | Font family for body text.                                                                                             |\n| `header`        | `FontSpecification` | Obsidian default | Default font family for all headings (h1-h6).                                                                          |\n| `code`          | `FontSpecification` | Obsidian default | Font family for code and monospace elements.                                                                           |\n| `interface`     | `FontSpecification` | Obsidian default | Font family for UI elements.                                                                                           |\n| `h1` – `h6`     | `FontSpecification` | `header` value   | Per-heading font family overrides.                                                                                     |\n| `useThemeFonts` | `boolean`           | `true`           | Use fonts from [Quartz Themes](https://github.com/saberzero1/quartz-themes) as defaults when it is installed.          |\n| `fontOrigin`    | `string`            | `\"googleFonts\"`  | `\"googleFonts\"` to load from Google Fonts CDN, `\"selfHosted\"` to download and serve locally, `\"local\"` for no loading. |\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    useThemeFonts: true\n    fontOrigin: googleFonts\n```\n\n### Font resolution\n\nFonts are resolved using a priority chain:\n\n```\nUser config (plugin options)\n  → Theme fonts (from Quartz Themes, if installed)\n    → Obsidian defaults (system font stacks)\n```\n\nFor individual headings:\n\n```\nh1 option → header option → theme --h1-font → theme font → Obsidian default\n```\n\nFor the site title:\n\n```\ntitle option → header option → theme font → Obsidian default\n```\n\n## Usage with Quartz Themes\n\nWhen [Quartz Themes](https://github.com/saberzero1/quartz-themes) is installed and enabled, Fonts automatically discovers the theme's font metadata and uses it as defaults. Any options you explicitly set in Fonts will override the theme fonts.\n\nFonts must run **after** Quartz Themes. This is handled automatically by plugin ordering (Quartz Themes = 10, Fonts = 60).\n\n> [!warning]\n> If Quartz Themes is enabled but hasn't run yet when Fonts executes, you'll see a warning in the console. Make sure Quartz Themes has a lower `defaultOrder` than Fonts.\n\n## Usage without Quartz Themes\n\nFonts works standalone. Without a theme, it falls back to Obsidian's default system font stacks. You can set fonts explicitly via the plugin options.\n\n## Examples\n\n```yaml title=\"quartz.config.yaml\"\n# Use theme fonts automatically (default behavior)\n- source: github:quartz-community/fonts\n  enabled: true\n\n# Override just the heading font\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    header: '\"Playfair Display\", serif'\n\n# Full control with per-heading fonts\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    body: '\"Inter\", sans-serif'\n    header: '\"Playfair Display\", serif'\n    code: '\"JetBrains Mono\", monospace'\n    h1: '\"Playfair Display\", serif'\n    h2: '\"Lora\", serif'\n\n# Load from Google Fonts automatically\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    body: Inter\n    header: Playfair Display\n    code: JetBrains Mono\n\n# Google Fonts with weight/italic control\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    body:\n      name: Inter\n      weights: [400, 600, 700]\n      includeItalic: true\n    header:\n      name: Playfair Display\n      weights: [400, 700]\n    code:\n      name: JetBrains Mono\n      weights: [400]\n\n# Custom title font (separate from header)\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: googleFonts\n    title: Abril Fatface\n    header: Playfair Display\n    body: Inter\n    code: JetBrains Mono\n\n# Self-hosted fonts (downloaded at build time, no external requests)\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    fontOrigin: selfHosted\n    body: Inter\n    header: Playfair Display\n    code: JetBrains Mono\n\n# Ignore theme fonts entirely\n- source: github:quartz-community/fonts\n  enabled: true\n  options:\n    useThemeFonts: false\n    body: '\"Inter\", sans-serif'\n```\n\n## Self-Hosted Fonts\n\nWhen `fontOrigin: selfHosted` is set, Fonts downloads fonts from Google Fonts during the build and serves them from your site's `static/fonts/` directory. This makes your site fully self-contained with no external requests to Google at runtime.\n\nAt build time, the plugin:\n\n1. Fetches the Google Fonts CSS for your configured fonts\n2. Downloads each font file (`.woff2`, `.woff`, etc.)\n3. Writes the font files to `static/fonts/` in your build output\n4. Generates a `quartz-fonts.css` file with `@font-face` rules pointing to the local files\n\n> [!note]\n> Self-hosted fonts require `baseUrl` to be set in your Quartz configuration, since font URLs in the CSS need an absolute path.\n\n```yaml title=\"quartz.config.yaml\"\nconfiguration:\n  baseUrl: \"example.com\"\n\nplugins:\n  - source: github:quartz-community/fonts\n    enabled: true\n    options:\n      fontOrigin: selfHosted\n      body: Inter\n      header: Playfair Display\n      code: JetBrains Mono\n```\n\n## Google Fonts Validation\n\nWhen `fontOrigin: googleFonts` is set and the optional [`google-font-metadata`](https://www.npmjs.com/package/google-font-metadata) package is installed, Fonts validates your font configuration at build time:\n\n- Checks that font family names exist in Google Fonts.\n- Warns if requested weights are not available for a font.\n- Warns if italic is requested but the font doesn't support it.\n\nInstall it to enable validation:\n\n```bash\nnpm install google-font-metadata\n```\n\nValidation warnings are logged to the console but do not block the build.\n\n## API\n\n- Category: Transformer, Emitter\n- Function name: `ExternalPlugin.Fonts()` (transformer), `ExternalPlugin.FontsEmitter()` (emitter).\n- Source: [`quartz-community/fonts`](https://github.com/quartz-community/fonts)\n- Install: `npx quartz plugin add github:quartz-community/fonts`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Footer.md) -->\n---\ntitle: Footer\ndescription: Page footer with configurable links.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/footer](https://github.com/quartz-community/footer)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders a footer at the bottom of the page with a \"Created with Quartz\" message and a set of configurable links.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `links`: A map of link labels to their URLs to display in the footer. Defaults to `{}`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/footer\n  enabled: true\n  options:\n    links:\n      GitHub: https://github.com/jackyzha0/quartz\n      Discord Community: https://discord.gg/cRFFHYye7t\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Footer()`.\n- Source: [`quartz-community/footer`](https://github.com/quartz-community/footer)\n- Install: `npx quartz plugin add github:quartz-community/footer`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Frontmatter.md) -->\n---\ntitle: Frontmatter\naliases:\n  - note-properties\n  - Note Properties\ndescription: Parses frontmatter and displays note properties in a collapsible panel.\ntags:\n  - plugin/transformer\n  - plugin/component\npublish: true\nenableToc: true\nimage:\nrepository: \"[quartz-community/note-properties](https://github.com/quartz-community/note-properties)\"\nenabled: true\nrequired: true\n---\n\nThis plugin parses the frontmatter of the page using the [gray-matter](https://github.com/jonschlinkert/gray-matter) library and optionally displays selected properties in a collapsible panel. See [[authoring content#Syntax]], [[Obsidian compatibility]] and [[OxHugo compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n> [!warning]\n> This plugin must not be removed, otherwise Quartz will break.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `delimiters`: the delimiters to use for the frontmatter. Can have one value (e.g. `\"---\"`) or separate values for opening and closing delimiters (e.g. `[\"---\", \"~~~\"]`). Defaults to `\"---\"`.\n- `language`: the language to use for parsing the frontmatter. Can be `yaml` (default) or `toml`.\n- `includeAll`: include all frontmatter properties in the properties panel. When `false`, only `includedProperties` are shown. Defaults to `false`.\n- `includedProperties`: properties to include when `includeAll` is `false`. Defaults to `[\"description\", \"tags\", \"aliases\"]`.\n- `excludedProperties`: properties to always exclude from display, even when `includeAll` is `true`. Defaults to `[]`.\n- `hidePropertiesView`: hide the visual properties panel while still processing frontmatter. Useful if you only need frontmatter parsing without the UI. Defaults to `false`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/note-properties\n  enabled: true\n  options:\n    includeAll: false\n    includedProperties:\n      - description\n      - tags\n      - aliases\n    excludedProperties: []\n    hidePropertiesView: false\n    delimiters: \"---\"\n    language: yaml\n```\n\n## Properties panel\n\nWhen enabled, this plugin renders a collapsible \"Properties\" panel before the page body. The panel displays selected frontmatter fields in a table with automatic type rendering:\n\n- **Strings** are shown as plain text. [[wikilinks]] and [markdown links](https://example.com) within strings are rendered as clickable links. Wikilink targets are slugified the same way as body-content links (e.g. `[[My Note]]` resolves to `my-note`) and matching is case-insensitive to mirror Obsidian's behavior, so `[[MyNote]]`, `[[mynote]]`, and `[[MYNOTE]]` all point to the same page.\n- **Arrays** are rendered as comma-separated lists.\n- **Booleans** are rendered as disabled checkboxes.\n- **Numbers** are rendered in a monospace font.\n- **Objects** are rendered as JSON in a code block.\n- **Tags** get special treatment: they are rendered as highlighted links that point to the corresponding tag page.\n- **Null/undefined** values are shown as an em-dash (—).\n\n### Per-note overrides\n\nYou can control the properties panel on a per-note basis using frontmatter keys:\n\n- `quartz-properties` (or `quartzProperties`): set to `true` to force-show the panel, or `false` to force-hide it, overriding the global `hidePropertiesView` setting.\n- `quartz-properties-collapse` (or `quartzPropertiesCollapse`): set to `true` to start the panel collapsed, or `false` to start it expanded, overriding the default collapse state.\n\nThese keys are automatically excluded from the visible properties table.\n\n```yaml title=\"Example frontmatter\"\n---\ntitle: My Note\nquartz-properties: true\nquartz-properties-collapse: false\n---\n```\n\n## Supported frontmatter\n\nQuartz supports the following frontmatter fields. Where multiple keys are listed, they are aliases — the first matching key is used.\n\n| Field              | Keys                                              | Description                                                                                                                                                                                                                        |\n| ------------------ | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Title              | `title`                                           | Page title. Falls back to filename if empty.                                                                                                                                                                                       |\n| Description        | `description`                                     | Page description for metadata and search.                                                                                                                                                                                          |\n| Tags               | `tags`, `tag`                                     | Categorization tags. Slugified the same way as file paths: spaces become `-`, `&` becomes `-and-`, `%` becomes `-percent`, and tags are lowercased so that `#MyTag` and `#mytag` resolve to the same tag page (matching Obsidian). |\n| Aliases            | `aliases`, `alias`                                | Alternative names for the page, used for link resolution.                                                                                                                                                                          |\n| Permalink          | `permalink`                                       | Custom URL slug. Also added to aliases.                                                                                                                                                                                            |\n| CSS classes        | `cssclasses`, `cssclass`                          | CSS classes applied to the page body.                                                                                                                                                                                              |\n| Social image       | `socialImage`, `image`, `cover`                   | Image used for social media previews.                                                                                                                                                                                              |\n| Social description | `socialDescription`                               | Description used specifically for social media previews.                                                                                                                                                                           |\n| Created date       | `created`, `date`                                 | When the note was created.                                                                                                                                                                                                         |\n| Modified date      | `modified`, `lastmod`, `updated`, `last-modified` | When the note was last modified. Falls back to `created` if unset.                                                                                                                                                                 |\n| Published date     | `published`, `publishDate`, `date`                | When the note was published.                                                                                                                                                                                                       |\n| Publish            | `publish`                                         | Whether the note should be published.                                                                                                                                                                                              |\n| Draft              | `draft`                                           | Whether the note is a draft.                                                                                                                                                                                                       |\n| Comments           | `comments`                                        | Whether comments are enabled for the note.                                                                                                                                                                                         |\n| Language           | `lang`                                            | Language code for the note.                                                                                                                                                                                                        |\n| Enable TOC         | `enableToc`                                       | Whether to show the table of contents.                                                                                                                                                                                             |\n\n## API\n\n- Category: Transformer, Component\n- Function name: `ExternalPlugin.NoteProperties()`.\n- Source: [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties)\n- Install: `npx quartz plugin add github:quartz-community/note-properties`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/GitHubFlavoredMarkdown.md) -->\n---\ntitle: GitHubFlavoredMarkdown\ndescription: GitHub Flavored Markdown support (tables, task lists, footnotes, strikethrough).\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/github-flavored-markdown](https://github.com/quartz-community/github-flavored-markdown)\"\nenabled: true\nrequired: false\n---\n\nThis plugin enhances Markdown processing to support GitHub Flavored Markdown (GFM) which adds features like autolink literals, footnotes, strikethrough, tables and tasklists.\n\nIn addition, this plugin adds optional features for typographic refinement (such as converting straight quotes to curly quotes, dashes to en-dashes/em-dashes, and ellipses) and automatic heading links as a symbol that appears next to the heading on hover.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `enableSmartyPants`: When true, enables typographic enhancements. Default is true.\n- `linkHeadings`: When true, automatically adds links to headings. Default is true.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.GitHubFlavoredMarkdown()`.\n- Source: [`quartz-community/github-flavored-markdown`](https://github.com/quartz-community/github-flavored-markdown)\n- Install: `npx quartz plugin add github:quartz-community/github-flavored-markdown`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Graph.md) -->\n---\ntitle: Graph\ndescription: Interactive link graph visualization.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/graph](https://github.com/quartz-community/graph)\"\nenabled: true\nrequired: false\n---\n\nInteractive graph visualization.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[graph view]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `localGraph`: Options for the local graph view.\n- `globalGraph`: Options for the global graph view.\n\nBoth `localGraph` and `globalGraph` accept the following options:\n\n- `drag`: Enable dragging nodes. Defaults to `true`.\n- `zoom`: Enable zooming. Defaults to `true`.\n- `depth`: The depth of the graph. Defaults to `1` for local and `-1` for global.\n- `scale`: The initial scale of the graph. Defaults to `1.1` for local and `0.9` for global.\n- `repelForce`: The force that pushes nodes apart. Defaults to `0.5`.\n- `centerForce`: The force that pulls nodes to the center. Defaults to `0.3` for local and `0.2` for global.\n- `linkDistance`: The distance between linked nodes. Defaults to `30`.\n- `fontSize`: The font size of node labels. Defaults to `0.6`.\n- `opacityScale`: The scale of node opacity. Defaults to `1`.\n- `removeTags`: Tags to exclude from the graph. Defaults to `[]`.\n- `showTags`: Whether to show tags in the graph. Defaults to `true`.\n- `enableRadial`: Whether to enable radial layout. Defaults to `false` for local and `true` for global.\n- `focusOnHover`: Whether to focus on the hovered node. Defaults to `false` for local and `true` for global.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/graph\n  enabled: true\n  options:\n    localGraph:\n      drag: true\n      zoom: true\n      depth: 1\n      scale: 1.1\n      repelForce: 0.5\n      centerForce: 0.3\n      linkDistance: 30\n      fontSize: 0.6\n      opacityScale: 1\n      removeTags: []\n      showTags: true\n      focusOnHover: false\n      enableRadial: false\n    globalGraph:\n      drag: true\n      zoom: true\n      depth: -1\n      scale: 0.9\n      repelForce: 0.5\n      centerForce: 0.3\n      linkDistance: 30\n      fontSize: 0.6\n      opacityScale: 1\n      removeTags: []\n      showTags: true\n      focusOnHover: true\n      enableRadial: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Graph()`.\n- Source: [`quartz-community/graph`](https://github.com/quartz-community/graph)\n- Install: `npx quartz plugin add github:quartz-community/graph`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/HardLineBreaks.md) -->\n---\ntitle: HardLineBreaks\ndescription: Treats single newlines as hard line breaks.\ntags:\n  - plugin/transformer\nimage: \"#ff8000\"\nrepository: \"[quartz-community/hard-line-breaks](https://github.com/quartz-community/hard-line-breaks)\"\nenabled: false\nrequired: false\n---\n\nThis plugin automatically converts single line breaks in Markdown text into hard line breaks in the HTML output. This plugin is not enabled by default as this doesn't follow the semantics of actual Markdown but you may enable it if you'd like parity with [[Obsidian compatibility|Obsidian]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.HardLineBreaks()`.\n- Source: [`quartz-community/hard-line-breaks`](https://github.com/quartz-community/hard-line-breaks)\n- Install: `npx quartz plugin add github:quartz-community/hard-line-breaks`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/index.md) -->\n---\ntitle: Plugins\nimage:\n---\n\nQuartz's functionality is provided by a collection of first-party community plugins. Each plugin can be enabled, disabled, and configured via `quartz.config.yaml`. See [[configuration#Plugins|Configuration]] for details on how to manage plugins.\n\n> [!info] Internal vs Community Plugins\n> Quartz has two kinds of plugins:\n>\n> - **Community plugins** are standalone repositories under [`quartz-community`](https://github.com/quartz-community). In TS overrides, they use `ExternalPlugin.X()` (imported from `.quartz/plugins`).\n> - **Internal plugins** are built into Quartz core (Assets, Static, ComponentResources, NotFoundPage). In TS overrides, they use `Plugin.X()` (imported from `./quartz/plugins`).\n\n## Plugin types\n\nQuartz plugins fall into several categories:\n\n- **Transformers** process content during the build, e.g. parsing frontmatter, highlighting syntax, or resolving links.\n- **Filters** decide which content files to include or exclude from the output.\n- **Page Types** generate HTML pages — one per content file, folder, tag, canvas, or bases view.\n- **Components** render UI elements in the page layout (sidebars, headers, footers, etc.).\n\n## First-party plugins\n\n```base\nfilters:\n  and:\n    - file.ext == \"md\"\n    - file.inFolder(\"plugins\")\n    - \"!file.name.startsWith('index')\"\n    - \"!file.name.contains('Demo')\"\n    - \"!file.name.contains('Static')\"\n    - \"!file.name.contains('Assets')\"\n    - \"!file.name.contains('ComponentResources')\"\n    - \"!file.name.contains('NotFoundPage')\"\nformulas:\n  category: |\n    if(file.hasTag(\"plugin/transformer\"), \"Transformer\",\n    if(file.hasTag(\"plugin/filter\"), \"Filter\",\n    if(file.hasTag(\"plugin/pageType\"), \"Page Type\",\n    if(file.hasTag(\"plugin/emitter\"), \"Emitter\",\n    if(file.hasTag(\"plugin/component\"), \"Component\",\n    \"Other\")))))\nproperties:\n  title:\n    displayName: Plugin\n  repository:\n    displayName: Repository\n  enabled:\n    displayName: Enabled\n  required:\n    displayName: Required\n  description:\n    displayName: Description\nviews:\n  - type: table\n    name: All Plugins\n    groupBy:\n      property: formula.category\n      direction: ASC\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: formula.category\n        direction: ASC\n      - property: title\n        direction: ASC\n  - type: table\n    name: Transformers\n    filters:\n      and:\n        - file.hasTag(\"plugin/transformer\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Filters\n    filters:\n      and:\n        - file.hasTag(\"plugin/filter\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Page Types\n    filters:\n      and:\n        - file.hasTag(\"plugin/pageType\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Emitters\n    filters:\n      and:\n        - file.hasTag(\"plugin/emitter\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n  - type: table\n    name: Components\n    filters:\n      and:\n        - file.hasTag(\"plugin/component\")\n    order:\n      - title\n      - repository\n      - enabled\n      - required\n      - description\n    sort:\n      - property: title\n        direction: ASC\n\n```\n\n> [!note] Multi-category plugins\n> Some plugins span multiple categories. **TableOfContents** is both a transformer and a component. **EncryptedPages** is a transformer, emitter, and component. They appear in each relevant category above.\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Latex.md) -->\n---\ntitle: Latex\ndescription: Renders LaTeX math expressions via KaTeX or Typst.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/latex](https://github.com/quartz-community/latex)\"\nenabled: true\nrequired: false\n---\n\nThis plugin adds LaTeX support to Quartz. See [[features/Latex|Latex]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `renderEngine`: the engine to use to render LaTeX equations. Can be `\"katex\"` for [KaTeX](https://katex.org/), `\"mathjax\"` for [MathJax](https://www.mathjax.org/) [SVG rendering](https://docs.mathjax.org/en/latest/output/svg.html), or `\"typst\"` for [Typst](https://typst.app/) (a new way to compose LaTeX equation). Defaults to KaTeX.\n- `customMacros`: custom macros for all LaTeX blocks. It takes the form of a key-value pair where the key is a new command name and the value is the expansion of the macro. For example: `{\"\\\\R\": \"\\\\mathbb{R}\"}`\n- `katexOptions`: Additional options passed to the KaTeX renderer. See the [KaTeX docs](https://katex.org/docs/options) for available options.\n- `mathJaxOptions`: Additional options passed to the MathJax renderer. See the [MathJax docs](https://docs.mathjax.org/en/latest/options/) for available options.\n- `typstOptions`: Additional options passed to the Typst renderer.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.Latex()`.\n- Source: [`quartz-community/latex`](https://github.com/quartz-community/latex)\n- Install: `npx quartz plugin add github:quartz-community/latex`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/NoteProperties.md) -->\n---\ntitle: NoteProperties\ndescription: Displays frontmatter properties in a collapsible panel.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/note-properties](https://github.com/quartz-community/note-properties)\"\nenabled: true\nrequired: true\n---\n\nThe NoteProperties plugin is documented under [[Frontmatter]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.NoteProperties()`.\n- Source: [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties)\n- Install: `npx quartz plugin add github:quartz-community/note-properties`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/NotFoundPage.md) -->\n---\ntitle: NotFoundPage\ntags:\n  - plugin/pageType\nimage:\n---\n\nThis plugin emits a 404 (Not Found) page for broken or non-existent URLs. It uses the `minimal` [[layout#Page Frames|page frame]] (no sidebars, no header or beforeBody chrome — only content and footer) to present a clean error page.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Page Type\n- Function name: `Plugin.NotFoundPage()` (internal plugin).\n- Source: [`quartz/plugins/pageTypes/404.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/pageTypes/404.ts)\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/ObsidianFlavoredMarkdown.md) -->\n---\ntitle: ObsidianFlavoredMarkdown\ndescription: Obsidian-specific Markdown extensions (wikilinks, callouts, highlights, tags, embeds).\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/obsidian-flavored-markdown](https://github.com/quartz-community/obsidian-flavored-markdown)\"\nenabled: true\nrequired: false\n---\n\nThis plugin provides support for [[Obsidian compatibility]].\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `comments`: If `true` (default), enables parsing of `%%` style Obsidian comment blocks.\n- `highlight`: If `true` (default), enables parsing of `==` style highlights within content.\n- `wikilinks`:If `true` (default), turns [[wikilinks]] into regular links.\n- `callouts`: If `true` (default), adds support for [[callouts|callout]] blocks for emphasizing content.\n- `mermaid`: If `true` (default), enables [[Mermaid diagrams|Mermaid diagram]] rendering within Markdown files.\n- `parseTags`: If `true` (default), parses and links tags within the content.\n- `parseBlockReferences`: If `true` (default), handles block references, linking to specific content blocks.\n- `enableInHtmlEmbed`: If `true`, allows embedding of content directly within HTML. Defaults to `false`.\n- `enableYouTubeEmbed`: If `true` (default), enables the embedding of YouTube videos and playlists using external image Markdown syntax.\n- `enableTweetEmbed`: If `true` (default), enables the embedding of tweets as static blockquotes from Twitter/X URLs.\n- `enableVideoEmbed`: If `true` (default), enables the embedding of video files.\n- `enableCheckbox`: If `true`, adds support for interactive checkboxes in content, including custom task characters (e.g. `- [?]`, `- [!]`, `- [/]`). Defaults to `false`.\n- `enableObsidianUri`: If `true` (default), marks `obsidian://` protocol links with a CSS class and data attribute for custom styling.\n\n> [!note]\n> The `disableBrokenWikilinks` option previously lived on this plugin. It has moved to [[CrawlLinks]], which owns link resolution and can honor the configured `markdownLinkResolution` strategy when deciding whether a link is broken. Users upgrading from earlier Quartz v5 betas should move the option from `ObsidianFlavoredMarkdown` to `CrawlLinks`.\n\n> [!warning]\n> Don't remove this plugin if you're using [[Obsidian compatibility|Obsidian]] to author the content!\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.ObsidianFlavoredMarkdown()`.\n- Source: [`quartz-community/obsidian-flavored-markdown`](https://github.com/quartz-community/obsidian-flavored-markdown)\n- Install: `npx quartz plugin add github:quartz-community/obsidian-flavored-markdown`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/OxHugoFlavoredMarkdown.md) -->\n---\ntitle: OxHugoFlavoredMarkdown\ndescription: Compatibility for ox-hugo exported Org-mode files.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/ox-hugo](https://github.com/quartz-community/ox-hugo)\"\nenabled: false\nrequired: false\n---\n\nThis plugin provides support for [ox-hugo](https://github.com/kaushalmodi/ox-hugo) compatibility. See [[OxHugo compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `wikilinks`: If `true` (default), converts Hugo `{{ relref }}` shortcodes to Quartz [[wikilinks]].\n- `removePredefinedAnchor`: If `true` (default), strips predefined anchors from headings.\n- `removeHugoShortcode`: If `true` (default), removes Hugo shortcode syntax (`{{}}`) from the content.\n- `replaceFigureWithMdImg`: If `true` (default), replaces `<figure/>` with `![]()`.\n- `replaceOrgLatex`: If `true` (default), converts Org-mode [[features/Latex|Latex]] fragments to Quartz-compatible LaTeX wrapped in `$` (for inline) and `$$` (for block equations).\n\n> [!warning]\n> While you can use this together with [[ObsidianFlavoredMarkdown]], it's not recommended because it might mutate the file in unexpected ways. Use with caution.\n>\n> If you use `toml` frontmatter, make sure to configure the [[Frontmatter]] plugin accordingly. See [[OxHugo compatibility]] for an example.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.OxHugoFlavoredMarkdown()`.\n- Source: [`quartz-community/ox-hugo`](https://github.com/quartz-community/ox-hugo)\n- Install: `npx quartz plugin add github:quartz-community/ox-hugo`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/PageTitle.md) -->\n---\ntitle: PageTitle\ndescription: Renders the site title as a home link.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/page-title](https://github.com/quartz-community/page-title)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders the site-wide page title (configured via the `pageTitle` field in [[configuration]]) as a clickable link to the home page. It typically appears in the left sidebar.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options. The displayed title is controlled by the `pageTitle` field in `quartz.config.yaml`.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.PageTitle()`.\n- Source: [`quartz-community/page-title`](https://github.com/quartz-community/page-title)\n- Install: `npx quartz plugin add github:quartz-community/page-title`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/ReaderMode.md) -->\n---\ntitle: ReaderMode\ndescription: Distraction-free reading mode toggle.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/reader-mode](https://github.com/quartz-community/reader-mode)\"\nenabled: true\nrequired: false\n---\n\nDistraction-free reading mode.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[reader mode]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enabled`: Whether to enable reader mode. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/reader-mode\n  enabled: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.ReaderMode()`.\n- Source: [`quartz-community/reader-mode`](https://github.com/quartz-community/reader-mode)\n- Install: `npx quartz plugin add github:quartz-community/reader-mode`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/RecentNotes.md) -->\n---\ntitle: RecentNotes\ndescription: Displays a list of recently modified notes.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/recent-notes](https://github.com/quartz-community/recent-notes)\"\nenabled: false\nrequired: false\n---\n\nShows recently modified notes.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[recent notes]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `title`: The title of the recent notes section. Defaults to `Recent notes`.\n- `limit`: The maximum number of recent notes to display. Defaults to `3`.\n- `showTags`: Whether to display the tags for each note. Defaults to `true`.\n- `linkToMore`: A slug to a page that shows more notes. Defaults to `false`.\n- `hideTagPages`: Whether to hide tag index pages from the list. Defaults to `false`.\n- `hideFolderPages`: Whether to hide folder index pages from the list. Defaults to `false`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/recent-notes\n  enabled: true\n  options:\n    limit: 3\n    showTags: true\n    hideTagPages: false\n    hideFolderPages: false\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.RecentNotes()`.\n- Source: [`quartz-community/recent-notes`](https://github.com/quartz-community/recent-notes)\n- Install: `npx quartz plugin add github:quartz-community/recent-notes`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/RemoveDrafts.md) -->\n---\ntitle: RemoveDrafts\ndescription: Filters out pages marked as drafts.\ntags:\n  - plugin/filter\nimage:\nrepository: \"[quartz-community/remove-draft](https://github.com/quartz-community/remove-draft)\"\nenabled: true\nrequired: false\n---\n\nThis plugin filters out content from your vault, so that only finalized content is made available. This prevents [[private pages]] from being published. By default, it filters out all pages with `draft: true` in the frontmatter and leaves all other pages intact.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Filter\n- Function name: `ExternalPlugin.RemoveDrafts()`.\n- Source: [`quartz-community/remove-draft`](https://github.com/quartz-community/remove-draft)\n- Install: `npx quartz plugin add github:quartz-community/remove-draft`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/RoamFlavoredMarkdown.md) -->\n---\ntitle: RoamFlavoredMarkdown\ndescription: Compatibility for Roam Research export format.\ntags:\n  - plugin/transformer\nimage:\nrepository: \"[quartz-community/roam](https://github.com/quartz-community/roam)\"\nenabled: false\nrequired: false\n---\n\nThis plugin provides support for [Roam Research](https://roamresearch.com) compatibility. See [[Roam Research compatibility]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `orComponent`: If `true` (default), converts Roam `{{ or:ONE|TWO|THREE }}` shortcodes into HTML Dropdown options.\n- `TODOComponent`: If `true` (default), converts Roam `{{[[TODO]]}}` shortcodes into HTML check boxes.\n- `DONEComponent`: If `true` (default), converts Roam `{{[[DONE]]}}` shortcodes into checked HTML check boxes.\n- `videoComponent`: If `true` (default), converts Roam `{{[[video]]:URL}}` shortcodes into embeded HTML video.\n- `audioComponent`: If `true` (default), converts Roam `{{[[audio]]:URL}}` shortcodes into embeded HTML audio.\n- `pdfComponent`: If `true` (default), converts Roam `{{[[pdf]]:URL}}` shortcodes into embeded HTML PDF viewer.\n- `blockquoteComponent`: If `true` (default), converts Roam `{{[[>]]}}` shortcodes into Quartz blockquotes.\n- `tableComponent`: If `true` (default), converts Roam table syntax into HTML tables.\n- `attributeComponent`: If `true` (default), converts Roam attribute syntax into rendered attributes.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.RoamFlavoredMarkdown()`.\n- Source: [`quartz-community/roam`](https://github.com/quartz-community/roam)\n- Install: `npx quartz plugin add github:quartz-community/roam`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Search.md) -->\n---\ntitle: Search\ndescription: Full-text search with tag filtering and keyboard navigation.\ntags:\n  - plugin/component\nimage: https://images.unsplash.com/photo-1516382799247-87df95d790b7\nrepository: \"[quartz-community/search](https://github.com/quartz-community/search)\"\nenabled: true\nrequired: false\n---\n\nFull-text search functionality.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nSee [[full-text search]] for detailed usage information.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `enablePreview`: Whether to show a preview of the page content in search results. Defaults to `true`.\n- `fieldPriority`: An array specifying the priority order for search fields. Defaults to `[\"title\", \"content\", \"tags\"]`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/search\n  enabled: true\n  options:\n    enablePreview: true\n    fieldPriority:\n      - title\n      - content\n      - tags\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Search()`.\n- Source: [`quartz-community/search`](https://github.com/quartz-community/search)\n- Install: `npx quartz plugin add github:quartz-community/search`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Spacer.md) -->\n---\ntitle: Spacer\ndescription: Flexible spacer for layout groups.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/spacer](https://github.com/quartz-community/spacer)\"\nenabled: true\nrequired: false\n---\n\nThis plugin renders a flexible spacer element that pushes adjacent components apart within a layout group. It uses CSS `flex: 2 1 auto` to fill available space, making it useful for spacing out items in toolbars or sidebars (for example, separating the search bar from the darkmode toggle in the left sidebar toolbar).\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.Spacer()`.\n- Source: [`quartz-community/spacer`](https://github.com/quartz-community/spacer)\n- Install: `npx quartz plugin add github:quartz-community/spacer`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/StackedPages.md) -->\n---\ntitle: StackedPages\ndescription: Andy Matuschak-style stacked sliding panes.\ntags:\n  - plugin/component\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/stacked-pages](https://github.com/quartz-community/stacked-pages)\"\nenabled: true\nrequired: false\n---\n\nAndy Matuschak-style stacked pages (sliding panes). Clicking internal links opens pages side by side in a horizontal stack, allowing you to trace your path through your notes. Each pane shows a full page and can be individually scrolled or closed.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nOnce enabled, clicking any internal link on a page opens the linked page as a new pane to the right instead of navigating away. The URL updates with a `#stacked=slug1,slug2` hash encoding your current stack, so you can share or bookmark a specific trail of pages.\n\nStacked pages are disabled on mobile by default (below 800px) since horizontal panning doesn't work well on small screens. On mobile, links navigate normally.\n\n### Interactions\n\n- **Click a link**: Opens the target page in a new pane to the right. If the maximum number of panes is reached, the leftmost pane is removed.\n- **Close a pane**: Click the × button in the pane header to remove it from the stack.\n- **Collapsed spines**: When panes overflow the viewport, earlier panes collapse to a thin vertical spine showing the page title. Click a spine to bring that pane back into focus.\n- **Browser back/forward**: The full stack state is stored in the URL hash and integrated with browser history, so back/forward navigation works as expected.\n\n## Configuration\n\nThis plugin accepts the following configuration options:\n\n- `maxTabs`: Maximum number of stacked panes visible at once. Defaults to `8`.\n- `mobileBreakpoint`: Viewport width (in pixels) below which stacked pages are disabled and links navigate normally. Defaults to `800`.\n- `showSpines`: Whether to show collapsed spine headers when panes overflow the viewport. Defaults to `true`.\n- `animateTransitions`: Whether to animate pane open/close transitions. Defaults to `true`.\n\n### Default options\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/stacked-pages\n  enabled: true\n  layout:\n    position: afterBody\n    priority: 50\n    display: all\n  options:\n    maxTabs: 8\n    mobileBreakpoint: 800\n    showSpines: true\n    animateTransitions: true\n```\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.StackedPages()`.\n- Source: [`quartz-community/stacked-pages`](https://github.com/quartz-community/stacked-pages)\n- Install: `npx quartz plugin add github:quartz-community/stacked-pages`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/Static.md) -->\n---\ntitle: Static\ntags:\n  - plugin/emitter\nimage:\n---\n\nThis plugin emits all static resources needed by Quartz. This is used, for example, for fonts and images that need a stable position, such as banners and icons. The plugin respects the `ignorePatterns` in the global [[configuration]].\n\n> [!important]\n> This is different from [[Assets]]. The resources from the [[Static]] plugin are located under `quartz/static`, whereas [[Assets]] renders all static resources under `content` and is used for images, videos, audio, etc. that are directly referenced by your markdown content.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Emitter\n- Function name: `Plugin.Static()` (internal plugin).\n- Source: [`quartz/plugins/emitters/static.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/static.ts).\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/SyntaxHighlighting.md) -->\n---\ntitle: SyntaxHighlighting\ndescription: Syntax highlighting for code blocks.\ntags:\n  - plugin/transformer\nimage: https://images.unsplash.com/photo-1580569214296-5cf2bffc5ccd\nrepository: \"[quartz-community/syntax-highlighting](https://github.com/quartz-community/syntax-highlighting)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is used to add syntax highlighting to code blocks in Quartz. See [[syntax highlighting]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `theme`: a separate id of one of the [themes bundled with Shikiji](https://shikiji.netlify.app/themes). One for light mode and one for dark mode. Defaults to `theme: { light: \"github-light\", dark: \"github-dark\" }`.\n- `keepBackground`: If set to `true`, the background of the Shikiji theme will be used. With `false` (default) the Quartz theme color for background will be used instead.\n- `clipboard`: Whether to add a copy-to-clipboard button to code blocks. Defaults to `true`.\n- `tokenClassification`: Whether to add semantic token classification CSS classes to code tokens. Defaults to `true`.\n\nIn addition, you can further override the colours in the `quartz/styles/syntax.scss` file.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.SyntaxHighlighting()`.\n- Source: [`quartz-community/syntax-highlighting`](https://github.com/quartz-community/syntax-highlighting)\n- Install: `npx quartz plugin add github:quartz-community/syntax-highlighting`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/TableOfContents.md) -->\n---\ntitle: TableOfContents\ndescription: Generates and renders a table of contents from headings.\ntags:\n  - plugin/transformer\n  - plugin/component\nimage: https://images.unsplash.com/photo-1768527338896-3765921e992d\nrepository: \"[quartz-community/table-of-contents](https://github.com/quartz-community/table-of-contents)\"\nenabled: true\nrequired: false\n---\n\nThis plugin generates a table of contents (TOC) for Markdown documents. See [[table of contents]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `maxDepth`: Limits the depth of headings included in the TOC, ranging from `1` (top level headings only) to `6` (all heading levels). Default is `3`.\n- `minEntries`: The minimum number of heading entries required for the TOC to be displayed. Default is `1`.\n- `showByDefault`: If `true` (default), the TOC should be displayed by default. Can be overridden by frontmatter settings.\n- `collapseByDefault`: If `true`, the TOC will start in a collapsed state. Default is `false`.\n- `layout`: The visual layout of the TOC component. Can be `\"modern\"` or `\"legacy\"`. Default is `\"modern\"`.\n\n> [!warning]\n> This plugin needs the `Plugin.TableOfContents` component in `quartz.config.yaml` to determine where to display the TOC. Without it, nothing will be displayed. They should always be added or removed together.\n\n## API\n\n- Category: Transformer, Component\n- Function name: `ExternalPlugin.TableOfContentsTransformer()`.\n- Source: [`quartz-community/table-of-contents`](https://github.com/quartz-community/table-of-contents)\n- Install: `npx quartz plugin add github:quartz-community/table-of-contents`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/TagList.md) -->\n---\ntitle: TagList\ndescription: Renders tags as clickable links.\ntags:\n  - plugin/component\nimage:\nrepository: \"[quartz-community/tag-list](https://github.com/quartz-community/tag-list)\"\nenabled: false\nrequired: false\n---\n\nThis plugin renders the page's tags as a list of clickable links. Each tag links to its corresponding [[TagPage|tag page]], making it easy for readers to browse related content by topic.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin has no configuration options.\n\n## API\n\n- Category: Component\n- Function name: `ExternalPlugin.TagList()`.\n- Source: [`quartz-community/tag-list`](https://github.com/quartz-community/tag-list)\n- Install: `npx quartz plugin add github:quartz-community/tag-list`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/TagPage.md) -->\n---\ntitle: TagPage\ndescription: Generates listing pages for tags.\ntags:\n  - plugin/pageType\nimage:\nrepository: \"[quartz-community/tag-page](https://github.com/quartz-community/tag-page)\"\nenabled: true\nrequired: false\n---\n\nThis plugin is a page type plugin that emits dedicated pages for each tag used in the content. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). See [[folder and tag listings]] for more information.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\nThis plugin accepts the following configuration options:\n\n- `numPages`: The maximum number of pages to display per tag before showing a \"see more\" link. Defaults to `10`.\n- `sort`: A function of type `(f1: QuartzPluginData, f2: QuartzPluginData) => number{:ts}` used to sort entries. Defaults to sorting by date and tie-breaking on lexographical order. Requires a TS override.\n- `prefixTags`: If `true`, generated tag page titles are prefixed with \"Tag: \" (e.g. \"Tag: recipes\"). Defaults to `false`.\n\n## API\n\n- Category: Page Type\n- Function name: `ExternalPlugin.TagPage()`.\n- Source: [`quartz-community/tag-page`](https://github.com/quartz-community/tag-page)\n- Install: `npx quartz plugin add github:quartz-community/tag-page`\n\n\n<!-- Skill/Rule: Plugins Skill (docs/plugins/UnlistedPages.md) -->\n---\ntitle: UnlistedPages\ndescription: Hides pages from navigation and indexes while still publishing them.\ntags:\n  - plugin/transformer\nimage:\nnew-in-v5: true\nrepository: \"[quartz-community/unlisted-pages](https://github.com/quartz-community/unlisted-pages)\"\nenabled: true\nrequired: false\n---\n\nZero-config transformer that makes `unlisted: true` in a page's frontmatter a first-class way to opt out of every listing surface on your site. The page is still emitted as HTML and remains accessible by direct URL, but is absent from `contentIndex.json`, RSS, sitemap, graph, explorer, search, backlinks, recent notes, folder listings, and tag listings.\n\n> [!note]\n> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.\n\n## Usage\n\nAdd an `unlisted` field to any page's frontmatter:\n\n```yaml\n---\ntitle: My Draft\nunlisted: true\n---\n```\n\nThat's it. Every Quartz v5 plugin that respects the `file.data.unlisted` convention will then hide the page.\n\n## What each plugin does\n\n| Plugin         | Behavior when `unlisted: true`                                             |\n| -------------- | -------------------------------------------------------------------------- |\n| `ContentIndex` | Page absent from `contentIndex.json`, `sitemap.xml`, and the RSS feed.     |\n| `Search`       | Page absent from search results (derived from `contentIndex.json`).        |\n| `Graph`        | Page absent from graph nodes and edges (derived from `contentIndex.json`). |\n| `Explorer`     | Page absent from the sidebar file tree (derived from `contentIndex.json`). |\n| `Backlinks`    | Page never appears as a backlink source on other pages.                    |\n| `RecentNotes`  | Page absent from the recent notes list.                                    |\n| `FolderPage`   | Page absent from folder listings and folder discovery.                     |\n| `TagPage`      | Page absent from tag discovery and tag listings.                           |\n\nIn every case, the page's HTML is still emitted and accessible by direct URL.\n\n## Configuration\n\nZero options. Just enable it.\n\n```yaml title=\"quartz.config.yaml\"\n- source: github:quartz-community/unlisted-pages\n  enabled: true\n```\n\n## Interaction with [[EncryptedPages]]\n\nThe [[EncryptedPages]] plugin also sets `file.data.unlisted` when its `unlistWhenEncrypted: true` option is set or when a page has `unlisted: true` in frontmatter. The two plugins compose cleanly:\n\n- If you install only `UnlistedPages`: any page with `unlisted: true` in frontmatter is hidden from listing surfaces. Encryption is independent.\n- If you install only `EncryptedPages`: `unlisted: true` only takes effect on pages that are also encrypted (have a password). Non-encrypted pages with `unlisted: true` are silently ignored.\n- If you install both: `unlisted: true` works for every page, encrypted or not. This is the recommended setup for sites that use encrypted pages.\n\n## API\n\n- Category: Transformer\n- Function name: `ExternalPlugin.UnlistedPages()`.\n- Source: [`quartz-community/unlisted-pages`](https://github.com/quartz-community/unlisted-pages)\n- Install: `npx quartz plugin add github:quartz-community/unlisted-pages`\n\n\n</agent_rules>"}