Website Style Guide · Preview · click anywhere to replay the wordmark

The mark, alone

The play triangle lifted from the wordmark — a single, recognizable glyph that doubles as the app icon, favicon, and loading state. Coral by default because it's a play button; the play button is an action; action is coral. Same path data as the iOS app, so what ships on TestFlight matches what ships on the web.

brand mark · primary

The triangle

Rounded play arrow. Coral by default. Scales from 12px to 256px from the same SVG.

app icon · dark · primary

iOS — dark

120×120 rounded square (iOS continuous radius). Coral triangle on a dark gradient chassis. The default app icon.

app icon · coral · alt

iOS — coral

Inverted: coral chassis, white triangle. For limited or seasonal treatments — a wink, not the default.

32×32
16×16
favicon · same path, smaller

At small sizes

Same SVG, no simplification — the rounded play triangle holds its silhouette down to 9px tall. Same brand at every size.

loading state · launch screen

Waking up

Inward rings collapse onto the mark — app launching, clip uploading, the review spinning up. Use exactly once per session.

size · 12 / 24 / 48 / 80

Across sizes

One shape, four sizes. Because the play triangle is geometric and convex, the silhouette never breaks — no special small-size variant needed.

The home page, composed

Every layer in service. Hex backdrop, slow-rotating polar grid behind the phone, corner brackets locked on the device, sonar pulsing inside the screen, an animated finding card sliding up from the bottom. The reticle next to the eyebrow is the smallest visible signal that the review is live.

iOS · Free in beta

Your sports clips,
reviewed closely.

Drop a clip in. Get a coach back.

Hips opened late
0:14 · medium confidence

How it works, visualized

Three frames. FX rises at step two — the moment Plai is actively reviewing — and pulls back at step three when the review is done and the findings are yours. The visual language tracks the work; the visitor reads the curve without thinking about it.

01 · ADD

Add a clip.

From the share sheet or your library. Whatever you've already shot — bring it in. No FX yet; Plai hasn't started its review.

02 · REVIEW

Plai reviews.

Every frame, end to end. Usually under 30 seconds. Brackets lock on, sonar pulses, polar grid spins. The full FX vocabulary.

Hips opened late
0:14
03 · SEE

You see what it saw.

Findings in plain language, pinned to the frame they came from. Reticles mark the where; the card tells the what.

A player that earns the second look

Every clip deserves a second look. The third time, frame by frame. The fourth, looped on one tap. Plai's player was built for the replay — haptic ticks on every keyframe, loop handles that snap to findings, slow-motion to 0.25× by pinch. The interactions are the value.

Haptic on every keyframe.
Feel each frame through your thumb as you scrub. No squinting at a tiny timeline — the keyframe is the click you hear in your skin.
Loop on any range.
Drag two handles to set a loop. The handles snap to nearby findings, so the moment lands every time you press play.
Slow to 0.25×, frame by frame.
Pinch in to slow down. Double-tap to step one frame. The body is doing things in six frames you can't see at full speed.
0:14 / 0:31 0.25×
TAP · PAUSE · HOLD · SCRUB · PINCH · SPEED

A coach in a card

Plai doesn't grade. It notices. Then it tells you what to try — in the voice of someone who's actually held a bat. Every finding has three parts: what we saw, what to try, and the frame it came from. Below is what one looks like, full-size, exactly as it appears in the app.

Lifted from the iOS app

Four real UI shapes — library tile, filter chip bar, tag pills, processing bar — pulled from the app source. Use them on the marketing site for the moments that need to show "this is what's inside." Same geometry as ios/Plai/Views/Library/; same color tokens as the rest of the system.

2 findings BASEBALL · 0:31
LibraryTile.swift

Library tile

Square card, dark gradient, accent finding-count badge. The grid uses these at ~160px wide. Lift the shape for "what's in your library" sections on marketing.

All Baseball Softball Soccer Golf
FilterChipBar.swift

Filter chips

Pill-shaped, horizontally scrolling. Active in accent; inactive in surface tint. Used for sport / category / age filters in the library.

Swing Right-handed Adult 12 yrs
TagCatalog.swift

Tag pills

Smaller, mono caption, in cyan scan. For inferred metadata — sport, skill, age. Quiet because they're observations, not actions.

REVIEWING · 67%
ProcessingSheet.swift

Processing bar

Cyan scan-fill with pulsing glow and mono caption. Label rotates with state — "loading", "reviewing", "almost there", "wrapping up".

Analyzing, full surface

A direct web port of ios/Plai/Views/Library/ProcessingSheet.swift. Looping clip backdrop, halftone scan veil dense at the edges and sparse in the center, sweeping scanline, layered vignettes, and a giant percent counter that climbs in real time. The dismissed AnalyzingPill sits below — what re-opens the sheet while a review keeps running in the background. Everything is driven from a single --progress custom property so the percent text, backdrop dim, and halftone intensity all track together.

Two themes, one accent

Hex values below resolve from the currently active theme — toggle with the button in the top-right and every swatch updates. Tokens with translucent fills also show their alpha, so the value you copy is the one you ship.

Surface

canvas
var(--canvas)
Page background
surface
var(--surface)
Cards, rows
surface-elevated
var(--surface-elevated)
Modals, dropdowns
nav-bg
var(--nav-bg)
Sticky header glass

Text

text-primary
var(--text-primary)
Headlines, body
text-secondary
var(--text-secondary)
Subheads, captions
text-tertiary
var(--text-tertiary)
Helper, eyebrows
text-disabled
var(--text-disabled)
Disabled controls

Borders

border-subtle
var(--border-subtle)
Section dividers
border-default
var(--border-default)
Cards, inputs
border-strong
var(--border-strong)
Focus, hover

Accent — coral

accent
var(--accent)
Primary action
accent-hover
var(--accent-hover)
Hover state
accent-press
var(--accent-press)
Pressed state
accent-soft
var(--accent-soft)
Badge background

FX scan — cyan

fx-scan
var(--fx-scan)
"AI is looking" overlays
fx-scan-soft
var(--fx-scan-soft)
Scan tint backgrounds
fx-scan-faint
var(--fx-scan-faint)
Faint scan wash
accent-glow
var(--accent-glow)
Hero glow halo

Semantic

success
var(--success)
Upload complete
warning
var(--warning)
Rate limits
error
var(--error)
Hard errors
info
var(--info)
Informational

Coral pairs with cyan

Coral marks what you do. Cyan marks what Plai does. They sit on opposite sides of the wheel so they never compete — one's the verb, the other's the witness.

accent · #FF6A3D
Record a clip.
Tap analyze.
fx-scan · #7DD3FC
Coach is reviewing…
Drawing on the frame.

Both themes, side by side

Hex/alpha for every token in dark and light. The accent shifts darker on light for contrast; semantics shift to WCAG-AA-friendly variants; FX cyan deepens from sky to ocean.

Token Dark Light Use
--canvas#0A0A0F#FAFAF8Page background
--surface#14141A#FFFFFFCards, rows
--surface-elevated#1C1C24#FFFFFFModals, dropdowns
--text-primary#F5F5F7#0A0A0FHeadlines, body
--text-secondary#F5F5F7 · α 0.72#0A0A0F · α 0.68Subheads
--text-tertiary#F5F5F7 · α 0.48#0A0A0F · α 0.46Helper text
--text-disabled#F5F5F7 · α 0.32#0A0A0F · α 0.28Disabled
--border-subtle#FFFFFF · α 0.06#0A0A0F · α 0.06Dividers
--border-default#FFFFFF · α 0.12#0A0A0F · α 0.12Cards, inputs
--border-strong#FFFFFF · α 0.20#0A0A0F · α 0.22Focus, hover
--accent#FF6A3D#E55A2FPrimary action
--accent-hover#FF8158#FF6A3DHover
--accent-press#E0531F#C84A22Pressed
--accent-soft#FF6A3D · α 0.15#E55A2F · α 0.10Badge bg
--accent-glow#FF6A3D · α 0.30#E55A2F · α 0.18Hero glow
--fx-scan#7DD3FC#0284C7"AI is looking"
--fx-scan-soft#7DD3FC · α 0.20#0284C7 · α 0.14Scan tint
--fx-scan-faint#7DD3FC · α 0.08#0284C7 · α 0.06Faint scan
--success#34D399#15803DUpload OK
--warning#FBBF24#B45309Rate limits
--error#F87171#B91C1CHard errors
--info#60A5FA#1D4ED8Informational

Eight sizes, three faces

Display uses Archivo — geometric, blocky, modernist, picked to sit close to the wordmark's industrial weight. Body uses DM Sans for legibility at 14–18px. The web wordmark uses Instrument Sans for its italic-`i`. All three on Google Fonts, free. The iOS wordmark renders as SVG path data and doesn't need a font at all.

Type faces

Wordmark
Instrument Sans
var(--font-wordmark) · weights 400 / 500 / 600 / 700 · italic
Plai
Aa 400 Aa 500 Aa 600 Aa 700 Aa 700i
Display
Archivo
var(--font-display) · weights 500 / 600 / 700 / 800 / 900
Record. Review.
Aa 500 Aa 600 Aa 700 Aa 800 Aa 900
Body
DM Sans
var(--font-body) · weights 400 / 500 / 600 / 700 / 800
Drop a clip in. Get a coach back. Plai is an iOS app for the clips already on your phone — slow-motion that pays attention, in 30 to 90 seconds.
Aa 400 Aa 500 Aa 600 Aa 700 Aa 800

Scale

text-display
~12vw
Record Plai Review.
text-3xl
60px
You filmed it. Now what?
text-2xl
36px
Three things Plai does well.
text-xl
24px
Collect, Review, Analyze.
text-lg
18px
Drop a clip in. Get a coach back. An iOS app for the clips already on your phone.
text-base
16px
Plai reviews every frame of your sports clip and tells you what it sees — like a good coach would. It's not magic. It's slow-motion that pays attention.
text-sm
14px
Smart trim now lands on the moment for clips over 60 seconds.
text-xs
12px
iOS only · Free in beta · © 2026 Plai

Type pairing in context

A real composition — display headline, body lede, helper. This is what the home page hero looks like as words on canvas.

An iOS pocket coach
You filmed it.
Now what?
Drop a clip in. Plai reviews every frame and writes back like a coach — specific, kid-safe, never demeaning. Typically 30 to 90 seconds.
Display · Archivo 600 · 60/64 · letter-spacing −0.02em · --text-primary Lede · DM Sans 400 · 18/28 · --text-secondary Eyebrow · DM Sans 600 · 12/16 · UPPERCASE · letter-spacing 0.12em · --accent

Three variants, one rule

Primary for the action. Secondary for the alternative. Ghost for the link that wants to be a button.

Pills, small and purposeful

Default, accent, and a live variant for real-time signals. See the green dot pulse.

New Beta 12,847 clips analyzed this week

Feature tiles

Hover any tile to see the 4px lift and border strengthen. Light theme adds a soft shadow on hover; dark theme uses the border alone.

[ Collect demo loop ]

Collect

Pull clips from your library. Plai trims to the moment that matters.

See how
[ Review demo loop ]

Review

Findings marked on the frame. Tap one to jump straight to that moment.

See how
[ Analyze demo loop ]

Analyze

Feedback tuned to who's playing — age, skill, sport.

See how

8px grid, with one exception

Every measurement aligns to 8px, with a documented 4px space-px for tight insets — badge padding, icon-to-text within a button.

space-px
4px
space-1
8px
space-2
16px
space-3
24px
space-4
32px
space-5
48px
space-6
64px
space-7
96px
space-8
128px

In-app FX, as web assets

Translations of the SkeletonFXVariant catalog — eleven in-app effects rebuilt as pure CSS / inline SVG, none over 2KB. Names mirror the iOS enum cases. The --fx-scan cyan is the review color: it shows where Plai is at work. Pairs with coral without competing — coral for what you do, cyan for what Plai does.

SkeletonFXVariant.cornerFocus

Corner focus

Camera-AF lock-on. Corners approach from outside, hold on target, then expand back out — 2.8s cycle. Use to frame the hero phone, the App Store badge, the showpiece moment.

SkeletonFXVariant.sonarRings

Sonar

Concentric pulses outward, no center dot. Three rings staggered on a 2.4s cycle. Use behind a CTA, behind the live counter, or as the loading state while Plai is reviewing a clip.

SkeletonFXVariant.polarGrid

Polar grid

Concentric circles plus radial lines, slowly rotating. Backdrop for hero sections, the review step, the showpiece scroll.

SkeletonFXVariant.hexWireframe

Hex · wireframe

Honeycomb tile pattern. Faint texture for any section that needs depth without an image. Tiles infinitely; zero file weight.

SkeletonFXVariant.fieldWarp

Field warp

Evenly spaced dots — the field Plai looks through. Used heavily in-app. Weightless texture; works as a backdrop for almost any section that needs a sense of structure.

SkeletonFXVariant.hudReticles

Reticles

Targeting crosshairs at multiple scales. Bullets in lists, markers next to findings, decorative accents on key headlines.

SkeletonFXVariant.targetLock

Target lock

Square frame with corner brackets and a center crosshair. More assertive than corner focus — use it the moment the review lands on something, not while it's still working.

SkeletonFXVariant.halftoneFullScreen

Halftone full

Graduated dot density with a radial fade — comic-book / risograph energy. Use as a hero backdrop or anywhere a section needs warmth without an image.

SkeletonFXVariant.radarSweep

Radar

A rotating arm with a trailing fade. The most "actively scanning" visual in the catalog — 5-second rotation, continuous. Three faint range rings underneath.

SkeletonFXVariant.ruleOfThirds

Thirds grid

Composition grid with cyan crosshairs at the four intersection points. Quiet signal that the frame is being read like a photograph.

SkeletonFXVariant.cornerArcs

Corner arcs

Expanding quarter-circle ripples from each corner, staggered. 3.6s cycle. Softer cousin of corner focus — for moments where right angles feel too tactical.

coral acts · cyan observes
color philosophy

Two accents, two jobs

Coral for what you do — buttons, links, CTAs. Cyan for what Plai does — corner brackets, sonar, the scan grid. Never mix the two in the same element.

In service — a framed moment

Three FX composed: a hex wireframe backdrop, a polar grid centered behind the headline, corner brackets framing the headline itself. Reads as "the review is happening here."

Record Plai Review.

analyzing · 0.5× · 187 frames

A single-sentence moment

After the hero, before the features. Five words, oversized. The gap between "you filmed it" and "you reviewed it" is the whole reason Plai exists. A halftone backdrop fades from the center; a thumbnail strip scrolls slowly behind the headline at 10% opacity — felt, not read.

You filmed it.
Now what?

This is the part Plai fixes.

Numbers and one quote

Three elements, muted, separated by hairlines: App Store rating, live count of clips reviewed this week, one quote with attribution. Ship without this section entirely if you don't have real numbers yet — better silent than seeded.

4.8★
On the App Store · 1,247 ratings
12,847
Clips reviewed this week
A
"My kid asked to see the Plai Review three times in a row."
Alicia · Baseball mom · Tampa

A short founder note

200–400 words, max. The reason Plai exists, in the voice of someone who'd actually say it at a dinner party. Anchors the brand emotionally; doubles as press / about-page content. Optional team row at the bottom — small team is a feature, not a liability.

Why we built Plai

The clips on your phone deserve a coach.

Most kids will never have access to a private coach. Most adults stopped playing the sport they loved because there was no one to tell them what they were doing wrong.

We built Plai for the millions of clips already sitting on phones — recreational games, backyard practice, weekend pickup. Clips that nobody replays because nobody knows what to look for.

Plai reviews every frame and tells you what it sees, in the voice of someone who's actually played. Not a grade. Not a leaderboard. Just the things you might want to try next time.

No team dashboards. No social feeds. No "AI-powered sports analytics platform." Just a coach for your clips.

— Bryan & team, Detroit · 2026
B
Bryan Elkus
Founder
A
Avery
Engineering
M
Marcus
Design

Free, with a known endpoint

Don't dodge the price question. Answer it briefly, in the same voice as everything else. The full /pricing page expands; the homepage version just acknowledges so visitors don't go looking.

Currently · Free

Plai is free while we're learning what it's worth.

We're in beta. The full feature set works, no caps, no watermarks. When we settle on what to charge, you'll know first — and anyone who joined during beta gets a year free.

No payment required · No card on file

Five questions, answered

The questions every visitor has. Plain language, two sentences max. Click any to expand. The "Is this Photos?" answer is the one that converts the skeptics.

Is Plai a video editor?

No. We don't help you cut highlights for Instagram. We help you understand the clip — what happened, what to try next.

Do I need to record clips with Plai?

No. Use your phone's camera the way you always do. Plai works on whatever's already in your library.

What sports does Plai understand?

Today: baseball, softball, basketball, soccer. Coming next: tennis, golf, swimming. We add a new sport every couple of months.

Will my clips be used to train AI models?

No. Your clips are yours. We don't use them for training, and we don't share them.

How is this different from Photos?

Photos organizes by when. Plai organizes by what happened.

Three most recent entries

A condensed strip showing momentum. Three entries — date, version, headline, two-sentence body. Link to the full /changelog at the top right. Cursor's changelog is the model: each entry small, dated, specific.

What's new in Plai

All updates →
May 20, 2026 v1.4.0

Smart trim lands on the moment.

For clips over 60 seconds, the trim handles now snap to the most-active window automatically. Tap once, the right 8 seconds are already selected.

May 14, 2026 v1.3.2

Findings now pinned to frames.

Each finding card includes a thumbnail of the exact frame it came from. Tap to jump straight to that moment in the player.

May 7, 2026 v1.3.0

Tennis support, in beta.

Forehand, backhand, serve — Plai now reviews tennis clips. Still figuring out which findings matter most for amateur play, so we're labeling these "beta" until the feedback loop settles.

Brand assets, downloadable

Quiet section, off the main scroll. Bundles every brand asset a journalist or partner might need. Skip building this until someone asks for it — but when they do, the link should already exist.

Bring your worst clip

Full-bleed. One sentence. One action. No second link, no newsletter, no "or read our blog." Just the offer. The accent glow pulses on a 4-second cycle so the section feels alive even at rest.

Bring your worst clip.

We'll find something worth keeping.

Get Plai on the App Store

About the fonts. The wordmark is the real PLAI SVG, lifted from ios/Plai/Views/WordmarkVector.swift — no font involved, no licensing question. Display headlines use Archivo — geometric and blocky, picked to sit close to the wordmark's industrial weight. Body copy uses DM Sans for legibility at 14–18px. Both on Google Fonts, free for commercial use, single CDN. Nothing to license before shipping.