Obsidian static site generator: inspect attachments separately from pages

The internal note has no published page, but its PDF still appears in the generated bundle. A Markdown filter and an asset emitter can follow different paths.

Inventory both before trusting a page-only exclusion.

The example compares three Markdown decisions and two asset decisions. Only public/intro.md has publish:true. The private notes lack that flag or set false. Baseline expectations still include both media assets as candidates, including private-media/review.pdf. Adding the declared private-folder exclusions removes that private asset from the expected set. This is a bounded policy calculator, not an actual Quartz build or privacy certification.

A hidden note can leave an emitted attachment.
A hidden note can leave an emitted attachment.
Open the full example ↗

Inventory the source kinds

The five fictional records are public/intro.md with Practice flow overview, private/review.md with no publish flag, private/check.md with publish:false, public-media/flow.svg, and private-media/review.pdf. Intended final inclusions are one page and the public diagram. A private folder name expresses intent but does not itself configure a generator. Keep source-relative paths separate from actual emitted routes; slugging and other plugins may choose different output names, which the native build needs to reveal.

The examined Quartz v4 sources distinguish ExplicitPublish filtering from the Assets emitter. ExplicitPublish checks the publish frontmatter value; the full-build asset path discovers non-Markdown files using ignorePatterns. Pin the actual version/commit, configuration, filter, emitter and plugin set before implementation. A mutable reference branch does not establish an installed runtime, and watch/incremental behavior is a different path from the fresh full-build comparison used for this fixture.

Test positive and negative inclusion targets

Baseline B has explicit Markdown publication with no custom asset exclusions. Intro is the page candidate; both private notes are excluded. Both media files remain asset candidates under the examined full-build arrangement. The private PDF therefore fails the intended policy even if no page links to it. Absence from navigation is not absence from the bundle. The page lets you filter to assets so that distinction is immediately visible instead of hiding the attachment behind a successful note-page result.

Case I adds private/** and private-media/**. Under this exact fixture, intro and the public diagram remain expected inclusions while private notes and PDF are excluded. The calculator implements the declared prefix policy for these names only. Test the actual glob behavior relative to the native content directory; a shell glob check or local reading control cannot prove Quartz applied the same pattern. Renaming a folder or adding content elsewhere needs a revised inventory and policy rather than inheriting a general private-content label.

Inspect output and source boundaries

Use fresh, independently identified complete output destinations for baseline and exclusion cases. An old PDF left from another run can mislead an output comparison. Inspect actual paths, byte hashes, readable intro content and public diagram as positive targets, then private pages and attachment as negative targets. Review generated search/content indexes, titles, transclusions, links and other plugin output separately. A filtered page does not establish that every derived reference or piece of content disappeared from the complete bundle.

Keep repository review separate from build review. Excluded content could still be exposed by a public source repository, and adding ignore rules does not remove already tracked history. Retain actual tracking/history findings under their own boundary rather than treating output exclusion as a repository pass. When source, frontmatter, or configuration changes, repeat the affected build and repository checks; the optional HTML ledger only makes those expected decisions easier to inspect.

Make your own working example

Build an original five-source Quartz inclusion policy calculator, not a build or privacy scanner. Sources: public/intro.md publish true; private/review.md no flag; private/check.md publish false; public-media/flow.svg asset; private-media/review.pdf asset. Intended inclusions intro page and public diagram.

Baseline button applies explicit-publish semantics to Markdown while leaving both assets candidates. Reviewed exclusions button models private/** and private-media/** against this exact inventory. Show each source path, kind, intended decision and expected candidate/excluded state. Baseline has 1page/2asset candidates and flags private PDF; exclusions leave 1page/1asset. Provide All, Assets only and Reset controls without changing records.

Label local matching as bounded prefix-policy expectations, not native glob execution. Actual Quartz version/commit/plugins/full-build output paths and bytes remain unobserved. Include separate native check prompts for full output/indexes/transclusions/inbound links and source repository tracking/history. No private-content certificate, vault access, builds, deletion, git changes, publication or guessed emitted routes. Keep useful candidate counts and the private attachment row early in the page.

Use one self-contained HTML file with no remote dependency. Keep the initial sample, output, and labeled controls near the top. Use at least 16px text, strong contrast, visible focus, and a stacked layout at 360px without horizontal overflow. Use explicit type=button click handlers and explicit DOM selectors; do not depend on native form submission. Clear stale feedback when task inputs change. Render entered text safely. Keep practice data local to the current page; do not imply saving, sending, or production integration. Return only the finished HTML.

Explain the attachment decision

Keep the native vault, complete build manifest and repository findings together. In an HTML inclusion ledger, NOS lets you revise eligible static notes visually without AI regeneration. Clarify why excluding a note did not establish exclusion of its PDF before the next native build review.

Keep reading