Skip to content
Resource
DocsTourSlicesBest PracticeAgentsInstall

Command Palette

Search for a command to run...

New
  • Changelog

Changelog

Release notes

Changelog

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

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.
NewerPage 20 / 25Older