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¶
- Pretty URLs (A) , routing-wide, do while the page tree is otherwise quiet.
- Workspace settings (B) + section menu (C) , both small infra + UI.
- Emoji dataset (D).
- Block DnD rewrite (E).
-
3 only if Justin reproduces it.¶