# kricket.ai Blackboard Carousel — Production Specification

Version 1.1 · 2026-09-04 · Reference implementation: `carousels/2026-09-03_build-the-base/` (Carousel 04, 10 slides) · Clean-room verification: `carousels/2026-09-04_strength-to-power/` (Carousel 05, built from v1.0 alone; its `GAPS.md` produced this revision)

This document is a complete, self-contained method for producing a kricket.ai Instagram carousel in the chalkboard style. It is written for an LLM or a designer who has not seen the reference deck. Every number is a measured value from a deck that passed review; every rule has a reason stated next to it. Sections 1–8 are the method. Section 9 is the reference table for all files, assets and tools. Appendices hold the verbatim templates.

---

## 0 · Scope and output contract

**Input**: one coaching chapter (transcript or script) from the kricket.ai course corpus, plus a hook line.
**Output**: 10 PNG slides, 1080 × 1350 px, plus one caption text file, plus a contact sheet, plus a saliency contact sheet, delivered to a review folder.
**Quality gate**: three automated checks pass, one cold human-style read reports zero blockers, and the reading order on every slide is headline → figure → support line.
**Judged on**: saves and sends. Not views.

---

## 1 · Canvas and colour tokens

| token | value | use |
|---|---|---|
| canvas | 1080 × 1350 px, PNG, sRGB | Instagram portrait |
| text margin | 96 px all sides | every text block starts or ends on this grid |
| figure side margin | 108 px | left or right edge of a figure box |
| figure bottom margin | 140 px | bottom edge of a figure box |
| board | texture `chalkboard-green-2026-07-15.png`, full-bleed, plus vignette `radial-gradient(122% 92% at 50% 36%, transparent 32%, rgba(0,0,0,.48) 100%)` | the only gradient permitted |
| chalk and type | `#F6ECE3` | the only ink on the board |
| card | `#F6ECE3` background, `#241616` ink, radius 26 px, padding 48 / 52 px | last slide only |
| CTA button | `glass-button-green-2026-07-13.png` as a 9-slice `border-image`, white type | last slide only |
| forbidden on board | any orange, coral, gold, blue | contrast law: warm accents fail on green |

The board is a texture asset, not a flat hex. The dark chalkboard is the marketing surface for this format; the cream card on the last slide is the only light surface.

---

## 2 · Typography

Font: Caros Soft, weights 300 / 400 / 500 only, from the kit's rebalanced `.woff2` files. No bold, no synthetic weights.

| level | size | weight | line-height | tracking | case | use |
|---|---|---|---|---|---|---|
| headline | 88 px | 500 | 1.08 | −0.01 em | sentence | one per slide, the only large element |
| body | 38 px | 400 | 1.4 | 0 | sentence | support line, 82 % opacity |
| small caps | 28 px | 500 | 1.4 | +0.14 em | UPPER | kicker, figure labels |

Three levels, fixed sizes, every slide. The headline never changes size to fit; the copy changes instead. Headline ≤ 2 lines in a 460–720 px block. Exceptions: the cover may run to 4 short lines; an enumeration slide (one word per line, e.g. "Movement. Strength. Power. Speed.") may run to 4 lines. Check the rendered PNG for soft wraps; a headline that wraps to an unplanned third line is a copy defect.

---

## 3 · Layout system

### 3.1 The two bands

- **Text band**: y = 150 px to about 540 px. Holds kicker, headline, support line, stacked in that order, left- or right-aligned on the 96 px grid.
- **Figure band**: from y ≈ 380 px down to y = 1210 px (1350 − 140). Holds one figure box.

The headline always sits above the figure. The figure occupies the corner the text does not. The two bands may overlap vertically only where the figure's own top third is empty board (two-figure comparisons are drawn that way on purpose).

### 3.2 Figure placement

A figure is placed by width fraction and anchor:

```
w = 1080 × wfrac
h = w / (image_width / image_height)          # aspect read from the chalk PNG
x = 108                     if anchor is left
  = (1080 − w) / 2          if anchor is centre
  = 1080 − 108 − w          if anchor is right
y = 1350 − 140 − h          (+ optional dy)
```

Measured fractions that read as balanced (neither dominant nor timid):

| figure type | wfrac | anchor | text block |
|---|---|---|---|
| single hero, dramatic pose | 0.60 – 0.66 | bottom-left or bottom-right | opposite top corner |
| single hero, cropped to ink | 0.66 – 0.70 | bottom-left | top-left; support line centred under the figure |
| two-figure comparison | 0.70 – 0.78 | bottom-centre | top-right or full-width top |
| metaphor / diagram object | 0.62 – 0.66 | bottom-right, dx −70, dy +40 for a wide object | top-left |
| calm small figure | 0.36 | bottom-right | top-left |

Below 0.55 the figure reads as an afterthought; above 0.80 it overpowers the text and crowds the edges.

**When the render did not leave the briefed corner empty**: measure ink in the top-left and top-right thirds of the lifted PNG, place the text block on the side with less ink, and drop the width fraction to the floor of its range. Do not move text into the figure band.

### 3.3 Crop to ink

If a rendered figure occupies only part of its own frame, crop the chalk PNG to its alpha bounding box plus 30–40 px before placement. Otherwise the fraction lies and the figure appears small.

### 3.4 Labels and cue marks

- Labels naming figures ("BALL 1", "TOO HEAVY") are small caps, set as type, placed **under** the figure they name, centred on it (y = figure bottom + 12 px). If the bottom is busy, place them above the head (y = head top − 70 px).
- Every comparison carries a tick on the correct figure and a cross on the wrong one, inline with its label, 40 px.
- A lone cue mark is 40 px when inline before a support line ("✗ A pitch is the arm…") and 80 px when it stands alone under a figure (a tick centred below the correct action).
- Cue marks are Phosphor Bold glyphs as inline SVG, fill `#F6ECE3`, opacity 0.92. Paths in Appendix B.
- A support line that would collide with the figure moves under the figure, centred, y = figure bottom + 12 px.

### 3.5 Furniture

None. No logo, no page numbers, no watermark on the slides. The account handle and the caption carry the brand.

---

## 4 · Content architecture

### 4.1 The 10-slide arc

| # | role | content rule | figure |
|---|---|---|---|
| 01 | hook | the coach's line in quotation marks, PRO + CONTRADICTION; name and credential mark beneath | one dramatic hero |
| 02 | the contradiction shown | the thing it is *not*, drawn; cross mark | one figure |
| 03 | the cost | same-camera comparison; tick and cross; labels under figures | two figures |
| 04 | the concept as an object | one metaphor drawn large | one object with a small figure |
| 05 | the answer | the correct action; tick under it | one figure |
| 06 | the trap | same-camera comparison; tick and cross | two figures |
| 07 | the order / method | a labelled diagram (labels drawn in chalk are acceptable here only) | diagram |
| 08 | the horizon | one calm figure, most of the board empty | one small figure |
| 09 | breath | type only, the line to remember | none |
| 10 | the ask | coach photograph in front of the cream card; credential; glass button with the keyword; one-line benefit | photograph |

### 4.2 Copy rules

- Headline ≤ 8 words. Support ≤ 30 words. One idea per slide.
- Slide 2 must hook on its own; Instagram re-serves carousels to non-swipers from slide 2.
- Hook shapes that win: professional contradiction ("Speed is the last thing a fast bowler trains"), number + benefit, expectation reversal. Never a brand name in the hook. Never a meta-hook ("stop scrolling").
- Name the coach and the credential on slide 1 and slide 10. The coach's own words are the source; do not invent coaching content.
- No em dashes. Write "&" only in the credential line. Romanize any Hindi.
- Keyword on slide 10 is a single uppercase word set by the account owner. The build reads it from one variable; the review message states it; a deck with an unconfirmed keyword is not delivered.
- Kicker vocabulary by role: cover `FAST BOWLING ENGINE · PART N`; then `THE MISTAKE` / `THE COST` / `THE CONCEPT` / `THE ANSWER` / `THE TRAP` / `THE ORDER` / `THE HORIZON` / `REMEMBER THIS` / `THE NEXT STEP`. The CTA card's small-caps line is the chapter's principle in three or four words.
- Corpus transcripts are machine transcriptions and mis-hear English inside Hindi. Correct a mis-heard word only when the surrounding sentence and the chapter topic make it certain; list every correction in the deck README; never add a claim the coach did not make.

### 4.3 Two materials

The coach is always a real photograph (background-removed cutout). Everything the coach explains is chalk. The two never swap.

---

## 5 · Illustration pipeline

### 5.1 Style block

Paste at the top of every render brief, unchanged:

```
GENERATE THE IMAGE. Do not write a prompt back.
Hand-drawn chalk illustration: cream-white chalk (#F6ECE3) line art with hatching on a dark green
blackboard (#2A3B2E) with faint chalk dust. 4:5 PORTRAIT, not square. ONE person only. ZERO text,
zero letters, zero numbers, zero arrows, zero logos. No colour anywhere except the cream chalk on the
green board. Nothing else in the frame except what is listed below.
```

For a diagram with no people (steps, a spring, an object) replace "ONE person only." with "No people. One object." For a symmetric two-footed pose (deadlift lockout, box jump) describe both legs together instead of front leg / back leg.

For a two-figure comparison replace "ONE person only." with:

```
TWO figures: the SAME person drawn twice, side by side, both seen from the same side-on camera at
knee height, both facing the viewer's left. A vertical dashed chalk line splits the frame down the
middle. Both figures fill the lower two-thirds of the frame; the top third is empty board.
```

### 5.2 Brief template (visible geometry)

Image models do not render camera vocabulary ("ultra-wide", "low angle") or biomechanics vocabulary ("front-foot contact", "hip–shoulder separation"). They render described content. Write every joint as what a photograph would show, with angles in degrees.

1. Style block (5.1).
2. **Camera and scale**: one canonical film term, then what is nearest and largest, what is farthest and smallest, and which region must stay empty board for the headline.
3. **Head and gaze**: profile / three-quarter / square to viewer; chin level; where the eyes look.
4. **Torso and shoulders**: which way the chest faces; spine tilt in degrees; which shoulder is high.
5. **Arms**: for each arm, elbow angle, where the forearm points, what the hand holds.
6. **Front leg**: knee angle, foot contact, toe direction.
7. **Back leg and hips**: knee angle, foot height, pelvis facing.
8. **Ground**: one hatched chalk line, and the one prop that identifies the sport (stumps, mound, barbell). Nothing else.

Worked example: Appendix A.1. Full set for the reference deck: Appendix A.

### 5.3 Constraints

| do | do not |
|---|---|
| one figure per frame; two only for a same-camera comparison | three or more figures, or figures receding in perspective |
| attach a real pose photograph when available, with "use the attached photograph for the body position only; do not copy the person, kit, colours or background" | describe a pose from memory that contradicts the reference |
| state which corner stays empty | assume empty space will appear |
| labels as type in the build | words, letters or numbers in the drawing |
| one directional frame ("faces the viewer's left") used consistently | mixing "left" of viewer and "left" of subject |
| re-roll the two weakest figures | re-roll the whole set |

### 5.4 Acceptance per figure

Reject and redraw if any of these fail:

- the head faces the direction the body moves
- both arms and both legs are present; hands grip what they hold
- the ball is in the bowling hand, or visibly just released
- elbows and knees bend the anatomical way
- a comparison shares one camera and one scale
- the requested empty region is empty
- no text, arrows or logos appeared

### 5.5 Render rails

| rail | procedure | reference input | output | limits |
|---|---|---|---|---|
| Google AI web app (Pro account) | one new chat per figure; paste reference image; insert brief; send; download the PNG with the app's download control | yes, pasted | ~1856 × 2304 PNG | none met in 12 renders |
| AGY CLI (`ask_antigravity`) | one figure per call; "RENDER ONE IMAGE, save it, print the absolute path"; collect the newest file under `~/.gemini/antigravity-cli/brain/*/` **or** `~/.gemini/antigravity-cli/scratch/` | yes: name the absolute path of the photograph in the prompt text ("use the photograph at /abs/path for the body position only") | 896 × 1200 JPG (no 4:5 preset; it renders 3:4) | about 12 renders per day, then an empty reply; a 300 s wrapper timeout with no file is not a failure of the brief, retry once with the identical prompt |

Never reconstruct an image from base64 chunks; download the file. Verify the downloaded file opens and has the expected dimensions before use.

### 5.6 Lift to chalk

```
python3 carousels/bin/chalkify.py <render> chalk/<name>.png --lift --max-width 2200
```

Produces cream chalk on transparency (`--preset` is ignored in lift mode). The board texture is composited underneath in the slide, never baked in. Small watermark glyphs in the render corner are removed by the lift. Then apply §3.3 (crop to ink) where the figure is small in frame; web-app renders often need it, AGY renders usually fill 80–99 % of the frame already.

**Reusing a figure from an earlier deck** is allowed when the pose matches the new slide's role exactly (a hero bound for a cover, a calm bowler for a horizon slide). Record every reuse in the deck README with the source deck.

---

## 6 · Build

### 6.1 Deck folder

```
carousels/<YYYY-MM-DD>_<slug>/
  build.py          slide HTML + placement + render to PNG + contact sheet
  check_v2.py       measured gates (§7.1)
  prompts_v3/       one brief per figure
  refs/             pose photographs attached to briefs
  gen_v3/           raw renders, never edited
  chalk/            lifted chalk PNGs
  people/           deck copy of the identity assets (source: `carousels/people/`, deck-independent)
  out/              slide_NN.png, contact.png, heat_NN.png, heatmap_contact.png
  DELIVERY/<Cnn_Title>/   Cnn_01.png … Cnn_10.png, caption.txt
  caption.txt · README.md
```

README.md is a deliverable: the chapter and clips used, every ASR correction, every reused figure and its source, the keyword and who confirmed it, the check results.

### 6.2 Slide composition

Each slide is one HTML document, 1080 × 1350, rendered by headless Chrome:

```
chrome --headless=new --screenshot=out/slide_NN.png --window-size=1080,1350 --hide-scrollbars --disable-gpu file://slides/sNN.html
```

Layer order: board texture → vignette → figure (`<img>` with `object-fit: contain` at the computed box) → text block → labels and cue marks. CSS essentials in Appendix B.

### 6.3 The CTA slide

Kicker · headline ("Is your base built?") · cream card containing: credential mark + coach name + credential line · small-caps series line · glass button with `Comment <KEYWORD>` · one benefit line. The coach photograph (~740 px wide) stands to the right, overlapping the card's lower right corner, feet on the canvas bottom.

---

## 7 · Quality gates

### 7.1 Measured checks (`check_v2.py`)

| check | rule | threshold |
|---|---|---|
| grid | every text block's left edge = 96 px, or right edge = 984 px | ± 8 px (glyph side bearing) |
| type on chalk | render the text block alone and the figure alone; measure figure ink inside the text block's bounding box | fail above 2.5 % |
| canvas | no text block runs past x = 984 or y = 1266 | 0 tolerance |
| count | exactly 10 slide PNGs | — |

### 7.2 Saliency heat map

Run `python3 carousels/bin/heatmap.py` in the deck folder. Method: OpenCV `StaticSaliencySpectralResidual` and `StaticSaliencyFineGrained`, averaged, Gaussian blur σ = 24, multiplied by a centre prior `0.6 + 0.4·exp(−((x−W/2)/(0.6W))² − ((y−H/2)/(0.6H))²)`, normalised, mapped with COLORMAP_JET at 45 % over the slide, three highest peaks marked with 180 px suppression. Saves `out/heat_NN.png` and `out/heatmap_contact.png`.

**Reading it**: cream type is always more salient than chalk line art under this algorithm, so the rule is about order, not about peak 2. **Pass**: peak 1 lies on the headline on every slide that has one; on slides with a figure, at least one of the three peaks lies on the figure; type-only slides are exempt. This is a look, taken with the contact sheet, not an automated gate.

### 7.3 Cold read

A reader with no context reads every slide at full size and reports only defects with slide number, location and severity (blocker / should-fix / nit), covering: anatomy (§5.4), type on drawing, collisions with labels, one first thing to read per slide, slide 2 standing alone, spelling, no warm colour on the board, the CTA card legible with the photograph in front of it. Zero blockers before review.

### 7.4 Iteration protocol

Show the contact sheet once, with the heat map contact beside it. Collect notes. Apply all notes in one pass, re-run §7.1–7.3, show once more. Keep each review to three decisions at most.

---

## 8 · Delivery

1. Copy `out/slide_NN.png` to `DELIVERY/<Cnn_Title>/Cnn_NN.png`; copy `caption.txt`.
2. Upload the folder to the shared review location for the community team, and mirror it to the team's cloud folder for carousels (§9, rows D1–D2).
3. Stage a review message as a **draft** in the two review channels (§9, rows D3–D4): what it is, the folder link, the keyword. Two lines. The account owner sends and schedules; the community manager posts.
4. Caption shape: hook line · three lines of the teaching · coach credit · keyword line · five hashtags · under 750 characters (Appendix C).

---

## 9 · Reference table

| id | item | path or identifier | purpose |
|---|---|---|---|
| K1 | style guide | `packaging/mediakit-2026-08-21/STYLE-GUIDE.md` | palette, type, brand laws (source of truth: the shipping app) |
| K2 | fonts | `packaging/mediakit-2026-08-21/assets/fonts/caros-soft-{light,regular,medium}.woff2` | the only typeface |
| K3 | board texture | `packaging/mediakit-2026-08-21/assets/textures/chalkboard-green-2026-07-15.png` | slide ground |
| K4 | glass button (green) | `packaging/mediakit-2026-08-21/assets/glass/glass-button-green-2026-07-13.png` | CTA, 9-slice `0 662 fill stretch` |
| K5 | credential mark | `carousels/people/bcci.png` (copy into the deck's `people/`) | cover and CTA |
| K6 | coach cutouts | `carousels/people/asif_ball.png`, `asif_direct.png` (copy into the deck's `people/`) | CTA photograph |
| S1 | chalk style block | `carousels/prompts/STYLE_V2.json` | §5.1 as data |
| S2 | camera and anatomy law | `carousels/_design_language/V2_CAMERA.md` | why §5 is written this way |
| S3 | reference briefs | `carousels/2026-09-03_build-the-base/prompts_v3/*.txt` | Appendix A sources |
| S4 | pose references | `carousels/2026-09-03_build-the-base/refs/*.jpg` | attach to briefs |
| T1 | lift | `carousels/bin/chalkify.py` | render → chalk PNG |
| T2 | build | `carousels/2026-09-03_build-the-base/build.py` | copy this file to start a deck |
| T3 | gates | `carousels/2026-09-03_build-the-base/check_v2.py` | §7.1 |
| T4 | heat map | `carousels/bin/heatmap.py` (OpenCV ≥ 4 with the `saliency` module) | §7.2 |
| T5 | web render runbook | `packaging/GEMINI_UI_RUNBOOK.md` | §5.5 row 1 |
| T6 | prompt laws | `packaging/PROMPT_CRAFT.md`, `packaging/POSE_METHOD.md` | the evidence behind §5.2 |
| C1 | corpus map | `~/KPro/Course/CUT/transcripts/PIN_MAP.md` | which clip holds which chapter |
| C2 | transcripts | `~/KPro/Course/CUT/transcripts/*.json` | the coach's words |
| D1 | review folder (Drive) | folder `1MbT9vy24vjgUEhj0Akk3uzRBuoFucH_N`, account `mustafa@khiladipro.com` | one subfolder per carousel |
| D2 | team cloud mirror | `Dropbox-KhiladiPro_Media/MediaTeamMegaFolder/kricket.ai/KLUB_STUDIO/Marketing/Carousels/<Cnn Title>/` | same files |
| D3 | review channel 1 | Slack group DM "Koach Pro Community Media" (`C0BEGBCPTM0`) | draft only |
| D4 | review channel 2 | Slack private channel `#media-design` (`C074FNV58RJ`) | draft only |
| R1 | reference deck | `carousels/2026-09-03_build-the-base/out/contact.png` | what the result looks like |
| R2 | reference heat maps | `carousels/2026-09-03_build-the-base/out/heatmap_contact.png` | what a passing §7.2 looks like |
| R3 | clean-room deck | `carousels/2026-09-04_strength-to-power/` (`out/contact.png`, `GAPS.md`) | a deck built from this spec alone, and the gap list that made v1.1 |

---

## 10 · Notes for whoever optimises this document

Change log · v1.1: margin conflict resolved (96); `heatmap.py` shipped and §7.2 pass rule rewritten as an order test; headline line rule widened for the cover and enumerations; cue-mark sizes split by case; kicker vocabulary, ASR correction rule, keyword ownership, README contents, figure reuse rule added; AGY rail retry, output locations, aspect and reference-photo mechanics documented; identity assets moved to `carousels/people/`.

Preserve the measured values (§1, §2, §3.2, §7.1, §7.2): they came from a deck that passed review and any change should come with a new measurement. The parts most open to improvement: the brief wording in §5.2 and Appendix A (clearer geometry, fewer words), the arc in §4.1 (which slide types earn saves), the cue-mark vocabulary in §3.4, and the caption template. Keep the document executable: a reader with the files in §9 should be able to produce a deck without asking a question.

---

## Appendix A · Figure briefs, reference deck

Each brief = style block (§5.1) + the lines below.

**A.1 Front-foot landing (slide 2 alternative, single figure)**
```
Worm's eye view, low angle: seen from the turf, inches above the grass, looking up.
Focal plane and scale: a right-arm fast bowler at the exact instant his front (left) foot lands. The left
boot is enormous, bottom-right foreground, spikes and sole partly visible, heel striking the crease. The
head is small and far, top-left. Empty board in the top-right quarter.
Head and gaze: head in profile facing the viewer's left, chin tucked down, eyes level along the pitch.
Torso and shoulders: chest three-quarters toward the viewer, upper back arched, right shoulder high and
behind, left shoulder pulled down and forward.
Arms: left (front) arm bent 90 degrees at the elbow, fist pulled down hard toward the left hip. Right
(bowling) arm extended fully behind and up at about 45 degrees, wrist cocked, ball in hand.
Front leg: left leg thrust forward toward the viewer, knee locked dead straight, foot flat on the crease,
toes pointing toward the viewer's left.
Back leg and hips: right leg trailing far behind, knee bent about 90 degrees, right toe dragging along the
ground. Pelvis turned three-quarters toward the viewer.
Ground: one hatched chalk crease line under the front boot, receding toward the top-left.
```

**A.2 Cover, bowler at the top of the bound** — attach a gather-phase photograph. Both feet clear of the ground; back boot nearest and largest, bottom-left; head small, upper-right; front arm straight up, elbow locked; bowling arm behind and below the hip, elbow ~40°, ball in hand; front knee driven up to 90°, thigh horizontal; back knee ~60°; one crease line and one small set of stumps far away. Empty board top-left third.

**A.3 Baseball pitcher at release (slide 2)** — side-on at eye level, facing the viewer's left; cap, button jersey, belt, glove on the left hand, cleats; throwing arm fully extended forward and down, elbow straight, ball just leaving the fingertips; glove tucked against the ribs; front knee ~30°, foot flat on the mound slope; back leg trailing, toe dragging off the rubber; trunk forward ~40°; the mound as a hatched hump. Top third empty.

**A.4 Fresh versus spent (slide 3)** — comparison variant of the style block. Left: release, bowling arm straight up past vertical, ball leaving the fingertips, front leg locked, back knee ~45°, chin up; one thin straight chalk line through fingertips, shoulder, hip and front heel. Right: same moment, front knee ~60° buckling inward, trunk folded ~60°, head hanging, bowling arm barely above shoulder height; the same reference line drawn as a kinked zigzag through shoulder and hip.

**A.5 Stone base (slide 4)** — a massive dressed-stone plinth, nearest corner huge bottom-left, hatched courses, a crease chalked on its top; the bowler from A.2 standing on it, small, upper-right, both feet clear of the stone. Empty board top-left third.

**A.6 Barbell back squat (slide 5)** — lens on the gym floor at the lifter's front-left, looking up; near plates the largest element, top-left; bar across the upper back behind the head, hands just outside the shoulders, elbows down and back; chin up, eyes ahead; both knees ~100°, thighs just below parallel, knees over toes, feet flat and shoulder width; hatched floor line at the bottom edge.

**A.7 Overloaded versus correct squat (slide 6)** — comparison variant. Left: oversized plates, bar bending, knees caving inward, heels lifted, back rounded into a C, chin thrown up, elbows flared, both arms drawn gripping the bar. Right: small plates, straight bar, spine straight and tilted ~20°, chest up, knees ~100°, heels flat; one straight chalk line through ear, shoulder, hip and heel.

**A.8 Four steps (slide 7)** — from ground level, four chalk steps rising along one diagonal from bottom-left to top-right; the first step huge and near, the last small and far with a tiny cricket ball on it; risers lettered MOVEMENT, STRENGTH, POWER, SPEED in hand-drawn chalk capitals (the one permitted in-drawing text). Empty board top-left third.

**A.9 The horizon (slide 8)** — medium shot from behind at eye level; a lone bowler standing at the top of his run-up mark, back to the viewer, feet together, ball in the right hand at his side; far ahead, tiny, one set of stumps and a short crease line; the top half of the frame empty.

---

## Appendix B · Build essentials

```css
@font-face { font-family:'Caros Soft'; src:url('.../caros-soft-light.woff2');   font-weight:300; }
@font-face { font-family:'Caros Soft'; src:url('.../caros-soft-regular.woff2'); font-weight:400; }
@font-face { font-family:'Caros Soft'; src:url('.../caros-soft-medium.woff2');  font-weight:500; }
html,body { width:1080px; height:1350px; overflow:hidden; }
body { font-family:'Caros Soft',sans-serif; color:#F6ECE3; background:#1d2a20; position:relative; }
.board { position:absolute; inset:0; width:1080px; height:1350px; object-fit:cover; }
.vig   { position:absolute; inset:0; background:radial-gradient(122% 92% at 50% 36%,rgba(0,0,0,0) 32%,rgba(0,0,0,.48) 100%); }
.art   { position:absolute; object-fit:contain; }                 /* width/height/left/top from §3.2 */
.block { position:absolute; width:640px; }  .block.right { text-align:right; }
.kicker{ font-weight:500; font-size:28px; letter-spacing:.14em; text-transform:uppercase; margin-bottom:34px; }
.h1    { font-size:88px; font-weight:500; line-height:1.08; letter-spacing:-.01em; }
.sup   { font-size:38px; font-weight:400; line-height:1.4; opacity:.82; margin-top:28px; }
.label { position:absolute; font-weight:500; font-size:28px; letter-spacing:.14em; text-transform:uppercase; opacity:.72; }
.creamcard { background:#F6ECE3; color:#241616; border-radius:26px; padding:48px 52px; }
.glassbtn  { display:inline-block; border-style:solid; border-color:transparent; border-width:0 48px;
             border-image:url('.../glass-button-green-2026-07-13.png') 0 662 fill stretch;
             border-radius:999px; padding:22px 6px; min-width:420px; text-align:center; color:#fff;
             font-size:38px; font-weight:500; line-height:1.2; }
```

Cue mark glyphs (Phosphor Bold, viewBox 0 0 256 256, fill `#F6ECE3`):

```
check: M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z
cross: M208.49,191.51a12,12,0,0,1-17,17L128,145,64.49,208.49a12,12,0,0,1-17-17L111,128,47.51,64.49a12,12,0,0,1,17-17L128,111l63.51-63.52a12,12,0,0,1,17,17L145,128Z
```

Placement function (Python, used by `build.py`):

```python
SIDE, BOTTOM = 108, 140
def geom(wfrac, anchor, png, dx=0, dy=0):
    iw, ih = Image.open(png).size
    w = int(1080*wfrac); h = int(w*ih/iw)
    x = {"l": SIDE, "c": (1080-w)//2, "r": 1080-SIDE-w}[anchor[1]] + dx
    y = 1350 - BOTTOM - h + dy
    return x, y, w, h
```

---

## Appendix C · Caption template

```
<Hook line, the coach's quote without quotation marks.>

<Teaching line 1.> <Teaching line 2.>
<Teaching line 3.>
<Teaching line 4, the practical instruction.>

<Coach name> (<credential>): <the ordered principle>. <Closing phrase.>

Comment <KEYWORD> for a free bowling review by BCCI certified coaches. Link in your DM.

#cricket #fastbowling #cricketcoaching #cricketindia #strengthtraining
```
