Skip to content
Resource
DocsTourSlicesBest PracticeAgentsInstall

Command Palette

Search for a command to run...

New
  • Changelog

Changelog

Release notes

Changelog

What changed in each rr release — page 22 of 25. Full prose history in CHANGELOG.md.

MAY202026
FeatureBO-waveMay 20, 2026

Operasi Mise M4 — manifest sync + 100% feature coverage + LandingRenderer parseConfigBadge extracted

Phase 4 of 5 in Operasi Mise (kitchen prep before continuing development). Goal: clean up structural debt the audit flagged — slice manifests drift, config title shortening, scaffolding dir counted in coverage stats, duplicated tiny helpers. (1) sync-slice-manifests.mjs: ran, wrote 4 manifests (ai-agents, ai-chat, ai-studio, icon-picker — config.ts added after manifest was last regenerated). Also taught the script to silently skip slices that have config.ts but no slice.json — those are catalog-only meta-slices (admin-panel, event-tracking, pages, rbac-roles) whose actual code lives in _shared/, not as standalone distributables. (2) Aligned 8 config.ts titles with their slice.json long-form (ai-agents/chat/studio, code-block, equation, notifications, notion-blocks, notion-shell). Pre-commit warnings now silent. (3) audit-feature-manifest.mjs: skip _-prefixed dirs (consistent with sync-slice-manifests convention) so _templates scaffolding doesn't count against coverage. Result: 98.0% → 100.0% (48/48). (4) Extracted parseConfigBadge to _shared/landing/parse-config.ts — 5 templates (kreator-studio, personal-brand, research, konsultan, wirausaha) had identical 8-line inline function. Now imported. Added generic parseConfigField<T>() helper for future config-key extraction. Net: -40 LOC across 5 templates. LandingRenderer base-class extraction (originally planned) revealed shallow shared surface — each template's switch-case maps to template-specific component imports (Hero, Stats, FeaturedPosts, etc), so no extraction beyond parseConfigBadge made sense.

Manifest sync

  • scripts/validation/sync-slice-manifests.mjs — skip catalog-only slices (config.ts only, no slice.json)
  • 4 manifest files updated: ai-agents, ai-chat, ai-studio, icon-picker — files[] regenerated from disk

Feature manifest coverage 100% (48/48)

  • scripts/audit-feature-manifest.mjs — skip _-prefixed dirs (matches sync-slice-manifests convention)
  • _templates scaffolding now correctly excluded from coverage stats

Slice title alignment (config.ts ↔ slice.json)

  • ai-agents/ai-chat/ai-studio — long-form titles restored
  • code-block/equation/notifications/notion-blocks/notion-shell — same

Shared helper extracted

  • components/templates/_shared/landing/parse-config.ts — parseConfigBadge + generic parseConfigField<T> (NEW)
  • 5 LandingRenderer.tsx files migrated: removed local parseConfigBadge, import from _shared
MAY202026
FeatureBN-waveMay 20, 2026

Operasi Mise M3 — unified resources registry + slice exposure in /api/knowledge

Phase 3 of Operasi Mise. NEW lib/content/resources.ts — derived layer over slices + layouts (additive, no upstream changes). Resource type with { source: 'slice'|'template'|'layout', slug, title, description, category, tags, href, previewPath, install }. /api/knowledge expanded to accept ?slice=, ?resource=, ?type= query params; response adds resources[], slices[], counts{} alongside the legacy layouts[]/recipes[]. llms.txt gets an Agent API section enumerating all endpoints + response shape so AI agents can discover the unified surface. Fixes ChatGPT's M-pre-audit finding that '/api/knowledge masih menerima recipe, mengembalikan recipes, dan belum expose slices sebagai first-class resource.'

NEW lib/content/resources.ts

  • Derived layer: spread slices.map(sliceToResource) + layouts.map(layoutToResource)
  • Templates = layouts.category === 'website-template'; rest = layout source
  • Helpers: getResource, getResourcesBySource, getResourcesByCategory, resourceCounts

/api/knowledge expanded (additive)

  • NEW query params: ?slice=<slug>, ?resource=<slug>, ?type=<source>
  • NEW response fields: resources[] (unified), slices[] (Tier-3 full), counts{}
  • Legacy layouts[], recipes[] preserved for pre-M3 consumers

llms.txt — Agent API section

  • Documents 7 endpoint variations with curl-paste examples
  • Lists response shape so agents skip the discovery roundtrip
MAY202026
FeatureBM-waveMay 20, 2026

Operasi Mise M2 — route SSOT via buildTemplatePaths(slug) helper

Phase 2 of Operasi Mise. Goal: dedupe hardcoded /preview/<slug>-os/... paths across templates so renaming a template = change one constant instead of editing 16+ files. NEW components/templates/_shared/config/template-paths.ts: buildTemplatePaths(slug: string) factory returning publicBase, dashboardBase, adminPanelBase, workspaceBase. Each of 8 templates' site-config.ts exports canonical TEMPLATE_SLUG; nav-config.ts imports it and derives all BASE consts via helper. app/preview/<slug>/{sitemap,robots}.ts also migrated for the 6 templates that ship them. Hardcoded /preview/<slug> literals before: 39 across 29 files. After: 0 functional.

NEW _shared/config/template-paths.ts

  • buildTemplatePaths(slug: string): TemplatePaths factory
  • Returns previewRoot, publicBase, dashboardBase, adminPanelBase, workspaceBase

8 templates migrated

  • site-config.ts adds canonical TEMPLATE_SLUG constant
  • nav-config.ts derives PUBLIC_BASE / DASHBOARD_BASE / ADMIN_PANEL_BASE / WORKSPACE_BASE via helper
  • ADMIN_BASE deprecated alias preserved for callers

12 app/preview/<slug>/{sitemap,robots}.ts migrated

  • PUBLIC_BASE derives from helper
  • robots.ts disallow rebased from stale /preview/<slug>/admin to dashboardBase
MAY202026
ChoreBL-waveMay 20, 2026

Operasi Mise M1 — docs SSOT + dead code cleanup

Phase 1 of Operasi Mise (kitchen prep before continuing development). Lowest risk wave. (1) lib/content/changelog.ts — append BK entry (the unified PageSectionsEditor + 98% feature manifest coverage that shipped at 9e5b72f had no changelog entry). (2) CLAUDE.md — version drift fixed. CLI 0.13.1 → 1.7.0, MCP 0.9.1 → 1.1.0 (matches npm published + local package.json). (3) app/(docs)/slices/page.tsx — h1 'Feature slices' → 'Slices' (navbar already says 'Features', metadata already says 'Slices'). (4) docs/slice-architecture.md — drop dangling MEMORY.md TODO (auto-memory lives in ~/.claude/projects). (5) docs/architecture/dashboard-vision.md — record BG–BK shipped + add Operasi Mise section with M1–M5 roadmap.

Docs catch-up

  • lib/content/changelog.ts — BK entry appended
  • CLAUDE.md — package versions corrected (CLI 1.7.0, MCP 1.1.0)
  • docs/architecture/dashboard-vision.md — Operasi Mise M1–M5 roadmap

Dead code / drift

  • app/(docs)/slices/page.tsx — h1 'Feature slices' → 'Slices'
  • docs/slice-architecture.md — dangling MEMORY.md TODO removed
MAY202026
FeatureBK-waveMay 20, 2026

Unified PageSectionsEditor (custom pages share landing's section editor) + feature manifest 98% coverage

Re-commit of BI files that didn't land (earlier BI commit cf18fc187 was empty after a parallel agent's interleaved commit reset the working tree). (1) Custom pages and landing share the SAME composition primitive (LandingSection). New PageSectionsEditor renders row-per-section + click-to-open CrudRowDialog. PageEditorView uses it when page.sections is defined OR legacy blocks[] empty; PageEditorBlocks kept for system pages with seeded blocks. Pages reducer learns PAGE_SECTION_UPSERT + PAGE_SECTION_DELETE with auto-shift order algorithm (siblings rebase so chosen position is unique). All 8 PagesAdapters dispatch the new actions. (2) Feature manifest backfilled — 10 slices added (ai-agents, ai-chat, ai-studio, code-block, database-cell-selection, equation, icon-picker, notifications, notion-blocks, notion-shell) + 4 updated (pages, admin-panel, event-tracking, rbac-roles), coverage 77.6% → 98.0% (48/49). scripts/audit-feature-manifest.mjs NEW. Only outlier _templates intentionally skipped (scaffolding, not a functional slice).

_shared/pages (NEW components)

  • PageSectionsEditor.tsx — row-per-section + click-to-open dialog; same LandingSection schema as landing surface
  • page-editor-helpers.tsx — extracted Field / PageNotFound / SystemPageNotice (200-LOC cap)

_shared/pages (extended)

  • types.ts — PageEntry.isLanding + sections forward-compat; PagesAction adds PAGE_SECTION_UPSERT + PAGE_SECTION_DELETE
  • reducer.ts — section CRUD with auto-shift order (upsertWithAutoShift helper)
  • pages-context.tsx — PagesStore adds upsertSection + removeSection callbacks
  • PageEditorView.tsx — renders PageSectionsEditor when page.sections defined OR legacy blocks empty
  • _shared/crud/CrudListView.tsx — editPath now optional (dialog-only flow)

Templates touched — all 8 PagesAdapter

  • store.tsx — upsertSection + removeSection wired; PAGE_SECTION_UPSERT + PAGE_SECTION_DELETE case labels added
  • store.tsx — same wiring
  • store.tsx — same wiring
  • store.tsx — same wiring (reducer split into store-reducer.ts)
  • store.tsx — same wiring
  • store.tsx — same wiring
  • store.tsx — same wiring
  • store.tsx — same wiring

Feature manifest (10 new config.ts)

  • ai-agents, ai-chat, ai-studio — AI surfaces
  • code-block, equation, notion-blocks — block primitives
  • database-cell-selection — table cell selection
  • icon-picker, notifications — UI utilities
  • notion-shell — outer Notion-clone surface

Feature manifest (4 updated to use defineFeature helper)

  • pages, admin-panel, event-tracking, rbac-roles — canonical shape via lib/shared/features/defineFeature

Tooling

  • scripts/audit-feature-manifest.mjs — NEW; reports coverage (currently 98.0% / 48 of 49 slices)
MAY202026
FeatureBJ-waveMay 20, 2026

notion-shell polish — DnD-kit drag handle, cover image, image/embed renderers, page actions menu

Final wave on the notion-shell Notion-clone surface. (1) SortableBlockList — @dnd-kit/core + sortable + utilities render-prop wrapper for block reorder. Pointer + keyboard sensors; emits (fromIndex, toIndex) via onReorder. (2) NotionBlock gains optional dragHandle slot — caller mounts a grip button wired to SortableBlockList's dragProps; renders next to the hover "⋯" actions handle. (3) NotionPage gains optional cover prop — 200px image band above header; X button on hover triggers onCoverRemove. (4) ImageRenderer + EmbedRenderer specialised block renderers — Image: URL + caption + preview, click to edit. Embed: URL detection for YouTube/Vimeo/Loom/Figma/CodePen/Spotify with provider-specific rewrites + sandboxed iframe fallback. (5) PageActionsMenu — header dropdown for page-level actions: add cover, favorite toggle, duplicate, export, move to trash. (6) Template wired — DocView wraps blocks in SortableBlockList + passes a GripVertical drag handle button per block; NotionPage receives doc.cover + actions=<PageActionsMenu>; block-renderers maps image/embed to the new shell renderers; types.ts gains doc.block.reorder + doc.duplicate actions; notion-reducer.ts handles them. (7) Inline slash-key trigger (`/` in block → menu opens at caret) intentionally deferred — current ergonomics ride on InsertBlockButton + hover "⋯" menu which already cover the new-block + turn-into flows. Bumps notion-shell to v0.4.0. npm deps added: @dnd-kit/core, @dnd-kit/sortable, @dnd-kit/utilities.

notion-shell (NEW components)

  • components/SortableBlockList.tsx — @dnd-kit render-prop wrapper for block reorder
  • components/PageActionsMenu.tsx — header dropdown (add cover / favorite / duplicate / export / trash)
  • components/blocks/ImageRenderer.tsx — URL + caption + preview, click to edit
  • components/blocks/EmbedRenderer.tsx — YouTube/Vimeo/Loom/Figma/CodePen/Spotify auto-detect + iframe fallback

notion-shell (extended)

  • components/NotionPage.tsx — optional `cover` prop (200px image band w/ hover X button via onCoverRemove)
  • components/NotionBlock.tsx — optional `dragHandle` slot prop, mounts next to actions handle
  • types.ts — Page gains optional `cover` field
  • index.ts + slice.contract + slice.json + slice.manifest — bump v0.4.0; export 4 new components + 3 new types; @dnd-kit npm deps declared

Template touched — notion-page-clone-os

  • slices/notion-app/DocView.tsx — SortableBlockList + per-block GripVertical drag handle; PageActionsMenu in header; cover prompt + remove
  • slices/notion-app/block-renderers.tsx — image + embed renderers mapped to ImageRenderer + EmbedRenderer
  • shared/types.ts — Action gains doc.block.reorder + doc.duplicate variants
  • shared/notion-reducer.ts — reorder splice + duplicate (clone w/ fresh ids)

npm deps

  • @dnd-kit/core, @dnd-kit/sortable, @dnd-kit/utilities — sortable block list, pointer + keyboard sensors

Catalog

  • lib/content/slices.ts — notion-shell v0.4.0 description + tags (drag/cover/embed)
  • lib/content/layouts.ts — notion-page-clone-os deps + shadcnComponents already cover dnd-kit usage

Notion-clone parity status (post-BJ)

  • Page editor: slash menu ✓ · actions menu (turn-into/duplicate/delete) ✓ · inline-markdown decorator ✓ · drag-handle reorder ✓ · cover image ✓ · page actions ✓
  • Database: 6 views (Table/Board/List/Gallery/Calendar/Feed) ✓ · sort/filter/search ✓ · column header menu ✓ · 10 property cells ✓
  • Block renderers: equation ✓ · code ✓ · divider ✓ · toggle ✓ · callout ✓ · image ✓ · embed ✓
  • Deferred (next): inline `/` slash-key trigger in caret-position popover, drag-fill selection grid, comments/mentions/snapshots (covered by separate slices in nosion — lift if needed)
MAY202026
FeatureBI-waveMay 20, 2026

notion-shell database depth — 6 views (Table/Board/List/Gallery/Calendar/Feed) + view tabs + sort/filter/search + column header menu + 10 property cells

notion-shell databases level up from a single-table surface to a 6-view dispatcher matching Notion's view canon. (1) ViewTabs — horizontal tab strip + add-view dropdown (Table/Board/List/Gallery/Calendar/Feed), double-click tab to remove. (2) ViewOptions — popover with sort (multi-prop, asc/desc), filter (contains/equals/empty/checked + 6 ops), search (any-prop substring). (3) ColumnHeaderMenu — per-column dropdown: rename + change type + sort asc/desc + hide + delete. (4) 6 view components — TableView (Notion-canonical), BoardView (kanban grouped by select/status), ListView (compact), GalleryView (3-up card grid), CalendarView (month grid bucketed by date prop), FeedView (chronological by updatedAt). All views share the ViewProps contract; host can override via VIEW_REGISTRY. (5) property-cells.tsx — 10 cell renderers extracted into a single switch helper: text/number/checkbox/select/status/multi_select/date/url/email/phone. NotionProperty delegates rendering to it. (6) lib/viewData.ts — pure applyView() (filter + sort + search), groupBy() (board), bucketByDate() (calendar). (7) NotionDatabase rewritten as orchestrator — owns header + ViewTabs + ViewOptions + ColumnHeaderMenu wiring; dispatches the active view via VIEW_REGISTRY. (8) Template wired — DatabaseView passes the 4 new onView* callbacks; seed.ts gains 3 default views on the Roadmap DB (All table / Board / Feed); reducer gains db.view.activate/add/remove/config split into notion-db-reducer.ts to stay under the 200-LOC cap. Bumps notion-shell to v0.3.0.

notion-shell (NEW components)

  • components/ViewTabs.tsx — horizontal tab strip + add-view dropdown
  • components/ViewOptions.tsx — sort + filter + search popover
  • components/ColumnHeaderMenu.tsx — per-column dropdown (rename/type/sort/hide/delete)
  • components/property-cells.tsx — 10 per-type cell renderers
  • components/views/{Table,Board,List,Gallery,Calendar,Feed}View.tsx — 6 view components
  • components/views/index.ts — VIEW_REGISTRY default map + barrel
  • components/views/types.ts — shared ViewProps contract

notion-shell (NEW lib)

  • lib/viewData.ts — applyView (filter + sort + search) + groupBy + bucketByDate

notion-shell (rewritten)

  • components/NotionDatabase.tsx — orchestrator: header + ViewTabs + ViewOptions + active view dispatch via VIEW_REGISTRY; 4 new onView* callbacks (activate/add/remove/configChange) + onPropertyUpdate
  • components/NotionProperty.tsx — delegates value rendering to renderPropertyCell (10 types)
  • index.ts + slice.contract + slice.json + slice.manifest — bump v0.3.0; export 9 new components + 7 new utils + 5 new types

Template touched — notion-page-clone-os

  • slices/notion-app/DatabaseView.tsx — wire onViewActivate/Add/Remove/ConfigChange + onPropertyUpdate
  • shared/seed.ts — Roadmap DB ships 3 default views (All/Board/Feed)
  • shared/types.ts — Action gains db.view.activate/add/remove/config variants
  • shared/notion-reducer.ts — refactored; db.* cases moved to notion-db-reducer.ts to stay under 200-LOC cap
  • shared/notion-db-reducer.ts — NEW; all db.* reducer cases (property/row/view CRUD)

Catalog

  • lib/content/slices.ts — notion-shell v0.3.0 (6 views + 10 cells + view tabs/options/column menu)
  • lib/content/layouts.ts — files list adds shared/notion-db-reducer.ts

Up next (BJ)

  • BJ-wave — polish: DnD-kit drag handle, cover image revive, image/embed block renderers, page actions menu, slash-key trigger inline
MAY202026
FeatureBH-waveMay 20, 2026

notion-shell page-editor depth — slash menu, actions menu, live inline-markdown decorator, toggle + callout renderers

notion-shell wrappers level up from barebones contentEditable to a Notion-grade editing surface. (1) <SlashMenu> — searchable block-type picker with keyboard nav (↑↓ Enter Esc), 18-spec baseline (text / h1-h3 / todo / bullet / numbered / toggle / quote / callout / code / equation / image / divider / page / database / table / embed). (2) <BlockActionsMenu> — popover with turn-into submenu + duplicate + delete, current type marker. (3) <InsertBlockButton> — "+ Add block" trigger wrapping SlashMenu in a popover with search input. (4) Live inline-markdown decorator — caret-preserving, IME-safe DOM pass that wraps **bold** _italic_ ~~strike~~ `code` $math$ [label](url) markers in semantic tags inside the contentEditable. Source-of-truth stays plain text (innerText round-trips verbatim) so the host store reads source markers, not decorated HTML. Headings hide markers visually via zero-size span. (5) NotionBlock extended — hover reveals "⋯" actions handle when onTurnInto provided; runs decorator on mount + every input (skipping composition); composition-end handler for IME. (6) Template wired — DocView's fixed +paragraph/+h2/+list buttons replaced with one InsertBlockButton; toggle + callout block-renderers added (ChevronRight expand + Lightbulb callout); notion-reducer gains doc.block.duplicate + doc.block.turnInto actions; types.ts adds matching Action variants. Slash-key trigger (`/` in block → menu opens at caret) deferred to BJ-wave alongside drag handle + cover + image/embed renderers. Bumps notion-shell to v0.2.0.

notion-shell (NEW components)

  • components/SlashMenu.tsx — searchable block-type picker w/ keyboard nav
  • components/BlockActionsMenu.tsx — turn-into / duplicate / delete popover
  • components/InsertBlockButton.tsx — `+` trigger w/ SlashMenu + search input

notion-shell (NEW lib)

  • lib/blockSpecs.ts — 18-spec BLOCK_SPECS registry + specFor() lookup
  • lib/inlineMd.ts — pure tokenizer (Slack model: **bold** _it_ ~~s~~ `code` $math$ links)
  • lib/inline-decorator/caret.ts — getCaretOffset / setCaretAtOffset (DOM-walk, BR-aware)
  • lib/inline-decorator/decorate.ts — decorateLineToFragment (pure DOM construction)
  • lib/inlineDecorator.ts — decorateInPlace facade (caret save → mutate → restore)

notion-shell (extended)

  • components/NotionBlock.tsx — decorator pass on mount + input, IME-safe, hover "⋯" actions handle
  • index.ts + slice.contract + slice.json + slice.manifest — bump v0.2.0, export 3 new components + 8 new utils + 2 new types

Template touched — notion-page-clone-os

  • slices/notion-app/DocView.tsx — InsertBlockButton replaces fixed +block bar; NotionBlock wired with onTurnInto + onDuplicate
  • slices/notion-app/block-renderers.tsx — toggle + callout specialised renderers added
  • shared/types.ts + shared/notion-reducer.ts — doc.block.duplicate + doc.block.turnInto actions

Catalog

  • lib/content/slices.ts — notion-shell v0.2.0 description + tags + recipe (slash-menu / decorator / wysiwyg)
  • lib/content/layouts.ts — notion-page-clone-os files list adds shared/notion-reducer.ts

Up next (BI + BJ)

  • BI-wave — database depth: view tabs + Board/List/Gallery/Calendar/Feed + sort/filter/search + column-header menu + multi-select/date/status/url/email/phone cells
  • BJ-wave — polish: DnD-kit drag handle, cover image revive, image/embed block renderers, page actions menu, slash-key trigger in NotionBlock
MAY202026
FeatureBG-waveMay 20, 2026

Admin Panel chassis + 3-group sidebar (Pages / Features / Admin Panel) on all 8 templates

Big foundation wave so the next batch can sync real implementations from notion-page-clone + superspace into the admin-panel blocks. Three slices land here. (1) Admin Panel chassis at _shared/admin-panel/ — FeatureBlock registry, buildAdminPanelNav helper, AdminPanelOverview grid, AdminFeatureCard placeholder, AdminFeatureStubPage shared route renderer. 6 stub blocks ship: AI Config, Analytics, User Management, Audit Log, Webhooks, Settings — each annotated with the rr slice that will power it (ai-router, event-tracking, rbac-roles, audit-log). (2) All 7 flat-nav templates migrated to grouped nav: buildAdminNav(state) returns [Overview, Pages, Features, Admin Panel] groups derived from the legacy buildAdminPrimaryNav so per-template source of truth stays in one place. saas-marketing-os Admin Panel group added too. (3) 48 admin-panel route stubs scaffolded across 8 templates (6 features × 8 templates) — each calls the shared AdminFeatureStubPage. Plus BG-D Advanced primitives chassis (workspace-switcher, secondary-sidebar, dashboard-shell-advanced — opt-in, no canary yet) and BG-E public-nav CRUD primitives (types + reducer with auto-shift orders + resolvePublicNavHref helper — per-template wiring deferred). BG-F: each template's landing page seed flagged with isLanding: true (forward-compat for landing-as-page migration). CMS vs Admin Panel architectural distinction documented in dashboard-vision.md.

Templates touched (3-group sidebar + 48 admin-panel routes)

  • saas-marketing-os — Admin Panel group added; 6 stub routes scaffolded
  • personal-brand-os — migrated to grouped nav; Admin Panel group + 6 stubs
  • agency-studio-os — migrated to grouped nav; Admin Panel group + 6 stubs
  • konsultan-os — migrated to grouped nav; Admin Panel group + 6 stubs
  • kreator-studio-os — migrated to grouped nav; Admin Panel group + 6 stubs
  • riset-kit — migrated to grouped nav; Admin Panel group + 6 stubs
  • wirausaha-os — migrated to grouped nav; Admin Panel group + 6 stubs
  • notion-page-clone-os — migrated to grouped nav; Admin Panel group + 6 stubs

Admin Panel chassis (_shared/admin-panel/)

  • feature-blocks.ts NEW — FeatureBlock type + ADMIN_PANEL_BLOCKS registry (6 blocks) + buildAdminPanelNav helper
  • AdminFeatureCard.tsx NEW — placeholder card with icon + description + 'powered by <slice>' hint
  • AdminPanelOverview.tsx NEW — grid of feature-block cards at /dashboard/admin/admin-panel
  • AdminFeatureStubPage.tsx NEW — shared route renderer (every per-template stub calls it)

Advanced primitives chassis (BG-D — opt-in, no canary yet)

  • _shared/types/common.ts — WorkspaceContext + SecondaryNavItem types
  • _shared/ui/workspace-switcher.tsx NEW — opt-in workspace-CONTEXT picker (multi-tenant). Lifted from notion-page-clone pattern. ⌘N keyboard hints not included this wave
  • _shared/ui/secondary-sidebar.tsx NEW — narrow contextual sub-nav + SecondarySidebarLayout wrapper (three-column composition)
  • _shared/ui/dashboard-shell-advanced.tsx NEW — composes admin-sidebar + workspaceSwitcher headerSlot + secondary-sidebar slot in main
  • _shared/ui/admin-sidebar.tsx — headerSlot prop added so DashboardShellAdvanced can swap BrandHeader for WorkspaceSwitcher

Public-nav CRUD chassis (BG-E — primitives only, per-template wiring deferred)

  • _shared/public-nav/types.ts NEW — PublicNavItem (label + pageRef OR href + order + enabled), PublicNavSlice, PublicNavAction
  • _shared/public-nav/reducer.ts NEW — publicNavReducer with auto-shift orders + resolvePublicNavHref helper (binds pageRef → page slug)

Forward-compat (BG-F)

  • 7 templates' pages-seed.ts — landing page (slug: "") flagged with isLanding: true. Sets up BH landing-as-page migration without changing runtime behavior

Docs

  • docs/architecture/dashboard-vision.md — Three sidebar groups (Pages / Features / Admin Panel) documented; CMS vs Admin Panel best practice (siblings, not nested) explained

Up next (BH-wave)

  • Sync notion-page-clone + superspace slices into admin-panel blocks (replace stubs with real implementations — AI Config from ai-router, Analytics from event-tracking, Users from rbac-roles, Audit from audit-log)
  • Wire notion-page-clone-os as DashboardShellAdvanced canary (workspace switcher + secondary sidebar live)
  • Per-template public-nav CRUD wiring (state.publicNav + admin /navigation editor + site-nav reads from state)
  • Landing-as-page full migration (drop state.landingSections in favor of isLanding Page.sections)
  • Extract landing-sections as installable rr slice
MAY202026
FeatureBF-waveMay 20, 2026

Dynamic Pages sidebar — every admin-created page becomes a menu item live

Sidebar now reflects the Pages CRUD store directly. Operator hits 'New page' in /admin/pages, fills the form, saves — the new page appears as a Pages-group sub-item in the sidebar immediately. No manual nav wiring. Implementation: pure helper `buildCustomPageNavItems(pages, baseHref, opts)` derives AdminNavItem[] from state.pages (skips systemPages, sorts alphabetic by default, supports updated/created sort + draft filter). All 8 templates wire it — saas-marketing-os spreads it into the grouped Pages bucket; the 7 flat-nav templates spread it into the Pages parent's children[]. Re-render is free because shell-client already subscribes to useStore(). Sets up BF-B / BF-C (landing-as-page + public nav CRUD) by proving the data-driven nav pattern works.

Templates touched (all 8 — Pages group now data-driven)

  • saas-marketing-os — custom pages appended to Pages group (grouped nav)
  • personal-brand-os — custom pages appended to Pages parent children
  • agency-studio-os — custom pages appended to Pages parent children
  • konsultan-os — custom pages appended to Pages parent children
  • kreator-studio-os — custom pages appended to Pages parent children
  • riset-kit — custom pages appended to Pages parent children
  • wirausaha-os — custom pages appended to Pages parent children
  • notion-page-clone-os — custom pages appended to Pages parent children

Chassis

  • _shared/pages/nav-builder.ts NEW — buildCustomPageNavItems(pages, baseHref, opts) helper. Filters systemPages, sorts alphabetic / updated / created, supports published-only filter, default lucide FileText icon

Per-template wiring (8 nav-config.ts files)

  • Each nav-config imports buildCustomPageNavItems
  • Pages group / Pages-parent children spreads the helper's output after the static items

Up next (BF-B onwards)

  • BF-B — Landing-as-page migration: drop state.landingSections[] in favor of the landing-flagged Page.sections[]
  • BF-C — Public nav CRUD: admin can add / rename / reorder PUBLIC_NAV items + bind each to any page (including custom)
  • BF-D — Propagate BE's grouped Pages/Features nav to the 7 flat-nav templates (audit-by-template — konsultan-os Projects + Contact belong under Pages)
  • BF-E — Build Advanced primitives (workspace-switcher / secondary-sidebar / dashboard-shell-advanced) + wire notion-page-clone-os canary
  • BF-F — Extract landing-sections as installable headless CMS slice
NewerPage 22 / 25Older