Mai · Faces

Bangkok · Est. 2026 · Brand guide

Find them on
Mai Faces.

Bangkok's talent agency. Driven · Unseen · Evolving.

This is the single source of truth for everything that ships under the Mai Faces name — voice, tone, logo, colour, typography, photography, social content. If it doesn't live here, it's not part of the brand yet. Every section is structured so an automation can scrape it cleanly.

03 — Colors

Editorial noir. One palette. No surprises.

Pure black, off-white, and the muted grays between them. We don't use accent colors — the photography is the colour. When something absolutely needs to read as system state (success, error), use the chip styles below.

Brand Black
HEX#000000
OKLCHoklch(0 0 0)

Primary background. Everything sits on this.

Cream
HEX#F4EFE5
OKLCHoklch(0.96 0 0)

Primary text + inverted background. The 'mai' off-white.

Card
HEX#141414
OKLCHoklch(0.08 0 0)

Card / panel surface. One step up from background.

Muted
HEX#2D2D2D
OKLCHoklch(0.18 0 0)

Borders, dividers, disabled states.

Foreground 60
HEX#9D9D9D
OKLCHoklch(0.62 0 0)

Secondary text, eyebrows, captions.

Email Cream
HEX#F6F1E7
OKLCH

Used inside the email frame, slightly warmer than UI cream.

State colours (sparingly)

Success / paid / confirmedWarm / nudge neededError / refunded / failed

04 — Typography

One serif for emotion. One sans for everything else.

Instrument Serif italic carries the brand voice — every headline, every tagline, every product page hero. Geist does the work: nav, body, forms, buttons, captions. We don't mix in a third typeface for editorial flair.

Display — Instrument Serif italic

Bangkok's talent agency.

  • --font-display · Google Fonts · weight 400 (italic only)
  • Use cases: H1 / H2 / hero quotes / tagline / numerals over 4rem
  • Always italic, always lowercase except for proper nouns. Periods at the end of headlines.

Sans — Geist

We review every application personally. Editorial, runway, brand campaigns — Bangkok work that actually pays.

  • --font-sans · weights 400 (body) and 500 (emphasis)
  • Use cases: body, nav, forms, buttons, eyebrows, table data
  • Eyebrows are tracking-[0.3em] uppercase at 10px. Body is 16–17px, line-height 1.65–1.8.

Type scale

TokenSizeUseFont
display/heroclamp(72px, 14vw, 180px)Landing hero onlyDisplay italic
display/h1clamp(40px, 6vw, 72px)Page titlesDisplay italic
display/h2clamp(28px, 4vw, 48px)Section headsDisplay italic
body/lg18px / 1.7Hero subtitle, ledeSans
body16px / 1.75Article body, paragraphsSans
body/sm14px / 1.6Cards, list itemsSans
eyebrow10px / tracking 0.3emSection labelsSans / uppercase

05 — Audiences

Three audiences. Three voices.

Mai Faces talks to three groups, and the tone shifts a little for each. Same brand, different register. The codes are how we tag surfaces and copy internally.

B.Brand

Creative directors, casting producers, agency leads. Comes to cast a campaign. Speaks budgets and deadlines.

Lives at

/brands, /b/*

Verbs they own

castbriefshortlistbook
T.Talent

Models on the roster — emerging and established. Comes for paid editorial work. Speaks rates and dates.

Lives at

/apply, /m/*

Verbs they own

applyrespondshootget paid
A.Agency

The Mai Faces team itself — scouting, vetting, brokering. Internal-facing language, denser tooling.

Lives at

/a/*

Verbs they own

scoutscoreapprovebroker

06 — UI components

Buttons, eyebrows, cards, CTA bands.

The interface vocabulary. Use these primitives instead of inventing new ones — consistency is what makes the brand feel run by adults.

Buttons

Right arrow on primary + secondary. Tracking is 0.25em. Padding is px-7 py-4. No rounded corners. No drop shadows.

Eyebrow

Section eyebrow

Stronger eyebrow (hero context)

10px, sans, uppercase, tracking 0.3em (or 0.35em in hero context). Sits above every section heading.

Card

A card.

1px border at foreground/15, slightly elevated background at foreground/[0.02], 24–32px padding, no border-radius beyond rounded-sm.

CTA band

Find them on Mai Faces

Where do you fit?

07 — Voice + tone

Eight rules. Most copy follows them by accident if you've read the rest.

01

Speak FROM the agency, not AT the audience.

Do

We review every application personally.

Don't

All applications are reviewed personally.

02

Use concrete numbers. Vague claims read as marketing fluff.

Do

We accept roughly one in every twelve applicants.

Don't

We accept a small percentage of applicants.

03

Em-dashes are welcome — they're how the brand breathes.

Do

Six photos do more work than twenty — beyond that, signal-to-noise drops fast.

Don't

Six photos do more work than twenty. After that, signal-to-noise drops fast.

04

Cut every 'just'. 99% of them are filler.

Do

Add a brief. We rank the roster against it.

Don't

Just add a brief and we just rank the roster against it.

05

No exclamation marks. Ever. The italic display already conveys feeling.

Do

Apply in three minutes.

Don't

Apply in three minutes!

06

No AI tropes. No 'delve', no 'leverage', no 'in today's fast-paced world', no 'navigate the landscape'.

Do

Cast smarter.

Don't

Navigate the casting landscape with AI-powered intelligence.

07

Sentence case for headings. Periods at the end of italic headlines.

Do

Bangkok's talent agency.

Don't

Bangkok's Talent Agency

08

Don't say 'AI' in key messaging. Body copy is fine. Headlines and taglines stay human.

Do

We understand the vibe — not just the keywords.

Don't

AI-powered vibe matching

08 — Social media

What we post and how to brief the generator.

Example posts (humans wrote these — match the cadence)

Instagram caption

New face on the roster.

@royselbach — Bangkok-based, editorial moves easily, books out fast.

DMs open for casting.

LinkedIn post

If your last cast took four days of WhatsApp threads, that's the workflow we replaced.

Brief us your campaign — vibe, dates, budget. We rank the roster against it in 90 seconds and you walk away with a ranked shortlist + rate quotes the same morning.

Mai Faces. Bangkok's talent agency.

X / Threads

30 BKK shoots a year, same five faces every time.

Not because they're the best — because they're the ones the producer remembers.

We built Mai Faces to fix that.

TikTok caption

BTS from yesterday's editorial test with our newest signing 🎞️

Mai Faces · Bangkok talent

#bangkokmodel #editorial #mai

Instagram Story

Casting BKK faces this week.

DM "CAST" → app link

Mai Faces

Prompt templates for the generator

New-signing announcement

Write a 3-line Instagram caption announcing {handle} joining the Mai Faces roster. Include their distinct quality ({quality}), one specific work type they're well-suited for ({type}), and end with a soft CTA to DM for casting. No emojis except one optional photo emoji. No hashtags.

Casting-call story

Write an Instagram Story (max 12 words on screen) opening a casting call for {brief}. Use Mai Faces voice — direct, no exclamation marks, one CTA. Output text on three lines.

BTS recap

Write a 2-sentence TikTok caption recapping a behind-the-scenes shoot for {brand} with model {handle}. Mention one concrete detail (location, styling note, weather). End with 2-3 lowercase hashtags. Single film-reel emoji optional.

Field-notes promo

Write a LinkedIn post (under 100 words) driving traffic to a Mai Faces blog post titled {title}. Open with a one-sentence problem most BKK creative directors face. Mention the specific insight from the post. Close with the URL. No emojis.

Cold-DM script (manual)

Write a 4-sentence Instagram DM to {handle} inviting them to apply to Mai Faces. Open with a specific compliment on something visible in their feed ({observation}). Briefly explain the agency. End with the apply link: https://maifaces.com/apply?ref=ig-discovery&handle={handle}. Tone: direct, no exclamation marks, no over-promising.

Bracketed fields like {handle} and {brief}are runtime variables the content engine fills in. Keep them — don't hardcode values into the templates.

09 — Social images

Four ratios. Same skeleton. Photo does the heavy lifting.

Every social image uses the same anatomy: full-bleed grayscale photography, one eyebrow, one italic caption, the wordmark in a corner. Don't add quote marks, drop shadows, or framing borders. If the photo can't carry the post, swap the photo — don't decorate it.

Square 1080×1080 — single faceNew face · BangkokMai.Ploy.

Square 1080×1080 — single face

1:1

Use: IG feed, Threads, LinkedIn

Single grayscale model headshot, full-bleed. Wordmark 'Mai.' top-left. One-line italic caption bottom-left.

Portrait 1080×1350 — editorialCasting · BangkokMai.Cast smarter.

Portrait 1080×1350 — editorial

4:5

Use: IG carousel cover

Full-bleed editorial photo (grayscale contrast +10). Eyebrow 'CASTING / BANGKOK' top-right. Wordmark bottom-left.

Story 1080×1920 — casting call
Open call · This weekApply in three minutes.Tap to apply →Mai.

Story 1080×1920 — casting call

9:16

Use: IG/TikTok Story, Reel cover

Black 70% gradient over photo. Centered italic display text. Eyebrow above. CTA chip at bottom 25% — 'TAP TO APPLY'.

Landscape 1200×630 — OG / share
Mai Faces · Field notesWhy brands are casting from tagged portfolios.Mai.

Landscape 1200×630 — OG / share

1.91:1

Use: Link previews

Half photo / half black. Photo left, italic title right, eyebrow above title. Wordmark bottom-right.

Image-generation prompt template

Editorial fashion portrait of a {age}-year-old Thai {gender} model,
{distinct_feature}, photographed in {bangkok_location}, natural window
light at golden hour, grayscale contrast +10, shot on Hasselblad 80mm,
shallow depth of field, calm direct gaze, minimal styling, no makeup.
No watermarks, no logos, no text overlays. Aspect {ratio}.

Generated images go through Nano Banana via /web-images pipeline. Final crops + text overlays happen in Figma — the generator never bakes text into the image.

10 — Photography

Grayscale or near-grayscale. Natural light. Real Bangkok.

Mai Faces is a photography-led brand. The talent is the product. Every shot — real or generated — follows these rules. They're boring because they need to be: consistency is what makes the portfolio look like a portfolio instead of a Pinterest board.

The roster — twelve shots, same treatment

PloyPloy
NiranNiran
SuaySuay
KasemKasem
MaiMai
AnanAnan
FaiFai
NoiNoi
PimPim
TaraTara
JanJan
YingYing

Twelve faces. Same grayscale +10. Same window-light or golden-hour bias. Same direct or mid-action expression. Same 4:5 crop. The roster reads as one shoot, not twelve.

Do

  • Grayscale or muted-natural colour. Contrast +5 to +15.
  • Natural light. Window light, golden hour, soft overcast.
  • One face per frame on social. Multi-face for editorial layouts.
  • Direct gaze or candid mid-action. No vamping.
  • Real Bangkok textures — wet asphalt, concrete, terracotta, beaded curtains.
  • Skin and pores visible. Light retouching only.

Don't

  • Saturated colour grading, teal-and-orange, sunset gradients.
  • Flash / ring light / studio softbox cliches.
  • Smile-with-teeth glamour shots.
  • Generic backgrounds (white seamless, beige walls).
  • Heavy filtering, skin smoothing, face-altering edits.
  • Composite cards from 2022. Recent only.

Aspect ratios we shoot for

1:1

Roster directory, social square

4:5

IG portrait, hero cards

16:9

Web hero, OG image, blog cover

11 — Photography prompts

Five prompts the image generator can run as-is.

These are the workshopped prompts we use with Nano Banana / GPT Image 2. Bracketed fields are optional — leave them in and the engine substitutes from context (model name, location, etc.). Outputs land in /public/images/auto/.

Roster headshot example4/5

Roster headshot

Editorial headshot of a 22-year-old Thai woman with a distinct quality (e.g. high cheekbones, freckled skin, asymmetric haircut). Natural window light from camera-left. Direct gaze, mouth slightly parted, no smile. Grayscale, contrast +10. Shot on Hasselblad 80mm, f/2.8, 1/200s. Background: muted concrete wall, slightly out of focus. No makeup, no jewelry, no text. 4:5 aspect.
Full-body — Bangkok street example16/9

Full-body — Bangkok street

Full-body editorial shot of a 24-year-old Thai man walking on a wet Sukhumvit side street at dusk. Streetlight from above-right, second light source from a 7-Eleven sign reflecting off the pavement. Casual streetwear, no logos visible. Mid-step, calm expression. Grayscale, contrast +12. Shot on 35mm film stock, slight grain. 16:9 aspect.
Behind the scenes example3/2

Behind the scenes

BTS frame: photographer with handheld 35mm camera shooting a model in profile under a rooftop fabric softbox in central Bangkok. Late afternoon. Visible boom mic, taped marks on floor, second model waiting in background. Documentary feel — wide enough to read the entire set. Grayscale, contrast +5. 3:2 aspect.
Editorial pair example4/5

Editorial pair

Two Thai models, both early 20s, photographed shoulder-to-shoulder against a soft-focused tropical foliage backdrop. One looking at camera, one looking off-frame. Minimal styling — plain tonal clothing. Window light from camera-left, soft overcast. Grayscale +8. Hasselblad 80mm, f/4. 4:5 aspect.
Candid — agency office example16/9

Candid — agency office

Candid editorial of a casting director at her desk in a Bangkok creative studio, reviewing printed composite cards under a desk lamp. Mid-action, slight motion blur on her hand. Late evening, warm tungsten + cool window light mix. Grayscale, contrast +6. Shot on 50mm. 16:9 aspect.

12 — Patterns + texture

The vertical label, the ambient glow, the scroll arrow.

Three recurring textural elements give the brand its specific feel. Use one per scene — never all three stacked.

Vertical label

Driven · Unseen · Evolving

10px / tracking 0.3em / writing-mode vertical-rl / rotate-180. Left edge of hero scenes.

Ambient glow

A single soft white circle at 6–8% opacity, blurred 60–80px, positioned off-center. Used behind hero typography.

Scroll arrow

Italic arrow, bottom-right of hero scenes. Pairs with the eyebrow word “scroll”.

13 — Illustrations

We don't use illustrations. Typography is the illustration.

Mai Faces doesn't use illustrated characters, line drawings, spot icons, or stock vector mascots. The italic display type carries every emotional moment that an illustration would normally handle. If you need a section anchor that isn't a photo, use oversized italic typography or a number set in the display face.

01.Discovery
02.Development
03.Debut

The closest thing to an “illustration” we use is a giant italic numeral set next to a small label, paired with a photograph. Treat numbers as illustrations. The phases on the landing page use this exact treatment.

14 — Blog imagery

Field notes use working photography, not stock.

The field notes blog runs on real shots from real shoots wherever possible: BTS from sets, casting-room interiors, agency-laptop screens, model contact sheets. When we don't have a real shot, we generate one — but it has to read as documentary, not as marketing.

Specs

FormatWebP, fall back to JPG. Never PNG for photos.
Hero size1920×1080 (16:9). Loaded with priority.
Card size1200×900 (4:3). Lazy-loaded.
Path/public/images/blog/[slug]-[descriptor].webp
Alt textAlways empty (alt=“”) — covers are decorative; the headline does the SEO work.

Prompt template

Documentary editorial photo for a blog about {topic}.
Setting: {bangkok_setting} (e.g. small creative studio, casting room,
agency conference room with composite cards on a corkboard).
Subjects: {who} (e.g. a casting director at a laptop, model and
photographer mid-frame, contact sheets spread on a desk).
Lighting: natural + practicals only.
Treatment: grayscale, contrast +5, slight grain.
Mood: working, present-tense, not staged.
Aspect: 16:9.
No text overlays, no watermarks, no studio backdrops.

14b — Mood library

The reference set behind every prompt.

Twelve generated frames we treat as the visual reference for tone, lighting, location, and styling. When briefing a new shoot or running the image pipeline, pull from this set so the next batch reads as part of the same world.

15 — Examples

Before / after — voice rules applied to real copy.

Apply CTA

Before

Submit your application and our AI-powered system will review your portfolio to determine if you qualify for our exclusive talent roster.

After

Submit your portfolio. We review every application personally.

Why → Drops AI, drops 'exclusive', drops the marketing tone. Says the actual promise.

Brand page hero

Before

Revolutionize your casting workflow with intelligent talent matching.

After

Cast smarter.

Why → Two words instead of seven. Specific verb. No 'revolutionize'.

Apply confirmation email

Before

Thank you for your interest in joining the Mai Faces family. We will reach out shortly.

After

Application in. We review every photo, read every word, and sit with each one properly. So bear with us — we won't ghost.

Why → Names the actual experience. 'Family' is a tell. Confirms the timeline.

Social copy

Before

🚀 We're SO excited to announce our newest signing! 🎉 Welcome to the team @royselbach!!! 💫

After

New face on the roster. @royselbach — Bangkok-based, editorial moves easily, books out fast.

Why → No emojis except where they serve. No exclamation marks. Specific qualities instead of generic hype.

16 — Downloads

Logo files, favicon, OG image.

Everything you need to embed Mai Faces in an outside surface — press kit, partner page, deck. If you need a vector EPS or a specific custom lockup, email us.

Favicon · SVG · 256×256

/icon.svg

OG / social card · PNG · 1200×630

/opengraph-image

Brand colours (copy-paste)

--brand-black:  #000000   oklch(0 0 0)
--brand-cream:  #F4EFE5   oklch(0.96 0 0)
--brand-card:   #141414   oklch(0.08 0 0)
--brand-muted:  #2D2D2D   oklch(0.18 0 0)
--brand-mute60: #9D9D9D   oklch(0.62 0 0)
--email-cream:  #F6F1E7

17 — Questions

Anything we missed?

This page is the source of truth, but if a specific situation isn't covered — a partner asking for a custom co-branded lockup, a TV station wanting motion variants, a journalist asking for a press kit — reach out and we'll either send the right thing or add the rule to this page.