rmnr
DocsTourSlicesBest PracticeAgentsInstall

Command Palette

Search for a command to run...

New
  • Changelog
Release notes

Changelog

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

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)

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.

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

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

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.

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)

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

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
NewerPage 13 / 17Older
  • 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

    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)

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

    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
    • 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
  • 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
  • app/(docs)/slices/page.tsx — h1 'Feature slices' → 'Slices'
  • docs/slice-architecture.md — dangling MEMORY.md TODO removed
  • 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)