This workspace uses Quartz as the static-site generator.
Markdown content is built from the content folder.
- Edit
apps/notes/vaults.config.json(name+pathper vault;~is supported; paths are standardized across machines). - Sync markdown:
pnpm --filter notes sync:vaults
Sync behavior:
- Recursively traverses each configured vault.
- Ignores symlinked files/directories (using
lstat, never dereferences links) and skips symlinked source roots. - Prints a sync summary including copied files, publish-filtered files, and symlink-skipped paths.
- By default, syncs only notes with
publish: truefrontmatter. - Set
requirePublish: falseon a source to sync every markdown file in that folder. - Set
includeInRss: falseon a source to keep its pages on the Notes site while excluding them from RSS. - Set
includeHidden: trueon a source to also traverse dot-directories (still skips.git,.obsidian,.trash,node_modules). - If no
dateis present, it auto-populatesdateusing this priority:date(existing) ->created(frontmatter) -> source filectime. - If no
createdis present, it auto-populatescreatedfrom source filectimeto preserve original file metadata in synced output. - If
hidden: trueis present, the note is still generated and accessible by direct URL, but excluded from Quartz Explorer/index-based discovery. - Folder hierarchy is preserved relative to the original vault path under
apps/notes/content/<vault-name>/....
- Install dependencies.
- Start preview server:
pnpm --filter notes dev
- Build static output:
pnpm --filter notes build
Quartz source is committed locally in apps/notes/quartz (standard Quartz project layout).
Dev server uses port 3002 (wsPort 3003).
Create a separate Vercel project for apps/notes:
- Import the monorepo in Vercel.
- Set Framework Preset to Other.
- Set Root Directory to
apps/notes. - Ensure URL rewriting is enabled via
apps/notes/vercel.json:"cleanUrls": true(so Quartz routes work without.htmlsuffixes)
- Keep default commands from
apps/notes/vercel.json:- Install:
pnpm install --frozen-lockfile - Build:
pnpm build - Output directory:
public
- Install:
- Set Node.js runtime to 22.x (also declared in
apps/notes/package.jsonengines). - (Optional) Add your custom domain (e.g.
notes.benoror.com) in project domains.
Quartz note: sitemap/RSS generation depends on correct baseUrl configuration (notes.benoror.com is already set in quartz.config.ts).
This deploys Quartz as a static site from the generated public/ output.
This app includes a wrapper for the official quartz-themes installer flow.
- Install/update a theme into
apps/notes/quartz/styles/themes:pnpm --filter notes theme:install -- "catppuccin"pnpm --filter notes theme:install -- "obsidian-nord"
Notes:
- The wrapper downloads and runs the upstream
action.shfromquartz-themesinapps/notes, so Quartz root detection works as intended. - Upstream installer applies one theme package at a time. If you need mixed-mode setup (for example, light from one theme and dark from another), keep using Quartz tokens/overrides for the mode split.
The Notes site now emits machine-discovery assets by default:
sitemap.xmlandindex.xml(RSS) via Quartz content index.robots.txt,llms.txt, andagents.txtat site root.- Per-page Markdown mirror under
/md/<slug>.md. - A "Download Markdown" action on content pages that links to the mirrored
.md. - Canonical URL, robots meta (
noindexforhidden: truepages), and JSON-LD schema metadata in page<head>.
This app vendors Quartz core source in apps/notes/quartz, so upgrades are explicit:
- Bump
quartzdependency inapps/notes/package.json. - Replace
apps/notes/quartzwith the upgraded Quartzquartz/folder. - Review
quartz.config.tsandquartz.layout.tsagainst upgrade notes. - Run
pnpm --filter notes build.
Use Quartz's upgrade guide for version-specific migration steps.
Use publish: true in notes you want synced and published.
Optional fields:
hidden: trueto keep a page URL-accessible but out of Explorer/index-based listings.date: "YYYY-MM-DD"to explicitly control the note date (otherwise sync injects one).
Quartz v4 requires Node 22+, but this pinned setup currently works best on Node 22.x.
If your shell uses Node <22 or Node >=24, Quartz commands fail fast with a clear version error.