oh-my-design-cli 1.5.1 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -1
- package/README.ko.md +1 -1
- package/README.md +38 -1
- package/agents/omd-master.md +13 -1
- package/data/reference-fingerprints.json +380 -2
- package/dist/bin/oh-my-design.js +1 -1
- package/dist/{install-skills-IETT2TBJ.js → install-skills-UKEVE3KT.js} +11 -9
- package/dist/{install-skills-IETT2TBJ.js.map → install-skills-UKEVE3KT.js.map} +1 -1
- package/package.json +10 -4
- package/scripts/ctx-prime.cjs +266 -0
- package/scripts/postinstall.cjs +6 -6
- package/skills/omd-harness/SKILL.md +135 -7
- package/web/references/91app/DESIGN.md +151 -0
- package/web/references/airtable/DESIGN.md +16 -2
- package/web/references/bithumb/DESIGN.md +170 -0
- package/web/references/bunjang/DESIGN.md +19 -0
- package/web/references/cakeresume/DESIGN.md +162 -0
- package/web/references/catchtable/DESIGN.md +19 -0
- package/web/references/classum/DESIGN.md +19 -0
- package/web/references/dabang/DESIGN.md +19 -0
- package/web/references/dji/DESIGN.md +0 -1
- package/web/references/fastcampus/DESIGN.md +19 -0
- package/web/references/flex/DESIGN.md +19 -0
- package/web/references/gmarket/DESIGN.md +19 -0
- package/web/references/gogolook/DESIGN.md +126 -0
- package/web/references/hahow/DESIGN.md +158 -0
- package/web/references/hyundaicard/DESIGN.md +172 -0
- package/web/references/inflearn/DESIGN.md +19 -0
- package/web/references/kbank/DESIGN.md +18 -0
- package/web/references/kdan/DESIGN.md +160 -0
- package/web/references/kkbox/DESIGN.md +114 -0
- package/web/references/kream/DESIGN.md +18 -0
- package/web/references/lunit/DESIGN.md +19 -0
- package/web/references/melon/DESIGN.md +153 -0
- package/web/references/nhncloud/DESIGN.md +174 -0
- package/web/references/oliveyoung/DESIGN.md +19 -0
- package/web/references/rayark/DESIGN.md +132 -0
- package/web/references/sendbird/DESIGN.md +285 -0
- package/web/references/socar/DESIGN.md +18 -0
- package/web/references/toss-securities/DESIGN.md +19 -0
- package/web/references/tving/DESIGN.md +18 -0
- package/web/references/upbit/DESIGN.md +19 -0
- package/web/references/upstage/DESIGN.md +18 -0
- package/web/references/velog/DESIGN.md +168 -0
- package/web/references/wadiz/DESIGN.md +19 -0
- package/web/references/webflow/DESIGN.md +16 -2
- package/web/references/yeogiotte/DESIGN.md +19 -0
- package/data/architecture-proposals/2026-05-13-thin-install-fresh-fetch.md +0 -189
- package/data/issues/2026-05-13-multi-surface-schema-rfc.md +0 -67
- package/data/reference-audits/2026-05-13-kr10.md +0 -132
- package/data/reference-audits/2026-05-14-kr10.md +0 -72
- package/data/reference-audits/2026-05-15-kr10.md +0 -124
- package/data/research/2026-05-18-agent-landscape.md +0 -69
- package/data/research/2026-05-18-kr-style-presets.md +0 -572
|
@@ -429,6 +429,25 @@ Interpretive claims (editorial, not documented Yeogiotte brand statements):
|
|
|
429
429
|
- The KKR-vs-CVC clarification in §11 — KKR is widely confused in casual press; primary press citations confirm CVC.
|
|
430
430
|
-->
|
|
431
431
|
|
|
432
|
+
|
|
433
|
+
## 16. Do's and Don'ts
|
|
434
|
+
|
|
435
|
+
### Do
|
|
436
|
+
- Reserve Yeogiotte Blue `#1D8BFF` for primary CTAs (hero `검색`, login, `지도 보기`), filter-chip selected-state, and the `반짝특가` promo badge, targeting ≤2 blue elements per viewport in a primary flow
|
|
437
|
+
- Hold to the three-tier radius scale of 8px buttons, 12px cards, and 100px filter pills, with inline badges at the tight 3-6px range
|
|
438
|
+
- Set body and headings in Pretendard at `#222222` rather than pure black, and confine 700 weight to the listing name, final price, promo badges, and hero CTA while keeping location and distance meta at 400-500
|
|
439
|
+
- Render the promo-badge grammar by role: yellow `#FFC83B` rating chip, blue-tint `#E3F0FF`/`#1D8BFF` `반짝특가`, slate `#49627A` `회원가`, and red `#FFEDEA`/`#F94239` coupon-applied price
|
|
440
|
+
- Separate borderless `#ffffff` listing cards by whitespace gap and let the edge-to-edge room photo fill the 12px-radius card top, placing all badges and pricing in the metadata block below
|
|
441
|
+
- Keep hashtag filter chips in user-language Korean (`#감성숙소`, `#연인추천`, `#반려견`) on a single 32px-tall horizontal-scroll row with 1.5px `#E6E6E6` borders as the primary filter surface
|
|
442
|
+
|
|
443
|
+
### Don't
|
|
444
|
+
- Use `#1D8BFF` as a hero background, card fill, divider, or decorative accent, or let three blue surfaces compete on one screen instead of demoting to the `#E3F0FF` tint
|
|
445
|
+
- Style the `회원가` member-rate badge in brand blue, red, or yellow — keep it on slate `#49627A` so it reads as account utility, not a flash deal
|
|
446
|
+
- Reach for an off-system radius like 10px, 14px, or 20px on a button or card when the answer is one of 8px, 12px, or pill
|
|
447
|
+
- Place any promo or coupon badge on top of the room photo or tint the photo with a brand-color filter — badges live below the image and the destination must read true
|
|
448
|
+
- Translate hashtag chips into category-style labels like `Romantic Stays` or `Pet-Friendly`, add extra adjectives to `#감성숙소`, or collapse the filter-chip row behind a primary `Filters` modal
|
|
449
|
+
- Apply spring or overshoot easing to chrome and money surfaces, bold an entire listing card, or stack two same-color-family promo badges on one card
|
|
450
|
+
|
|
432
451
|
---
|
|
433
452
|
|
|
434
453
|
**Verified:** 2026-05-09
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
# Thin install + fresh fetch (WebFetch + MCP)
|
|
2
|
-
|
|
3
|
-
**Status**: proposed — not implemented
|
|
4
|
-
**Author context**: 2026-05-13 conversation, after KR-10 batch
|
|
5
|
-
**Motivation**: npm publish on every brand addition is high-friction and produces stale installs
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Problem statement
|
|
10
|
-
|
|
11
|
-
Current `oh-my-design-cli` package bundles 88 brand DESIGN.md files (~12MB) and ships them via npm.
|
|
12
|
-
|
|
13
|
-
**Pain points observed**:
|
|
14
|
-
1. Every batch (10 brands) requires `npm publish` to reach end users
|
|
15
|
-
2. Users installed at count N keep seeing N brands forever, even after we add more
|
|
16
|
-
3. Skill descriptions historically baked the count (`"67개 ..."`) — required re-edit per batch, easy to forget (we forgot in the 78 release; observed again at 88)
|
|
17
|
-
4. Bundle grows linearly; cold install time scales
|
|
18
|
-
5. Single brand typo fix = minor version bump + publish
|
|
19
|
-
|
|
20
|
-
**Decided 2026-05-13**: skill descriptions are now **count-agnostic** ("실제 기업 레퍼런스" without a number). Won't regress this kind of bug again. But the fundamental delivery model still needs reform.
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Proposed architecture
|
|
25
|
-
|
|
26
|
-
Hybrid: **thin npm baseline + fresh fetch at runtime**.
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
npm package (thin, ~500KB)
|
|
30
|
-
├─ skills/ (routing logic, count-agnostic)
|
|
31
|
-
├─ data/reference-fingerprints.json (metadata only — id, category, primary, tone keywords)
|
|
32
|
-
├─ data/snapshot-date.txt ("baseline 2026-05-13")
|
|
33
|
-
├─ hooks/, agents/, bin/ (unchanged)
|
|
34
|
-
└─ (no DESIGN.md bundled — fetched at runtime)
|
|
35
|
-
|
|
36
|
-
Runtime (skill execution in user's agent)
|
|
37
|
-
1. Match brand via local fingerprints.json (offline-capable)
|
|
38
|
-
2. Fetch full DESIGN.md from:
|
|
39
|
-
- Primary: WebFetch https://oh-my-design.kr/api/references/<id>/design-md
|
|
40
|
-
- MCP path: omd_get_designmd(id) (if MCP server connected)
|
|
41
|
-
- Fallback: bundled (if shipped — optional Phase 3 decision)
|
|
42
|
-
3. Apply, write to project DESIGN.md
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
**Outcome**:
|
|
46
|
-
- New brand batch → `git push` web + git commit fingerprints; **no npm publish**
|
|
47
|
-
- Users see new brands on next skill call (no reinstall)
|
|
48
|
-
- npm publish frequency drops to "skill behavior changes" (<1/month)
|
|
49
|
-
- Marketing copy (READMEs) still updates count per batch — that's intentional
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## Implementation phases
|
|
54
|
-
|
|
55
|
-
### Phase 1 — Backend HTTP endpoint (~1h)
|
|
56
|
-
|
|
57
|
-
`web/src/app/api/references/[id]/design-md/route.ts`:
|
|
58
|
-
```ts
|
|
59
|
-
import { readFileSync } from 'fs';
|
|
60
|
-
import { join } from 'path';
|
|
61
|
-
import { NextRequest, NextResponse } from 'next/server';
|
|
62
|
-
|
|
63
|
-
export async function GET(_req: NextRequest, { params }: { params: { id: string } }) {
|
|
64
|
-
try {
|
|
65
|
-
const md = readFileSync(join(process.cwd(), 'references', params.id, 'DESIGN.md'), 'utf-8');
|
|
66
|
-
return new NextResponse(md, {
|
|
67
|
-
headers: {
|
|
68
|
-
'Content-Type': 'text/markdown; charset=utf-8',
|
|
69
|
-
'Cache-Control': 'public, max-age=300, s-maxage=3600',
|
|
70
|
-
'Access-Control-Allow-Origin': '*',
|
|
71
|
-
'ETag': `"${md.length}-${md.slice(-32)}"`,
|
|
72
|
-
},
|
|
73
|
-
});
|
|
74
|
-
} catch {
|
|
75
|
-
return NextResponse.json({ error: 'not found' }, { status: 404 });
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Smoke test: `curl https://oh-my-design.kr/api/references/kakaopay/design-md | head -20`
|
|
81
|
-
|
|
82
|
-
### Phase 2 — MCP server (~3h, parallel with Phase 1)
|
|
83
|
-
|
|
84
|
-
New package `oh-my-design-mcp` (separate npm package).
|
|
85
|
-
|
|
86
|
-
Tools exposed:
|
|
87
|
-
| Tool | Args | Returns |
|
|
88
|
-
|---|---|---|
|
|
89
|
-
| `omd_search_references` | `{ query, top_k? }` | top-N brand fingerprints (id, score, why) |
|
|
90
|
-
| `omd_get_designmd` | `{ id }` | full DESIGN.md markdown |
|
|
91
|
-
| `omd_list_categories` | — | category → ids map |
|
|
92
|
-
| `omd_get_snapshot_date` | — | "2026-05-13" (for staleness check) |
|
|
93
|
-
|
|
94
|
-
Resources exposed (MCP resources, browsable):
|
|
95
|
-
- `omd://references` — list all
|
|
96
|
-
- `omd://references/<id>` — single DESIGN.md
|
|
97
|
-
|
|
98
|
-
Server reads from same HTTP endpoint internally (single source of truth) OR direct disk if self-hosted.
|
|
99
|
-
|
|
100
|
-
Distribution: `npx -y oh-my-design-mcp` in MCP config:
|
|
101
|
-
```json
|
|
102
|
-
{
|
|
103
|
-
"mcpServers": {
|
|
104
|
-
"oh-my-design": { "command": "npx", "args": ["-y", "oh-my-design-mcp"] }
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
### Phase 3 — Skill updates (~1h)
|
|
110
|
-
|
|
111
|
-
`skills/omd-init/SKILL.md`, `skills/omd-harness/SKILL.md`:
|
|
112
|
-
|
|
113
|
-
```diff
|
|
114
|
-
- Phase 4: fetch reference DESIGN.md from .claude/data/references/<id>/DESIGN.md
|
|
115
|
-
+ Phase 4: fetch reference DESIGN.md (priority order):
|
|
116
|
-
+ a) If MCP `oh-my-design` connected: call omd_get_designmd(id)
|
|
117
|
-
+ b) Else WebFetch https://oh-my-design.kr/api/references/<id>/design-md
|
|
118
|
-
+ c) Else (offline): bundled .claude/data/references/<id>/DESIGN.md if present
|
|
119
|
-
+ d) Else: report "id not in catalog, network unavailable, no bundle"
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
Skill must also surface the snapshot date to the user when fetching offline:
|
|
123
|
-
> "오프라인 모드 — 2026-05-13 기준 카탈로그 사용 중. 최신 brand 보려면 인터넷 연결 후 재시도."
|
|
124
|
-
|
|
125
|
-
### Phase 4 — Bundle diet (~30m, optional)
|
|
126
|
-
|
|
127
|
-
`package.json`:
|
|
128
|
-
```diff
|
|
129
|
-
"files": [
|
|
130
|
-
"dist",
|
|
131
|
-
"skills/*",
|
|
132
|
-
"agents",
|
|
133
|
-
"data",
|
|
134
|
-
- "web/references/*/DESIGN.md",
|
|
135
|
-
+ "data/snapshot-date.txt",
|
|
136
|
-
".claude/hooks/*.cjs",
|
|
137
|
-
".claude/settings.json"
|
|
138
|
-
]
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
`scripts/postinstall.cjs`: stop copying DESIGN.md files into `.claude/data/references/`. Skills will fetch.
|
|
142
|
-
|
|
143
|
-
**Trade-off**: completely offline-broken if API down. Mitigation: optional flag `--bundle-references` for users who want offline guarantee.
|
|
144
|
-
|
|
145
|
-
### Phase 5 — `omd:batch-launch` SKILL update (~15m)
|
|
146
|
-
|
|
147
|
-
Phase 3 SYNC:
|
|
148
|
-
- Remove `npm publish` from suggested follow-ups
|
|
149
|
-
- Add note: "After git push, brand reaches users automatically via API"
|
|
150
|
-
- Marketing surfaces (README count, llms.txt count) still need batch sync since they're static
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
## Migration plan
|
|
155
|
-
|
|
156
|
-
1. **Phase 1 first** (backend endpoint) — non-breaking, just adds capability
|
|
157
|
-
2. **Phase 2 in parallel** (MCP) — non-breaking, separate package
|
|
158
|
-
3. **Phase 3** (skill update) — backward-compat: tries MCP → WebFetch → bundle, so old installs still work
|
|
159
|
-
4. **Phase 4 last** (bundle diet) — only after Phase 3 has shipped for 1-2 weeks and we confirm fetch reliability
|
|
160
|
-
5. **Phase 5** (omd:batch-launch update) — final cleanup after migration is stable
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## Open questions
|
|
165
|
-
|
|
166
|
-
- **Authentication**: keep API public read? (Yes — DESIGN.md files are intended for public consumption, that's the product.)
|
|
167
|
-
- **Rate limit**: needed? (Probably basic per-IP at edge — Vercel/Cloudflare. Not critical for v1.)
|
|
168
|
-
- **Versioning of DESIGN.md content**: should the API return a `?version=YYYY-MM-DD` parameter so installs can pin? (Defer — KISS for v1.)
|
|
169
|
-
- **Caching**: should the skill cache fetched DESIGN.md locally per session? (Yes — agent runtime should cache the parsed result for the session.)
|
|
170
|
-
- **What about agent that has no WebFetch tool?** (Edge case. Codex CLI has it. Cursor has it via tool config. If a user's agent really has neither WebFetch nor MCP, they install the `--bundle-references` flag at install time.)
|
|
171
|
-
|
|
172
|
-
---
|
|
173
|
-
|
|
174
|
-
## When to do this
|
|
175
|
-
|
|
176
|
-
**Trigger**: next time the user mentions "10개 더" or any brand addition. Pause Phase 2 build, ship the architecture first, then resume.
|
|
177
|
-
|
|
178
|
-
**Or**: after 2 more batches (100, 110 brands), npm package bundle pain becomes hard to ignore — natural breakpoint.
|
|
179
|
-
|
|
180
|
-
**Not now**: this conversation closed with count-agnostic skill descriptions as the immediate fix. Architecture is tracked but not implemented yet.
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
## Reading list / inspirations
|
|
185
|
-
|
|
186
|
-
- Linear's hosted catalog approach (linear.app/docs API)
|
|
187
|
-
- Tailwind v4 CDN-first delivery model
|
|
188
|
-
- shadcn/ui's "components are not a package, they're snippets you copy" — opposite direction but instructive
|
|
189
|
-
- MCP spec: `https://modelcontextprotocol.io/`
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
# RFC: Multi-surface brand spec (deferred)
|
|
2
|
-
|
|
3
|
-
**Status**: deferred / not blocking
|
|
4
|
-
**Filed**: 2026-05-13
|
|
5
|
-
**Trigger**: Banksalad mismatch — canonical DESIGN.md captured "advisor app" idiom, but `banksalad.com` is a "marketing landing" idiom. Generated landing.html was schema-faithful but didn't resemble the actual brand homepage.
|
|
6
|
-
**Decision**: do NOT do this schema change now. Solve at the skill level first (see `data/issues/2026-05-13-multi-surface-schema-rfc.md` companion fix in commit history). Revisit only if skill-level fix proves insufficient after ~10 more brand additions or repeated user complaints about surface mismatch.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Problem
|
|
11
|
-
|
|
12
|
-
One brand can have visually distinct surfaces (marketing landing, in-app, docs, onboarding). The current `DESIGN.md`-per-brand schema implicitly picks ONE surface as canonical. Generators following the spec faithfully will mismatch when user requests a different surface.
|
|
13
|
-
|
|
14
|
-
## Why we're deferring the schema change
|
|
15
|
-
|
|
16
|
-
1. **Both prior-art systems we surveyed keep schema single**:
|
|
17
|
-
- Google Stitch treats variants/modes/devices as runtime workflows (sidebar items in their docs), not separate spec documents.
|
|
18
|
-
- getdesign.md allows N entries per brand with catalog-level tags, but actual catalog data shows 1 entry per brand in practice (e.g. Apple has 1 entry).
|
|
19
|
-
- W3C Design Tokens Community Group spec deliberately does NOT scope tokens by surface — leaves it to vendor `$extensions`.
|
|
20
|
-
2. **Authoring cost scales poorly**: 88 brands × N surfaces is real maintenance overhead for marginal cases. Only ~10-15% of brands appear to have visually distinct landing/app idioms.
|
|
21
|
-
3. **The Banksalad case is a generator priority bug, not a schema gap**. We already had `tokens.json#live_overrides` and screenshots — the generator just didn't weight them.
|
|
22
|
-
4. **Backward compatibility**: 88 published references would all need migration. High blast radius for unclear payoff.
|
|
23
|
-
|
|
24
|
-
## What might warrant revisiting
|
|
25
|
-
|
|
26
|
-
- ≥3 distinct user reports of "this brand's generated output doesn't look like the real brand"
|
|
27
|
-
- A new batch where ≥30% of brands exhibit landing-vs-app idiom split
|
|
28
|
-
- AI coding agents adopting a multi-surface convention (W3C tokens spec, Stitch, etc. adding `surface` as a first-class field)
|
|
29
|
-
|
|
30
|
-
## Sketch (if/when we do this)
|
|
31
|
-
|
|
32
|
-
Probable shape based on the survey:
|
|
33
|
-
|
|
34
|
-
- `web/references/<id>/DESIGN.md` stays — essence-leaning (voice, principles, motion philosophy, raw palette)
|
|
35
|
-
- Optional `surfaces/<surface>.md` overlay files — delta only, frontmatter `surface: marketing|product|docs|onboarding`, `extends: ../DESIGN.md`
|
|
36
|
-
- Generator reads essence + (one) overlay → composes
|
|
37
|
-
- Closed enum chosen for AI determinism (Spectrum/Carbon precedent — productive vs expressive moment)
|
|
38
|
-
- Only ~10-15% of brands need overlays — most stay single-doc
|
|
39
|
-
|
|
40
|
-
## What we're doing instead (now)
|
|
41
|
-
|
|
42
|
-
Skill-level fix shipping in v1.4.0 or similar:
|
|
43
|
-
|
|
44
|
-
1. `omd:reference-capture` writes `structure.json` recording observable composition cues (hero type, CTA shape, nav structure, ornament style) — facts, not copyrighted content.
|
|
45
|
-
2. `omd:apply` / `omd:harness` instructed to Read hero screenshots as images for visual grounding before composing.
|
|
46
|
-
3. Token-resolution priority order documented: `tokens.json#live_overrides` > canonical DESIGN.md > `delta_set`. Brand essence (voice, principles, motion philosophy) stays canonical-only.
|
|
47
|
-
4. `omd:harness` Step 4 master prompt includes a `surface_signal` field derived from task keywords (`랜딩`→marketing, `대시보드`→product, etc.). Master uses it to weight reference-capture artifacts vs canonical spec.
|
|
48
|
-
|
|
49
|
-
The skill-level fix achieves the same Banksalad-landing outcome without any schema or migration work.
|
|
50
|
-
|
|
51
|
-
## References (survey notes)
|
|
52
|
-
|
|
53
|
-
- Stitch docs at `stitch.withgoogle.com/docs/design-md/overview` — sidebar nav includes `Device Types`, `Design Modes`, `Generate design variations` as separate workflows
|
|
54
|
-
- getdesign.md catalog (`getdesign.md/apple`) — N-entries-per-brand with category tags at catalog level, but actual data has single entries
|
|
55
|
-
- W3C Design Tokens spec `tr.designtokens.org` — `$extensions` escape hatch, no surface primitive
|
|
56
|
-
- Material 3 (`m3.material.io`) — three-tier `ref/sys/comp` is vertical, not surface-horizontal
|
|
57
|
-
- Carbon (`carbondesignsystem.com`) — theme axis (`white/g10/g90/g100`) is the closest to surface, but it's a single coarse dimension
|
|
58
|
-
- Adobe Spectrum (`spectrum.adobe.com`) — `productive/expressive` moment is a 2-bucket idiom split; precedent for closed enum
|
|
59
|
-
- shadcn/ui (`ui.shadcn.com`) — explicitly refuses the surface problem by shipping unstyled primitives
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## Linked actions
|
|
64
|
-
|
|
65
|
-
- [ ] Implement skill-level fix (4 items above) — target v1.4.0
|
|
66
|
-
- [ ] After 3 more batches, re-evaluate whether skill fix is sufficient
|
|
67
|
-
- [ ] If not, draft formal `omd: 0.2` schema following the surfaces/<name>.md sketch
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
# Batch Audit — 2026-05-13 / KR-10
|
|
2
|
-
|
|
3
|
-
**Theme**: Korean IT companies with publicly observable design system signal
|
|
4
|
-
**Brands added**: 10 (78 → 88)
|
|
5
|
-
**Skill**: `omd:batch-launch` (Phase 2 build pipeline = `omd:add-reference` CREATE)
|
|
6
|
-
**Verification date**: 2026-05-13
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## How the 10 were researched (pipeline applied to each)
|
|
11
|
-
|
|
12
|
-
Every brand went through the standard `omd:add-reference` CREATE 3-tier pipeline. Each `omd-batch-launch` subagent was constrained to:
|
|
13
|
-
|
|
14
|
-
1. **Tier 1 — Live inspect (required)**: playwright MCP `getComputedStyle` on hero CTA / nav / footer / input / cards across **≥1 surface** of the brand's production site. Where possible, also `curl` of the production CSS bundle (more authoritative than runtime sampling because it exposes the entire token system).
|
|
15
|
-
2. **Tier 2 — Cross-check (both attempted)**: `getdesign.md/<id>` + `styles.refero.design/?q=<brand>` (also `?q=<한글명>`). Either source success = OK; both empty = explicitly logged in §4 footer.
|
|
16
|
-
3. **Tier 3 — Reconcile + write**: 9 product sections (Stripe schema) + §10-15 philosophy (Toss §10-15 shape) + `_research.md` source map + `_promo.json` highlight + verified footer.
|
|
17
|
-
|
|
18
|
-
Every brand also has:
|
|
19
|
-
- `web/references/<id>/DESIGN.md` (the spec, frontmatter `omd: 0.1`)
|
|
20
|
-
- `web/references/<id>/_research.md` (Tier-by-Tier source list + dates + confidence per section)
|
|
21
|
-
- `web/references/<id>/_promo.json` (id, Korean name, logo URL, single "most striking" highlight for promo video)
|
|
22
|
-
- §4 footer with `**Verified:** 2026-05-13` + Tier 1 sources + Tier 2 status + Conflicts unresolved
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## Systemic finding
|
|
27
|
-
|
|
28
|
-
**Tier 2 directories (`getdesign.md`, `styles.refero.design`) have weak Korean coverage**. All 10 brands returned **empty** on both 3rd-party indexes. This is not a brand-quality issue — it's a directory-bias issue (both are English-tooling-oriented). Documented per-brand in §4 footers.
|
|
29
|
-
|
|
30
|
-
**But brand-published DS / design narrative resources DO exist for most of the 10** — they were just not in those 3rd-party indexes. 7/10 have public DS-related surfaces that were used in Tier 1 reconcile:
|
|
31
|
-
|
|
32
|
-
| brand | brand-published DS surface | type | live (2026-05-13) |
|
|
33
|
-
|---|---|---|---|
|
|
34
|
-
| socar | `design.socar.kr` | docs hub | ✅ 200 |
|
|
35
|
-
| wanted | `montage.wanted.co.kr` + `wanted.co.kr/brandcenter` | full DS | ✅ 200 |
|
|
36
|
-
| remember | `dramancompany.github.io/remember-ui` | Storybook | ✅ 200 |
|
|
37
|
-
| banksalad | `github.com/banksalad` (org + styleguide repos) | source | ✅ 200 |
|
|
38
|
-
| zigzag | `brunch.co.kr/@zigzag/73` + `devblog.kakaostyle.com` | brand articles (ZDS) | ✅ 200 |
|
|
39
|
-
| gangnamunni | `blog.gangnamunni.com/post/welchis/` | DS architecture post | ✅ 200 |
|
|
40
|
-
| kakaopay | `story.kakaopay.com` | brand / design narrative | ✅ 200 |
|
|
41
|
-
| 29cm | — | — | ❌ no public DS |
|
|
42
|
-
| ably | — | — | ❌ no public DS |
|
|
43
|
-
| zigbang | — | — | ❌ no public DS |
|
|
44
|
-
|
|
45
|
-
→ For future Korean batches, weight Tier 1 (live inspect + **brand-owned tech blogs / brunch / medium / GitHub orgs**) more heavily. Tier 2 (3rd-party directories) is documentation discovery, not validation.
|
|
46
|
-
|
|
47
|
-
→ The 7 brand-published DS URLs are also registered in `web/src/lib/design-systems.ts` so they surface as DS buttons in Browse modal and Builder Step 3 preview header. The 3 brands without a public DS correctly return null and the DS button stays hidden.
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## Per-brand audit
|
|
52
|
-
|
|
53
|
-
Confidence rubric:
|
|
54
|
-
- **High** — ≥2 Tier 1 surfaces OR production CSS bundle captured; no unresolved hex; ≥3 supporting brand-owned sources (blog/medium/brunch); §10-15 sourced
|
|
55
|
-
- **Medium** — 1 Tier 1 surface; some inferred values; brand-owned philosophy sources present
|
|
56
|
-
- **Low** — Tier 1 partially blocked; key tokens marked `(unverified live)` or `(illustrative)`; needs UPDATE pass
|
|
57
|
-
|
|
58
|
-
| # | id | confidence | Tier 1 depth | Tier 2 | Known gaps | Follow-up |
|
|
59
|
-
|---|----|------------|--------------|--------|------------|-----------|
|
|
60
|
-
| 1 | socar | **Medium** | 1 surface (home full); design.socar.kr partial (browser session contended) | empty (getdesign no record · refero no isolated set) | SOCAR Blue **exact hex unpublished** — brand-name-only reference. Brand fonts Sandoll Gothic Neo2 / Avenir (print) vs live Pretendard (web) — documented as intentional print-vs-web split. | UPDATE pass on `design.socar.kr` for canonical SOCAR Blue hex + Space Frame system tokens |
|
|
61
|
-
| 2 | gangnamunni | **High** | 3 (home live + production CSS bundle `d246c5b2edcb00b6.css` with full Cell token map + blog.gangnamunni.com Cell+Welchis architecture post) | empty | none material | — |
|
|
62
|
-
| 3 | kakaopay | **Medium** | 1 surface (home full live inspect); /payment/online second surface blocked by browser tab contention | empty (both verified empty) | none unresolved. KPDS = narrative-only on `story.kakaopay.com`, no public docs site. | UPDATE pass on /payment/online or /transfer for second surface verification |
|
|
63
|
-
| 4 | zigzag | **High** | 4 (home live + production CSS bundle 184KB with full ZDS canonical tokens via `--zds-color-*` vars + devblog.kakaostyle.com ZDS rearchitecture + brunch.co.kr/@zigzag/73 brand-owned) | empty | Two-pink architecture (`#fa6ee3` brand-anchor vs `#f55dd6` interactive primary) — documented as intentional role split | — |
|
|
64
|
-
| 5 | 29cm | **Medium** | 1 surface (home via isolated Playwright `browser_run_code_unsafe` workaround for session contention) | empty | PDP / checkout flows not inspected this pass | UPDATE pass on PDP + checkout (editorial product story modules) |
|
|
65
|
-
| 6 | ably | **Low** | 1 navigation only — live `evaluate` calls blocked by Playwright session contention; §4 token hexes flagged `(unverified live)` in footer | empty / inconclusive (refero JS-rendered, capture blocked) | §4 token values need live re-capture. Brand disambiguation note added (Ably Corp KR commerce ≠ ably.com realtime API). | **Priority**: full Phase U2 live inspect re-run on a clean Playwright session |
|
|
66
|
-
| 7 | banksalad | **High** | 5 (home live + 865KB production CSS bundle with `border-radius:2px` ×81 confirming system default + BPL tech blog + 2× GitHub orgs) | empty (both verified empty) | One nav exception documented (sign-in pill at 16px radius vs system 2px default) — already noted as exception, not conflict | — |
|
|
67
|
-
| 8 | zigbang | **Medium** | 2 (home full + /home/apt/map partial — map-overlay listing card tokens inferred due to second-pass contention) | empty | (a) **brand-orange exact hex unpublished** — `~#FF6600` flagged illustrative in §2 + footer; (b) map-overlay listing-card / price-chip tokens inferred | UPDATE pass on /home/apt/map for canonical orange hex + listing-card token verification |
|
|
68
|
-
| 9 | wanted | **High** | 8 sources (live DOM on `wdlist/518` 22 samples + brandcenter + Montage docs + wanted-sans GitHub + wanteddev org + wantedlab.com + WDS creation blog) | empty (refero blocked by session contention, getdesign verified empty) | none unresolved. `#14191E` (marketing) vs `#171719` (product) is documented two-surface split, not a conflict. | (optional) refero re-attempt on clean session |
|
|
69
|
-
| 10 | remember | **High** | 5 (career page primary live inspect + `dramancompany.github.io/remember-ui/` Storybook root + corp x2 + redirect) | empty (3rd-party empty + GitHub UI repo 404 — source private/deleted, Storybook deploy still live) | (a) filter-chip **selected/active** state not observed (only default captured); (b) error/warning semantic tokens inferred from KR fintech convention | UPDATE pass capturing filter chip selected/active + error/warning states |
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## Confidence distribution
|
|
74
|
-
|
|
75
|
-
- **High** (5): gangnamunni, banksalad, wanted, zigzag, remember
|
|
76
|
-
- **Medium** (3): socar, 29cm, kakaopay
|
|
77
|
-
- **Low** (1): ably
|
|
78
|
-
- *(zigbang was kept at Medium even though 2 surfaces inspected, because of 2 unresolved illustrative tokens — orange hex + map overlay)*
|
|
79
|
-
|
|
80
|
-
**Aggregate**: 5/10 are publishable as-is. 3/10 are publishable with marked uncertainty. **2/10 (ably + zigbang) warrant a follow-up UPDATE pass before being cited in external blog posts or comparisons.**
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Known shared limitation — Playwright session contention
|
|
85
|
-
|
|
86
|
-
The Phase 2 build ran 10 subagents in parallel, all sharing the host Playwright MCP browser. Several agents reported that `browser_evaluate` calls landed on *other agents' tabs* (kakaopay/zigzag/banksalad/29cm appear in multiple reports as "the tab that hijacked my session"). Mitigations applied per agent:
|
|
87
|
-
|
|
88
|
-
- Fall back to direct `curl` of the production CSS bundle (banksalad, gangnamunni, zigzag) — actually higher signal than runtime sampling for these
|
|
89
|
-
- Use `browser_run_code_unsafe` in isolated newPage context (29cm)
|
|
90
|
-
- Document and explicitly flag affected surfaces in `_research.md` (ably, kakaopay, zigbang)
|
|
91
|
-
|
|
92
|
-
**Process fix for next batch**: serialize Playwright sessions per brand (run 1-2 in parallel, not 10), OR isolate to `--user-data-dir` per agent if available. Cost: longer wall-clock. Benefit: no contention, clean §4 token values for every brand.
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
## Promo highlight selection (auditable)
|
|
97
|
-
|
|
98
|
-
Each brand's `_promo.json` records a single "most striking" element — chosen by the build subagent and used in the promo MP4. Type distribution:
|
|
99
|
-
|
|
100
|
-
- **palette** (7): socar, gangnamunni, zigzag, ably, banksalad, zigbang, wanted
|
|
101
|
-
- **voice** (2): kakaopay, 29cm
|
|
102
|
-
- **cta** (1): remember
|
|
103
|
-
|
|
104
|
-
Justifications are written into each `_promo.json` (`label` field) and re-verified during Phase 4 composition build.
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## Follow-up TODO (prioritized)
|
|
109
|
-
|
|
110
|
-
1. **ably** — full Phase U2 live inspect re-run (clean session). §4 tokens currently `(unverified live)`.
|
|
111
|
-
2. **zigbang** — UPDATE pass on `/home/apt/map` for canonical orange hex + map-overlay tokens.
|
|
112
|
-
3. **socar** — UPDATE pass on `design.socar.kr` for canonical SOCAR Blue hex + Space Frame token system.
|
|
113
|
-
4. **remember** — UPDATE pass capturing filter-chip selected/active + error/warning semantic tokens.
|
|
114
|
-
5. **29cm** — UPDATE pass on PDP + checkout flows.
|
|
115
|
-
6. **kakaopay** — UPDATE pass on a transactional second surface (e.g., /transfer).
|
|
116
|
-
7. **reader UI**: long variant headings overlap preview area (observed on 29cm §5). Fix in `web/src/components/reference-preview.tsx` (or equivalent).
|
|
117
|
-
8. **Process**: serialize Playwright sessions per build agent for future batches.
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## Schema for this file (future batches use the same shape)
|
|
122
|
-
|
|
123
|
-
Required top-level sections (so they're greppable across batches in `data/reference-audits/`):
|
|
124
|
-
- `## How the 10 were researched`
|
|
125
|
-
- `## Systemic finding`
|
|
126
|
-
- `## Per-brand audit` (table with id, confidence, Tier 1 depth, Tier 2, Known gaps, Follow-up)
|
|
127
|
-
- `## Confidence distribution`
|
|
128
|
-
- `## Known shared limitation`
|
|
129
|
-
- `## Promo highlight selection`
|
|
130
|
-
- `## Follow-up TODO`
|
|
131
|
-
|
|
132
|
-
Filename: `data/reference-audits/<YYYY-MM-DD>-<batch-slug>.md`
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# Batch Audit — 2026-05-14 / KR finance
|
|
2
|
-
|
|
3
|
-
**Theme**: Korean digital-first banks (extending the KR-10 set with live-token capture)
|
|
4
|
-
**Skill**: `omd:add-reference` CREATE — with live CDP token harness
|
|
5
|
-
**Verification date**: 2026-05-14
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Audit rows
|
|
10
|
-
|
|
11
|
-
| id | name | country | category | url | tier1_live | tier1_official_ds | tier2_indexes | raw_samples | css_vars | flags |
|
|
12
|
-
|---|---|---|---|---|---|---|---|---|---|---|
|
|
13
|
-
| kbank | K bank (케이뱅크) | KR | finance | https://www.kbanknow.com | ✓ CDP :9222 / getComputedStyle on `/ib20/mnu/PBKMAN000000` | ✗ negative — no public DS site (design.kbanknow.com no DNS; no GitHub design-system repo; no Figma Community kit). Documented as authoritative negative result in §11/§12. | ✗ getdesign.md empty; ✗ styles.refero.design empty (kbank + 케이뱅크 both) | 6 | 43 | a11y: no landmark elements; H1 uses font-size:0 image-replacement; fixed 1280px canvas — all logged in §8/§10 |
|
|
14
|
-
| classum | Classum (클라썸) | KR | education | https://business.classum.com | ✓ CDP :9222 / getComputedStyle on `business.classum.com` + production Webflow CSS bundle (13,904 lines) frequency analysis | ✗ negative — no public DS / brand portal; `classum.com/brand` title-only; no Figma library, no design.classum.com, no GitHub design-system repo. Closed B2B SaaS as of 2026-05-14. | ✗ getdesign.md `classum` → "No designs found"; ✗ styles.refero.design empty | 6 | 0 (no `:root` token vars — Webflow-class-driven theming) | 14px Korean-density body sits at WCAG floor; primary CTA `#FF4438` on white ≈4.3:1 (borderline AA); single-color CTA palette shares brand red with destructive — downstream should split semantic vs brand |
|
|
15
|
-
| lunit | Lunit (루닛) | KR | healthcare | https://www.lunit.io | ✓ CDP :9222 / getComputedStyle on `www.lunit.io/` — 34 + 23 targeted samples across hero H1, 7 sections, stats band, 5 CTA candidates, 4 nav links, body paragraphs, footer | ✗ negative — `design.lunit.io` no DNS; GitHub org `lunit-io` has 10 public repos, all medical-imaging / ML research (`archon`, `dicom-rs`, `mmg-model-nia`, `nlst-nodule-detection`, `ocelot23algo`, `openslide`, `spec-cxr`, …), zero design-system / Storybook / tokens repo; HTML keyword scan for `design-system / brand-guidelines / lunit-ui / storybook` returns no hits. Documented as authoritative negative result in §15. | ✗ getdesign.md `lunit` not present; ✗ styles.refero.design empty (lunit + 루닛) | 8 | 0 Lunit-namespaced (only WordPress `--wp-*` defaults) — corroborates "no public DS" finding | Stack = WordPress + Oxygen Builder + AOS. Signature blue `#1032cf` is **withheld from primary CTA** (CTA is black pill `#000` / radius 100px) — unusual brand-color discipline; primary geometric thesis is binary radius `0px` everywhere except CTA pill; LIGHT-weight typography defaults (Lexend 300 / ClashGrotesk 400) anti-pharma. |
|
|
16
|
-
| flex | flex (플렉스) | KR | saas / hr | https://flex.team | ✓ CDP :9222 / getComputedStyle on `flex.team/` — 40 samples across header, nav, hero (`.l2024_dark`), manifesto cards, service filter pills, h1/h2/h3, primary/secondary buttons; 9 curated `raw_samples` in proof | ✗ negative — no `design.flex.team` DNS; `flex.team/design` and `/brand` 404; no public Storybook / Figma library; no GitHub org-level design-system repo. Documented as authoritative negative result in `_research.md`. Corporate data sourced from `thevc.kr/Flex` (founder 장해남, 2019-05 founding, Seongnam HQ, Series B, ~213 employees as of 2026-03). | ✗ getdesign.md `flex` → "No entry"; ✗ styles.refero.design `?q=flex.team` no result cards (also tried `?q=flex` — collides with Flex Ltd. manufacturing, irrelevant) | 9 in `.live-inspect-proof.json` (40 in raw) | 0 Flex-namespaced (Stitches/CSS-in-JS `l2024-c-*` class system, not `:root` custom props) | **One-ink discipline**: `#1D1D1F` + alpha-stepped (0.04/0.10/0.24/0.72/0.96) — no semantic blue/green/red on marketing surface. **Pill rings, not borders**: `box-shadow 0 0 0 1px inset` instead of `border` (no layout shift on hover). **Inverted h1/h2 size**: hero h1=28px, in-page h2=52px with -1.56px tracking (the visual signature). **Theme flip via class**: `.l2024_dark` / `.l2024_light` toggles surfaces section-by-section, not by token swap. Motion tokens partially inferred (entry fade observed, exact durations not captured in single CDP pass) — flagged in §15. |
|
|
17
|
-
| upbit | Upbit (업비트) | KR | finance / crypto-exchange | https://upbit.com | ✓ CDP :9222 / getComputedStyle on **two surfaces** — `/home` (41 samples) + `/exchange?code=CRIX.UPBIT.KRW-BTC` (80 samples) = **121 raw samples** across buttons, anchors, inputs, role=button, role=tab, nav children, market/coin classes, table rows/cells/headers, h1-h3, price classes, Emotion `css-*` classes | ✗ negative — `design.upbit.com` DNS 000; `upbit.com/brand` 301 → marketing root; `design.dunamu.com` DNS 000; `dunamu.com` 200 (corporate vision/IR/ESG, no DS surface); Naver blog `dunamupr` is PR not design; WebSearch / GitHub no canonical hit. Documented as authoritative negative in `_research.md`. | ✗ getdesign.md explicit text "No designs found for 'upbit'"; ✗ styles.refero.design `?q=upbit` no result cards | 121 (12 shipped in `.live-inspect-proof.json`, ≥5 floor) | 263 page-level CSS vars captured (Emotion-generated, not Upbit-namespaced design tokens — corroborates "no public DS") | **Locale-critical** rise/fall convention (KR red=up / blue=down) — any port outside KR/JP/TW must invert. Hit-target trade-off: 28px quick-fill tags below WCAG 2.5.5 (44px) — explicit speed-over-floor decision called out in §9. Legacy IE-era font fallback chain (Dotum / 돋움) not pruned by Upbit — documented, not "fixed". State / motion tokens partially inferred (no live error-state capture this pass) — flagged as follow-up. |
|
|
18
|
-
| wadiz | Wadiz (와디즈) | KR | commerce / crowdfunding | https://www.wadiz.kr | ✓ CDP :9222 attempted (handshake 403 — `--remote-allow-origins` guard); fallback = direct curl of production CSS bundle `static.wadiz.kr/main/main.css` (936473 bytes — authoritative full-token source) + `wui.css` reset + 3 HTML surfaces (`/`, `/web/wreward/category/289`, `/web/main`). All `#00c4c4` (111×), `#191f28` (208×), radius `8px` (112×), `font-weight:700` (358×), and named module classes (`Button_mint`, `Button_blue`, `Button_red`, `Button_yellow`, `Button_contained`, `Button_tint`, `LabelBadge_solid`/`outlined`/`tint`) directly observed via frequency analysis. Reproducible: `curl -sL https://static.wadiz.kr/main/main.css \| grep -c "#00c4c4"` → 111. | △ partial — Wadiz blog (`blog.wadiz.kr`) is known to publish "와디즈 디자인 시스템 구축하기" (referenced in Wadiz internal search snippet), but direct article URL 404 on this pass (likely renamed/moved). No `design.wadiz.kr` DNS, no `/web/wbrand` page, no GitHub org-level design-system repo. Documented as **partial-positive** (existence attested, canonical URL pending re-discovery) in §15. Followup: re-find article URL in UPDATE pass. | ✗ getdesign.md `wadiz` → "No designs found"; ✗ styles.refero.design `?q=wadiz` empty | 8 in `.live-inspect-proof.json` (≥5 floor) — selectors: filled-mint CTA, mint hover, tint mint button, checkbox-checked, yellow LabelBadge solid + tint, body font-family, CardThumbnail | 5 root CSS vars (`--dark`, `--white-68`, `--black-84`, `--black-54`, `--pale-grey-30`) — CSS Modules class system, not heavy token-var usage. Token system lives in named class variants (`Button_mint`, `LabelBadge_yellow`) rather than `:root --tokens`. | **A11y weak point** (documented, not fixed): filled mint CTA `#00c4c4` background + `#fff` text = 2.7:1 (borderline AA fail); outlined mint text `#00c4c4` on `#e6fafa` = 2.4:1 — system as shipped accepts the trade-off, called out in §9. **IP guardrail tight**: no verbatim Wadiz copy; gerund `-하기` verb pattern + factual funding-state vocabulary documented as voice *shape*, not reproduced. **Personas explicitly inferred** (§11 marked FILL-IN). **Detail-page + funding-sheet flows not inspected** — UPDATE pass recommended. CDP fallback to curl is *higher signal* than runtime DOM sampling because the 936KB bundle exposes the entire token system (not just rendered-DOM applied styles). |
|
|
19
|
-
| kream | KREAM (크림) | KR | marketplace | https://kream.co.kr | ✓ CDP :9222 / getComputedStyle on **two surfaces** — `/` (40 raw samples; 50+ `--greyscale-*` CSS custom properties extracted from `:root`) + `/search?keyword=nike` (43 raw samples covering filter chip, category pill, shortcut row, search input, tab strip) + `/shop` 404 ghost-button chrome | ✗ negative — no `kream.design` / `design.kream.co.kr` / `kream.co.kr/design`; no public DS hub (parent Naver has mixed-public pattern — Naver Connect/Snow have docs, KREAM does not). Documented as authoritative negative result in §9. | ✗ getdesign.md `kream` "No record found"; ✗ styles.refero.design `?q=kream` no match (both verified 2026-05-14) | 13 raw_samples in `.live-inspect-proof.json` (over ≥5 floor; total 83 across two surfaces) | ~50 `--greyscale-dark-*` + `--greyscale-white-alpha-*` CSS custom properties on `:root` — formal grayscale token system with both numeric scale (0/2/4/6/8/10/20/30/35/40/50/60/70/75/80/90) and semantic role naming | **Grayscale-only chrome** — no brand red/blue/green in product chrome (single observed teal `rgb(17,161,151)` used twice as watch accent). **Four-step radius scale encodes card class** (16px banner / 30px chip / 8px ghost / 6px row). **Weight, not hue, signals state** (active tab 700 vs default 400, both `#222`). §10 voice samples are **OmD-original characterizations** — no verbatim KREAM marketing copy reproduced. §11 narrative is reported-fact based (no founder/exec quote at OmD attribution fidelity in EN-language public sources). State matrix and product-detail page not captured this pass — flagged for UPDATE. |
|
|
20
|
-
| inflearn | Inflearn (인프런) | KR | education | https://www.inflearn.com | ✓ CDP :9222 / getComputedStyle on **two surfaces** — `/` (12 raw_samples, 162 `--mantine-color-*` CSS vars + full `--mantine-radius-{xs,sm,md,lg,xl}` + `--mantine-spacing-*` + `--mantine-font-family`, h1 34px/700 / h2 20px/700 sampled, GNB sticky 65px white, search input r=8px, primary green pill submit r=999px `#00C471`) + `/courses` (8 raw_samples, 38 `mantine-Card-root` tiles observed, pagination active page solid `#00C471`). Brand-owned context: `tech.inflab.com/20260305-new-header/` engineering blog post confirming GNB rebuild as shared MFE component. | ✗ negative — no `design.inflearn.com` DNS; Inflab GitHub org has no public DS / Storybook / component-library repo (verified `gh search repos inflab` / `inflearn design` — only course-content repos surface); `tech.inflab.com` has engineering posts (MFE / GNB / infra) but no canonical token table. The DS lives **in production code as a Mantine UI theme override** — accessible only by runtime inspect. Documented as authoritative negative in §4 footer + `_research.md`. | ✗ getdesign.md `inflearn` → "No designs found for 'inflearn'" (verified 2026-05-14); ✗ styles.refero.design `?q=inflearn` no result cards (verified 2026-05-14) | 20 raw_samples in `.live-inspect-proof.json` (well above ≥5 floor — 12 home + 8 courses) | 162 `--mantine-color-*` CSS vars + 5 `--mantine-radius-*` + 5 `--mantine-spacing-*` + `--mantine-font-family` exposed on `:root` — Inflearn theme-extends Mantine UI wholesale | **Framework signal authoritative**: Inflearn is a Mantine UI app; the "DS" is the Mantine theme primitive set with the `green` scale overridden to `#00C471`. Designers picking from Inflearn should treat the Mantine semantic palette (red/blue/yellow/cyan) as part of the system. **Two radius families** are the visual signature: `8px` for cards/inputs/pagination, `32px` for nav pills, `999px` for the green search submit + tag chips. **`#00C471` fails AA for body text** (2.45:1 on white) — Inflearn correctly restricts it to white-on-green CTAs (4.4:1, passes AA), pagination active fills, and >18pt accents; called out in §9. **IP guardrails**: tagline "라이프타임 커리어 플랫폼" quoted once as factual brand-narrative context (§11), not adopted as design copy; voice samples in §10 are fresh illustrative reconstructions in casual-polite Korean. **Inferred tokens** flagged `(Inferred)` in §4: labelled primary CTA (only icon-pill captured live), form focus, disabled, error-focus, tag chip alpha. Follow-up UPDATE pass recommended on a course-detail + payment surface. |
|
|
21
|
-
| bunjang | Bunjang (번개장터) | KR | marketplace | https://m.bunjang.co.kr | ✓ CDP :9222 / getComputedStyle on `m.bunjang.co.kr` across **two viewports** — desktop 1280×713 dpr=2 + mobile-emulated 390×844 dpr=3 (iPhone UA). 211 DOM samples across header / nav / cards / buttons / footer / heart / price / meta. Websocket required `suppress_origin=True` to bypass `--remote-allow-origins` block. | ✗ **negative (documented)** — Bunjang ships a real internal DS branded **"Bun UI"** (proven by `--bun-ui-*` CSS-variable prefix + vanilla-extract class patterns `Box__7nn0kn17` / `Flex__wsrgth3` / `Typography_typography__1wr8iu13` + explicit z-index/radius/aspect-ratio token families), but **no public artifacts as of 2026-05-14**. Probed: `design.bunjang.co.kr` / `bun-ui.bunjang.co.kr` / `tech.bunjang.co.kr` / `brand.bunjang.co.kr` / `company.bunjang.co.kr` / `blog.bunjang.co.kr` all DNS no-resolve (000). `medium.com/bunjang-tech` → 404. `github.com/bunjang` org exists but **0 public repos / 0 members / 0 packages**. `npmjs.com/package/@bunjang/bun-ui` → 403 (does not exist). Authoritative negative documented in DESIGN.md verification footer. | ✗ getdesign.md `bunjang` → "No designs found for 'bunjang'"; ✗ styles.refero.design `?q=bunjang` no entry. Consistent with KR-10 systemic finding. | 9 raw_samples in `.live-inspect-proof.json` (≥5 floor) covering: primary CTA `#d80c18` bg, body color `#191919`, footer bg `#f6f6f6`, Pretendard Variable on body, secondary-button `1px solid #e5e5e5` + 6px radius, card price 16px/700/`#191919`, card title 14px/500/`#666`, card meta 12px/500/`#999`, circular icon button 999px radius | **73 CSS custom properties** on `:root` — full 11-stop gray ladder (`--color-gray-{10..900}`), 4-stop semantic ladders (`--color-{red,green,blue,yellow}-{50,100,400,500}`), **two specialty ladders distinctive to Bunjang**: `--color-care-*` (warm amber `#FDF4E2`→`#FFE1A6` for 감정완료 luxury-auth chips) and `--color-safe-*` (cool indigo `#EFF2FE`→`#5558A8` for 안전결제 escrow chips). 8 social-partner brand colors. Layout max-widths (480/640/1240). Drawer 480px. Aspect-ratio tokens `--bun-ui-aspect-ratio-{vertical: 81/100, square: 1/1}`. Radius token `--bun-ui-radius-pill: 999px`. Full z-index scale (header 200 / drawer 1000 / popup 1200 / snackbar 1500). iOS safe-area vars `--bun-ui-{sat,sab,sal,sar}`. | **One red, one job**: `--color-primary: #d80c18` appears on exactly one CTA variant (`_variant-primary`) — red as scarcity asset, cleanest example in the Korean-marketplace cohort. **Zero box-shadow** on any sampled production element — depth is borders + tints exclusively. **81:100 portrait thumbnail** is brand-defining (phones/sneakers/K-pop goods photograph tall). **Two specialty color tiers map to revenue services** (care → 감정/luxury-auth, safe → 안전결제/escrow) — rare case where color IS product taxonomy. **Pretendard Variable exclusive** (100% of 211 samples). **Weight jump 500→700 without 600** accelerates price emphasis. IP guardrail: logo SVG archived for verification only; no verbatim taglines or product copy reproduced; service-feature names (안전결제 / 감정완료 / 내폰시세) used descriptively. Bottom tab bar / sell flow / chat / product-detail page not inspected this pass — flagged for UPDATE. |
|
|
22
|
-
| channeltalk | Channel Talk (채널톡) | KR | saas | https://channel.io/en | ✓ CDP :9222 / getComputedStyle on `channel.io/en` — 118 element samples, 559 CSS custom properties extracted from `:root`, 10 raw_samples retained | ✓ **positive — canonical Bezier Design System** at `github.com/channel-io/bezier-react/packages/bezier-tokens/src/{global,semantic}` (MIT-licensed). Fetched via `gh api`: color.json (6.7KB, full 12-hue × 3-weight × 4-alpha ladder), font.json (3.0KB, Inter+Noto stacks KR/JP), typography.json (2.7KB, 11-36px size scale), radius.json (463B, 2-44px+42% ladder), transition.json (945B, 150/300/450ms × `cubic-bezier(0.3,0,0,1)`), elevation.json (2.3KB), input.json (1.5KB). **Gold-standard Korean SaaS DS publishing — first Tier-1-positive in this audit file.** | not consulted — Bezier is canonical Tier-1, third-party indexes redundant; flagged in DESIGN.md footer for follow-up UPDATE | 10 raw_samples in `.live-inspect-proof.json` (≥5 floor; from 118 total live captures) | 559 `--color-*` / `--inverted-*` / `--bg-*` / `--bdr-*` / `--bgtxt-*` CSS custom properties on `:root` (full alpha + inverted-theme + semantic-role naming) | **Cobalt-only brand accent** `#329BE7` — semantic hue palette reserved for status. **Translucent off-black** `rgba(0,0,0,0.85)` body text (141/118 sampled elements). **Marketing-vs-product type cliff**: 64px hero vs 36px product cap; weights 500/600 marketing-only. **AI manifesto plum canvas** `rgba(25,3,49,0.898)` is homepage-only rhetorical device, not a Bezier token. §11 founder list / founding year / total funding / HQ city partially unverified (Crunchbase 403'd on WebFetch; only current CEO Choi Si-won confirmed Channel-side) — flagged in DESIGN.md footer. IP guardrail: §10 voice samples explicitly marked tone-shape-only with 3 fresh derivation alternatives provided inline ("Routine, automated. Strategy, yours." / "AI for the queue. You for the moves that matter." / "Every channel. One inbox."). |
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## Artifacts written
|
|
27
|
-
|
|
28
|
-
- `references/kbank/DESIGN.md` — frontmatter `id=kbank, country=KR, category=finance, verified=2026-05-14`
|
|
29
|
-
- `references/kbank/assets/_reference/tokens.json` — normalized brand/neutral/semantic/extended palettes + typography + radius + spacing
|
|
30
|
-
- `references/kbank/assets/_reference/fonts.json` — Pretendard K Edition + fallback stack
|
|
31
|
-
- `references/kbank/assets/_reference/structure.json` — IA tree, heading outline, layout observations
|
|
32
|
-
- `references/kbank/assets/_reference/.live-inspect-proof.json` — 6 raw_samples (≥5 required) + 43 CSS variables + top observed colors
|
|
33
|
-
- `references/kbank/assets/_reference/.live-inspect-raw.json` — full CDP capture (provenance)
|
|
34
|
-
- `references/lunit/DESIGN.md` — frontmatter `id=lunit, country=KR, category=healthcare, verified=2026-05-14`
|
|
35
|
-
- `references/lunit/assets/_reference/tokens.json` — color (ink/surface/accent) + typography scale + binary radius rule + zero-elevation + AOS motion
|
|
36
|
-
- `references/lunit/assets/_reference/fonts.json` — ClashGrotesk (display) + Lexend (text), both LIGHT-weight defaults
|
|
37
|
-
- `references/lunit/assets/_reference/structure.json` — 11-band page anatomy (sticky header → hero → stats → tech overview → solutions grid → partnering → testimonials → scale → investor → news → footer)
|
|
38
|
-
- `references/lunit/assets/_reference/.live-inspect-proof.json` — 8 raw_samples (≥5 required), CDP method + browser version + page URL
|
|
39
|
-
- `references/upbit/DESIGN.md` — frontmatter `id=upbit, country=KR, category=finance, omd=0.1, captured_at=2026-05-14`; 9 product sections + §10-15 philosophy (toss style-ref per skill rule P-1)
|
|
40
|
-
- `references/upbit/_research.md` — Tier-by-Tier source map + confidence per § + IP guardrail log
|
|
41
|
-
- `references/upbit/assets/_reference/tokens.json` — color (brand triple + rise/fall semantic + text + surface) + radius + typography + control sizing
|
|
42
|
-
- `references/upbit/assets/_reference/fonts.json` — Roboto + Noto Sans KR primary stack, legacy fallback chain documented
|
|
43
|
-
- `references/upbit/assets/_reference/structure.json` — home + exchange structural counts + 5 layout notes
|
|
44
|
-
- `references/upbit/assets/_reference/.live-inspect-proof.json` — 12 raw_samples (≥5 required), 2 tab ids, 2 surface URLs, WS endpoint, total 121 samples
|
|
45
|
-
- `references/upbit/assets/_reference/raw-capture.json` — home surface (41 samples)
|
|
46
|
-
- `references/upbit/assets/_reference/raw-capture-exchange.json` — exchange surface (80 samples)
|
|
47
|
-
- `references/flex/DESIGN.md` — frontmatter `id=flex, country=KR, category=saas, omd=0.1, verified=2026-05-14`; 9 product sections + §10-15 philosophy (toss style-ref per skill rule P-1)
|
|
48
|
-
- `references/flex/_research.md` — Tier 1 (live CDP + thevc.kr) and Tier 2 (getdesign/refero both empty) source map
|
|
49
|
-
- `references/flex/assets/_reference/tokens.json` — single-ink alpha-stepped color, Pretendard Variable scale, ring shadows, section paddings
|
|
50
|
-
- `references/flex/assets/_reference/fonts.json` — Pretendard Variable + full system fallback chain
|
|
51
|
-
- `references/flex/assets/_reference/structure.json` — header / hero / manifesto / service filter pill anatomy + tone_observed
|
|
52
|
-
- `references/flex/assets/_reference/.live-inspect-proof.json` — 9 raw_samples (≥5 required) + CDP method + browser version
|
|
53
|
-
- `references/flex/assets/_reference/.raw-inspect.json` — full 40-sample CDP dump (provenance)
|
|
54
|
-
- `references/wadiz/DESIGN.md` — frontmatter `id=wadiz, country=KR, category=commerce, verified=2026-05-14`; 15 sections (§1 visual theme + 9 product sections + §10–15 philosophy/personas/anti-patterns/footer per toss style-ref); confidence **High**
|
|
55
|
-
- `references/wadiz/assets/_reference/tokens.json` — color (brand mint family + Toss-family ink scale + 4-hue label badge system + surface + overlay) + radius scale (3/4/8/16/50%/100px with frequencies) + shadow tiers + typography sizes + weight frequency
|
|
56
|
-
- `references/wadiz/assets/_reference/fonts.json` — Pretendard exclusive (no display accent), cdnjs 1.3.9 dynamic-subset, base body 15px, weights 400/500/700
|
|
57
|
-
- `references/wadiz/assets/_reference/structure.json` — 3 surfaces, CSS Modules naming pattern, 5-axis button system, 4-color × 3-shape LabelBadge system, card anatomy, 5-tier elevation
|
|
58
|
-
- `references/wadiz/assets/_reference/.live-inspect-proof.json` — 8 raw_samples (≥5 floor), 5 surfaces, full token-frequency table, CDP fallback rationale documented
|
|
59
|
-
|
|
60
|
-
## IP guardrails confirmed
|
|
61
|
-
|
|
62
|
-
- Brand assets reference-only (logo/name/navy `#0114A7` for inspiration; not redistributed).
|
|
63
|
-
- §9 Voice is fresh analyst paraphrase — no verbatim taglines or marketing copy lifted.
|
|
64
|
-
- Token values reproduced as factual CSS custom property values under analytical fair-use.
|
|
65
|
-
|
|
66
|
-
## Flags
|
|
67
|
-
|
|
68
|
-
1. **Tier 1 official DS = negative**. K bank has chosen not to externalise a public design system (unlike Toss/Kakao). The production CSS `:root` token set is the closest public artifact and was captured directly.
|
|
69
|
-
2. **Tier 2 indexes empty** — consistent with the systemic Korean-coverage gap logged in `2026-05-13-kr10.md`.
|
|
70
|
-
3. **A11y debt observed**: no landmark elements, image-replacement H1 logo, fixed 1280px canvas. Surfaced in §8 and §10 with explicit "don't steal" guidance.
|
|
71
|
-
4. **Upbit locale rule (critical)**: Korean finance UI convention — red `#DD3C44` = up / 매수, blue `#1375EC` = down / 매도. Inversion of US convention. Surfaced in §3 and §9 of `references/upbit/DESIGN.md` with explicit porting guidance (must invert for US/EU markets).
|
|
72
|
-
5. **Upbit IP guardrails**: title-tag positioning phrase ("가장 신뢰받는 디지털 자산 거래소") referenced only as positioning evidence in §11 narrative — not reproduced as headline copy; voice samples in §10 marked illustrative; persona block carries public-surveys-only disclaimer.
|