rmnr
DocsTourSlicesBest PracticeAgentsInstall

Command Palette

Search for a command to run...

New
  • Changelog
Release notes

Changelog

What changed in each rr release — page 11 of 17. Full prose history in CHANGELOG.md.

MAY212026
FeatureCK-4May 21, 2026

database-csv standalone slice — import + export for notion-database

Continuation of CK-wave (database completion). Lifted pre-staged database-csv from template-base/notion/slices/database-csv/ as new standalone slice frontend/slices/database-csv/. Simplified contract vs upstream: ONE onImport callback (was 5 useStore methods) — receives {newProperties, rows} and lets host translate to its own adapter calls. CsvActions = dropdown trigger w/ Export (Blob URL download) + Import. CsvImportDialog = file picker → auto-map columns (case-insensitive name match against db.properties) → user re-pick mapping (existing prop / Title / skip / + New of 12 supported types) → submit. Supports auto-seeding select/multi_select/status options from CSV value names. Computed types (formula / created_time / last_edited_time / unique_id) recognised as readonly — never written from CSV. Dropped vs upstream: relation cross-DB lookups (no pages reference exposed), created_by / last_edited_by / rollup branches (not in rr PropertyType). New peer slice in catalog: database-csv 0.1.0 with notion-database ^0.3 peer dep. Preview /preview/slices/database-csv demo: 3-row DB w/ working in-memory Export + Import (refresh clears state). Slice count 44 → 45.

New slice files

  • frontend/slices/database-csv/{slice.json, slice.manifest.json, slice.contract.ts, index.ts}
  • components/CsvActions.tsx — dropdown trigger (Export + Import items)
  • components/CsvImportDialog.tsx — file picker + mapping submit
  • components/csv-mapping.tsx — extracted column-mapping table (≤200 LOC budget)
  • lib/csv.ts — parseCsv + valueFromString + exportDatabaseToCsv + downloadCsv

API surface

  • Single `onImport({newProperties, rows})` callback — host owns persistence
  • CsvNewProperty: { type, name, options? } (options auto-seeded for select-family)
  • CsvRowDraft: { title, rowProps }
  • All exports also available as utility fns for custom toolbars

Catalog

  • NEW database-csv 0.1.0 — peer of notion-database ^0.3
  • Slice count: 44 → 45. CSV import/export coverage: 0% → 100%.
  • Database adaptation: ~72% → ~76%

Deferred

  • JSON import (similar pattern, lower demand — defer to mega-bundle)
  • Relation column type via CSV (needs cross-DB scope — same blocker)
  • CK-1C FormView — still pending
MAY212026
FeatureCK-3May 21, 2026

notion-database +6 property cells (files / person / formula / created_time / last_edited_time / unique_id)

Continuation of CK-wave. PropertyType union extended from 10 → 16 types. Lifted the pre-staged property cells from template-base/notion/slices/databases/ into frontend/slices/notion-database/components/cells/, plus the formula evaluation engine into lib/formula.ts (simplified — drops relation / rollup branches since those need cross-DB context that the standalone slice doesn't expose). Each cell is a self-contained component (≤105 LOC) with prop-driven mutations. NEW CELLS: (1) FilesCell — popover w/ chip list + paste-URL input, no upload UX (host plugs `files` slice adapter at a higher level). (2) PersonCell — initials avatar chips + comma-separated text picker (no user directory lookup vs upstream). (3) FormulaCell — readonly evaluated expression display + popover editor with live preview; expression syntax via {{title}}/{{prop_name}}/now/today + fn(arg, ...) (concat/upper/lower/length/if/and/or/not/empty/contains/replace/round/floor/ceil/abs/min/max) + `=expr` arithmetic. (4) CreatedTimeCell — readonly row.createdAt formatted. (5) LastEditedTimeCell — readonly row.updatedAt. (6) UniqueIdCell — auto-derived from row index + optional prefix (e.g. TASK-001). Existing multi_select + select/status cases extracted to MultiSelectCell + SelectCell to keep property-cells.tsx ≤200 LOC. CellArgs extended with optional row + db + onPropertyChange so the heavier cells can read metadata + write back formula expressions. NotionDatabase.renderCell wires all three through. Property type coverage: 10/17 (59%) → 16/17 (94%; only relation/rollup remain deferred). Adaptation ~65% → ~72%. Version 0.2.0 → 0.3.0. Preview demo extended with 6 new columns (Owners, Files, Summary formula, ID, Created, Edited).

MAY212026
FeatureCK-waveMay 21, 2026

notion-database completion — 10/11 views + FilterBuilder + SortBuilder lifted

User report: 'mari fokus menyelesaikan database'. Calculated current notion-database adaptation at ~35% (6 views / 11 + zero filter or sort UI + 10/17 property types). Goal: get database close to upstream parity in standalone slice form (the upstream open-silong mega-bundle is still ~3wk away per docs/rr-sync/2026-05-21-notion-mega-lift-plan.md Phase 5). EXECUTED in 3 commits: (1) CK-1A (commit a7532da) — lifted ChartView (recharts bar/line/area/pie/donut + inline picker for kind / X axis / aggregate / Y value + chartPalette/Decimals/TopN view-config fields) and DashboardView (KPI strip + group breakdowns by select/status + recent updates feed). 7 new files including chart-data.ts (pure aggregation helpers) and dashboard-parts.tsx (GroupBreakdown + Stat split out for ≤200 LOC). DatabaseViewConfig extended with 16 chart fields + dashboard fields. ChartKind + ChartAggregate types exported from notion-shell. (2) CK-1B (commit e742c10) — lifted MapView (SVG world projection w/ row pins read from lat/lng number-properties; optional select/status property maps to pin color — no leaflet, pure SVG) and TimelineView (Gantt-style horizontal timeline w/ drag-to-shift + drag-to-resize bars via pointer events; ChevronLeft/Right pan; auto-detects first date property). 5 new files including map-svg.tsx, timeline-bar.tsx, timeline-helpers.ts (TimelineView split because upstream was 354 LOC), lib/keyboard.ts (focusSiblingBySelector helper). Views now 10/11 (91%) — only FormView deferred (heavy PropertyFormInput + FormSettings + addRow-with-values plumbing). (3) CK-2 (commit 7b81d41) — lifted FilterBuilder + SortBuilder as standalone components (shadcn Select-based UI). ViewOptions refactored to delegate to them inside Sort / Filter popovers — replaces previous inline native-<select> builders. Exported from notion-database barrel for toolbar embedding. (FINAL CK) — notion-database version 0.1.0 → 0.2.0. Catalog title + description + tags updated. recharts@^2.13.0 added to npm deps. shadcn deps add Select. Adaptation moves 35% → ~65%. CK-3 (property type cells for file/person/timestamps), CK-4 (database-csv standalone), CK-1C (FormView) deferred to future waves.

MAY212026
ChoreCJ-waveMay 21, 2026

catalog cleanup — drop dead `pages` skeleton + redundant `notion-blocks` aggregator

User report: 'aku rasa banyak sampah, mari bersihkan module yang menurutmu tidak terlalu penting, atau bisa di gabung'. Cross-referenced docs/rr-sync/2026-05-21-notion-mega-lift-plan.md (upstream open-silong's incoming `notion/` mega-bundle, Phase 5 ~3wk out) — that plan will subsume the 4 notion atoms (equation, code-block, notifications, database-cell-selection) + notion-shell + notion-database behind one adapter. NOT consolidating those now — premature merge before the adapter contract lands = refactor twice. INSTEAD: tightened scope to two no-brainer cuts + one disambiguation. (1) DELETED frontend/slices/pages/ — dead `defineFeature` skeleton, routes:[], zero live imports (the `pages` ids in templates' nav-config are sidebar group keys, NOT slice refs). (2) DROPPED `notion-blocks` catalog entry — pure aggregator that re-exported the 4 atoms; atoms remain individually accessible in catalog. Slice dir + barrel KEPT so notion-page-clone template's `import { EquationBlock, CodeBlock } from "@/features/notion-blocks"` keeps resolving. (3) DELETED app/preview/slices/notion-blocks/page.tsx. (4) UPDATED notion-page-clone template nav link `/slices/notion-blocks` → `/slices/notion-shell` (avoids catalog detail 404). (5) RETITLED `theme-presets` catalog entry → 'tweakcn Theme Loader (30+ presets)' for unambiguous distinction from `theme-preset-switcher` (Convex-backed OKLch — different slice entirely). NO file moves on theme-presets (would cascade through CLAUDE.md + 5 docs + cookbook for marginal gain). Catalog: 45 → 44 slices. Backend slices spot-checked — rate-limit/subscribers/testimonials/services/socials all already `previewPath: undefined`, no janitor work needed.

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.

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.

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.

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`.

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

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

NewerPage 11 / 17Older

New cells

  • FilesCell — popover list + paste-URL (no upload UX)
  • PersonCell — initials chips + comma text picker (no directory)
  • FormulaCell — evaluated display + popover editor w/ live preview
  • CreatedTimeCell — readonly row.createdAt
  • LastEditedTimeCell — readonly row.updatedAt
  • UniqueIdCell — derived from row index + optional prefix

Refactor

  • components/cells/ subfolder created
  • MultiSelectCell + SelectCell extracted from property-cells.tsx
  • renderPropertyCell now takes row + db + onPropertyChange (optional)
  • lib/formula.ts lifted (simplified, no relation/rollup branches)
  • All new files ≤200 LOC; property-cells.tsx trimmed to 185 LOC

Types (notion-shell)

  • PropertyType: 10 → 16 (+ person, files, formula, created_time, last_edited_time, unique_id)
  • Property: + formulaExpression? + uniqueIdPrefix?
  • Database: + uniqueIdCounter?

Catalog

  • notion-database 0.2.0 → 0.3.0 — title says '10 views · 16 cells', tags include files/person/formula/timestamp/unique-id
  • Property type coverage: 10/17 → 16/17 (94%); database adaptation ~65% → ~72%

Deferred

  • relation + rollup — need cross-DB context (lift via upstream notion mega-bundle)
  • CK-1C FormView — still pending
  • CK-4 database-csv — still pending

Views lifted

  • ChartView — recharts bar/line/area/pie/donut + inline kind/X/agg/Y pickers
  • DashboardView — KPI strip + select-grouped breakdowns + recent updates feed
  • MapView — SVG world projection + lat/lng pins, optional color property
  • TimelineView — Gantt drag-to-shift / drag-to-resize bars
  • Views 6/11 → 10/11 (91%). FormView deferred to CK-1C.

Filter + Sort UI

  • FilterBuilder + SortBuilder — props-driven, shadcn Select-based
  • ViewOptions refactored — delegates to the new builders in its popovers
  • Coverage: filter/sort UI 0% → 100%

Type extensions (notion-shell types.ts)

  • DbView union: 6 → 11 (table/board/list/gallery/calendar/feed/chart/dashboard/form/map/timeline)
  • ChartKind + ChartAggregate types added
  • DatabaseViewConfig: 25 new optional view-specific fields (chart*, map*, form*, dashboard*, feed*, timeline*, hiddenPropIds)
  • ViewProps: onViewConfigChange + onOpenRow added (optional callbacks)

Catalog

  • notion-database 0.1.0 → 0.2.0 — title + description + tagline + tags updated, recharts npm dep added
  • Database adaptation: ~35% → ~65%

Deferred

  • CK-1C — FormView (PropertyFormInput + FormSettings + addRow-with-values plumbing)
  • CK-3 — property type cells (file/person/created_time/last_edited_time)
  • CK-4 — database-csv as standalone peer slice
  • Per docs/rr-sync/2026-05-21-notion-mega-lift-plan.md, upstream open-silong Phase 5 (~3wk) will land the full adapter-driven `notion/` mega-bundle that subsumes these gaps.

Deleted

  • frontend/slices/pages/ — dead skeleton, only ref was in this changelog's history
  • app/preview/slices/notion-blocks/ — preview route paired with catalog drop

Catalog

  • DROPPED notion-blocks — aggregator redundant, atoms individually listed
  • RETITLED theme-presets → tweakcn Theme Loader for clarity vs theme-preset-switcher
  • Catalog count: 45 → 44 slices

Template touch-ups

  • notion-page-clone/shared/nav-config.ts — link now points to notion-shell slice page (notion-blocks catalog no longer exists)

Deferred to upstream mega-bundle

  • notion atom consolidation (equation/code-block/notifications/database-cell-selection) — wait for docs/rr-sync/2026-05-21-notion-mega-lift-plan.md Phase 5 from open-silong (~3wk). Their adapter contract is the single converge point; pre-staging here would refactor twice.

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)

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).

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.

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
  • _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.
  • 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.