moimeDesign Systemv1.0
Canvas theme
moime · Design System

Brand and design system for moime.app

Token strategy (3-tier architecture, dark mode as semantic values), enterprise-grade structure (asset audit, documented decisions), and AI-integrated workflow.

moime
RoleTakao Umehara
Product & Design Director
Productmoime.app, a link-in-bio service built on editorial templates
StackNext.js, CSS custom properties, HTML specs, Claude, Claude Code

The brief

Give moime one identity across the marketing site and the product, for design-conscious working women who expect a modern, simple and quietly luxurious feel. The product already shipped on a token set inherited from another project, and its logo was live text.

What I owned

  • Direction, naming and trademark risk calls
  • Logo selection and small-size validation
  • Token architecture for light and dark themes
  • Component specs and the governance model
  • Audit of the existing codebase and the implementation brief for an AI coding agent
moime · Case study

Key decisions

Each choice with the options on the table and the reason it won. Most of them were settled by testing at real sizes, not by preference.

Logo typeface and weight

Weight test at the real mobile header size (22px): Book 400 was chosen because it held the serifs at small sizes; lighter weights (XLight 250, Light 300) broke when the stems became sub-pixel.

Favicon construction

At browser-tab size (16×16 pixels), the moime wordmark becomes illegible. The favicon uses a standalone 'm' mark pixel-drawn at 16px to keep 2px stems on whole pixels. Auto-scaling the outline blurs every stem.

Token architecture

Three tiers: primitive (hex values), semantic (CSS variables reading primitives), component (reading semantic only). Dark mode is a second set of semantic values, not a second set of components. This keeps the token file short and makes themes predictable.

moime · Case study

Asset audit

Before designing tokens, I read the production codebase to see what the UI actually depended on.

The product reads colour, type and shape from about thirty custom properties. Overriding their values in one file moves the whole UI onto the brand without a rename migration, and leaves room to introduce brand-named aliases later.

Scope boundaryCreator templates carry their own type and colour. They sit outside the system and are checked by the existing template scripts after every step.
Existing rules keptThe repo already had binding taste rules (no italics, no eyebrow labels, sentence case). The new system adopts them, and limits the mono label style to metadata.
MethodRead the layout, theme blocks, header and footer components, then searched for every hard-coded colour, radius and wordmark.
moime · Foundations

Colour tokens

Three tiers. Components read semantic tokens only, so a theme is a second set of semantic values, not a second set of components.

Primitives

Paper
#F6F1E8
Paper raised
#FBF8F2
Linen
#EAE2D4
Rule
#DCD3C4
Stone
#6E655A
Graphite
#4A443D
Ink
#1A1816
Bronze
#8A6A47

WCAG contrast checked in both light and dark modes. Every text token meets AA against its background.

moime · Foundations

Typography

Archer appears only in the outlined logo. The web stack is free to self-host: a serif for voice, a sans for work, a mono for metadata.

AaNewsreader 400 · OFL
AaInstrument Sans 400/500 · OFL
AaIBM Plex Mono 400 · OFL
moime · Foundations

Space, shape, motion

A 4px scale, square corners and hairlines, and short motion with no overshoot.

Spacing runs on a 4px base: 4, 8, 12, 16, 20, 24, 32, 48, 64, 96, 128. Radius: 0 (square corners everywhere). Borders: 1px solid. Motion: 120–200ms, cubic-bezier(0.2, 0, 0, 1). No bounce, no overshoot.

moime · Brand

Favicon

A set of sizes from 16×16 to 512×512, plus the pixel-perfect 16px comparison showing how much detail survives.

16px16×16
32px32×32
48px48×48
192px192×192
512px512×512

At browser-tab size (16×16), the moime m is still clear. The dot stays visible at one pixel. Scaling the outline blurs every stem; the pixel-drawn version keeps 2px stems on whole pixels.

moime · Components

Button

Primary, secondary and text buttons in two sizes.

Primary for the main action. Secondary for alternatives. Text button for tertiary actions. Square corners (radius 0), 1px borders, 120ms hover transition.

moime · Components

Text input

A labelled field with helper and error text. The handle field shows the prefix and validates as you type.

48px height, 1px border, label above, helper text below. Error state: border becomes danger colour, helper text turns red.

moime · Components

Checkbox, radio, switch

Selection controls with whole-row hit targets.

Checkbox for independent options saved with a form. Radio for one of a few visible choices. Switch for a setting that applies immediately. All have 20px control size, 1px borders, and labels with 48px minimum tap targets.

moime · Components

Tabs and tags

Tabs switch views in place. Tags filter and label.

Up to four tabs. Active tab: ink text and a 1px underline. Tags: outline for filters, filled when selected. Both use square corners and no icons.

moime · Components

Feedback

Alerts, toasts, modals and dialogs for success, errors, and confirmations.

Alerts and toasts

✓Your changes were saved successfully
!That handle is already taken. Try another.

Modals and dialogs

Centered overlay with a scrim. Action buttons (primary + text cancel) at the bottom. Escape key or outside click to dismiss.

moime · Components

Cards

Preview cards for links, templates, and content items.

16:9
Card titleA short lede describing the item. Two lines maximum before truncation.

16:9 image, title and description. Raised paper background, 1px rule border. Hover lifts with a subtle shadow.

moime · Operating model

Governance

Where the truth lives, how it changes, and what it must never touch.

Versioning: patch (value changes), minor (new token), major (rename/removal with alias first). Quality gates: AA contrast, 375 and 1280 screens, light and dark, visible keyboard focus. Token file is the source of truth; documentation follows.

moime · Operating model

AI workflow

People make the calls, AI produces options and evidence, and a coding agent implements from a brief written for it.

PERSON
  • Defines the problem
  • Decides the direction
  • Approves in production
  • Owns the outcome
AI (CLAUDE)
  • Generates options
  • Measures tradeoffs
  • Surfaces evidence
  • Documents rationale
AGENT (CLAUDE CODE)
  • Reads the token file first
  • Implements from brief
  • Ships to production
  • Checks quality gates

Making the system legible to agents

The decisive move was writing the rules down as hard constraints so a tool built by a person or an agent comes out looking like the product. The token file ships as JSON; a one-page brief tells an agent the rules before it writes a line.