rmnr
DocsLayoutsModulesDirectoryBest PracticeAgentsInstall

Command Palette

Search for a command to run...

New
  • Introduction
  • Installation
  • Architecture
  • Stack
  • Directory
  • Install with Agent
    new
  • Bundle Builder
    new
  • MCP server
    new
  • VPS Control Room
    new
  • Changelog
    new
  • All website templates
    new
  • Personal Brand OS
  • Agency Studio OS
  • Notion Page Clone OS — localStorage demo (pointer to open-silong for production)
  • SaaS Marketing OS
  • Kreator Studio OS
  • Konsultan OS
  • Wirausaha OS
  • Riset Kit
  • All layouts
  • 19
  • 3
  • 6
  • All slices
    new
  • 2
  • 2
  • 6
  • 3
  • 3
  • 1
  • 1
  • 7
  • 25
  • 6
  • All recipes
Release notes

Changelog

What changed in each rr release. Full prose history in CHANGELOG.md.

MAY212026
ImprovementCI-waveMay 21, 2026

split notion-database out of notion-shell — database is now an optional module

User report after deep-comparing rr's notion-shell with the full notion-page-clone upstream: 'copy semua dari notion clone kecuali database sebagai opsional, karena bisa saja butuh database inline, bisa saja tidak, notion database akan menjadi features module sendiri tapi di gabung di website template'. EXECUTED: extracted the database surface from notion-shell into a NEW dedicated `notion-database` slice. Consumers can now install notion-shell ALONE for pages + sidebar + block editor without the database weight, OR add notion-database when they want embedded DBs. Both compose in the notion-page-clone-os website template (DocView imports from notion-shell, DatabaseView imports from notion-database). FILES MOVED from notion-shell → notion-database: components/{NotionDatabase, NotionProperty, ViewOptions, ViewTabs, ColumnHeaderMenu, property-cells}, components/views/* (TableView/BoardView/ListView/GalleryView/CalendarView/FeedView + types + registry), lib/viewData.ts. DOMAIN TYPES (Database, Property, PropertyValue, DbView, DatabaseViewConfig, DatabaseFilter, DatabaseSort, SelectOption, NumberFormat, PropertyType) STAY IN notion-shell — they're the single source of truth (Page.rowOfDatabaseId + rowProps reference them) — notion-database re-exports them as a convenience. Avoids circular shell↔database imports. PEER DECLARED: notion-database lists notion-shell as a peer (^0.4); npx rr add notion-database cascades the shell. SCHEMA CHANGES: notion-shell slice.json + slice.contract.ts + slice.manifest.json updated (no longer claims database components). NEW slice files for notion-database. CATALOG: new notion-database entry with notion-like tag set + tagline + agentRecipe + previewPath. /preview/slices/notion-database route built — minimal real DB demo with 3 views (Table / Board grouping by status / List), 6 property types (text/status/select/multi_select/date/checkbox), 5 seed rows. Audit chain green: 45 slices (was 44), all ≤200 LOC.

Files moved (notion-shell → notion-database)

  • components/NotionDatabase.tsx + NotionProperty.tsx + ViewOptions.tsx + ViewTabs.tsx + ColumnHeaderMenu.tsx + property-cells.tsx
  • components/views/ — TableView / BoardView / ListView / GalleryView / CalendarView / FeedView + types + index registry
  • lib/viewData.ts (applyView + groupBy + bucketByDate)

Domain types — stay in notion-shell (single source)

  • Database, Property, PropertyValue, DbView, DatabaseViewConfig, DatabaseFilter, DatabaseSort, SelectOption, NumberFormat, PropertyType
  • Page references these via rowOfDatabaseId + rowProps — moving them to notion-database would create circular shell↔database imports
  • notion-database/types.ts re-exports them as a convenience for downstream consumers

Catalog

  • NEW notion-database — optional embeddable DB surface
  • notion-shell description + tagline updated — split is documented
  • Slice count: 44 → 45. Audit green.

Consumer wiring

  • DatabaseView.tsx (notion-page-clone-os template) — import path moved from notion-shell → notion-database
  • preview/slices/notion-shell/page.tsx — NotionDatabase imported from notion-database instead of notion-shell
  • /preview/slices/notion-database — NEW route, 5 seed rows × 6 property types × 3 views (Table/Board-by-status/List)

Followup (deferred)

  • CJ-wave (next) — lift more from upstream into notion-shell: editor depth (ColumnLayoutGroup, MentionTypeahead, SelectionToolbar, ColumnBlockEditor, RowPropertiesPanel), sidebar depth (WorkspaceSwitcher, NavUser, DragGhost, PagesPanel, SortablePageRow), provided they're pure-UI and not convex-coupled
  • CK-wave (later) — lift more database views from upstream into notion-database: ChartView, DashboardView, FormView, MapView, TimelineView (currently rr has 6 of 11)
MAY212026
ImprovementCH-waveMay 21, 2026

slice catalog polish — 6 NEW preview routes (404 fix) + tagline field for compact cards

User report: '/preview/slices/<slug>' returned 404 for 6 slices (the 4 CF-wave additions + 2 pre-existing — equation / code-block / notifications / database-cell-selection / theme-presets / files). All had `previewPath` in the catalog but no actual route file → clicking 'Try it' from the catalog card hit a 404. ALSO USER: 'descripsinya terlalu panjang dan user mungkin tidak perlu baca juga, kalau perlu pindahkan ke bagian detail' — descriptions too long, move long-form to detail tabs. TWO FIXES IN ONE WAVE. (1) Built 6 missing preview routes — each is a minimal interactive demo of the slice. equation: 4 LaTeX sample switcher + KaTeX live. code-block: editable TS snippet with language picker + copy. notifications: bell + popover demo. database-cell-selection: 5×3 grid with click-select + drag-fill. theme-presets: ThemePicker swatch grid (30+ presets, click swaps CSS vars live). files: localStorage adapter demo with upload + chip list. Each ≤60 LOC. (2) Added optional `tagline?: string` field to SliceEntry — short 1-sentence hook (≤ ~140 chars) shown in catalog cards + related-slice cards + detail-page subtitle. Full `description` preserved (canonical reference, shown on detail page only). Catalog card + detail subtitle + related-slices now read `tagline ?? description` with fallback. 10 entries got taglines this wave — the 4 CF additions (notion-style primitives) + theme-presets, files, notion-shell, notion-blocks, icon-picker, command-menu, convex-auth, ai-chat, landing-sections. Remaining 45 entries fall back to the old description (still works, just not yet shortened). Backfill is an opt-in chore — entries without tagline keep behaving as before.

NEW preview routes (6, fixes 404)

  • /preview/slices/equation — LaTeX sample switcher + KaTeX live
  • /preview/slices/code-block — editable TS + language picker + copy
  • /preview/slices/notifications — bell + frequency popover
  • /preview/slices/database-cell-selection — 5×3 grid + drag-fill
  • /preview/slices/theme-presets — ThemePicker swatch grid (30+ presets)
  • /preview/slices/files — localStorage adapter demo (upload + chip list)

Schema change

  • SliceEntry: NEW optional `tagline?: string` (≤ ~140 chars, 1 sentence). When set, catalog cards + related-slice cards + detail-page subtitle render tagline instead of description. Full description preserved + shown in detail page body.
  • catalog page (/slices) + slice-detail-client + use-related-groups all use `tagline ?? description` fallback — entries without tagline behave exactly as before

Taglines added (10 entries)

  • equation, code-block, notifications, database-cell-selection (the 4 CF-wave Notion peers)
  • theme-presets, files, notion-shell, notion-blocks, icon-picker, command-menu
  • convex-auth, ai-chat, landing-sections

Followup

  • Tagline backfill for remaining ~42 entries — opt-in chore. Worst remaining offenders: subscribers (447), hero (433), portfolio-section (414).
MAY212026
FixCG-waveMay 21, 2026

subdomain 404 fix — proxy passes through already-prefixed /preview/<slug>/ URLs

User report: 'banyak module features yang 404' (many module/features 404 on subdomains). ROOT CAUSE: every template's nav-config.ts uses ADMIN_PANEL_BASE = `/preview/<slug>/dashboard/admin` as the href root for sidebar links — those URLs are correct on the canonical resource.rahmanef.com but DOUBLE-NEST when clicked on a demo subdomain (proxy.ts re-rewrites `/preview/konsultan-os/dashboard/admin/clients` → `/preview/konsultan-os/public/preview/konsultan-os/dashboard/admin/clients`, the catch-all renders notFound() = page-not-found inside the template chrome with HTTP 200, looks like a broken endpoint). VERIFIED: every internal sidebar click on every demo subdomain was affected — admin/clients, admin/proposals, admin/contracts, admin/projects, admin/billing, admin/documents, admin/pages, admin/landing, admin/settings (~9 routes per template × 8 templates = ~72 broken links). FIX: 7-line proxy guard — if request path is already correctly nested under /preview/<slug>/ for this subdomain's resolved slug, pass through unchanged. canonical resource.rahmanef.com still works (different subdomain → falls through to default route). Subdomain root URL (demo-X.rahmanef.com/) still rewrites to /preview/<slug>/public. /admin shortcut still rewrites to /preview/<slug>/dashboard/admin. Single-file fix in proxy.ts (~7 LOC + comment). Aesthetic follow-up (clean URLs via short forms in nav-config) deferred to a future wave — current fix restores function without changing what's in the URL bar.

Behavior before / after

  • BEFORE: demo-konsultan.rahmanef.com/preview/konsultan-os/dashboard/admin/clients → notFound() rendered (header shows '404')
  • AFTER: same URL passes through, renders the real Clients admin page
  • Unchanged: /admin/clients shortcut still rewrites; / still rewrites to public; /contact still rewrites to public/contact

Audit

  • Slice catalog: 55/55 endpoints already returned 200 on canonical site (pre-fix scan)
  • Layout catalog: 36/36 endpoints 200
  • Docs section: 15/15 endpoints 200
  • Subdomain admin sidebar nav: ~72 broken links across 8 templates pre-fix — all unblocked post-fix

Followup (deferred)

  • Nav-config could emit subdomain-short URLs (/admin/clients) when running under a demo subdomain — would give cleaner URL bar. Requires context-aware Link wrapper. Defer to CH-wave.
MAY212026
ImprovementCF-waveMay 21, 2026

notion peer slices surfaced — 4 NEW catalog entries + adaptation audit

User asked: 'berapa persen pengadaptasian notion clone? berapa slices notion yang sudah terdaftar? tolong update slices features yang notion related, jadi search notion akan muncul list slicesnya.' Audit + fix landed in one wave. AUDIT: upstream notion-page-clone has 37 slices on disk; rr previously had 6 catalog entries tagged `notion-like` (command-menu, icon-picker, notion-blocks, notion-shell, theme-presets, files) — but notion-blocks is a BUNDLE that wraps 4 peer slices (equation, code-block, notifications, database-cell-selection) which existed on disk but had ZERO standalone catalog entries. Search for `notion` / `katex` / `highlight.js` did NOT surface them. ADAPTATION %: catalog entries 6/37 = 16% → 10/37 = 27%; lifted concepts 12/37 = 32%; UI-shareable surface coverage 12/15 = 80% (22 convex-coupled upstream slices remain blocked-pending-adapter per BS-wave audit). FIX: 4 standalone catalog entries added — equation (Notion-style KaTeX block), code-block (Notion-style syntax-highlighted code), notifications (Notion-style per-page Notify Me), database-cell-selection (Notion-style drag-fill + multi-select). Each entry: notion-inspired description, full `notion` + `notion-like` tag set, agentRecipe for AI installers, previewPath, npm + shadcn deps, source pointed at notion-page-clone. Total: 4 new entries × ~22 LOC = 88 LOC. Search now surfaces 10 notion-related slices when typing `notion`.

NEW catalog entries (4)

  • equation — Notion-style KaTeX block primitive
  • code-block — Notion-style syntax-highlighted code primitive
  • notifications — Notion-style per-page Notify Me popover
  • database-cell-selection — Notion-style drag-fill + multi-select

Search 'notion' now returns 10 slices

  • command-menu, icon-picker, notion-blocks, notion-shell, theme-presets, files (existing 6)
  • equation, code-block, notifications, database-cell-selection (NEW 4)

Adaptation % — three framings

  • Catalog entries: 10 / 37 upstream slices = 27%
  • Lifted concepts: 12 / 37 = 32% (treating bundles as multi-concept; notion-shell wraps editor + workspace-sidebar + databases + cover)
  • UI-shareable coverage: 12 / 15 = 80% (22 upstream slices are convex-coupled and remain blocked-pending-adapter)

Remaining blocked (per BS-wave audit, future waves)

  • Convex-coupled (need adapter pattern): admin-panel, ai-agent, analytics, backlinks, comments (rr has own different impl), dashboard, database-csv/json/presets/templates, databases, editor, feedback, inbox, library, snapshots, templates, trash, wiki, workspace-io, workspace-members, workspace-sidebar
  • Missing shared primitives in rr: responsive-dialog, responsive-alert-dialog (block several lifts)
  • lucide-react version drift (rr ^1.16 vs notion-page-clone ^0.462) — affects icon-picker variants
MAY212026
FeatureCE-waveMay 21, 2026

audit-log diff tree — expandable event rows showing before/after JSON

Second per-block depth feature. Audit events that carry a `diff` field (Record<key, {before, after}>) are now CLICKABLE — the row becomes a button, hover-highlights, and on click expands an inline diff tree showing each changed field as a key + before / after pair side-by-side (rose for before, emerald for after, monospace, JSON-stringified for objects / arrays / nulls / numbers / booleans, quoted for strings). Type update: AuditEventRow gains optional `diff?: Record<string, { before: unknown; after: unknown }>` field — mirrors frontend/slices/audit-log AuditEvent shape. Seed update: 4 update events (role editor permissions, page pricing tiers, brand colors, owner transfer) now carry real diff data alongside their diffSummary preview line. Events without diff render as before (no chevron, not interactive). a11y: aria-expanded on the row button, aria-label describes the toggle target. Animation: chevron rotates 180° when expanded via CSS transform transition. Pattern: this is the per-block-depth shape every block can follow — keep the row compact, surface the depth via expansion. Aligns with what a 'real' audit-log impl always has: nobody just wants 'X changed Y'; they want to see what changed.

NEW + MODIFIED

  • _shared/admin-panel/blocks/audit-log/diff-tree.tsx — NEW (62 LOC). DiffTree + DiffValue tone-rendered key/before/after grid
  • _shared/admin-panel/blocks/audit-log/event-row.tsx — row becomes button when diff present; rotates chevron; expands DiffTree below
  • _shared/admin-panel/blocks/audit-log/types.ts — adds optional diff field to AuditEventRow
  • _shared/admin-panel/blocks/audit-log/seed.ts — 4 events gain real diff data (role permissions, pricing tiers, brand colors, ownership transfer)
  • _shared/admin-panel/blocks/audit-log/AuditLogBlockView.tsx — tracks expandedId state, passes expand handlers to EventRow

Demo events with diff (clickable)

  • ev_13 — Editor role permissions: +manage:workflows
  • ev_10 — Pricing tier 2: $99 → $129 + label change
  • ev_7 — Brand colors: primary + primaryForeground hex swap
  • ev_2 — Owner role transfer: u_old → u_1 + transferredAt timestamp

Pattern lesson

  • Per-block depth: compact row + expandable detail. Replicable for webhooks (full request/response inspect), settings (audit log of own changes), users (per-user role history).
  • Real impl will reuse DiffTree as-is — the component takes `Record<key, {before, after}>` which matches the audit-log slice's contract.
MAY212026
FeatureCD-waveMay 21, 2026

webhooks Test button — live mock POST → delivery row prepended

First per-block depth feature after CC adapter pattern. Clicking the per-endpoint Test button now FIRES a synthetic delivery — bindings.fire(endpointId, event?) generates a delivery with random physics (70% delivered / 20% retry / 10% failed, 60-220ms latency on success, 5s on hard fail), prepends it to the deliveries list, and bumps the endpoint's lastDeliveryAt + failingRetries counters. The Recent deliveries tab updates in real time. Paused endpoints disable the Test button with an explanatory tooltip. Side effect: a hard-failed test marks the endpoint status as 'failing' — so a few rapid Tests on a 'good' endpoint can trip the failing state, demonstrating how the real system would surface intermittent endpoint health. Demo physics are intentionally rough (70/20/10) to make the demo feel alive without requiring 10 clicks to see a non-200. EXTRACTED rollDeliveryStatus() helper in bindings.tsx so a Convex impl can override the physics with real HTTP results. Side cleanup: DeliveryTable refactored to take {deliveries, endpoints} as props (single source of truth from the orchestrator's bindings), avoiding the multi-consumer-of-bindings duplicate-state pitfall.

Behavior

  • Click Test → new delivery row appears at top of the Recent deliveries tab
  • Endpoint lastDeliveryAt updates; failingRetries increments on retry/fail
  • Paused endpoints disable Test (tooltip: 'Resume endpoint to fire')
  • Hard-failed fire bumps endpoint status to 'failing' — visible in the Endpoints tab badge

Files

  • bindings.tsx — adds fire() to WebhooksBindings + rollDeliveryStatus helper (95 LOC)
  • endpoint-row.tsx — Test button wired to onFire prop; disabled when paused
  • WebhooksBlockView.tsx — passes onFire={() => fire(e.id)} to each row
  • delivery-table.tsx — takes {deliveries, endpoints} props (was bindings — fixes multi-consumer duplicate-state pitfall)

Pattern lessons

  • Default-fallback bindings (no Provider) → ONE consumer per block, or share via props. Don't call useDefault*Bindings twice in the same render tree.
  • Children that need block data either consume bindings (single consumer) or take props (multi consumer). Provider-wrap-self pattern deferred.
MAY212026
ImprovementCC-waveMay 21, 2026

adapter pattern propagated — all 6 admin-panel blocks now go through bindings

Follow-up to CB users-canary. The 5 remaining blocks (audit-log / ai-config / analytics / webhooks / settings) now each ship a bindings.tsx exposing a typed `<Block>Bindings` shape, a `useDefault<Block>Bindings()` hook (in-memory + SEED, the demo default), a `<Block>BindingsProvider value={...}>` context wrapper, and a `use<Block>Bindings()` consumer with default-fallback. Each BlockView refactored to consume via the hook instead of inline useState/SEED imports — all 6 views are now data-source agnostic. ZERO user-visible change (same seeded data, same optimistic mutations). FOUNDATION COMPLETE: any future Convex / REST / external-auth wire-up is a Provider override, not a view edit. PER-BLOCK bindings shape: audit-log = events + isLoading + optional logEvent; ai-config = config + moderation + isLoading + 4 mutators; analytics = kpis + series + sources + topPages + funnel + isLoading (read-only); webhooks = endpoints + deliveries + isLoading + togglePause + remove; settings = identity + integrations + apiKeys + isLoading + setIdentity + revokeKey. View JSDocs preserve the BS-canary pattern explanation + add the CC-wave adapter note. Eject (per docs/architecture/eject-spec.md Phase 2) is now a per-block file-swap operation: replace bindings.tsx with the Convex variant, leave everything else.

NEW files (5)

  • _shared/admin-panel/blocks/audit-log/bindings.tsx — AuditLogBindings (37 LOC, read-mostly)
  • _shared/admin-panel/blocks/ai-config/bindings.tsx — AiConfigBindings (57 LOC, config + moderation + mutators)
  • _shared/admin-panel/blocks/analytics/bindings.tsx — AnalyticsBindings (46 LOC, read-only)
  • _shared/admin-panel/blocks/webhooks/bindings.tsx — WebhooksBindings (61 LOC, endpoints + deliveries + mutators)
  • _shared/admin-panel/blocks/settings/bindings.tsx — SettingsBindings (53 LOC, identity + integrations + apiKeys + mutators)

Refactored

  • 5 BlockViews: drop inline useState/SEED, consume via use<Block>Bindings() hook
  • Demo behavior identical — same seed, same mutations, same state lifecycle

Foundation complete — what this unlocks

  • Real Convex per block: 1 file swap (bindings.tsx → useQuery + useMutation impl)
  • npx rr eject Phase 2: bindings.tsx is the per-block override seam, see eject-spec.md
  • Mock for tests: wrap with <BlockBindingsProvider value={mockBindings}> in stories / Vitest
  • External auth flows: wrap dispatcher once at root with multi-block Provider stack
MAY212026
ImprovementCB-waveMay 21, 2026

users-bindings adapter canary — block IO routed through useUsersBindings() hook

First adapter-pattern canary for the admin-panel blocks. Establishes the contract that lets a future Convex / REST / external auth swap happen WITHOUT touching the BlockView. NEW file: _shared/admin-panel/blocks/users/bindings.tsx exports `UsersBindings` type (users: UserRow[] + isLoading + changeRole + revoke), `useDefaultUsersBindings()` hook (in-memory useState + SEED — the demo default), `<UsersBindingsProvider value={...}>` context wrapper, and `useUsersBindings()` consumer hook that falls back to default when no Provider is in scope — so the demo iframe needs zero setup, but an ejected app or future Convex wire-up can plug in by wrapping the dispatcher with a Provider. UsersBlockView refactored to consume via the hook instead of inline useState/SEED — view is now data-source agnostic. Behavior identical for the demo (same SEED, same optimistic mutations). Pattern to replicate per block in subsequent waves (audit-log → CC, ai-config → CD, etc.) when Convex bindings come online. Foundation for npx rr eject (per docs/architecture/eject-spec.md Phase 2) and for the real-Convex canary that BS-wave's eject spec was always pointing toward.

NEW file

  • _shared/admin-panel/blocks/users/bindings.tsx — UsersBindings + useDefaultUsersBindings + UsersBindingsProvider + useUsersBindings (65 LOC)

Refactored

  • UsersBlockView.tsx — drops inline useState/SEED, consumes via useUsersBindings(); view now data-source agnostic
  • JSDoc updated: BS-canary pattern + CB-wave adapter pattern explanation

Why this matters

  • Real Convex swap (future): wrap dispatcher with <UsersBindingsProvider value={convexBindings}> — view code untouched
  • npx rr eject (future): bindings.tsx is the file the ejected app rewrites to wire its own backend
  • BSDL trauma avoided: no sync engine, no auto-detect, no .kitab.json — just a plain Provider override
  • Audit suggestion (BY-wave): adapter pattern next — done for users canary; 5 more blocks to follow same shape
MAY212026
ImprovementCA-waveMay 21, 2026

/docs/architecture page refresh — current state of subdomain + dispatcher + block patterns

The /docs/architecture page was stale (described the old template-base/ structure that no longer exists in this repo, didn't mention any of the BR→BZ waves). Rewritten to reflect today's actual state: (1) wildcard subdomain routing diagram (request → proxy.ts → host-resolve → path rewrite → BlockView), (2) AdminFeatureStubPage dispatcher pattern with the actual 7-line switch + an 8×6 block × template coverage matrix showing the 48-routes-from-one-dispatcher leverage, (3) per-block file shape (types + seed + view + sub-components ≤200 LOC, with shared chrome from _shared/admin-panel/ui/), (4) hard rules updated (added LOC cap + audit chain + no-marketing-chrome-on-workspace + proxy.ts-not-middleware), (5) NEW wave-progression timeline section showing BR→CA at a glance. Portfolio-grade: a viewer can understand the system in 30 seconds. Single file, 135 LOC.

Sections

  • Subdomain routing — ASCII flow diagram (proxy.ts → AdminFeatureStubPage)
  • Admin-panel dispatcher pattern — actual code + 8×6 coverage matrix
  • Block file shape — _shared/admin-panel/ui/ + blocks/<segment>/ tree
  • Hard rules — refreshed (NO Clerk / shadcn-only / copy-first / stack lock / ≤200 LOC / audit chain / no marketing chrome / proxy.ts)
  • Wave progression — BR / BS-BX / BY / BZ / CA quick timeline

What this isn't

  • Not a tutorial (Notion-clone vs Notion comparison page lives elsewhere)
  • Not a deploy guide (separate /docs section)
  • Not a slice deep-dive (per-slice pages at /slices/<slug>)
MAY212026
ImprovementBZ-waveMay 21, 2026

notion-page-clone-os — strip marketing chrome, full-bleed workspace (real Notion-like)

User request: 'tidak perlu ada header dan footer ... langsung saja workspacenya'. Template now opens directly into the Notion-clone workspace at the root URL (demo-nosion.rahmanef.com) with NO marketing header / footer / SiteShell wrapping. Behaves like the real Notion app, not a marketing site about one. CHANGES: (1) app/preview/notion-page-clone-os/public/layout.tsx — stripped SiteShell, PUBLIC_NAV, FOOTER_COLUMNS, brand object — now just Suspense + StoreProvider passthrough. Metadata preserved. (2) Dashboard.tsx h-[calc(100vh-8rem)] min-h-[640px] rounded border → h-dvh bg-background (full-bleed viewport, no rounded card). (3) DELETED dead components/templates/notion-page-clone/slices/home/ (HomePage + LandingRenderer never imported since BD-wave). (4) RESTYLED [...slug] catch-all: was meant to render custom pages INSIDE the SiteShell chrome; now renders standalone with a thin 'back to workspace' header at top + centered max-w-3xl canvas — mirrors Notion's 'publish to web' UX. Audit-bp's Pages CRUD requirement satisfied (8/8 templates have catch-all). (5) layouts.ts file manifest cleaned (HomePage.tsx ref removed). nav-config.ts kept (still consumed by the /dashboard side admin routes for ADMIN_BASE / PUBLIC_BASE / ADMIN_PANEL_BASE constants).

User-visible at demo-nosion.rahmanef.com

  • Root / → immediate Notion workspace (sidebar + welcome doc, full viewport)
  • Sidebar CRUD (create / rename / delete / move) — unchanged
  • /d/<id> → doc view, /db/<id> → database view (both full-bleed)
  • /<custom-slug> → published custom page, standalone with back-to-workspace link
  • No marketing landing, no top-navbar, no footer columns

Files

  • MODIFIED app/preview/notion-page-clone-os/public/layout.tsx — bare StoreProvider
  • MODIFIED components/templates/notion-page-clone/slices/notion-app/Dashboard.tsx — h-dvh
  • MODIFIED app/preview/notion-page-clone-os/public/[...slug]/catch-all-renderer.tsx — standalone framing
  • DELETED components/templates/notion-page-clone/slices/home/ (HomePage + LandingRenderer)
  • MODIFIED lib/content/layouts.ts — removed dead HomePage.tsx ref from manifest

Not affecting

  • Other 7 templates (konsultan / personal-brand / kreator / wirausaha / agency / saas / riset) — still keep marketing SiteShell, unchanged
  • Admin side (/admin/...) — DashboardShell + sidebar unchanged
  • Audit chain: 44 slices · 679 template files · pages-CRUD requirement still satisfied via standalone-render catch-all
MAY212026
FeatureBY-waveMay 21, 2026

files slice lifted from open-silong — storage-adapter pattern reference

The `files` slice ships as the first proof of the storage-adapter pattern that unlocks the remaining open-silong blocked-pending-adapter wave (cover, workspace-io, templates, ai-agent, inbox, feedback, workspace-members, library, mobile-nav). Slice surface: <FileUploadButton>, <FileChip>, useFileUpload(), useFileUrl() — every read/write/url-resolve flows through a host-supplied FilesAdapter (upload + remove + useUrl). Bundled adapter: useLocalStorageFilesAdapter (data-URL bucket; small files only, capped by browser localStorage quota). Host wires its own via <FilesAdapterProvider adapter={...}> — open-silong drops in a Convex-backed adapter, an S3 deployment writes an S3 adapter, the rr demo uses the bundled localStorage one. The slice itself has ZERO backend coupling; the source-of-truth lives at https://github.com/rahmanef63/open-silong and syncs lift-only via scripts/sync-to-rr.mjs.

NEW files (synced from open-silong)

  • frontend/slices/files/adapter/types.ts — FilesAdapter interface
  • frontend/slices/files/adapter/context.tsx — Provider + useFilesAdapter()
  • frontend/slices/files/adapter/localStorageAdapter.ts — bundled demo adapter
  • frontend/slices/files/{hooks,components,lib,types}/* — pure consumers of the adapter

Catalog

  • lib/content/slices.ts — new slug `files` entry with tag `notion-like` + `adapter` + `portable`
  • Pattern reference for the remaining open-silong adapter wave

Skip-list

  • open-silong-side rr-sync.json adds `convexAdapter.tsx` to skipFiles — the Convex production adapter never ships to rr, only the localStorage demo + the host-pluggable contract.
MAY212026
FeatureBX-waveMay 21, 2026

admin-panel/settings real impl — sixth + final BS-pattern block (100% block coverage)

Sixth and final admin-panel block graduates from generic AdminFeatureCard stub to a real interactive view. ALL 6 ADMIN PANEL BLOCKS NOW REAL (users + audit-log + ai-config + analytics + webhooks + settings). SettingsBlockView ships with a 4-tab layout (Identity / Integrations / API keys / Danger zone). Identity tab: live editable workspace name + URL slug (auto-sanitized to a-z0-9-) + timezone Select (7 IANA zones) + language Select (4 locales) + contact email — all wired to local state. Integrations tab: 6-service grid (Slack messaging, Resend email, Stripe payments, Vercel deploy, GitHub vcs, DOKU payments) each with connected/disconnected/error status badge, category label, status detail line, Connect/Configure/Reconnect button, and docs link. API keys tab: 3 seed keys with scope badge (read / read-write / admin), masked tail, created date + last-used relative, copy button, revoke action (wired). Danger zone: 3 destructive actions (Transfer ownership / Archive workspace / Delete workspace) with descriptive subtext and destructive Button variant. Pattern identical to prior 5: _shared/admin-panel/blocks/settings/{types, seed, view, identity-form, integration-grid, api-keys-list} + final dispatch case. AdminFeatureStubPage's comment block updated to reflect 100% coverage. AdminFeatureCard retained as fallback for any future segment added to ADMIN_PANEL_BLOCKS before a real view ships.

NEW files

  • _shared/admin-panel/blocks/settings/types.ts — WorkspaceIdentity + IntegrationStatus + Integration + ApiKey
  • _shared/admin-panel/blocks/settings/seed.ts — DEFAULT_IDENTITY + 7 TIMEZONES + 4 LANGUAGES + 6 INTEGRATIONS + 3 SEED_KEYS + tone tables
  • _shared/admin-panel/blocks/settings/SettingsBlockView.tsx — orchestrator (4-tab + DangerZone)
  • _shared/admin-panel/blocks/settings/identity-form.tsx — name + slug auto-sanitize + timezone + language + email
  • _shared/admin-panel/blocks/settings/integration-grid.tsx — 6-service status grid
  • _shared/admin-panel/blocks/settings/api-keys-list.tsx — list with revoke + masked tail + last-used relative

Dispatcher final state

  • AdminFeatureStubPage: added `if (segment === "settings") return <SettingsBlockView />;` case
  • Comment updated: BS-canary → BX-wave (2026-05-20 → 2026-05-21) — all 6 blocks real
  • AdminFeatureCard retained as the future-segment fallback

Final coverage

  • 6 / 6 admin-panel blocks real (users · audit-log · ai-config · analytics · webhooks · settings) — 100%.
  • All 8 templates inherit all 6 real blocks via the shared dispatcher. Single edit propagates to 48 admin-panel routes (8 templates × 6 blocks).
  • BS-pattern (per-block: types + seed + view + sub-components + single-line dispatch case + ≤200 LOC cap) proven end-to-end.

What's next

  • Templates pivot — real Convex bindings for blocks that have a slice (users → rbac-roles, audit-log → audit-log, analytics → event-tracking, ai-config → ai-router). Webhooks + settings need new canonical slices.
  • Optional: extract a Mermaid/SVG architecture diagram for the dispatcher → block pattern, surface on /docs.
  • Optional: build `npx rr eject` per docs/architecture/eject-spec.md when commercialize trigger fires.
MAY212026
FeatureBW-waveMay 21, 2026

admin-panel/webhooks real impl — fifth BS-pattern block

Fifth admin-panel block graduates from generic AdminFeatureCard stub to a real interactive view. WebhooksBlockView ships with a 3-tab layout (Endpoints / Recent deliveries / Payload format) inside a shadcn Tabs. Endpoints tab shows 4 seed endpoints (Zapier CRM, Slack #ops, internal audit mirror, staging sandbox) with per-row status badge (active / paused / failing), event chips, masked secret tail, Test button, and a DropdownMenu with Pause/Resume + Rotate secret + Delete — all wired to local state so toggle/remove work live. Failing endpoint shows retry counter. Deliveries tab is a 12-row table (when, endpoint, event, status badge, HTTP code, ms, attempt-multiplier marker, replay action) covering delivered/failed/retry/pending. Payload tab shows a sample event body + the HMAC-SHA256 signature header consumers must verify (with 5-min replay protection note). Pattern identical to prior 4 blocks: _shared/admin-panel/blocks/webhooks/{types, seed, view, endpoint-row, delivery-table} + single dispatch case. No canonical slice yet — schema here would seed a future frontend/slices/webhooks/.

NEW files

  • _shared/admin-panel/blocks/webhooks/types.ts — WebhookEventName (8) + EndpointStatus (3) + WebhookEndpoint + DeliveryStatus (4) + WebhookDelivery
  • _shared/admin-panel/blocks/webhooks/seed.ts — STATUS_META + DELIVERY_META tone tables + 4 endpoints + 12 deliveries + SAMPLE_PAYLOAD + SAMPLE_SIGNATURE
  • _shared/admin-panel/blocks/webhooks/WebhooksBlockView.tsx — orchestrator (header stats + 3-tab Endpoints/Deliveries/Payload)
  • _shared/admin-panel/blocks/webhooks/endpoint-row.tsx — row with Test + DropdownMenu (Pause/Resume/Rotate/Delete) + event chips + secret tail
  • _shared/admin-panel/blocks/webhooks/delivery-table.tsx — 12-row recent deliveries grid with replay button

Dispatcher update

  • AdminFeatureStubPage: added `if (segment === "webhooks") return <WebhooksBlockView />;` case

Coverage

  • 5 of 6 admin-panel blocks now real (users, audit-log, ai-config, analytics, webhooks). Only settings remains as placeholder.
  • All 8 templates' webhooks routes auto-updated via shared dispatcher.
MAY212026
FeatureBV-waveMay 21, 2026

admin-panel/analytics real impl — fourth BS-pattern block (recharts)

Fourth admin-panel block graduates from generic AdminFeatureCard stub to a real interactive view — first one to use charts. AnalyticsBlockView ships with 4 KPI cards (page views, sessions, conversion, bounce rate — each with signed delta-vs-prev-period and good/bad coloring), a 30-day stacked area chart (views + sessions, recharts via shadcn chart wrapper with proper CSS-variable theming), a traffic-source donut + legend (Direct / Organic search / Referral / Social / Email with deterministic visit counts), a 5-step conversion funnel showing drop-off % between steps, and a top-pages table (path / title / avg duration / bounce rate / views). Range chips (7d/30d/90d) wired but seed is single 30-day series. Pattern identical to BS+BT+BU: _shared/admin-panel/blocks/analytics/{types, seed, AnalyticsBlockView, traffic-chart, sources-donut, funnel-and-pages} + a single dispatch case. All 8 templates' /admin/admin-panel/analytics routes auto-updated. Backed by frontend/slices/event-tracking/ (today config-only — events schema + ingest endpoint deferred to a separate wave that wires real Convex writes).

NEW files

  • _shared/admin-panel/blocks/analytics/types.ts — DayPoint + TrafficSource + PageStat + FunnelStep + KpiCardData
  • _shared/admin-panel/blocks/analytics/seed.ts — buildSeries() deterministic 30-day series + 4 KPI cards + 5 sources + 6 top pages + 5-step funnel
  • _shared/admin-panel/blocks/analytics/AnalyticsBlockView.tsx — orchestrator (header range chips + KPI grid + chart + donut + funnel + top-pages table)
  • _shared/admin-panel/blocks/analytics/traffic-chart.tsx — recharts AreaChart with gradient fills via shadcn ChartContainer + ChartConfig
  • _shared/admin-panel/blocks/analytics/sources-donut.tsx — recharts PieChart donut + legend list with visit counts + %
  • _shared/admin-panel/blocks/analytics/funnel-and-pages.tsx — FunnelList (drop-off % per step) + TopPagesTable

Dispatcher update

  • AdminFeatureStubPage: added `if (segment === "analytics") return <AnalyticsBlockView />;` case
  • Real impl backed by event-tracking slice

Coverage

  • 4 of 6 admin-panel blocks now real (users, audit-log, ai-config, analytics). 2 still placeholder (webhooks, settings).
  • All 8 templates' analytics routes auto-updated via shared dispatcher. Zero per-template touchpoints.
MAY212026
FeatureBU-waveMay 21, 2026

admin-panel/ai-config real impl — third BS-pattern block

Third admin-panel block graduates to a real interactive view. AiConfigBlockView ships with 4 providers (Anthropic, OpenAI, Mistral, Google), 10 models across 3 tiers (fast / balanced / frontier) with per-model context window + input/output cost per 1M tokens, an active-model picker grouped by provider in a shadcn Select with full pricing metadata in each option, system prompt textarea (4000 char cap, live counter), temperature + max-output-tokens sliders, and a moderation rule list with 5 rules (toxicity threshold, PII redaction, off-topic refusal, competitor mention threshold, external-link allowlist) each toggleable via Switch with graded rules exposing a 0-1 Slider for threshold. Reset button restores defaults. Provider cards show status badge (connected / missing-key / rate-limited), masked key tail, and docs link. Pattern identical to BS+BT: _shared/admin-panel/blocks/ai-config/{types, seed, AiConfigBlockView, provider-card, moderation-row, knobs} + a single dispatch case in AdminFeatureStubPage. All 8 templates' /admin/admin-panel/ai-config routes auto-updated. Backed by frontend/slices/ai-router/ (barrel-only today, real impl deferred until a separate wave wires provider adapters + a Convex key vault).

NEW files

  • _shared/admin-panel/blocks/ai-config/types.ts — ProviderId + ProviderStatus + AiProvider + ModelTier + AiModel + ModerationRule + AiConfig
  • _shared/admin-panel/blocks/ai-config/seed.ts — 4 providers + STATUS_META + TIER_META + 10 models + DEFAULT_CONFIG + DEFAULT_MODERATION (5 rules)
  • _shared/admin-panel/blocks/ai-config/AiConfigBlockView.tsx — orchestrator (header stats + provider grid + active model card + prompt+sampling + moderation list)
  • _shared/admin-panel/blocks/ai-config/provider-card.tsx — provider tile (status badge + masked key + rotate/connect button + docs link)
  • _shared/admin-panel/blocks/ai-config/moderation-row.tsx — rule row (Switch + optional threshold Slider)
  • _shared/admin-panel/blocks/ai-config/knobs.tsx — Stat tile + Knob slider+label helpers (extracted to keep orchestrator ≤200 LOC)

Dispatcher update

  • AdminFeatureStubPage: added `if (segment === "ai-config") return <AiConfigBlockView />;` case
  • Real impl backed by ai-router slice (today barrel-only)

Coverage

  • 3 of 6 admin-panel blocks now real (users, audit-log, ai-config). 3 still placeholder (analytics, webhooks, settings).
  • All 8 templates' ai-config routes auto-updated via shared dispatcher. Zero per-template touchpoints.
MAY202026
FeatureBT-waveMay 20, 2026

admin-panel/audit-log real impl — second BS-pattern block (after Users)

Second admin-panel block graduates from generic AdminFeatureCard stub to real interactive view. AuditLogBlockView ships with 14 seed events covering all 10 actions (create/update/delete/publish/unpublish/invite/revoke/login/logout/export) across 8 entity types (page/user/role/webhook/setting/post/workflow/session) at 3 severities (info/warn/alert). Interactive filters: text search across actor + entity + diff, action chip filter (8 chips), severity chip filter (4 chips), live count badge. Each event row shows actor avatar + name, action badge with tone, entity type → entity label, optional diff summary (e.g. `permissions: +manage:workflows`), relative timestamp, IP, entity id. Pattern identical to BS Users canary: _shared/admin-panel/blocks/audit-log/{types.ts, seed.ts, AuditLogBlockView.tsx, event-row.tsx} + a single dispatch case in AdminFeatureStubPage. Single edit → all 8 templates' /admin/admin-panel/audit-log routes serve the real UI. Backed by frontend/slices/audit-log/ contract (AuditLogBindings → real Convex impl post-eject, see eject-spec.md). NEXT BLOCKS (4 remaining, one wave each): ai-config / analytics / webhooks / settings.

NEW files

  • _shared/admin-panel/blocks/audit-log/types.ts — AuditAction (10) + AuditEntityType (8) + AuditSeverity (3) + AuditEventRow shape mirroring slice's AuditEvent
  • _shared/admin-panel/blocks/audit-log/seed.ts — ACTION_META + SEVERITY_META tone tables + 14 demo events
  • _shared/admin-panel/blocks/audit-log/AuditLogBlockView.tsx — header stats + 3 severity cards + filter bar + filtered list
  • _shared/admin-panel/blocks/audit-log/event-row.tsx — EventRow + SeverityCard + formatRelative helpers (extracted to keep view ≤200 LOC)

Dispatcher update

  • AdminFeatureStubPage: added `if (segment === "audit-log") return <AuditLogBlockView />;` case
  • Users block remains live from BS-wave (unchanged)
  • Real-impl pattern backed by audit-log slice contract

Coverage

  • 2 of 6 admin-panel blocks now real (users, audit-log). 4 still placeholder (ai-config, analytics, webhooks, settings).
  • All 8 templates' audit-log routes auto-updated via shared dispatcher. Zero per-template touchpoints.
MAY202026
FeatureBS-waveMay 20, 2026

notion-like tag + theme-presets slice + lift-status audit (open-silong sync round 1)

Round 1 of pushing every nosion (open-silong) slice into rr. Outcome: 6 slices truly synced + tagged (1 NEW + 5 pre-existing), 31 slices identified as blocked-pending-adapter due to convex coupling, missing shared primitives (responsive-dialog / responsive-alert-dialog), or lucide-react version drift (rr ^1.16 vs nosion ^0.462). Tag `notion-like` added to all open-silong-derived catalog entries so consumers can filter by source upstream. Lift status audit lives upstream in docs/rr-sync/lift-status.md.

NEW slice

  • theme-presets — tweakcn theme preset loader + 30+ color schemes (no backend, pure React + Tailwind v4 + next-themes; storage key `nosion:theme-preset` preserved verbatim for back-compat)

`notion-like` tag added (5 entries)

  • command-menu — renderless ⌘K
  • icon-picker — emoji + lucide picker
  • notion-blocks — 4-primitive bundle
  • notion-shell — 18-component wrapper set
  • theme-presets — NEW (above)

Blocked-pending-adapter (31 slices, registry tracked at rr-sync.json upstream)

  • Convex coupling (admin-panel:18, editor:10, feedback:3, comments:3, ai-agent/cover/files/inbox/templates/workspace-io:2 each, plus 6 with 1 convex import) — need adapter pattern + storage-adapter interface to lift
  • Missing shared primitives — responsive-dialog, responsive-alert-dialog need lift first OR slice must adopt @/components/ui/dialog wrapper
  • lucide-react version drift — rr ^1.16 (missing Github icon used by shared/icon-picker copy); resolve via bump or icon swap
  • Nosion-named source files (comments/adapters/nosionStandalone.ts, command-palette/adapters/NosionCommandPalette.tsx) — scrub script renames CONTENT but not file BASENAMES; need post-scrub rename step

How to query (consumers)

  • rr catalog UI filter by tag `notion-like` shows everything open-silong-derived
  • node scripts/rr-sync-status.mjs (upstream) shows file-level drift for the 6 truly-synced
  • docs/rr-sync/lift-status.md (upstream) lists every slice + status + blocker reason
MAY202026
FeatureBR-waveMay 20, 2026

Wildcard subdomain demo routing — 8 templates × portfolio-grade domain via host-based rewriter (one codebase, zero sync)

8 website templates now each get a portfolio-quality demo URL: demo-konsultan.rahmanef.com, demo-personal-branding.rahmanef.com, etc. ARCHITECTURE: all 8 subdomains resolve to the same Next.js deployment — proxy.ts inspects the Host header and rewrites /demo-<short>.rahmanef.com → /preview/<slug>/public (or /admin → /preview/<slug>/dashboard/admin). Zero fork, zero sync engine, zero webhook. Editing any template in rr → push to main → Dokploy rebuilds → all 8 subdomains reflect change in next request because they ARE the same codebase, just different entry points. CHOSEN OVER FORK-rr-per-template (rejected — 95% dead-weight: catalog, CLI, MCP, 38 other layouts) AND multi-tenant single-deployment without subdomain (rejected — no portfolio storytelling value). FILES: lib/content/template-subdomains.ts (NEW — SSOT map subdomain→slug, helpers resolveDemoSlug + getDemoUrl); proxy.ts (NEW — Next.js 16 root proxy, pass-through for _next/api/brand-assets/favicon/sitemap/robots/llms, rewrite for demo-* hosts); components/site/template-detail.tsx (Live demo button on /layouts/<slug> detail page); docs/architecture/subdomain-routing.md (NEW — full ops doc for Cloudflare wildcard DNS + Dokploy custom domain + SSL setup). MANUAL OPS REQUIRED (Rahman, one-time): (1) Cloudflare DNS add wildcard A record *.rahmanef.com → Dokploy IP, proxied. (2) Dokploy add *.rahmanef.com to resource-site deployment custom domains. (3) Verify SSL via Cloudflare proxy (orange cloud) OR Let's Encrypt DNS-01.

NEW infrastructure

  • lib/content/template-subdomains.ts — SSOT mapping (subdomain → slug); resolveDemoSlug(host) + getDemoUrl(slug) helpers
  • proxy.ts — Next 16 root proxy, host-based rewriter with safe pass-through list (_next, api, brand-assets, favicon, sitemap, robots, llms, manifest)
  • docs/architecture/subdomain-routing.md — Cloudflare + Dokploy ops walkthrough

8 demo subdomains live (after DNS+Dokploy setup)

  • demo-personal-branding.rahmanef.com → personal-brand-os
  • demo-konsultan.rahmanef.com → konsultan-os
  • demo-kreator.rahmanef.com → kreator-studio-os
  • demo-wirausaha.rahmanef.com → wirausaha-os
  • demo-riset.rahmanef.com → riset-kit
  • demo-agency.rahmanef.com → agency-studio-os
  • demo-saas.rahmanef.com → saas-marketing-os
  • demo-nosion.rahmanef.com → notion-page-clone-os

User-visible

  • Each /layouts/<slug> detail page (template subset) now shows a 'Live demo' button linking to the matching subdomain
  • Subdomain root → public landing. /admin → dashboard admin panel. localStorage isolated per subdomain.

What this is NOT

  • Not a per-template repo fork (rejected — inherits 95% dead-weight)
  • Not a per-template Convex backend (deferred — `npx rr eject` future CLI)
  • Not affecting rahmanef.com personal site (different deployment, untouched)
  • Not affecting resource.rahmanef.com canonical main site (pass-through)
MAY202026
ImprovementBQ-waveMay 20, 2026

Operasi Mise M5 — public taxonomy rollout (Features → Modules, recipes retired) + SliceEntry resourceType/domain/maturity

Final phase of Operasi Mise. Public-facing taxonomy rename + additive data model extension. CHANGES THAT USERS SEE: (1) Navbar 'Features' → 'Modules'. URL stays /slices for back-compat with inbound links + bookmarks; internal code keeps 'slice' naming (slice.json contract unchanged). (2) Command palette: 'Recipes' group removed (recipes.ts has been an empty deprecated stub since 2026-05-12), replaced with 'Modules' group sourcing from slices[]. Pages quick-action 'Recipes' → 'Modules'. (3) Homepage ShowcaseGrid kind='recipes' (which silently rendered 0 cards) → kind='slices'. Heading 'Feature recipes' → 'Modules'. (4) Hero subtitle: '{layouts} layouts, {recipes} recipes' → '{layouts} layouts, {slices} modules'. (5) Docs intro page: dropped recipe count line + Recipes card; replaced with Modules card pointing at /slices. (6) Agents page: 'recipe' → 'module'/'resource' in 4 spots. ADDITIVE DATA MODEL: SliceEntry gains optional resourceType ('primitive'|'component'|'block'|'module'), domain ('auth'|'rbac'|'cms'|'crm'|'commerce'|'payments'|'ai'|'data'|'search'|'messaging'|'admin'|'infra'), maturity ('draft'|'beta'|'stable'). None populated yet — backfill is a separate wave so site filter chips + builder UI can opt in incrementally. Resource type in resources.ts surfaces these (maturity defaults to 'stable' when omitted). recipes.ts retained as silent dead stub (10 import sites still reference it; coordinated removal is post-Mise). Mise complete: M1-M5 shipped, ready to resume development with BR (notion-page-clone sync to admin-panel real impl).

Public label renames

  • Navbar Features → Modules (top-navbar.tsx)
  • Command palette: Recipes group removed; Modules group added (sources from slices[])
  • Homepage ShowcaseGrid kind: recipes → slices
  • Hero subtitle: recipes count → slices count
  • Docs intro: Recipes card → Modules card
  • Agents page: 'recipe' → 'module' (4 mentions)

Data model extension (additive, optional)

  • SliceEntry.resourceType?: 'primitive'|'component'|'block'|'module'
  • SliceEntry.domain?: 'auth'|'rbac'|'cms'|'crm'|'commerce'|'payments'|'ai'|'data'|'search'|'messaging'|'admin'|'infra'
  • SliceEntry.maturity?: 'draft'|'beta'|'stable' (defaults to 'stable' when omitted)
  • Resource type in resources.ts surfaces all three; layout entries inherit maturity='stable'

Bug fix (side effect)

  • Homepage ShowcaseGrid kind='recipes' was rendering 0 cards (empty stub) — replaced with kind='slices' (44 cards live)

Operasi Mise complete (M1-M5)

  • M1 BL docs SSOT · M2 BM route SSOT · M3 BN resources registry · M4 BO manifest+helpers · M5 BQ taxonomy
  • Resume development next: BR — sync notion-page-clone slice into admin-panel real impl
MAY202026
ChoreBP-waveMay 20, 2026

Pivot pointer — notion-page-clone-os DEMO + notion-shell SLICE link to open-silong OSS product

Strategic positioning update. The upstream Notion-clone source (this rr's notion-shell + notion-page-clone-os) has been rebranded + open-sourced as github.com/rahmanef63/open-silong (silong.rahmanef.com, MIT). rr keeps both surfaces as DEMO + SLICE distribution; for production users (multi-workspace + auth + sharing + Convex), the rr catalog now points to the open-silong repo as the canonical product. Two-surface model documented in the upstream repo's docs/rr-sync/2026-05-20-pivot-nosion-source-of-truth.md. No code changes in rr — only catalog copy (description + agentRecipe) updates to call out the pointer.

Catalog copy updates

  • notion-page-clone-os layouts entry — title clarifies 'localStorage demo'; description calls out github.com/rahmanef63/open-silong as the production stack pointer; source field updated
  • notion-shell slices entry — agentRecipe adds product-pointer block clarifying that rr's slice is the EMBED surface and open-silong repo is the FULL PRODUCT surface

Why

  • rr monorepo (40+ slices) too broad for outside OSS contributors — focused single-product repo lowers barrier
  • Real users want Convex-backed product (auth + multi-user + sharing); rr template is localStorage demo only
  • Two-surface model: rr = template marketplace + lifted slice; open-silong = production OSS Notion clone

Sync direction unchanged

  • open-silong → rr (lift-only via scripts/rr-sync/ in open-silong repo)
  • rr never modifies the lifted source; fixes originate in open-silong + re-sync
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
MAY202026
FeatureBE-waveMay 20, 2026

Grouped admin nav (Pages / Features) + position-dropdown reorder + saas-marketing catalog fix

Four foundation pieces landing in one wave so the next batch can build on a clean chassis. (1) AdminNavGroup type — sidebar + shell accept primaryNavGroups[] alongside legacy flat primaryNav. Templates opt into grouped Pages/Features rendering one by one. (2) Position dropdown — LandingSection.order field switches from manual number input to a sibling-aware Select; reducer auto-shifts other sections on create / move / delete so two sections can never share a position. (3) Responsive overlap fix — min-w-0 on SidebarInset + main flex child prevents wide admin pages clipping under the shadcn sidebar. (4) saas-marketing-os catalog metadata corrected — adminPreviewPath + full admin file list added; description no longer claims 'no admin' (the filesystem had it all along). (5) saas-marketing-os = canary for the new grouped nav — buildAdminNav(state) returns [Overview, Pages, Features] groups; legacy buildAdminPrimaryNav kept as flatten-wrapper for backwards compat. (6) PageEntry forward-compat — isLanding?: boolean + sections?: LandingSection[] added to the type. BF-wave does the data migration (landing-as-page).

Templates touched

  • saas-marketing-os — admin entry now visible in catalog; sidebar uses Pages + Features groups

Chassis (_shared)

  • _shared/types/common.ts — AdminNavGroup type + PageEntry isLanding/sections forward-compat
  • _shared/ui/admin-sidebar.tsx — accepts primaryNavGroups optional; renders one <SidebarGroup> per group
  • _shared/ui/dashboard-shell.tsx — primaryNavGroups prop threaded; min-w-0 on SidebarInset + main
  • _shared/crud/types.ts — FieldDef kind "position" added
  • _shared/crud/CrudFieldInput.tsx — position renders sibling-aware Select
  • _shared/crud/CrudFormBody.tsx + CrudFormView.tsx + CrudRowDialog.tsx — ctx={ total, editing } threaded to fields
  • _shared/landing/landing-fields.ts — order field migrated to kind: 'position'
  • _shared/landing/reducer.ts — auto-shift sibling orders on LANDING_UPSERT + close gap on LANDING_DELETE
  • _shared/pages/types.ts — PageEntry.isLanding + sections added (forward-compat for BF migration)

Catalog

  • lib/content/layouts.ts — saas-marketing-os entry: adminPreviewPath set, 22 admin files added to files[], description corrected, 'admin' tag added

Docs

  • docs/architecture/dashboard-vision.md — BE-wave delivery summary + BF-wave plan (landing-as-page migration, public nav CRUD, propagate grouped nav to other 7 templates, build Advanced primitives, extract landing-sections as headless slice)

Up next (BF-wave)

  • Migrate landingSections[] into the landing-flagged Page.sections[] — single source of truth
  • Public nav CRUD — admin can add/rename/reorder nav items + bind to any page including custom
  • Propagate Pages/Features grouped nav to other 7 templates (audit per template — konsultan-os's Projects + Contact should live under Pages)
  • Build Advanced primitives (workspace-switcher, secondary-sidebar, dashboard-shell-advanced) + wire notion-page-clone-os as canary
  • Extract landing-sections as installable headless CMS slice
MAY202026
ImprovementBD-waveMay 20, 2026

Two-archetype dashboard direction — revert switcher; simple is the default

Corrective wave after BB / BC. BB-wave's DashboardSwitcher dropdown was the wrong primitive (shadcn TeamSwitcher applied to section toggle); BC-wave bolted multi-tenant workspaces onto personal-brand-os which doesn't need them. New direction: two opt-in archetypes. **Simple** (default) — single sidebar, BrandHeader, admin nav with collapsible sub-menus. **Advanced** (opt-in) — three-column layout with workspace switcher in the primary header and a secondary sidebar for active-section sub-nav. Simple is what 7 of 8 templates need; advanced is reserved for notion-page-clone-os and any future template with multi-tenant context + many non-CMS surfaces. The advanced primitives (WorkspaceSwitcher, SecondarySidebar, DashboardShellAdvanced) ship in BE-wave when notion-page-clone-os is wired as the canary.

Templates reverted to Simple archetype

  • saas-marketing-os — DashboardSwitcher removed, workspace route deleted
  • personal-brand-os — workspace surface fully reverted (state + reducer + views + seed); storageKey pbos:state:v6 → v7-simple
  • agency-studio-os — DashboardSwitcher removed, workspace route deleted
  • konsultan-os — DashboardSwitcher removed, workspace route deleted
  • kreator-studio-os — DashboardSwitcher removed, workspace route deleted
  • riset-kit — DashboardSwitcher removed, workspace route deleted
  • wirausaha-os — DashboardSwitcher removed, workspace route deleted
  • notion-page-clone-os — DashboardSwitcher removed; flagged as the BE-wave canary for the Advanced archetype

Removed (dead chassis)

  • _shared/ui/dashboard-switcher.tsx — wrong primitive (TeamSwitcher pattern for section toggle)
  • _shared/ui/workspace-placeholder.tsx — Simple templates don't have a workspace surface
  • _shared/dashboard/sections.ts — buildDashboardSections + activeSectionFromPathname helpers
  • _shared/types/common.ts → DashboardSection type
  • _shared/ui/dashboard-shell.tsx — dashboardSections + activeSectionId props
  • _shared/ui/admin-sidebar.tsx — DashboardSwitcher conditional in SidebarHeader
  • personal-brand/shared/{workspace-types.ts,workspace-reducer.ts} + slices/workspace/*
  • Per-template DASHBOARD_SECTIONS export + workspace route directories (8 templates)

Kept

  • Per-template DASHBOARD_BASE / ADMIN_PANEL_BASE / WORKSPACE_BASE constants — zero cost and needed by the Advanced archetype
  • AZ-wave URL shift (/admin → /dashboard/admin) and permanent redirect
  • Simple shell + admin-sidebar + admin-nav-items (the canonical archetype)

Docs

  • docs/architecture/dashboard-vision.md REWRITTEN — two-archetype model, decision matrix per template, BE-wave plan, source map for primitive lifts from superspace + notion-page-clone

Up next (BE-wave)

  • Build _shared/ui/workspace-switcher.tsx (opt-in workspace-context picker, not a section toggle)
  • Build _shared/ui/secondary-sidebar.tsx (three-column layout primitive lifted from superspace FeatureThreeColumnLayout)
  • Build _shared/ui/dashboard-shell-advanced.tsx (composes the two)
  • Wire notion-page-clone-os as canary for the Advanced archetype
MAY192026
FeatureBC-waveMay 19, 2026

personal-brand-os workspace surface — Workspace CRUD + Notes + Tasks (live)

BB-wave delivered the DashboardSwitcher chassis. BC-wave proves it end-to-end on one template: personal-brand-os now has a fully working Workspace surface. Multi-tenant workspaces (Personal / Side Project / …) with CRUD + active switching. Per-workspace Notes (full editor, search) and Tasks (inline checklist with overdue badge + open/done/all filter). All persisted via the existing localStorage store + BroadcastChannel cross-tab sync. Sidebar nav swaps between admin and workspace primary nav based on pathname; switcher header shows the active workspace icon + name. Old `/dashboard/workspace` placeholder replaced by a real dashboard with stat cards and recent-notes list. The other 7 OS templates keep the placeholder; their workspace surfaces lift the same pattern in subsequent waves.

Template touched

  • personal-brand-os — Workspace dashboard + Notes (CRUD with editor) + Tasks (inline checklist) + Workspaces (CRUD over the workspace entities themselves)

Data model (personal-brand/shared)

  • types.ts — added Workspace + Note + Task types, State fields (workspaces, activeWorkspaceId, notes, tasks), Action union extensions (workspace.create/update/delete/switch, note.upsert/delete, task.upsert/toggle/delete)
  • workspace-reducer.ts NEW — isolated workspace surface transitions; cascade-delete notes + tasks on workspace.delete; keep ≥1 workspace alive; activeWorkspaceId falls back when active is removed
  • store-reducer.ts — delegates workspace/note/task actions via isWorkspaceAction guard
  • seed.ts — 2 workspaces (Personal 🧠, Side project 🚀) + 3 notes + 4 tasks; storageKey bumped pbos:state:v5 → v6-workspaces

Surfaces

  • WorkspaceDashboardView — stat cards (Notes / Open tasks / Workspaces) + recent-notes list scoped to active workspace
  • NotesView + NoteEditor — list with search, inline create-then-redirect, full-page editor with dirty-state Save
  • TasksView — quick-add input, open/done/all filter, checkbox toggle, overdue badge, delete
  • WorkspaceManageView — list with inline rename (icon + name), switch, delete (cascade-aware, disabled when only one remains), create form with icon input

Routing + nav

  • app/preview/personal-brand-os/dashboard/workspace/{page,notes/page,notes/[id]/page,tasks/page,manage/page}.tsx NEW
  • personal-brand/shared/nav-config.ts — buildWorkspaceNav(state) returns Dashboard / Notes / Tasks / Workspaces with live counts
  • personal-brand/dashboard-shell-client.tsx — section-aware primaryNav (admin vs workspace), appLabel shows active workspace icon + name, homeHref + searchPlaceholder swap by section

Up next

  • Propagate workspace surface to remaining 7 OS templates (likely lifted as a distributable rr slice once the pattern stabilizes)
  • BD — feature harvest from superspace + notion-page-clone via /rr lift (RBAC / CRM / Analytics / CMS-menu inside Admin Panel)
  • BE — replace placeholder Tasks with notion-style block editor for richer Note bodies
MAY192026
FeatureBB-waveMay 19, 2026

DashboardSwitcher — shadcn sidebar-07 team-switcher adapted for /dashboard/{admin,workspace}

Top of every template sidebar now hosts an improved adaptation of the shadcn sidebar-07 TeamSwitcher pattern. Click → dropdown reveals Admin Panel + Workspace sections with icon, label, one-line description, active checkmark, and ⌘1/⌘2 keyboard shortcuts. Footer link jumps to /templates so operators can hop to another template without leaving the dashboard. Inspired by notion-page-clone WorkspaceSwitcher (role-gated items, composable trigger) and superspace EnhancedWorkspaceSwitcher (hierarchical context, descriptions). The dashboard/admin and dashboard/workspace surfaces now share a single dashboard/layout.tsx — the switcher and store provider live one level up so the chassis stays consistent across both surfaces. Workspace placeholder updated to point at the new ⌘1/⌘2 shortcuts.

Templates touched (DashboardSwitcher mounted; layout lifted)

  • saas-marketing-os — switcher in sidebar header; workspace inherits shell
  • personal-brand-os — switcher in sidebar header; workspace inherits shell
  • agency-studio-os — switcher in sidebar header; workspace inherits shell
  • konsultan-os — switcher in sidebar header; workspace inherits shell
  • kreator-studio-os — switcher in sidebar header; workspace inherits shell
  • riset-kit — switcher in sidebar header; workspace inherits shell
  • wirausaha-os — switcher in sidebar header; workspace inherits shell
  • notion-page-clone-os — switcher in sidebar header; workspace inherits shell

Infra

  • _shared/ui/dashboard-switcher.tsx NEW — SidebarMenuButton + DropdownMenu + ⌘N shortcuts + active checkmark + Switch-template footer
  • _shared/dashboard/sections.ts NEW — buildDashboardSections() + activeSectionFromPathname() helpers
  • _shared/types/common.ts — added DashboardSection type
  • _shared/ui/admin-sidebar.tsx — renders DashboardSwitcher when sections prop provided (BrandHeader fallback preserved)
  • _shared/ui/dashboard-shell.tsx — accepts dashboardSections + activeSectionId props
  • Per-template nav-config.ts — DASHBOARD_SECTIONS export (8 templates)
  • Per-template dashboard/layout.tsx NEW — lifted from admin/layout.tsx so workspace inherits StoreProvider + DashboardShell
  • Per-template dashboard/dashboard-shell-client.tsx NEW — derives activeSection from usePathname

Up next (see docs/architecture/dashboard-vision.md)

  • BC-wave — Workspace bootstrap (notion editor at MAX, calendar, command-menu, database views) — replaces current placeholder
  • BD-wave — feature harvest from superspace + notion-page-clone via /rr lift (RBAC / CRM / Analytics / CMS-menu siblings inside Admin Panel)
MAY192026
FeatureBA-waveMay 19, 2026

notion-shell slice + Notion Page Clone OS = real Notion-clone template (not marketing landing)

Before: /preview/notion-page-clone-os/public showed a marketing landing page jualan notion-blocks slice. After: it IS a Notion clone — left sidebar with tree-nav (page CRUD inline), main panel with page editor (rich blocks via notion-blocks primitive registry) or database table (per-cell + property CRUD). Built by lifting the six props-driven Notion wrappers from nosion's shared/components/notion (NotionPage / NotionHeader / NotionSidebar / NotionBlock / NotionDatabase / NotionProperty) to a new rr slice `notion-shell`. Zero-peer-dep design — icon-picker dropped in favor of `renderIcon` + `renderIconPicker` props so host wires any icon library (we wire @/features/icon-picker at the template layer). NotionBlock dispatches via a `blockRenderers` prop — the template registers equation/code/divider from notion-blocks, falls back to contentEditable for text-shape blocks. Template store extended with `docs` + `databases` slices alongside existing pages/snippets/landingSections; storageKey bumped v2-landing → v3-docs. Reducer split into `notion-reducer.ts` to stay under the 200-LOC cap.

Slices touched

  • notion-shell — NEW: six portable Notion wrappers + types subset
  • notion-blocks — registered as block renderers inside notion-shell's NotionBlock

Templates touched

  • notion-page-clone-os — public surface = full Notion-clone dashboard (replaces marketing landing)

Site

  • frontend/slices/notion-shell/ NEW — 6 wrapper components + types subset + slice metadata trio + /preview demo
  • components/templates/notion-page-clone/slices/notion-app/ NEW — Dashboard / DocView / DatabaseView + block-renderers registry + sidebar hooks
  • components/templates/notion-page-clone/shared/types.ts — added docs/databases + 14 action types (doc.*, db.*, db.row.*)
  • components/templates/notion-page-clone/shared/store.tsx — wired notion-reducer; storageKey v2-landing → v3-docs
  • components/templates/notion-page-clone/shared/notion-reducer.ts NEW — pulled out for 200-LOC cap
  • components/templates/notion-page-clone/shared/seed.ts — seeded 3 docs + 1 Roadmap database (3 rows)
  • app/preview/notion-page-clone-os/public/page.tsx — opens to dashboard@doc-welcome
  • app/preview/notion-page-clone-os/public/d/[id]/ + db/[id]/ NEW — dynamic dashboard surfaces
  • lib/content/slices.ts + layouts.ts — added notion-shell entry; template pullPaths cascade notion-shell + icon-picker; stale notion-page-clone-os dir refs renamed to notion-page-clone
MAY192026
ImprovementAZ-waveMay 19, 2026

Dashboard foundation rename — /admin → /dashboard/admin + workspace stubs

AZ-wave foundation only (mechanical URL prefix shift). Every `/preview/<template>/admin/...` route moves under `/preview/<template>/dashboard/admin/...`, freeing `dashboard/workspace/` as the new productivity surface. Permanent redirect from old URLs preserves every external link. Per-template constants split: DASHBOARD_BASE / ADMIN_PANEL_BASE / WORKSPACE_BASE introduced; ADMIN_BASE kept as alias for backwards compat. _shared/ui/admin-shell.tsx renamed to dashboard-shell.tsx with AdminShell as deprecated alias. Workspace landing pages now render a placeholder pointing to docs/architecture/dashboard-vision.md — BA/BB waves will populate it with notion editor + calendar + command-menu + database views. No URL breaking change; no consumer-side action needed.

Templates touched (admin → dashboard/admin + workspace stub)

  • saas-marketing-os — admin moved to dashboard/admin; workspace stub added
  • personal-brand-os — admin moved to dashboard/admin; workspace stub added
  • agency-studio-os — admin moved to dashboard/admin; workspace stub added
  • konsultan-os — admin moved to dashboard/admin; workspace stub added
  • kreator-studio-os — admin moved to dashboard/admin; workspace stub added
  • riset-kit — admin moved to dashboard/admin; workspace stub added
  • wirausaha-os — admin moved to dashboard/admin; workspace stub added
  • notion-page-clone-os — admin moved to dashboard/admin; workspace stub added

Infra

  • next.config.mjs — permanent redirect /preview/:tpl/admin/:path* → /preview/:tpl/dashboard/admin/:path*
  • _shared/ui/dashboard-shell.tsx — canonical export DashboardShell + deprecated AdminShell alias (drop-in for existing layouts)
  • _shared/ui/workspace-placeholder.tsx NEW — minimal coming-soon card for /dashboard/workspace until BB-wave
  • lib/content/layouts.ts — adminPreviewPath + filePaths updated for all 8 OS templates (81 path replacements)
  • Per-template nav-config.ts — DASHBOARD_BASE / ADMIN_PANEL_BASE / WORKSPACE_BASE constants (8 templates)

Up next (see docs/architecture/dashboard-vision.md)

  • BA-wave — Pages restructure inside Admin Panel + RBAC / CMS-menu / Analytics / CRM / Audit-log siblings
  • BB-wave — Workspace bootstrap (notion editor at MAX, calendar, command-menu, database views)
  • BC-wave — feature harvest from superspace + notion-page-clone via /rr lift
MAY192026
ImprovementAY-waveMay 19, 2026

Session close-out — All Pages first sub-item + Dashboard vision docs

Tiny nav UX fix + comprehensive close-out docs so the next session resumes without retracing today's conversation. Reorder Pages sub-items so All Pages comes first (the listing surface a user opens before drilling into a specific page editor like Landing). Capture the Dashboard architectural direction (Admin Panel + Workspace split, RBAC/CRM/Analytics harvest from superspace) at docs/architecture/dashboard-vision.md, and a wave-by-wave log at docs/sessions/2026-05-19-session.md. Memory entries written so /rr in the next session auto-loads the vision + open items.

Templates touched (Pages children re-ordered)

  • saas-marketing-os — All pages first, Landing second
  • personal-brand-os — All pages first
  • agency-studio-os — All pages first
  • konsultan-os — All pages first
  • kreator-studio-os — All pages first
  • riset-kit — All pages first
  • wirausaha-os — All pages first

Docs

  • docs/architecture/dashboard-vision.md NEW — Dashboard > Admin Panel + Workspace split direction; AZ→BC wave roadmap; source map for RBAC/CRM/Analytics from superspace + notion-page-clone
  • docs/sessions/2026-05-19-session.md NEW — wave-by-wave commit log AK→AY; flagged items for next session; process notes (200-LOC cap, pre-push build hook, wave-letter collisions)
  • Memory entries — dashboard-vision + session-2026-05-19 + feedback-wave-letters + feedback-changelog-discipline written to /home/rahman/.claude/projects/-home-rahman-projects-resources/memory/ for cross-session auto-load
MAY192026
FeatureAX-waveMay 19, 2026

Nested Pages nav across all 7 templates + Open-full-page button

Closes the AV-deferred propagation: every website template now has the Pages parent + collapsible sub-items (Landing / All pages / blog / portfolio / services where applicable). ParentNavItem rewired to the canonical shadcn NavMain idiom (group/collapsible + group-data-[state=open]/collapsible:rotate-90) — same pattern shadcn ships in its docs. FeatureBar gets a new ExternalLink button: when the active docs tab is a preview surface, the button pops the iframed content out into a real browser tab at native size.

Templates touched (Pages parent + nested sub-items)

  • personal-brand-os — Landing, All pages, Blog, Portfolio, Services, Resources
  • agency-studio-os — Landing, All pages, Work, Services
  • konsultan-os — Landing, All pages
  • kreator-studio-os — Landing, All pages
  • riset-kit — Landing, All pages
  • wirausaha-os — Landing, All pages

Site

  • components/templates/_shared/ui/admin-nav-items.tsx — ParentNavItem refactored to canonical shadcn NavMain idiom (group/collapsible class + CSS-driven chevron rotation, no per-item useState)
  • components/site/feature-context.tsx — FeatureManifest.previewUrls?: { public?, admin? } so FeatureBar can resolve the surface URL without a fresh ref
  • components/site/preview/manifest-builder.tsx — buildPreviewManifest emits previewUrls from publicPath/adminPath
  • components/site/feature-bar.tsx — new ExternalLink button (right-side cluster) opens the active preview surface in a new tab; auto-hides on split tab and when manifest has no URL for the current surface
MAY192026
FeatureAW-waveMay 19, 2026

Notion Page Clone OS — nested Pages nav + landing-renderer composition

Applies the AV nested-nav pattern to notion-page-clone-os and rewires the public homepage to compose existing rr slices instead of a bespoke React tree. Admin sidebar now groups Landing / Snippets / All-pages under a single "Pages" parent (Collapsible + SidebarMenuSub). Public homepage reads admin-editable LandingSection rows from the template store and renders each via the canonical HeroBlock / FeatureGridSection / CtaBand slices, plus a custom snippets gallery section for the notion-blocks demo. Store schema bumped to v2-landing — landing-sections now first-class state managed via LANDING_UPSERT / LANDING_DELETE alongside pages + snippets.

Templates touched

  • notion-page-clone-os — nested Pages nav + LandingRenderer composition

Slices reused (no change)

  • hero-block — landing hero rendered via canonical HeroBlock
  • feature-grid — primitive showcase via FeatureGridSection
  • cta-band — landing CTA rendered via canonical CtaBand
  • notion-blocks — snippet gallery embeds EquationBlock + CodeBlock + NotifyMePopover

Site

  • components/templates/notion-page-clone/shared/nav-config.ts — buildAdminPrimaryNav now emits nested Pages parent with landing/snippets/all-pages children
  • components/templates/notion-page-clone/shared/store.tsx — landingSections added to State; storageKey bumped to v2-landing; LANDING_UPSERT / LANDING_DELETE reducer
  • components/templates/notion-page-clone/slices/home/LandingRenderer.tsx NEW — switch on section.kind → HeroBlock / FeatureGridSection / CtaBand / custom SnippetsGallery
  • components/templates/notion-page-clone/slices/home/HomePage.tsx — reads useLandingSections() filter+sort, renders via LandingRenderer
MAY192026
FeatureAV-waveMay 19, 2026

Admin sidebar: nested Pages parent + sub-items (POC on saas-marketing-os)

Admin nav was a flat list per template — every content surface (landing, blog, pricing, features, changelog) sat as a sibling top-level menu item. With more entities being added the sidebar started feeling crowded. AV adds optional `children` to AdminNavItem and renders nested entries via shadcn's `Collapsible` + `SidebarMenuSub` + `SidebarMenuSubButton`. POC on saas-marketing-os groups all page-driving CRUDs (landing, all pages, blog, pricing, features, changelog) under a single "Pages" parent. Top-level keeps Dashboard / Pages / Customers / Subscriptions / Leads. Other 6 templates queued for AW. Dynamic per-page section composition (using existing hero / feature-grid / pricing-page / blog-section / changelog-feed / faq-section / portfolio-section / cta / services / testimonials-grid slices) deferred to a separate AW-B sub-wave.

Templates touched

  • saas-marketing-os — Pages parent with 6 sub-items (POC)

Templates queued for AW (same restructure)

  • personal-brand-os
  • agency-studio-os
  • konsultan-os
  • kreator-studio-os
  • riset-kit
  • wirausaha-os

Site

  • components/templates/_shared/types/common.ts: AdminNavItem.children?: AdminNavItem[]
  • components/templates/_shared/ui/admin-nav-items.tsx NEW — ParentNavItem + LeafNavItem + isPathActive helper
  • components/templates/_shared/ui/admin-sidebar.tsx — NavGroup routes child-having items through ParentNavItem (Collapsible + SidebarMenuSub)
  • Existing flat nav items keep rendering as before (LeafNavItem)
MAY192026
FeatureAU-waveMay 19, 2026

Notion Page Clone OS — full website template using notion-blocks

First end-to-end website template built on the notion-blocks bundle. Notion Page Clone OS = block-based notes-app starter with admin CRUD + public landing. Snippets entity (kind: equation/code/text/grid) renders live on the public landing via the four bundled primitives (EquationBlock / CodeBlock / NotifyMePopover / SelectableCell). Pure-localStorage state, zero convex required — drop-in for anyone shipping a writing surface or doc site. Wires the same _shared/{pages,landing,crud,ui} primitives the other 7 templates use so consistency holds across the OS family.

Templates touched

  • notion-page-clone-os — NEW website template (admin + public)

Slices touched

  • notion-blocks — first downstream consumer (template usedBy)

Site

  • /preview/notion-page-clone-os/public — homepage renders snippets via notion-blocks primitives (equations, code, NotifyMe bell)
  • /preview/notion-page-clone-os/admin — dashboard + /snippets CrudListView for managing the public content
  • lib/content/layouts.ts — new SliceEntry for notion-page-clone-os, with pullPaths cascading notion-blocks + 4 peer slices
MAY192026
ImprovementAT-waveMay 19, 2026

Docs catalog sidebar now uses shadcn Sidebar primitives

User principle: rr is an extension of shadcn, not a replacement. The website-template ADMIN sidebars already used shadcn Sidebar primitives (Sidebar / SidebarMenuButton / SidebarMenuSub / SidebarMenuBadge wrapped in SidebarProvider) — but the rr docs CATALOG sidebar (the left nav on /slices /layouts /templates /changelog etc.) was still a hand-rolled <nav> with custom buttons + chevrons. AT refactors it to shadcn primitives so collapse tooltips, mobile drawer, and persistent state inherit from the same canon as the admin shells. We extend shadcn — we don't fight it.

Site

  • components/site/docs-sidebar/nav-parts.tsx: SectionGroup → SidebarGroup + Collapsible + SidebarGroupLabel; BranchItem → SidebarMenuItem + SidebarMenuButton + SidebarMenuSub; leaf links → SidebarMenuButton / SidebarMenuSubButton
  • components/site/docs-sidebar.tsx: wrapped in SidebarProvider so SidebarMenuButton has its useSidebar() context — overrides flex / min-h-svh classes so the provider stays flush inside ThreeColumnLayoutAdvanced's left column
  • Visual hierarchy preserved (3-tier: section / branch / leaf) — chevron rotation, active badge, count pill all carry over via shadcn data-state

Templates touched (no change — already on shadcn)

  • saas-marketing-os — admin sidebar already shadcn-based (AdminShell)
  • personal-brand-os — admin sidebar already shadcn-based
  • agency-studio-os — admin sidebar already shadcn-based
  • konsultan-os — admin sidebar already shadcn-based
  • kreator-studio-os — admin sidebar already shadcn-based
  • riset-kit — admin sidebar already shadcn-based
  • wirausaha-os — admin sidebar already shadcn-based
MAY192026
ImprovementAS-waveMay 19, 2026

Consolidate notion editor primitives into single bundle

Four tiny notion-lifted primitives (equation, code-block, notifications, database-cell-selection) collapsed into one catalog entry: notion-blocks. Each was ~5 files / one component — splitting them four ways cluttered the catalog without giving consumers narrower install ergonomics. notion-blocks is a peer-bundle: re-exports the four slices' public API behind one import path. Per-block narrow imports still work (the peer slices stay registered + lifted). Updated equation + code-block index.ts to also re-export their Props types for ergonomic typing.

Slices touched

  • notion-blocks — NEW peer-bundle. Catalog entry replaces 4 sub-entries
  • equation — added EquationBlockProps to barrel exports
  • code-block — added CodeBlockProps to barrel exports

Site

  • /preview/slices/notion-blocks — single page demos all 4 primitives (KaTeX formulas, TS/Bash code samples, NotifyMe bells, drag-fill table)
  • Removed /preview/slices/{equation,notifications,code-block,database-cell-selection} — bundle is canonical surface
  • Removed 4 individual SliceEntry rows from lib/content/slices.ts
MAY192026
ImprovementAR-waveMay 19, 2026

Skeleton fallbacks + cacheComponents-friendly slice file I/O

After AP killed the client-side reset churn, server-side nav still felt heavy because cacheComponents: true treats async server components as dynamic by default — every navigation re-ran readSliceFiles on the filesystem. AR adds Next 16 `use cache` directives to the file readers and per-route loading.tsx skeletons that stream instantly on click. /slices/[slug] now reports as Partial Prerender with 15m revalidate; nav between detail pages feels app-router-fast.

Site

  • lib/slice-files.ts: "use cache" on readSliceFiles + readPathsFiles — cross-nav cache, not just intra-render dedupe
  • components/site/docs-loading-skeleton.tsx NEW — shared title-strip / tabs / preview-iframe skeleton
  • app/(docs)/loading.tsx — catch-all skeleton for plain docs routes
  • app/(docs)/slices/[slug]/loading.tsx — tab + iframe skeleton
  • app/(docs)/layouts/[slug]/loading.tsx — tab + iframe skeleton
  • RecentlyUpdatedBadge → "use client" so Date.now() runs in the browser (cacheComponents blocked the previous server read)
MAY192026
FeatureAQ-waveMay 19, 2026

Notion editor primitives lifted via new rr-sync pipeline

Four pure-UI primitives lifted from notion-page-clone using a new hash-based, idempotent sync pipeline. The pipeline auto-derives import rewrites from both repos' tsconfigs, follows transitive shared-dep graphs, cross-checks npm packages against rr's package.json, and ships a registry (rr-sync.json) so subsequent updates to the same slice in nosion can re-propagate with one command. Each lifted slice has an interactive preview at /preview/slices/<slug>.

Slices touched

  • equation — KaTeX-rendered LaTeX block, click-pencil to edit
  • notifications — per-page subscription toggle (localStorage-backed NotifyMePopover)
  • code-block — highlight.js syntax block with language picker + copy
  • database-cell-selection — drag-fill + SelectableCell primitives for grid UIs

Site

  • rr-sync pipeline in notion-page-clone: pathMap registry + tsconfig alias auto-derivation + transitive-import follower + sibling-barrel resolver + npm-deps cross-check + skipFiles wildcards + per-file hash drift detection
  • Pre-push hook adds `npm run build` to catch Next-only errors (cacheComponents conflicts, Turbopack loader issues) that tsc misses
  • next.config: transpilePackages: ["rahman-shared"] added — required for slices using rewritten @/shared/lib/utils → rahman-shared/lib/utils imports
MAY192026
FixAP-waveMay 19, 2026

Stop full preview reset on every sidebar/layout nav

Regression from AM-wave: /slices/[slug] started registering a FeatureManifest to share the docs-shell tabs with /layouts/[slug]. Two long-standing rough edges in feature-context surfaced — useFeatureManifest's unmount cleanup flashed null on every nav (firing the provider's effect twice), and the effect reset activeTab / previewView / previewZoom on every manifest object identity change. Result: clicking any sidebar link rebuilt the iframe, dropped the user's tab choice, and felt like a fresh fetch. AP threads a stable manifest.id (slug-based) through buildPreviewManifest, gates the reset on id change via a ref, preserves activeTab across slugs when the id exists in the new tabs, drops the unmount cleanup, and React.cache-wraps readSliceFiles.

Site

  • FeatureManifest gained `id` field; buildPreviewManifest derives from slug
  • feature-context useEffect is now id-gated — same-id re-renders don't reset state
  • useFeatureManifest cleanup dropped — no more null-flash between transitions
  • lib/slice-files: readSliceFiles wrapped with React.cache for intra-render dedupe
  • components/site/feature-context-effect.ts NEW — extracted manifest-effect helper to keep feature-context.tsx under 200 LOC
MAY192026
FeatureAO-waveMay 19, 2026

Notion editor primitives lifted via new rr-sync pipeline

Four pure-UI primitives lifted from notion-page-clone using a new hash-based, idempotent sync pipeline. The pipeline auto-derives import rewrites from both repos' tsconfigs, follows transitive shared-dep graphs, cross-checks npm packages against rr's package.json, and ships a registry (rr-sync.json) so subsequent updates to the same slice in nosion can re-propagate with one command. Each lifted slice has an interactive preview at /preview/slices/<slug>.

Slices touched

  • equation — KaTeX-rendered LaTeX block, click-pencil to edit
  • notifications — per-page subscription toggle (localStorage-backed NotifyMePopover)
  • code-block — highlight.js syntax block with language picker + copy
  • database-cell-selection — drag-fill + SelectableCell primitives for grid UIs

Site

  • rr-sync pipeline in notion-page-clone: pathMap registry + tsconfig alias auto-derivation + transitive-import follower + sibling-barrel resolver + npm-deps cross-check + skipFiles wildcards + per-file hash drift detection
  • Pre-push hook adds `npm run build` to catch Next-only errors (cacheComponents conflicts, Turbopack loader issues) that tsc misses
  • next.config: transpilePackages: ["rahman-shared"] added — required for slices using rewritten @/shared/lib/utils → rahman-shared/lib/utils imports
MAY192026
ImprovementAN-waveMay 19, 2026

Changelog clickable + live-preview SSOT + landing editor polish

AM-wave unified the docs-shell tabs for /slices and /layouts behind a single buildPreviewManifest helper. AL-wave fixed admin landing editor: bgImage scrim, fg image inside Hero with aspect-ratio dropdown, 1-based reorder arrows. AK-E published landing-sections as installable slice. AN-wave: changelog bullets now link back to the slice/template they reference.

Slices touched

  • landing-sections — promoted to distributable slice
  • changelog-feed — bullets now accept { text, slug, kind } for back-links

Templates touched (admin landing editor)

  • saas-marketing-os
  • personal-brand-os
  • agency-studio-os
  • konsultan-os
  • kreator-studio-os
  • riset-kit
  • wirausaha-os

Site

  • VersionWatcher toasts when a redeploy lands (rc-samata-dash pattern)
  • /slices/<slug> + /layouts/<slug> share the same Code/Public/Split/Admin tabs
MAY182026
Feature1.7.0May 18, 2026

Seven canonical UI slices + V-wave three-column

R + S + T waves shipped the missing marketing-page primitives so every template consumes one SSOT per surface. V-wave ported superspace's PanelSection compound. W-wave wired live previews. CLI 1.7.0 + MCP 1.1.0 on npm.

New slices

  • pricing-page · PricingSection with renderTierCta slot
  • feature-grid · cards / minimal / alternating / grouped layouts
  • faq-section · single / two-column / grouped + footer CTA
  • testimonials-grid · cards / quote-stack / masonry
  • blog-section · BlogListSection + BlogPostView (afterContent / extraMeta / related slots)
  • changelog-feed · timeline / cards / list
  • portfolio-section · PortfolioListSection + PortfolioDetailView with sections[]

Layout — V-wave

  • PanelSection compound (Header / Items / Footer)
  • PanelGroup / PanelMenu / PanelSeparator primitives
  • leftFooter / centerFooter / rightFooter slots on ThreeColumnLayoutAdvanced
  • Trigger ≠ Header separation rule
  • Mobile drawer header + footer slot props

Site

  • /preview/slices/<slug> for all 7 new slices
  • /preview/three-column-trio V-wave demo
  • rr site dogfood — FeaturesGrid + /stack + /changelog use canonical slices
MAY102026
Feature1.6.0May 10, 2026

Generic CRUD primitives + 25 entities migrated

<CrudListView> + <CrudFormView> + typed CrudController<T>. Replaced per-template bespoke admin tables. Every website template now has Pages CRUD with audit-templates hard-error gate.

APR222026
Feature1.5.0Apr 22, 2026

Page CRUD on all 7 website templates

Shared _shared/pages/ infra. PagesView + PageEditorView propagated to every website template. Hybrid client-wrap pattern: server chrome + client data section.

APR102026
Improvement1.4.0Apr 10, 2026

Security + infra + Next.js primitive sweep

Rate-limit, strict headers, isHidden wiring, env hygiene. next/link + next/image + typed catch across template-base. Sidebar grouping: 38 flat slices → 11 collapsible categories.

MAR252026
Improvement1.3.0Mar 25, 2026

CLI publish prep + audit chain self-doc

Consumer install REAL test. .env.example per-slice augment. Schema unification. pre-commit hook expanded to run full audit chain. /llms.txt + catalog completeness.

FEB282026
Improvement1.2.0Feb 28, 2026

Install snippet modernization + lint zero

Install snippets → npx rr init flow. 75 lint warnings → 0. Catalog drift fixes (5 ai-* + platform-admin + 2 landing). sync-slice-manifests handles both schemas.

FEB142026
Feature1.1.0Feb 14, 2026

200-LOC modularity rule + audit-file-size guard

New audit-file-size.mjs gates file length. 8 top offenders refactored. Grandfather list driven 35 → 0. F4: TEMPLATE/SLICE distinction in audit guard.

JAN302026
Feature1.0.0Jan 30, 2026

Audit chain comprehensive — D + B waves

Site-level raw-HTML audit. Convex authn+authz on every public mutation. Schema index validity. 39 raw <button> wrapped in shadcn Button. Pre-push hook installed. Hardcoded MCP URL extracted to env.