π― Goal
Roll the @mind-studio/ui brand refresh β the interlocking-weave logo, the typography role redefinition (serif h1βh3, mono kbd), and the new React-free ./brand export β out to all 15 remaining consumer apps. Landing is already done (#26); this issue tracks the fleet.
β Added requirement (see π·οΈ Per-app wordmark): the in-app logo lockup must show the product name beside the mark (mark + "Drive"), not "Mind". This needs a small ui <Logo> enhancement and a new release on top of 0.6.0.
π¦ What 0.6.0 ships (the payload)
- Logo β the canonical interlocking-weave mark replaces every old per-app placeholder.
- Typography roles β base-layer rule sets
h1βh3 β var(--font-serif) (Fraunces), kbd β mono; h4βh6 stay sans.
./brand subpath β React-free export of MIND_MARK_SVG, MIND_MARK_VIEWBOX, MIND_GREEN, monoMarkSvg, MIND_CONSTRUCTION_SVG. Safe to import from plain Node build scripts β favicons/app-icons/OG/manifests authored from one source of truth instead of vendoring a copy that drifts.
π·οΈ Per-app wordmark
Each app's in-app lockup keeps the shared weave mark but labels itself with its own product name, set in the same Fraunces serif, weight, and size as the wordmark:
- Brand / host (landing, shell) β mark + "Mind"
- Product app (drive) β mark + "Drive" Β· slides β "Slides" Β· chat β "Chat" Β· etc.
Today <Logo> hardcodes the wordmark to theme.label ("Mind"). The product name is an app-level fact, not a brand/theme fact, so it should be a prop β not a per-app theme fork.
ui enhancement (new release, e.g. 0.6.1):
Scope note: label affects only the in-app <Logo> lockup. Favicons / app-icons / OG / manifest stay mark-only (no word), so the ./brand gen-icons pass below is unaffected.
π How it propagates (this is why most of the work is small)
- Typography β automatic. Every consumer already
@imports @mind-studio/ui/dist/styles.css in globals.css. The serif rule resolves --font-serif β --mind-font-serif β var(--font-fraunces) inside the package, so headings flip to Fraunces on bump β provided the app exposes a --font-fraunces variable (they all load Fraunces today; just confirm the variable name).
- Component logos β automatic. Anywhere the app renders the ui
<Symbol>/<Logo> component, the weave arrives on bump (only projects does this today). The product wordmark needs the new label prop (above).
- Static brand assets β manual. Favicons/app-icons/manifests/OG images are local files; they must be regenerated from
./brand. This is the only large per-app effort, and only for user-facing apps.
π Reference implementation: landing β scripts/gen-icons.mjs (imports @mind-studio/ui/brand) β src/app/{icon.svg, apple-icon.png, manifest.ts, opengraph-image.tsx}.
πΊοΈ Fleet state (survey, 2026-06-21)
All 15 are Next.js 16 app-router + Tailwind v4 (shell also Tauri), all already import the ui stylesheet. No conflicting h1βh3 CSS overrides found anywhere β clean adopters.
| App |
ui now |
Logo today |
Action |
| builder |
0.4.0 |
old amber diamond icon.svg |
bump + π·οΈ lockup label="Builder" + π¨ full asset pass |
| calendar |
0.4.0 |
old teal calendar icon.svg |
bump + π·οΈ lockup label="Calendar" + π¨ full asset pass |
| chat |
0.4.0 |
old cyan/magenta bubble icon.svg |
bump + π·οΈ lockup label="Chat" + π¨ full asset pass |
| drive |
0.5.0 |
old cyan "M" icon.svg |
bump + π·οΈ lockup label="Drive" + π¨ full asset pass |
| slides |
0.4.0 |
old teal "M" icon.svg |
bump + π·οΈ lockup label="Slides" + π¨ full asset pass |
| videos |
0.4.0 |
play-button icon.svg |
bump + π·οΈ lockup label="Videos" + π¨ full asset pass |
| shell |
0.5.0 |
old indigo/cyan arrow icon.svg + Tauri icons |
bump + π·οΈ lockup "Mind" (host) + π¨ full asset pass + π₯οΈ Tauri desktop icons |
| dock |
0.4.0 |
custom β¦ in TopBar.tsx chrome |
bump + π swap β¦ β <Logo> (label per context) |
| projects |
0.3.0 |
renders ui <Symbol> (auto) |
bump + π·οΈ adopt <Logo label="Projects"> where the wordmark shows |
| codespaces |
0.4.0 |
text-only ("Mind Codespaces") |
bump + π·οΈ <Logo label="Codespaces"> for the header |
| contacts |
0.4.0 |
text-only ("Mind Contacts") |
bump + π·οΈ <Logo label="Contacts"> for the header |
| product |
0.4.0 |
none |
bump only (typography) |
| notes |
0.4.0 |
none |
bump only |
| photos |
0.4.0 |
none |
bump only |
| whiteboard |
0.5.0 |
none |
bump only |
π¦ Rollout plan
Tier 0 β ui enabling release β prerequisite for the wordmark work
Tier 1 β Universal bump (all 15) β
delivers typography + state tokens + auto logos
Tier 2 β Typography QA (all 15, cheap)
Tier 3 β In-app lockup π·οΈ (mark + product name)
Tier 4 β Static brand assets, user-facing apps π¨ (builder, calendar, chat, drive, slides, videos, shell)
Per app, port landing's pattern (mark-only, no wordmark):
Tier 5 β Internal-tool assets (product, notes, photos, whiteboard) β optional / deferred
π§° DS enhancement (recommended, avoids 7Γ copy-paste drift)
β
Acceptance criteria
π Related
Suggested execution: land Tier 0 (<Logo label> + release) β bump fleet (Tier 1) β lockup + asset passes per repo. File a per-repo sub-issue (ready-for-agent) from each table row. Conventional Commits, no JIRA id.
π― Goal
Roll the
@mind-studio/uibrand refresh β the interlocking-weave logo, the typography role redefinition (serifh1βh3, monokbd), and the new React-free./brandexport β out to all 15 remaining consumer apps. Landing is already done (#26); this issue tracks the fleet.β Added requirement (see π·οΈ Per-app wordmark): the in-app logo lockup must show the product name beside the mark (mark + "Drive"), not "Mind". This needs a small
ui<Logo>enhancement and a new release on top of 0.6.0.π¦ What 0.6.0 ships (the payload)
h1βh3 β var(--font-serif)(Fraunces),kbd β mono;h4βh6stay sans../brandsubpath β React-free export ofMIND_MARK_SVG,MIND_MARK_VIEWBOX,MIND_GREEN,monoMarkSvg,MIND_CONSTRUCTION_SVG. Safe to import from plain Node build scripts β favicons/app-icons/OG/manifests authored from one source of truth instead of vendoring a copy that drifts.π·οΈ Per-app wordmark
Each app's in-app lockup keeps the shared weave mark but labels itself with its own product name, set in the same Fraunces serif, weight, and size as the wordmark:
Today
<Logo>hardcodes the wordmark totheme.label("Mind"). The product name is an app-level fact, not a brand/theme fact, so it should be a prop β not a per-app theme fork.uienhancement (new release, e.g. 0.6.1):label?: stringto<Logo>insrc/components/brand.tsx; default totheme.label(backward compatible). It overrides only the wordmark text, rendered with the existingfont-serif font-semibold text-2xl leading-none tracking-tight. The mark/symbol still comes from the active theme β unchanged.aria-hidden.symbolOnlystill drops the word.<Logo label="Drive" />renders "Drive" in the serif wordmark and still renders the theme symbol;<Logo />still renders "Mind".π How it propagates (this is why most of the work is small)
@imports@mind-studio/ui/dist/styles.cssinglobals.css. The serif rule resolves--font-serif β --mind-font-serif β var(--font-fraunces)inside the package, so headings flip to Fraunces on bump β provided the app exposes a--font-frauncesvariable (they all load Fraunces today; just confirm the variable name).<Symbol>/<Logo>component, the weave arrives on bump (onlyprojectsdoes this today). The product wordmark needs the newlabelprop (above)../brand. This is the only large per-app effort, and only for user-facing apps.π Reference implementation:
landingβscripts/gen-icons.mjs(imports@mind-studio/ui/brand) βsrc/app/{icon.svg, apple-icon.png, manifest.ts, opengraph-image.tsx}.πΊοΈ Fleet state (survey, 2026-06-21)
All 15 are Next.js 16 app-router + Tailwind v4 (shell also Tauri), all already import the ui stylesheet. No conflicting
h1βh3CSS overrides found anywhere β clean adopters.icon.svglabel="Builder"+ π¨ full asset passicon.svglabel="Calendar"+ π¨ full asset passicon.svglabel="Chat"+ π¨ full asset passicon.svglabel="Drive"+ π¨ full asset passicon.svglabel="Slides"+ π¨ full asset passicon.svglabel="Videos"+ π¨ full asset passicon.svg+ Tauri iconsβ¦inTopBar.tsxchromeβ¦β<Logo>(label per context)<Symbol>(auto)<Logo label="Projects">where the wordmark shows<Logo label="Codespaces">for the header<Logo label="Contacts">for the headerπ¦ Rollout plan
Tier 0 β
uienabling release β prerequisite for the wordmark work<Logo label>enhancement above; cut a release (e.g. 0.6.1). This becomes the bump target for any app adopting the in-app lockup.Tier 1 β Universal bump (all 15) β delivers typography + state tokens + auto logos
@mind-studio/uiβ the new release, reinstall,pnpm build && pnpm typecheckgreen. (projects0.3.0 and the 0.4.0 cohort also pick up the 0.5.0 semantic-state tokens in the same jump.)Tier 2 β Typography QA (all 15, cheap)
--font-frauncessoh1βh3render Fraunces, not system serif; alias where the variable is named differently (dock/photos/product/codespaces use--mind-font-*bridges β verify the chain reaches--font-fraunces).kbdmono; drop now-redundant manual.font-displayon headings.Tier 3 β In-app lockup π·οΈ (mark + product name)
<Logo label="<Product>" />per the table; landing/shell stay<Logo />β "Mind".β¦BrandMarkinsrc/components/TopBar.tsxfor<Logo>.Tier 4 β Static brand assets, user-facing apps π¨ (builder, calendar, chat, drive, slides, videos, shell)
Per app, port landing's pattern (mark-only, no wordmark):
scripts/gen-icons.mjsimporting@mind-studio/ui/brand; wire agen:iconsscript.src/app/icon.svgwith the gradient weave (legible to 16px).apple-icon.png(180Γ180, white mono mark on brand-green, 22% radius).manifest.ts(theme-color: #16B88A, 192/512 maskable green icons).opengraph-image.tsxrendering the real mark.Tier 5 β Internal-tool assets (product, notes, photos, whiteboard) β optional / deferred
π§° DS enhancement (recommended, avoids 7Γ copy-paste drift)
gen-iconshelper fromui(e.g.@mind-studio/ui/scripts/gen-iconsor a documented snippet) so the asset-pass apps consume one script instead of vendoringgen-icons.mjsseven times β same anti-drift rationale as the./brandexport.β Acceptance criteria
uiships<Logo label>; released; consumers on that version.kbdmono across the fleet.dockchrome andprojectsshow the weave../brand(mark-only); shell homescreen/desktop icon is the green app icon.@mind-studio/ui/brand.π Related