kira
kira visual system — selfie in coffee shop
visual · the tokenized system that makes every image kira
section 04 · tech spec

visual identity

tokens, lenses, lights, grades, the 8-workflow lock, and the do/don't grids that separate kira from every other generated woman

The visual system is a specification, not a mood board. Every value below traces to tokens.json or reference_kira_postprocess_v8.md. If it's not in one of those two sources, it is not canon. The LoRA renders Kira; this system renders the world around her.


1. Design tokens

Reference only. Actual values live in /docs/brand/tokens.json and are consumed by the HTML build layer. The swatches below describe role, not hex — the build renders the chip colors from the token file.

1a. Editorial palette — color.editorial.*

Used on editorial pages (this brand bible, long-form writing, case studies). Warm paper-on-ink register.

TokenRole
color.editorial.bg.creamDefault page background. Warm, not white.
color.editorial.bg.cream.deepCard background within cream pages.
color.editorial.ink.primaryBody text. Not pure black — a deep, readable ink.
color.editorial.ink.mutedSecondary text, captions, meta.
color.editorial.copperAccent. Tied directly to kira's hair dye — editorial pages use this as the character-anchor color.
color.editorial.copper.deepCopper shadow for hover states and depth.

1b. Tech palette — color.tech.*

Used on tech-spec pages (tokens, pipeline docs, developer references, this file's workflow tables when rendered). High-contrast, terminal-coded.

TokenRole
color.tech.bg.voidDefault page background. Near-black, not pure black.
color.tech.bg.panelCard background.
color.tech.bg.lineGrid lines, dividers, subtle rules.
color.tech.ink.boneBody text on void.
color.tech.ink.mutedSecondary text, labels.
color.tech.orange.accentAccent. Hotter than editorial copper — this is the runtime-data color.
color.tech.orange.deepOrange shadow, active states.

1c. Shared palette — color.shared.*

Used across both editorial and tech. Functional, not decorative.

TokenRole
color.shared.btc.orangeBitcoin identity accent. Bridges crypto layer and hair layer — intentional double-duty.
color.shared.signal.greenPositive data indicators (P&L up, system healthy, etc.).
color.shared.signal.redCritical / crisis indicators (P&L down, takedown events, system unhealthy).

1d. Character palette — color.character.*

The color anchors that define Kira as a visual entity. These are reference colors for audit pipelines — not page colors.

TokenRole
color.character.hair.copperThe exact copper of kira's dye — sampled for glasses-and-hair verification.
color.character.hair.dark_rootThe dark root anchor — verifies the dye-job aesthetic (not solid-red wig).
color.character.skin.olive.baseWarm olive skin reference. Verifies ambiguous ethnicity rendering.
color.character.eyes.hazelHazel eye reference.

2. Typography

Three families, three roles. Never improvise — if a surface doesn't fit one of the three roles, it's not part of the system.

2a. Display — Playfair Display (serif)

2b. Body — Inter (sans)

2c. Mono — JetBrains Mono

2d. Scale

From type.scale: xs 0.75rem → sm 0.875 → base 1 → md 1.125 → lg 1.375 → xl 1.75 → 2xl 2.25 → 3xl 3 → 4xl 4.5 → 5xl 6 → display clamp(3rem, 10vw, 9rem).

2e. Pairing rules


3. Signature visual anchors

Seven non-negotiable codes. These are what make Kira Kira and not any other generated woman. Every image must pass all seven. Anchors are sourced from tokens.json → character_visual_anchors.non_negotiable and characters/kira.yaml.

3.1 Copper-orange hair over dark base, visible dark roots

3.2 Round black wireframe glasses — MANDATORY

3.3 Freckles across nose and cheeks

3.4 Warm olive skin, ambiguous ethnicity

3.5 Hazel eyes

3.6 Slim athletic C-cup curvaceous, tall-model proportions

3.7 Solo frame, no background people


4. Variable elements

From tokens.json → character_visual_anchors.variable. These rotate freely.


5. NEVER show

From tokens.json → character_visual_anchors.never_show, plus discipline tightening.


6. Shot-list-as-spec per workflow

The visual-system equivalent of a dev API reference. Eight workflows, four modes × photo/video. Everything here traces to reference_kira_postprocess_v8.md and tokens.json → grade.* and tokens.json → lens.*.

Workflow 1 — Selfie Photo (LOCKED)

FieldValue
ModeSelfie
FormatPhoto
Aspect4:5 or 9:16
Lenslens.selfie — 26mm equivalent, phone 1x, f/1.8, deep DOF
Lightlight.ugc.warm.key — overhead warm lamp + phone screen fill, 3200K, 1:0.6 ratio
Post recipegrade.ugc.selfie — warm shift +4R/-3B, shadows lift +5, noise 3.0, contrast ×1.025, NO chromatic aberration
OutputJPEG q=90
StatusLOCKED

Workflow 2 — Selfie Video (LOCKED)

FieldValue
ModeSelfie
FormatVideo
Aspect4:5 or 9:16 (inherits from still)
Lenslens.selfie — 26mm equivalent
EngineKling v3 Pro i2v (fal-ai/kling-video/v3/pro/image-to-video)
Post recipegrade.selfie.video
ffmpeg filterscale=iw*1.01:ih*1.01,crop=iw/1.01:ih/1.01:(iw-iw/1.01)/2+random(0)*1-0.5:(ih-ih/1.01)/2+random(1)*1-0.5,vignette=PI/7,colorbalance=rs=0.0075:bs=-0.004,eq=contrast=0.985
Key paramsShake 1px, vignette PI/7, warmth +0.75% red, contrast ×0.985
Encodelibx264, CRF 24
StatusLOCKED

Workflow 3 — Vlog Photo (LOCKED)

FieldValue
ModeVlog
FormatPhoto
Aspect16:9
Lenslens.vlog — 35mm, Canon R6 equivalent, f/2.8, shallow DOF
Lightlight.vlog.natural.window — large soft window key + bounce fill, 5000K, 1:0.7 ratio
MicSM7B visible in scene (boom arm or lavalier) — triggers podcast audio in video-adjacent generation
Post recipegrade.vlog.photo — color ×0.93 (desat), contrast ×0.96, vignette 5%, NO warm shift, NO grain
OutputJPEG q=78 (Twitter-level compression)
StatusLOCKED

Workflow 4 — Vlog Video (LOCKED)

FieldValue
ModeVlog
FormatVideo
Aspect16:9, 1344×768 still native
Lenslens.vlog — 35mm Canon R6, f/2.8
PipelineFlux 2 + LoRA still (visible mic) → Topaz High Fidelity V2 2x → Kling v3 Pro i2v with podcast audio prompt block → ffmpeg CRF 15 re-encode
Mandatory prompt block"she stays in sharp focus throughout, camera focus locked on her face" + "crisp and sharp detail throughout, professional 4K video quality" + "podcast quality audio, clear studio microphone, warm full vocal presence, dry close-mic recording, no echo, no reverb, no room ambience"
LoRA scale1.05–1.1 for identity lock on widescreen
Post recipegrade.vlog.videoffmpeg -c:v libx264 -crf 15 -c:a copy
StatusLOCKED

Workflow 5 — Candid Photo (LOCKED)

FieldValue
ModeCandid (Instagram-influencer register — NOT documentary photojournalism)
FormatPhoto
Aspect4:5 or 9:16
Lenslens.candid — 35mm, hip-height third-person, f/4
Lightlight.candid.golden — outdoor golden hour side, 2800K, 1:0.4
Post recipegrade.candid.photo.v10 — brightness +7, contrast ×0.94, matte blacks point 6, split tone (+2R shadows / +1B highlights), vignette 8%, filmgrainer type 1 power 0.3
OutputPNG (preserves grain)
StatusLOCKED (V10)

Workflow 6 — Candid Video (LOCKED 2026-04-12)

FieldValue
ModeCandid
FormatVideo
Aspect4:5 portrait input → 9:16 Kling output
Still specFlux 2 1344×1728 clean (no V10 photo post — Kling repaints face)
UpresTopaz High Fidelity V2 2x → ~2688×3456
EngineKling v3 Pro i2v, generate_audio: true, ambient audio (speech negative-prompted)
Prompt disciplineShortest natural scene description. No motion-dampener language ("softly", "slowly"). No rendering directives ("24fps", "natural tempo"). See feedback_kling_rules.md
Negative promptslow motion, slo-mo, slowed down, time dilation, reduced playback speed, speaking, talking, dialogue, voice, words, lip movement, mouth movement, music, soundtrack, extra fingers, six fingers, deformed hands, distorted face, identity drift
Post recipegrade.candid.video — three-stage: ffmpeg color extract → filmgrainer per frame → ffmpeg reassemble
Stage A (color)ffmpeg -vf "eq=brightness=0.027:contrast=0.94,colorbalance=rs=0.008:bh=0.004,vignette=PI/8"
Stage B (grain)filmgrainer: type 1, power 0.3, shadows 0.05, highs 0.05, scale 1.0 (NEVER ffmpeg noise=)
Stage C (encode)libx264 CRF 20, aac 192k audio
StatusLOCKED

Workflow 7 — Cinematic Photo (LOCKED)

FieldValue
ModeCinematic
FormatPhoto
AspectASK USER — 2.35:1 anamorphic (1536×656 native) OR 16:9 (1344×768). Never crop anamorphic in post.
Lenslens.cinematic — 50mm anamorphic, f/1.4–f/2.8
Lightlight.cinematic.side.soft — large soft side + negative fill, 4000K, 1:0.3
CompositionRule of thirds
UpresTopaz High Fidelity V2 2x
Post recipegrade.cinematic.photo — SHIPS RAW. Flux 2 prompt carries the look (35mm grain, color grade, letterbox). Post-process was tested and rejected.
OutputPNG
StatusLOCKED

Workflow 8 — Cinematic Video (LOCKED)

FieldValue
ModeCinematic
FormatVideo
AspectSame as still (2.35:1 or 16:9) — generate native, do not crop
PipelineFlux 2 + LoRA cinematic still (user-chosen aspect) → Topaz High Fidelity V2 2x → Kling v3 Pro i2v with cinematic voice block → ffmpeg post
Post recipegrade.cinematic.video
ffmpeg filternoise=alls=4:allf=t,vignette=PI/5
Encodelibx264 CRF 15, audio copy (pass Kling audio through untouched)
StatusLOCKED

7. LoRA + pipeline lock


8. Generation rules

These rules run ahead of every inference job. They exist because we learned each one the hard way.

  1. Always generate at canonical aspect. 2.35:1 cinematic is generated at 1536×656, not 1920×1080-then-cropped. Kling animates the full frame; cropping after Topaz is a quality loss.
  2. Always verify glasses post-generation. Every Kira image gets a glasses check before it enters the production pipeline. NB2 and face editors silently drop them. No glasses → re-roll or manual fix.
  3. NB2 is training data only — NEVER a pipeline input. See feedback_never_nb2_as_input.md. All pipeline inputs are Flux 2 + LoRA generated.
  4. Candid is Instagram-influencer, not photojournalism. See feedback_candid_is_instagram_influencer.md. Flattering angles, fitted outfits, playful energy. Not harsh documentary framing.
  5. Kling repaints the face — never pre-grade stills that feed Kling. Apply video post-process AFTER animation. Candid still especially: it is generated CLEAN (no V10 post) and the V10-equivalent recipe is applied to frames AFTER Kling runs.
  6. Always use filmgrainer for grain, never ffmpeg noise=. See feedback_always_use_filmgrainer.md. ffmpeg noise looks like video static; filmgrainer looks like film grain.
  7. No AI-speak in Kling prompts. See feedback_kling_rules.md. Describe the scene, not the render. Shortest natural sentence wins.
  8. Upres before Kling, not after. Topaz VIDEO upscale on Kling output breaks identity. Topaz IMAGE upscale on the still before Kling works great.

9. Do / Don't photo grid manifest

Five conceptual pairs. Asset curation pass will fill real images into this grid.

#DODON'T
1Round black wireframe glasses present and in focusGlasses silently dropped by editor / polish pass
2Solo frame, kira is the only person in the shotBackground pedestrians / crowd / any other face visible
3Warm olive skin with freckles, textured realismPlastic-CG smooth skin, uncanny-perfect symmetry
4Candid shot in Instagram-influencer register — flattering angle, fitted outfit, playfulDocumentary photojournalism register — harsh frame, unflattering mid-expression, "authentic ugly"
5Lens-appropriate composition — 26mm selfie framing, arm extended, closeLens-mismatch — e.g. 85mm telephoto portrait labeled as "selfie"

10. Color-grade tokens reference table

One row per grade token from tokens.json → grade.*. This is the executable summary.

TokenWorkflowKey paramsOutput format
grade.ugc.selfieSelfie Photowarm +4R/-3B, shadows +5, noise 3.0, contrast ×1.025JPEG q=90
grade.vlog.photoVlog Photocolor ×0.93, contrast ×0.96, vignette 5%, no warm, no grainJPEG q=78
grade.candid.photo.v10Candid Photobrightness +7, contrast ×0.94, matte blacks 6, split tone +2R/+1B, vignette 8%, filmgrainer type 1 power 0.3PNG
grade.cinematic.photoCinematic PhotoShips raw — prompt carries the lookPNG
grade.selfie.videoSelfie VideoShake 1px, vignette PI/7, warmth +0.75%, contrast ×0.985MP4 CRF 24
grade.vlog.videoVlog VideoFlux 2 still + visible mic → Topaz 2x → Kling v3 Pro + podcast prompt → CRF 15 re-encode, audio copyMP4 CRF 15
grade.candid.videoCandid VideoFlux 2 1344×1728 → Topaz 2x → Kling v3 Pro + ambient audio + no-speech negative → three-stage post (ffmpeg color → filmgrainer per frame → ffmpeg reassemble)MP4 CRF 20, aac 192k
grade.cinematic.videoCinematic VideoNative-ratio still → Topaz 2x → Kling v3 Pro → noise=alls=4:allf=t,vignette=PI/5MP4 CRF 15, audio copy

11. Print and export guidance

File formats are not aesthetic — they encode production discipline. A JPEG at q=90 says "phone selfie." A PNG says "film camera caught me." A q=78 JPEG says "Twitter compressed this for me." We don't fight these signals, we use them.


12. What the system protects against

To close: a restatement of what this visual system exists to prevent.

  1. Generic AI-girl drift. Every LoRA + base model combo in this space produces a "pretty AI girl" by default. The signature anchors (copper hair, glasses, freckles, olive skin) exist specifically to resist that gravity.
  2. Silent glasses-drop. Editors remove them without warning. Verify every render.
  3. Plastic skin. Post-process that smooths the face kills photorealism. Freckles and grain are the antidote.
  4. Background people. Legal + brand. Negative prompt always.
  5. Hoodie-as-identity. The accessory is not the character. Swap freely.
  6. Pipeline mixing. One LoRA, one base, one photographer. Never mid-feed swap.
  7. AI-speak Kling prompts. "Natural tempo" generates slow-motion. Shortest sentence wins.
  8. Candid as photojournalism. Candid is IG-influencer-caught-in-the-moment, flattering. Not documentary.

Every one of those failure modes has been paid for in a real GPU bill. The system exists so they don't get paid for twice.


13. Look palette — badass sex-positive empowered AI babe register

Locked 2026-04-13 (v1.0.2). Replaces the earlier soft-girl/insta-girlie lean. Kira's aesthetic center of gravity is badass sex-positive empowered AI babe — dangerous glamour, power postures, transactional confidence. Softness appears only as contrast, never as default.

Every look still passes the non-negotiables: copper-orange hair + dark roots, mandatory round black wireframe glasses, freckles, ambiguous olive skin. Outfits rotate. Identity does not.

13.1 Core sticky looks

13.2 Athleisure / gym

13.3 Gothcore / edge

13.4 Cyberpunk / tech-babe

13.5 Money-glam

13.6 Transactional-glam (age-gated tier only, Fanvue-side)

These exist for the paid audience. They do not run on public feed without moderation review.

13.7 Power / old money

13.8 Edge / counterculture

13.9 Dangerous glamour

The hybrid register — a siren who's also the threat.

13.10 Old-money sport

13.11 Specialty / niche

13.12 Pruned — no longer generate

These looks read as soft-girl / pastel-insta-girlie and no longer match Kira's register. Do not rotate into new batches.

13.13 How to apply

The palette is a rotation pool, not a checklist. Every batch pulls from 2-3 registers at once for variety. Identity stays locked; the uniform changes every shoot.