Unlisted and encrypted pages

What this demonstrates

This page contrasts two mechanisms that are easy to confuse:

  1. Unlisted is an indexing policy. The unlisted demo has a normal public HTML route, but the unlisted transformer removes it from search, graph, explorer, RSS, sitemap and Bases views. Anyone who knows the URL can still fetch it.
  2. Encrypted is a content transform. The encrypted demo has a password frontmatter field, so the transformer replaces its rendered body with an AES-256-GCM ciphertext container. The browser’s Web Crypto code decrypts it only after a password is supplied.

Neither is a substitute for authentication. Unlisted hides discoverability; encryption protects the body against casual readers but leaves public ciphertext and an offline attack surface.

Configuration used

  - source: "@quartz-community/unlisted-pages"
    enabled: true
    options: {}
    order: 45
 
  - source: "@quartz-community/encrypted-pages"
    enabled: true
    options:
      iterations: 600000
      passwordField: password
      unlistWhenEncrypted: false
      outputPath: static/encryptedContentIndex.json
    order: 900
    layout:
      position: afterBody
      priority: 1

The encrypted component has no default layout position in its manifest, so the explicit layout entry is important: it loads its CSS and afterDOMLoaded decrypt/unlock script into the final page resource collection. CrawlLinks remains at order 60, before encryption, so links from encrypted source can populate the shadow index before their body is replaced.

Content used

# unlisted-demo.md
unlisted: true
 
# encrypted-demo.md
password: sandbox-demo

The demo password is published on purpose and protects no real secret.

What the rendered output proves

The unlisted page has its own emitted route but no entry in content-index-derived discovery files. The encrypted page’s static HTML contains an empty <div class="encrypted-page popover-hint" data-encrypted="..." data-iterations="600000">; its plaintext marker is absent from the source HTML. The unlock form is injected by the component’s browser script, so a Chrome run with JavaScript enabled also finds the password field and can reveal the body with sandbox-demo.

The emitted static/encryptedContentIndex.json is a separate shadow index for revealable encrypted pages. It contains ciphertext only, and a stealth: true page would be omitted from that index entirely.

safe_for_shared_engine

false — unlisted pages change every discovery surface, while encryption adds PBKDF2 work, client-side decryption and a shadow index. Both are useful, but adopting them across 51 wikis requires an explicit threat model and privacy review.