Skip to content

CreatorTrack , Remaining Builds (fresh-session pickup)

URL: https://mkdocs.justinsforge.com/memory/plans/creatortrack-remaining-2026-06-18/

The bigger multi-file builds left after the 2026-06-18 sprint. Security RLS hardening + the real-time title/icon, slash menu, switcher, etc. are DONE + deployed. These remain , each needs new infra, hence a clean session. Parent: [[creatortrack-roadmap-2026-06-18]].

Working mode

Single owner of main, working in /home/justinwieb/forge-suite (NOT a worktree). The systemd dev server runs next dev on :3060 / dev.creatortrack.ai from this checkout , every save HMR- updates the preview. Do NOT run a dev server. Verify npx tsc --noEmit. Commit per task. DDL = Python migrations in /home/justinwieb/forge/data/workspace/migrations, applied via forge_workspace_migrate.py (admin role; app role lifeos_app cannot run DDL). DB admin creds in ~/.forge-secrets/forge-data.env (PGADMIN_*). Brand strictly B&W, reuse components/ui + primitives, var(--token). RLS is now strict (no is_owner bypass) , every data path must use the membership- scoped query under the signed-in identity.

The builds

A , Pretty / workspace-scoped URLs (roadmap "URL work" 1-3)

Today pages are raw /n/{id}. Move app routes under a workspace segment + a readable slug, id stays canonical (rename-safe): - app.creatortrack.ai/{workspace-slug}/{page-slug}-{id} (and a clean /{workspace}/... home). - Tie the ACTIVE WORKSPACE to the URL prefix (replacing/augmenting the current cookie in lib/active-workspace.ts); the (suite) layout reads the workspace from the path. - Keep /n/{id} working as a 308 redirect so existing links never break. - Update the workspace switcher, breadcrumbs, and internal <Link>s to the new paths. Touches: app/(suite) route tree, proxy.ts, layout, switcher, breadcrumbs. Single-owner; do first or last as one focused pass (routing-wide).

B , #10 Workspace settings / gear (rename + icon)

A workspace-settings surface (gear in the switcher) to rename a workspace + set its icon. - INFRA: lifeos_app can't UPDATE core.workspaces (RLS) , add a SECURITY DEFINER core.update_workspace(p_id, p_name, p_icon) (members/owner only), migration + grant to lifeos_app, mirroring core.create_workspace (0013). - UI: a small settings popup from the switcher; lib/workspace.ts helper + an API route.

C , #7 Sidebar section "…" menu (Move up/down, Hide, Show count, Customize)

Per-section customization on the Favorites/Private/Apps section headers. - INFRA: per-user SECTION PREFERENCES persistence (order, hidden, show-count) , store in core.users.prefs jsonb (already used by installed-apps) or a small table; a prefs hook. - UI: extend components/workspace/SidebarSection.tsx header with the "…" menu (kit Menu).

D , #9 Full emoji dataset for the icon picker

Replace the small glyph set with a real emoji picker. - Bundle a full-Unicode emoji JSON dataset (pick a source: e.g. an emoji-data JSON) into the repo; wire it into components/workspace/IconPicker.tsx with search + categories. - Keep image-URL icons working; emoji stored as the char in nodes.icon (already supported).

E , #13 Block drag-and-drop rewrite

Blocks already reorder via the ⋮⋮ handle; rewrite to the target interaction (drag any block, clear drop indicators, nesting where applicable), matching the page-tree DnD quality. Touches: components/workspace/BlockList.tsx + the block DnD layer (Section-0 dnd primitives).

F , #3 Empty-row click (NEEDS REPRO)

ct-admin could not reproduce this as broken (clicking the empty body below the title already keeps writing). Get Justin's exact repro before building; otherwise skip.

Suggested order

  1. Pretty URLs (A) , routing-wide, do while the page tree is otherwise quiet.
  2. Workspace settings (B) + section menu (C) , both small infra + UI.
  3. Emoji dataset (D).
  4. Block DnD rewrite (E).
  5. 3 only if Justin reproduces it.