Young's Mind
06 Implementation

Docs-site nav v2 — the two-aside fix (2026-10-15)

Follow-up to docs-restructure-vault-mirror. Young reported (screenshot): sidebar showed raw folder names (manual/investing/properties) and no Pulse/Docs groups. Root causes found and fixed at the Docus-framework level; all verified live this morning.

Docs-site nav v2 — the two-aside fix (2026-10-15)

Follow-up to docs-restructure-vault-mirror. Young reported (screenshot): sidebar showed raw folder names (manual/investing/properties) and no Pulse/Docs groups. Root causes found and fixed at the Docus-framework level; all verified live this morning.

Root causes (in order of discovery)

  1. Docus hardcodes ONE docs collection (node_modules/docus/content.config.ts): every page in the single collection → one global sidebar (238 Docs links rendering on /pulse). Separate sections are not a supported layout without an override.
  2. Collection routing is hardcoded too: the [...slug].vue page always queries docs, so /pulse/** pages 404'd even with a pulse collection built (verified in the sqlite: _content_pulse had all 331 docs).

The fix (overriding, not forking — Young's build-on-top rule)

Three small files in the repo, all diff-sized against upstream:

  1. content.config.ts (repo root): two collections — docs (source Docs/**, prefix /docs) + pulse (source Pulse/**, prefix /pulse). Docus merges our config over its default (extends mechanism).
  2. app/pages/[lang](lang)/[...slug].vue: upstream file copied + 2-line diff — collectionFor(path) resolves pulse for /pulse/**, else docs. .upstream-bak kept.
  3. app/app.vue: upstream copy + merged-navigation patch — queryCollectionNavigation('docs') + (...'pulse') concatenated, then the standard transformNavigation. Imports re-pointed docus/app/... (relative imports don't resolve in our app dir). Plus app.config.ts navigation.sub: 'aside' — second tab bar, per-section sidebar.

Battle scars (for the next person)

  • sync-docus.sh runs port.py (retired) — it stomped the mirror content mid-fix; reinstall from the tar after any port-era script runs.
  • .navigation.yml needs navigation: true as well as title: for top-level grouping nodes (Docus Content v3 schema).
  • Tailwind scans content: the string h-[calc(100dvh-...)] ("..." literal) in a Pulse product-spec md failed the whole vite build (arbitrary-value class with literal "..." is invalid CSS). Rewrote to var(--header-h,4rem). Rule: no literal ... inside [] class strings in markdown.
  • Data flow trap: useAsyncData + .then(merge) — the transform: option receives the POST-.then merged array, not the raw tuple. (data[0]||[]).is-not-iterable was the runtime 500.
  • Junk filter now in the forge: _conflicts-* dirs and the 2026-01-01 leak-test stub are skipped (forge continue line).

Verification (final build, live)

  • Routes all 200: /, /pulse, /pulse/{brief,research,podcast,weekly-study}, /docs, /docs/solosv3 incl. deep pages (manual/01-operation, fleet-ssh-tunnels, 3-package-deep-dive), /docs/investing/market-watch, /docs/vault-index. / 307→/pulse. Junk 404s.
  • Asides now section-scoped: /pulse pages show ONLY pulse tree (0 docs links); /docs pages show ONLY docs tree (manual group links listed, 237 doc hrefs).
  • Group titles render (Docs, Pulse, Manual, SolOS V3, 01 Research, Brief, Research).
  • Committed bc3b7bf to solos-docs GitHub.
Copyright © 2026