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 13 of 25. Full prose history in CHANGELOG.md.

JUN072026
Improvementmcp@1.2.0Jun 7, 2026

Gates actually gate — agent.md + changelog checks in pre-commit, vitest in pre-push, MCP↔CLI version coupling

Hardening W4. The drift checks existed (gen:agent-md:check, slices:check) but were never wired to a hook — agent.md drifted across three waves before anyone noticed. pre-commit now runs gen:agent-md:check + validate:changelog (verified: a deliberately corrupted agent.md fails the commit); pre-push runs vitest before the build (the audits are structural — no audit ever caught a dead click). MCP's rahman-resources dependency had drifted to ^1.9.1 while the CLI sat at 1.12.x — published MCP installs silently served a stale catalog; bumped to ^1.13.0 and a new prepublishOnly check-peer gate fails any future publish whose range lags the sibling CLI. DX: typecheck script carries the 4GB heap bump (cold tsc OOMs default Node), allowedDevOrigins unblocks 127.0.0.1 dev browsing (the silent no-hydrate trap), dev:alt serves port 3457 for parallel sessions, and a warn-only ui-drift report (41 drifted primitives, 13 site-only, 5 template-only) runs at the tail of validate:all so the dual shadcn trees diverge by decision, not accident.

Gates

  • pre-commit: + gen:agent-md:check + validate:changelog
  • pre-push: + vitest (~12s) before the production build
  • packages/mcp prepublishOnly: check-peer.mjs — dependency range must admit the sibling CLI version (was ^1.9.1 vs CLI 1.12.x)

DX

  • typecheck script bakes NODE_OPTIONS=--max-old-space-size=4096; validate:all uses it
  • next.config allowedDevOrigins: 127.0.0.1 dev pages hydrate again
  • dev:alt script (port 3457) for concurrent sessions
  • report-ui-drift.mjs — warn-only components/ui vs template-base diff at validate:all tail
JUN072026
Improvementsite@debt-sweepJun 7, 2026

Debt sweep — bidir block removed (generalization promoted), files joins the metadata system, 3.3MB orphan assets purged

Hardening W3. The BSDL-era bidir block survived in 20 slice contracts as pure noise — syncPolicy died with BSDL, but its nested generalization payload (level / forbiddenTerms / requiredProps) still feeds check-forbidden-terms.mjs, so it was promoted to a top-level contract field instead of deleted: all 20 contracts rewritten, SliceSyncPolicy + SliceBidirContract types and validateBidir dropped from the contract DSL, validateGeneralization replaces it. The files slice was the only catalog entry without a slice.json (the parity gate silently skipped it) — authored from its contract + catalog entry, versions aligned at 0.2.1, parity now checks 63/63 with zero skips. public/brand-assets/ carried PNG+WebP twins of every banner with no code references — 10 orphans deleted (4.4MB → 1.1MB), keeping the og:image PNG, icons, and the SVGs the footer actually uses.

Slices

  • files 0.2.1 — slice.json authored; parity gate now covers all 63 slices (0 skipped)

Site + CLI lib

  • contract DSL: bidir removed; generalization is a top-level field (forbidden-terms audit keeps its data)
  • 20 slice.contract.ts rewritten — zero bidir blocks remain
  • brand-assets: 10 orphaned banner/wordmark files deleted (-3.3MB static weight)
JUN072026
Fixsite@changelog-integrityJun 7, 2026

Nested-anchor hydration fix + changelog data integrity (page-aware badge links, date validator)

Hardening W2. Three site bugs: (1) RecentlyUpdatedBadge's card variant rendered a <Link> inside CatalogCard's own <Link> — invalid HTML, confirmed hydration error, and the inner anchor sat under pointer-events-none so it was unreachable anyway; the card variant now renders the bare pill. (2) Four changelog entries were future-dated (a miscomputed UTC-midnight epoch landed on Jun 8) which made badges read 'Updated today' for a day that hadn't happened — dates corrected. (3) Badge deep links pointed at /changelog#id, but the feed paginates 10/page and anchors on later pages never scroll — PAGE_SIZE moved to changelog-helpers as SSOT, getLatestUpdate now reports the entry's page, and links carry ?page=N. New gate: scripts/validation/validate-changelog.mjs (unique ids + no future dates + epoch sanity) wired into validate:changelog and slices:check so both data bugs stay fixed.

Site (fixed)

  • RecentlyUpdatedBadge card variant: no more anchor-in-anchor (hydration error gone)
  • Badge deep links are page-aware: /changelog?page=N#id via changelogHref()
  • Four future-dated entries corrected to their real dates
  • validate-changelog gate: unique ids, no future dates, epoch sanity (123 entries checked)
JUN072026
Fixrate-limit@0.2.0Jun 7, 2026

Security hardening W1 — touchToken bearer-proof, rate-limit policy map, Convex-backed admin login gate

Security audit follow-up. Two public Convex mutations were anonymously abusable: touchToken took a row id (anyone could enumerate token ids and tamper lastUsedAt) and rate-limit consume took caller-supplied limit/windowMs (anyone could forge a loose window and bypass the limit, or burn a victim key's budget). Neither can become internalMutation — ConvexHttpClient callers can't reach internal functions — so both are hardened in place: touchToken now takes the bearer token VALUE and resolves it via by_token (possession = authorization, no-op on miss); consume's limits moved to an in-code per-prefix POLICY map (unknown prefix rejected) plus an optional RATE_LIMIT_SERVER_KEY env gate compared constant-time. Admin login now uses the Convex-backed limiter when a deployment is configured (replica-safe, fail-open) with the in-memory bucket as dev fallback — and success no longer resets the counter, so a correct guess can't refund an attacker's budget. Session-token trade-off (signed-not-encrypted payload) documented in admin-auth.

Slices (hardened)

  • rate-limit 0.2.0 — consume({ key, serverKey? }) + in-code POLICY map; README documents the forged-window and budget-burn vectors
  • create-your-mcp — touchToken({ token }) by_token lookup replaces enumerable { id }; route template passes the bearer

Site

  • admin login rate-limit: Convex consume when NEXT_PUBLIC_CONVEX_URL set (fail-open), memory bucket fallback; reset-on-success dropped
  • admin-auth: session payload signed-not-encrypted trade-off documented
JUN072026
Improvementos-apps@status-tokensJun 7, 2026

Semantic status tokens + responsive guards — backported from os-vps across 5 slices

The os-vps de-gaudy sweep lands in the lifted slices: every raw Tailwind palette class used for STATUS meaning (bg-red-500, text-emerald-500, bg-amber-400, bg-sky-500, …) now reads the semantic tokens the site palette already defines — bg-success / bg-destructive / bg-warning / bg-info — so notification dots, toast icons, taskbar activity pips, error states, mute buttons and mask-edit banners all follow the active theme preset instead of fighting it. Intentionally colorful surfaces (app-icon gradients, file-type icon colors, avatar palettes) are untouched. Same wave adds responsive guards to the three fixed-width panels that could overflow small viewports: notification center (340px), inspector (300px) and the image-editor side panel (312px) now carry max-w clamps. Consumers on older copies: `npx rr update <slug>` — the slices assume --success/--warning/--info/--destructive tokens in globals.css (the rr init template ships them).

Slices (updated)

  • appshell 1.3.1 — app-badge, mobile-notification dots, notification-center (+max-w guard), window close-confirm, Windows-taskbar pips, toast-host, dynamic-island, inspector max-w guard → status tokens
  • image-editor 2.0.2 — brush warning chip + mask-edit banner → warning token; side panel max-w clamp
  • reel-editor 1.0.2 — mute toggle, delete action, error states, out-of-clip indicator → status tokens
  • browser 1.0.2 — omnibar secure-lock indicator → success token
  • code-editor 1.0.2 — status-bar save-error indicator → warning token
JUN072026
Featureappshell@1.3.0Jun 7, 2026

appshell 1.3.0 — 20-feature window-manager wave: command registry, Spaces, window tabs, Quick Look, clipboard, share, lock screen + more

The F1–F20 productivity wave lands from app-shell (app.rahmanef.com), where every feature shipped behind its own e2e gate (21-check headless harness, 13 vitest suites ride along in the slice). The multiplier seam is a dynamic command registry — registerCommands(source, cmds) — that Spotlight merges at runtime; nearly every other feature self-registers its palette commands through it (shells too: switching surfaces is a command). Window manager grew: always-on-top pinning, tiling presets incl. ⅓/⅔ thirds snap zones, virtual desktops (Spaces 1–4 with per-window spaceId), window tabs (merge an app's windows into one tabbed frame), saved layouts, session profiles (windows + shell prefs as one unit), and a work-area-clamped spawn cascade (windows can no longer open off-screen). New bundled features (DEFAULT_FEATURES 5 → 10): Quick Look (Space-bar previewer registry), clipboard history (⌘⇧V overlay, pin survives clear, monotonic ids), share sheet (target registry + copy/download built-ins), shortcut cheat-sheet (⌘/, source-keyed hint registry), lock screen (privacy curtain, idle auto-lock, consumer unlock guard). Notifications gained inline actions + per-app icon badges (count pill / dot / progress ring on every shell's icons, auto-driven by unread appId toasts). Plus: cross-app drag & drop (typed payloads → per-app drop handlers), focus mode (toasts go log-only), recents, a11y-ready font/contrast seams, desktop wallpaper-layer widgets (new desktopWidgets slot region), and document.title sync ("App — Brand", manifest.titleSync opt-out). Framework stays brand-free — the one hardcoded brand string found in review (notification cards) now reads useBrand().

Slices (updated)

  • appshell 1.3.0 — dynamic command registry, badges, layouts, recents, notification actions, pin/tiling-thirds, Spaces, window tabs, Quick Look, clipboard, share, DnD, focus mode, ⌘/ help, profiles, lock screen, desktop widgets, title sync, cascade clamp; 13 vitest suites in-slice
JUN072026
Featureloading-states@0.1.0Jun 7, 2026

loading-states slice — skeleton + spinner SSOT, adopted across the site

UX wave U8. A repo-wide grep found loading UI hand-rolled everywhere: bespoke animate-pulse divs (notion hosts), raw Loader2 spans (preview-kit, admin-login), and a one-off docs body skeleton. New loading-states slice centralizes the pattern: LoadingSkeleton composes the shadcn Skeleton primitive with seven kind presets (text / card / list / table / form / page / block, count + columns overridable), and LoadingState composes the shadcn Spinner for in-flight work (inline / block / overlay). The page kind drops straight into a route loading.tsx. The site now eats its own dog food: DocsLoadingSkeleton keeps only the docs-shell chrome strips and delegates its body to kind="page"; the notion database/notes hosts swap pulse divs for kind="block"; preview-kit chat + composer and admin-login swap Loader2 for the Spinner primitive. Per-slice skeletons (icon-picker, notion editor) stay put — slice self-containment beats DRY across slice boundaries.

Slices (new)

  • loading-states 0.1.0 — LoadingSkeleton (7 kinds) + LoadingState (3 variants) on shadcn Skeleton/Spinner; previews for every kind

Site (adopted)

  • DocsLoadingSkeleton body now renders LoadingSkeleton kind="page" — chrome strips stay bespoke
  • Notion database/notes hosts: ad-hoc animate-pulse divs → LoadingSkeleton kind="block"
  • preview-kit chat/composer + admin-login: raw Loader2 → shadcn Spinner primitive
  • agent.md regen catch-up for admin + the five U6 slices (titles/taglines drifted since U5–U7)
JUN072026
Fixsite@sidebar-treeJun 7, 2026

Docs sidebar tree actually folds — dead chevrons fixed, sections collapsed by default

UX wave U7. Three compounding bugs killed the docs-sidebar tree: (1) category branches never toggled at all — SidebarMenuButton's tooltip prop wraps the button in a Tooltip root, and CollapsibleTrigger's asChild Slot merged its onClick onto that non-DOM wrapper, silently dropping the handler; (2) section chevrons never rotated — the group/section class sat on SidebarGroupLabel, which Radix never stamps data-state on, so the group-data-[state=open] selector could not match; (3) every section defaulted to open, rendering the whole catalog as one wall. Fixes: tooltip dropped from the trigger (sidebar is always full-width — it added nothing), group classes moved to the Collapsible roots that actually carry data-state, and only the section containing the active path starts open (navigation re-opens, manual toggles stick). Also: publish gate caught template-base/contact-form-resend still on the removed "email" category — moved to integrations.

Site (fixed)

  • Branch toggle: tooltip-in-CollapsibleTrigger swallowed clicks — removed
  • Chevron rotation: group/* classes now live on the data-state-carrying Collapsible roots
  • Sections collapsed by default except the one holding the active path

Slices (fixed)

  • contact-form-resend (template-base copy): category email → integrations (unblocks CLI publish gate)
JUN072026
Improvementos-apps@hooks-v6Jun 7, 2026

react-hooks v6 compliance sweep backported from os-vps + macOS-style app icons

The os-vps lint sweep (55 compiler-era react-hooks warnings → 0, rules promoted to error) lands in every lifted slice so both repos are line-identical outside seams again. Pattern conversions, no blanket disables: latest-ref mirrors move into effects, effect-driven resets become request/prop-keyed derived state (window-content, file-tree, use-konva-image, favicon, omnibar, remote-view, NumBox, waveform, spotlight), dynamic icon lookups render via createElement (useMemo does NOT satisfy static-components — probed), inline components hoist to module scope, the image-editor co-locates selection+mask in one state so the mask-exit invariant is atomic, history snapshots canUndo/canRedo at mutation time, and the inspector AI thread resets via key= remount. Bonus: the appshell AppIcon drops the hard iOS-glass sheen for a macOS Ventura treatment — soft full-height luminance ramp, hairline edge ring, layered drop shadow, shadowed glyph — mirrored in the app-store icon preview + card tiles.

Slices (changed)

  • appshell 1.2.1 — hooks-v6 clean (window-content keyed loader, url-sync/app-switcher ref mirrors, spotlight mounts per open, inspector key= remount) + Ventura AppIcon
  • image-editor 2.0.1 — atomic selection+mask state, mutation-time history flags, paintBox memo, derived dirty, un-curried overlay drags
  • reel-editor 1.0.1 — frameRef mirror, keyed NumBox draft, .then-form imports browser, lazy layout init, map-derived waveform
  • browser 1.0.1 — keyed favicon error, keyed omnibar draft, lazy usePersistent
  • app-store 1.0.1 — createElement glyph tiles + ramp sheen; assistant 1.0.1, media-viewer 1.0.1, code-editor 1.0.1 (file-tree keyed listing), os-terminal 1.0.1 ref mirrors
JUN072026
Featurerahman-resources@1.12.0Jun 7, 2026

Five basics every app needs — data-table, empty-states, marketing-chrome, settings-page, notifications-center

UX wave U6. The catalog had editors, payments and an OS shell — but no data table, no 404 page, no footer. Five foundational slices land, all pure-UI, adapter-driven where state is involved, each with variant previews + smoke coverage (registry 37 → 42): data-table (generic DataTable<TData> on TanStack Table v8 + shadcn Table — sorting, search, pagination, row selection, column visibility; density/selectable axes), empty-states (six presets 404/500/403/no-results/empty-list/first-use on the shadcn Empty primitive + ErrorPage drop-in for app/not-found.tsx + error.tsx), marketing-chrome (config-driven MarketingHeader split/centered/minimal + mobile sheet menu, MarketingFooter columns/slim — the chrome every template hand-rolled), settings-page (Profile/Preferences/Notifications/Danger-zone shell over a two-method SettingsAdapter with optimistic save), notifications-center (bell + unread badge + popover/sheet inbox over a NotificationsAdapter; enhances appshell + dashboard-shell). CLI 1.12.0 carries them plus the U2 category enum + U3 alias resolution.

Slices (NEW)

  • data-table — TanStack v8 + shadcn Table; sorting / search / pagination / selection / column visibility
  • empty-states — 404/500/403/no-results/empty-list/first-use presets + ErrorPage drop-in
  • marketing-chrome — MarketingHeader (3 layouts, sheet menu) + MarketingFooter (2 layouts)
  • settings-page — adapter-driven settings shell, 4 sections, optimistic save
  • notifications-center — bell + inbox, adapter-driven, enhances appshell/dashboard-shell

CLI

  • 1.12.0 — 62 slices in manifest, integrations/data category enum, alias resolution, @tanstack/react-table dep guidance
NewerPage 13 / 25Older