Grammar
Frame1200 × 630 PNG for crawlers; every element inside a centred 1200 × 600 frame (15 px clear top and bottom) and 55 px from the sides, the rail of the Block at 3.43x. Kakao accepts 1:1, 2:1 and 4:3 and crops anything else around the most prominent content; 1200 × 630 is 1.905:1, and keeping the content in a 2:1 frame costs 15 px of margin and guarantees no type is cropped.The Block, drawn as an imageThe page’s own ink Block (flat-v2-auth, section web, frames sc-s, sc-m, sc-p and sc-lb) at 1200 / 350 = 3.43x, so the card and the page share one grammar: ink #15181A ground, no theme (ink and white always), padding 86 top and 55 at the sides. Zone A, 62 tall (the Tag, 82, makes it taller): the eyebrow as 45/62·600 white α0.8 (11.65:1 on the ground), a 3 px bar between facts, the lockup at the end; zone B, 79 below: the one figure 137/165·700 in ball (13.95:1), tabular, with its unit 51/75·600 white beside it; zone C, 79 below: one line of facts 51/75·500 white α0.85. A person’s name wraps and is never cut; a place that is too long crops.LockupThe mark beside DABUSI, white on the ink ground: the mark 62, the word 45 at 0.06em, 25 between (OgLockup in lib/og-card.tsx, the same geometry as the lockup of this board: a unit-100 circle with two seam gaps painted in the ground). The root card draws it 44 high (the mark 44, the word 41); the missing-target card at 137 / 103, centred.State TagBeside the lockup, 82 tall, radius 21, 45/600: neutral (#F2F2F2, #4F5851) for 취소됨 and 기록 제외, warning (#F5B301 with ink) for 검토 중. The states are drawn on flat-v2-auth (sc-s-cancel, sc-m-review, sc-m-void); a state with a sentence puts it in zone B in white at 82/110·700.Ball budgetOne ball accent per card: the figure, or on the root card the mark in the block.Root and missingRoot: a white canvas, ink type (title 72/700 on 80, subtitle 34/500 secondary), the lockup top left and one 380 × 390 ink block holding the ball mark at 60%; no domain line. It is the root grammar (canvas and block); the share cards sc-* keep the full ink Block, as ratified. Missing: the lockup alone on the ink ground.RoutesRoot /opengraph-image (opengraph-image.tsx); session /s/[sessionId], match /m/[matchId], profile /p/[userId] and club ranking /lb/[clubId] (opengraph-image.tsx each, one body in lib/og-card-lines.tsx: shareCardImage) drawing OgLinkCard, or OgNotFoundCard for a missing or private target (lib/og-card.tsx). The lines come from shareCardLines in @twomore/app, so the card, the page metadata and the alt text agree.FontsSpecified in Pretendard. satori renders the fonts it is given and the edge route loads none today (the OTFs are 1.58 MB each), so it renders its own until a subset is bundled. Sizes and hierarchy do not depend on the face.KakaoStaff (devtalk, 2025-12-12): the accepted og:image ratios are 1:1, 2:1 and 4:3, and others are auto-cropped around the most prominent content. The documentation gives only minimum sizes (200 × 200 default templates, 400 × 400 custom) and 5 MB, and the image is cached: version the URL with ?v=. The feed call declares 1200 × 630 (imageWidth and imageHeight in share.native.ts).Share pages/s, /m, /p and /lb are server pages over a client island that draws them with the kit (flat-v2-auth, section web): white canvas, the lockup slot at the top, the OG image as the hero (350 × 184, radius 16), title 24/32 bold, the open-in-app control as the kit’s primary lg Button inside a plain link to the app scheme (web-door-link.tsx). They stay Korean.ReplacesThree grammars, none S2: a flat green root card (#0F5132, 96px white wordmark), the green-gradient OgCard for match, profile and leaderboard, and the white OgSessionCard with emoji lines and old badge-palette chips (opengraph-image.tsx, lib/og-card.tsx). For the share pages: open-in-app-button.tsx (#0f5132, radius 8, 48 tall), share-page-styles.ts and --tm-bg #f8fbf9 (globals.css).ShipsWeb deploy, with S1: the grammar ships wordmark-only (type, ball Tag, ink block) and the lockup’s mark joins with the new mark. Share pages: the button and canvas colour with S1, the layout with the web phase. Kakao feed image (share.native.ts): an OTA with the OG grammar; keep 1200 × 630 with 2:1-safe content, and declare 800 × 400 only if the route serves a 2:1 image.Not verifiedThe Kakao ratio rule is a staff answer, not documentation: send a test feed after the OG change. Sample copy is invented for layout.
Check of the cards (arithmetic on the code’s constants, not a browser measurement)
Ruleevery element inside the 1200 × 600 frame (y 15 to 615) and 55 px from the sides (the rail)Rootlockup, title, subtitle and the ink block all inside y 15 to 615 and x 64 to 1136: passSessionzone A y 86 to 148, zone B y 227 to 392, zone C y 471 to 546; x 55 to 1145: passClub rankingthe same three zones: the unit sits on the figure’s baseline in zone B: passMatchthe same three zones: the score 6-4 in zone B: passProfilethe same three zones; a long name wraps and zone A grows, zone C stays 79 under B: passNot foundthe lockup centred, 137 / 103, inside the frame: passClipped textcomputed from the code’s constants (og-card.tsx, scaled 3.43x), not measured in a browserMeasured inarithmetic on the constants of apps/web/lib/og-card.tsx