Quartz Custom Component Development
How to write, register, and configure custom TSX components in a Quartz digital garden.
Why / When to Use
When the built-in Quartz components don’t cover a need — e.g. a note counter, custom header, tag cloud, or series navigator. Components are plain TSX with an optional CSS string and optional config options.
Core Concept / Commands
Minimal component skeleton
// quartz/components/YourComponent.tsx
import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types"
export default (() => {
function YourComponent() {
return <p class="red-text">Example Component</p>
}
YourComponent.css = `
p.red-text {
color: red;
}
`
return YourComponent
}) satisfies QuartzComponentConstructorThree things: JSX function, optional .css string, export default.
Component with config options
interface Options {
showCount: boolean
}
const defaultOptions: Options = { showCount: true }
export default ((userOpts?: Options) => {
const opts = { ...defaultOptions, ...userOpts }
function YourComponent({ allFiles, displayClass }: QuartzComponentProps) {
const count = allFiles.length
return (
<div class={`your-component ${displayClass}`}>
{opts.showCount && <span class="count">{count}</span>}
</div>
)
}
YourComponent.css = `...`
return YourComponent
}) satisfies QuartzComponentConstructorallFiles— metadata for all parsed files (useful for counts, listings, cross-file queries)displayClass— utility class for mobile/desktop rendering preference
Registration — two required steps
Step 1 — Export from index:
// quartz/components/index.ts
export { default as YourComponent } from "./YourComponent"Step 2 — Add to layout:
// quartz.layout.ts
import * as Component from "./quartz/components"
// Use in layout:
Component.YourComponent()
// Or with options:
Component.YourComponent({ showCount: false })Key Options / Variants
Best reference files to copy from
| File | What it teaches |
|---|---|
quartz/components/Footer.tsx | Simplest built-in — best starting template |
quartz/components/TagList.tsx | Reading frontmatter, rendering links |
quartz/components/Backlinks.tsx | Reading allFiles, filtering, listing |
quartz/components/ContentMeta.tsx | Dates, reading time, metadata display |
quartz/components/Explorer.tsx | Complex component with JavaScript |
Fastest start
cp ~/projects/quartz/quartz/components/Footer.tsx \
~/projects/quartz/quartz/components/GardenHero.tsxGut the JSX, write your own. The scaffold (types, export pattern) is already correct.
Gotchas
- Use
classnotclassNamein Quartz TSX (it uses Preact, not React) - CSS is scoped to the component via the
.cssstring property — no separate file needed allFilesis read-only metadata — it doesn’t give you file contents, just frontmatter + graph data- Both registration steps are required; missing either one silently omits the component
Source
Conversation “Note Taking - Hugo&Quartz” — 2026-06-01