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.
02 — Logo
The wordmark is the logo.
Mai Faces doesn't use a symbol mark. The wordmark, set in Instrument Serif italic with a hard period after “Mai”, is the whole identity. The period is non-negotiable — it's how you know the brand is from Bangkok rather than imitating a Milanese agency.
Primary lockup — stacked
Horizontal lockup — nav + email signature
Inverted lockup — cream-on-black
Icon mark — favicon, avatar (1024×1024)
Rules
- Clear spaceequals the height of the lowercase “a” in any direction.
- Minimum size is 60px wide for the horizontal lockup, 28px for the icon mark.
- Never rotate. Never stroke. Never gradient. The wordmark sits still and lets the photography do the work.
- On dark backgrounds use the cream wordmark. On cream/white backgrounds use black. Mid-tone backgrounds get black with a 2px cream halo.
Co-brand explorations
Logo concepts we've generated for partner / portfolio brands on the platform. Mai Faces sits comfortably next to all of them because the wordmark is restrained — partners get to be loud.
Atlas Hotels
Khao Studios
Lume Beauty
Mango Tropic
Royce Cola
Soi Denim03 — 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.
#000000oklch(0 0 0)Primary background. Everything sits on this.
#F4EFE5oklch(0.96 0 0)Primary text + inverted background. The 'mai' off-white.
#141414oklch(0.08 0 0)Card / panel surface. One step up from background.
#2D2D2Doklch(0.18 0 0)Borders, dividers, disabled states.
#9D9D9Doklch(0.62 0 0)Secondary text, eyebrows, captions.
#F6F1E7—Used inside the email frame, slightly warmer than UI cream.
State colours (sparingly)
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
| Token | Size | Use | Font |
|---|---|---|---|
display/hero | clamp(72px, 14vw, 180px) | Landing hero only | Display italic |
display/h1 | clamp(40px, 6vw, 72px) | Page titles | Display italic |
display/h2 | clamp(28px, 4vw, 48px) | Section heads | Display italic |
body/lg | 18px / 1.7 | Hero subtitle, lede | Sans |
body | 16px / 1.75 | Article body, paragraphs | Sans |
body/sm | 14px / 1.6 | Cards, list items | Sans |
eyebrow | 10px / tracking 0.3em | Section labels | Sans / 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.
Creative directors, casting producers, agency leads. Comes to cast a campaign. Speaks budgets and deadlines.
Lives at
/brands, /b/*Verbs they own
Models on the roster — emerging and established. Comes for paid editorial work. Speaks rates and dates.
Lives at
/apply, /m/*Verbs they own
The Mai Faces team itself — scouting, vetting, brokering. Internal-facing language, denser tooling.
Lives at
/a/*Verbs they own
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.
Speak FROM the agency, not AT the audience.
Do
We review every application personally.
Don't
All applications are reviewed personally.
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.
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.
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.
No exclamation marks. Ever. The italic display already conveys feeling.
Do
Apply in three minutes.
Don't
Apply in three minutes!
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.
Sentence case for headings. Periods at the end of italic headlines.
Do
Bangkok's talent agency.
Don't
Bangkok's Talent Agency
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
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
Ploy
Niran
Suay
Kasem
Mai
Anan
Fai
Noi
Pim
Tara
Jan
YingTwelve 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:1Roster directory, social square
4:5IG portrait, hero cards
16:9Web 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/.
4/5Roster 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.
16/9Full-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.
3/2Behind 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.
4/5Editorial 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.
16/9Candid — 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
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.



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.
Live covers — pulled from the actual blog
Specs
| Format | WebP, fall back to JPG. Never PNG for photos. |
| Hero size | 1920×1080 (16:9). Loaded with priority. |
| Card size | 1200×900 (4:3). Lazy-loaded. |
| Path | /public/images/blog/[slug]-[descriptor].webp |
| Alt text | Always 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.svgOG / social card · PNG · 1200×630
/opengraph-imageBrand 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.


08 — Social media
What we post and how to brief the generator.
Example posts (humans wrote these — match the cadence)
Instagram caption
LinkedIn post
X / Threads
TikTok caption
Instagram Story
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.