RTSN

Brand Book

The brand foundation, in one document. Identity, voice, visual system — every locked decision, captured plainly.

Singapore · MMXXVI RTSN Studios
01
Premise

Why this brand exists.

Founders start companies to build something specific. The running of the business eats their time on it. RTSN exists so they can keep building.

Hero

The founder + their team, building toward what they started the company for.

Enemy

The grind that eats the time meant for the building.

Promise

Keep building. We'll handle the rest.

The grind has no universal shape — vendor calls, customer surprises, admin that is important but feels forced. It varies in form per founder. The felt experience is the same: being swept away from the work that motivates you. The brand stays on the founder's terms; RTSN is the supporting role.

The full statement of this premise lives in the manifesto, next.

02
Manifesto

The manifesto.

Three acts. ~155 words. Read it slowly.

I — Your world

You started this company to build something specific.

An idea you wanted to make real. A team you wanted to gather. A way of working you knew was possible. Something you could stand behind.

II — What got in the way

Then the running of the business started taking your time.

Vendor calls. Customer surprises. Admin that is important but feels forced. The work you actually started this for kept getting pushed to the weekend, and then off the calendar entirely.

You started making compromises. The version of the company you imagined kept getting smaller than the one you're stuck running.

III — What we do

We built RTSN to make sure that doesn't happen.

We run the brand and operations alongside your team. AI handles the consistent execution. We work with the team you have, not around it.

The point isn't to take your business off your hands. The point is to keep you in the part of the business you started this for. The building. The deciding. The work that motivates you.

Keep building.
We'll handle the rest.
03
Promise

What we say.

Three pieces of customer-facing copy carry the brand. They lock together — the H1 introduces, the subhead explains, the tagline closes every surface.

H1 — homepage hero · ad headline · social bio
A Singapore AI studio for founder-led teams.
Subhead — what we do, in the founder's voice

You keep building what you started the company for. We run brand and operations alongside your team. AI handles the consistent execution, so your team can focus on what matters.

Tagline — logo-adjacent · footer · business card
Keep building.
04
Vision & Mission

The world we move toward.

The horizon, and the daily compass. The brand has one centre-of-gravity phrase that operates at multiple scales — Vision expands it, Mission compresses to it, Tagline IS it.

Vision
A world where builders get to keep building.

Builders — anyone who makes things, not just founders. The Vision scales beyond the immediate buyer to the wider tribe.

Mission
Keep building.

Identical to the tagline. The brand has one centre-of-gravity phrase that operates at multiple scales — Vision expands it, Mission compresses to it, Tagline IS it.

05
Voice

How the brand speaks.

Calm-capable, reader-first, matter-of-fact. The customer is the grammatical subject when possible; RTSN is supporting. Confident — but doesn't perform it. The brand disappears into the proposition.

The climate

Reference register: Stripe, Linear, Mercury, Pilot, Notion. Service-tier brands that talk like they have nothing to prove.

The tone — two modes

  • Default — customer-facing. Homepage, About, case studies, social, ads. Reader-first.
  • Operational — documentation. Contract, methodology, support. Same voice; slightly more functional.

Words we use

  • keep building
  • alongside your team
  • what you started the company for
  • focus on what matters
  • the work that motivates you
  • run the brand and operations
  • handle the consistent execution
  • founder-led teams

Words we avoid

  • AI-augmented
  • AI-powered
  • AI-native
  • transform
  • revolutionize
  • unleash
  • disrupt
  • synergy
  • leverage
  • utilize
  • stakeholder
  • cutting-edge
  • best-in-class
  • world-class
  • innovative
  • robust
  • seamless
  • scalable
  • empower
  • solution
  • platform

Syntax — eight rules

  1. Short declarative default. Average 12-18 words per sentence.
  2. No exclamation marks. Ever.
  3. Em dashes — sparingly. For longer prose only. Microcopy uses periods and commas.
  4. Oxford comma always.
  5. Sentence case for headlines. No Title Case.
  6. Contractions in customer-facing prose. Don't, can't, we'll. Not in contract/legal.
  7. Customer is the grammatical subject when possible. You keep building... not We keep founders building...
  8. One idea per sentence. Break before compounding.

Four failure modes

If a draft hits any of these, rewrite:

  1. Theatre. Three-line stacks. Dramatic line breaks. Stand in the storm register. Anything wanting to be read at a TED talk.
  2. Narcissism. Performing as good copy. Wordplay for its own sake. Customer feels written-at, not addressed.
  3. Cringe SaaS-template. AI-powered solutions for forward-thinking teams. Generic value-positioning. Buzzword density.
  4. Hype-Magician. Promising transformation without naming the mechanism. Unleash your potential. No substrate underneath.

Microcopy proof

The voice in actual use:

SurfaceVoice
404"This page doesn't exist. Use the navigation above, or head back to the homepage."
Loading"One moment."
Empty state"No engagements yet. When one begins, it shows up here."
Confirmation"Thanks, we'll be in touch within two business days."
Unsubscribe"Unsubscribed. Take care and keep building."
Payment failure"The payment didn't go through. Your work continues. We'll retry, and reach out if it doesn't clear within 24 hours."
Onboarding"We've got it from here. The system starts running tonight. We'll tell you what changed by Friday."
CTA"Start a conversation" or "See how we work"

The five-second check

Before shipping copy, ask:

  1. Is the customer the grammatical subject (or implied beneficiary)?
  2. Does the line perform good-copy craft? If yes, rewrite plainer.
  3. Any banned word? Replace.
  4. Could a reader on their phone at 11pm get it in 2 seconds?
  5. Does it sound like the locked H1 + subhead + manifesto?
06
Mark

The mark.

Three squares ascending. A geometric wordmark beside it. Together — the brand mark. Constructed against cap-height, calibrated for optical balance, documented per tier-1 convention.

The cascade

Three 12-unit squares, offset by 12 units diagonally, climbing from bottom-left to top-right on a 48-unit grid. Mathematical. No decoration. The mark for the brand.

The wordmark

RTSN

Set in DM Sans Bold (700). Uppercase, letter-spacing: 0.02em. The wordmark uses the body typeface at bold weight — geometric grotesque DNA matches the cascade's square geometry. Distinct from the editorial display serif (Newsreader) used for taglines elsewhere.

The lockup

RTSN

Variant C — Symbol-led. Cascade at 1.1× cap-height, centred on the cap-band (excess 0.05cap above cap-line and 0.05cap below baseline — symmetric). Wordmark to the right, ⅓cap ink-to-ink gap. This is the default lockup — the mark that goes on every surface unless a reason to switch.

Lockup family

Four calibrated variants share the construction principles. C is the default; A, B, D for context-specific use.

A · Tight
0.9cap symbol · ¼cap gap
Compact applications · favicon adjacency · footers
RTSN
B · Classic
1.0cap symbol · ⅓cap gap
General-purpose alternative · slightly quieter than C
RTSN
C · Symbol-led
1.1cap symbol · ⅓cap gap · centred on cap-band
Default lockup. Goes everywhere unless reason to switch.
RTSN
D · Glyph
1.0cap symbol · inter-letter gap
Tight integrated mark — cascade reads as fifth letter
RTSN

Construction

The cascade is centred on the cap-band — the same vertical band as the uppercase wordmark letters. Excess height (cascade is 1.1cap, cap-band is 1cap) distributes equally above the cap-line and below the baseline. Both gap brackets read 0.05U. Two views: construction-only on top, clean lockup below.

View 1 · Construction (no wordmark)
1U = CAP HEIGHT BASELINE CAP-LINE SYMBOL 1.1U · CENTRED ON CAP-BAND 0.05U 0.05U ↑ EQUAL ↓ SYMMETRIC EXCESS
View 2 · Clean lockup (production rendering)
RTSN

Sizing

The lockup uses the modern CSS cap unit (with em fallback) — symbol height scales as a multiple of the wordmark's cap-height at any font-size. Change one number; everything scales.

Favicon · 14px
RTSN
Nav · 24px
RTSN
Card · 40px
RTSN
Hero · 72px
RTSN

On backgrounds

The lockup inherits colour from its container via currentColor. Five backgrounds, one lockup spec.

RTSN
Canvas · Default
RTSN
Ink · Inverted
RTSN
Signal · Brand moment
RTSN
Verdant · The work
RTSN
Sapphire · Systems

Clear space

6u

Reserve a minimum clear-space of 6 viewBox-units (half a square-width) on every side of the symbol. No other graphic element, type, or chrome may enter this zone.

Don'ts

Don't stretch
Don't rotate
Don't recolour off-palette
Don't add shadow / glow / ornament

The mark works because it's mathematical. Stretching breaks the cascade. Rotation breaks the ascent reading. Off-palette colour breaks the system. Ornament breaks the discipline.

07
Palette

Three chrome, three accents.

Six tokens. Three chrome (Canvas, Ink, Muted) for typography and structure. Three accents (Signal, Verdant, Sapphire) for semantic colour — one warm hero balanced by two cool supporting voices. LCH-calibrated as a sibling family.

#F7F4EE
Canvas
Warm off-white. 60% of any layout.
CHROME · PRIMARY SURFACE
#0F0F0F
Ink
Deep off-black. Body text, primary type.
CHROME · BODY
#6B6864
Muted
Warm grey. Secondary text, meta, rules.
CHROME · SECONDARY
#C0533A
Signal
Warm terracotta. Primary brand accent — presence.
ACCENT · BRAND PRESENCE
#3D7A72
Verdant
Cool sage teal. The work, growth, outcomes.
ACCENT · THE WORK
#2E5F82
Sapphire
Cool petrol blue. Systems, methodology, precision.
ACCENT · SYSTEMS

Hue arc: 14° → 174° → 205°. Warm earth, cool botanical, deep water. A coherent material sequence — not a colour wheel. The brand defaults to chrome + Signal; Verdant and Sapphire join when content relevance calls.

Accent role assignment

Each accent has a content register. Colour does meaning-work — it tells the reader what kind of content they're in.

SIGNAL · #C0533A
Brand presence
The warm hero accent. Used everywhere the brand needs to be felt — primary CTAs, headline emphasis, eyebrows, section numbers, the wordmark in brand-moment contexts.
Primary CTA · Key links · Eyebrows · Hero accents · Wordmark
VERDANT · #3D7A72
The work, growth
Cool sage teal — the colour of build moments, outcomes, case studies. Where the brand talks about what the customer's team accomplishes.
Case study tags · Outcome metrics · Growth content · Founder profiles · Build moments
SAPPHIRE · #2E5F82
Systems, methodology
Cool petrol blue — the colour of system, structure, precision. Where the brand talks about how the work runs.
Methodology pages · Data visualisations · Audit trails · Technical depth · System diagrams

Palette in motion

Same composition, three accents. Each accent carries the same content into a different semantic register.

SIGNAL · Brand moment
Keep building.
The brand line. The hero CTA. The wordmark on a campaign cover. Where the brand needs to be felt as itself.
Start a conversation
VERDANT · The work
42% less admin time.
Case study outcomes. Growth content. Founder profiles. Where the brand talks about what the customer's team accomplishes.
See the case study
SAPPHIRE · The system
470 documented steps.
Methodology pages. Data visualisations. Audit trails. Where the brand talks about how the work runs.
Read the methodology

The 60/30/10 rule

Canvas does 60% of any layout. Ink + Muted do 30% (type + structure). Accents combined do no more than 10%. This is the chrome-calms / content-carries discipline in numbers — the brand should feel calm at a glance, and the colour should only earn the eye when meaning calls.

Accessibility (WCAG 2.1)

PairingRatioStatus
Ink on Canvas17.46:1AAA (any size)
Muted on Canvas5.05:1AA (normal text)
Signal on Canvas4.21:1AA-large (decorative / large only)
Verdant on Canvas4.53:1AA (any size)
Sapphire on Canvas6.22:1AA (any size)

Signal as body text fails AA — never used at < 18pt without bolding. Verdant and Sapphire pass at all sizes.

08
Type

Two typefaces. One mono.

DM Sans for body and the wordmark; Newsreader for taglines, headlines, manifesto; DM Mono for system data. Free Google Fonts, editorial-functional register — same neighbourhood as the Klim Söhne + Tiempos standard (The Guardian, Stripe Press, Anthropic) without the licensing.

Display Newsreader (Google Fonts) Variable opsz + wght — calm humanist editorial serif
The work that motivates you.
Body + wordmark DM Sans (Google Fonts) Variable opsz + wght — geometric grotesque sans; Bold 700 for wordmark per Variant C lockup
We work with the team you have, not around it. The point isn't to take your business off your hands — the point is to keep you in the part of the business you started this for.
Mono DM Mono (Google Fonts) Static 400 + 500 — DM Sans family-matched monospace
470 steps · 30 gates · 14 checkpoints · 24 agents

Type scale

Display
72px · serif 400
Brand and operations, handled.
H1
48px · sans 500
A Singapore AI studio for founder-led teams.
H2
36px · sans 500
A team that runs alongside yours.
H3
20px · sans 600
How the system works
Body large
20px · sans 400
Founders hire us to take the brand and operations work off them.
Body
17px · sans 400
We run brand and operations alongside your team. AI handles the consistent execution, so your team can focus on what matters.
Small
14px · sans 400
Singapore-based studio working with founder-led teams across software, consumer, and B2B.
Micro
12px · mono
RTSN Studios · 2026

Hierarchy in context

Worked example — section opener
A team that runs alongside yours.
Brand and operations, handled. You stay focused on the work that motivates you. We work with the team you have, not around it.
The work that matters.
How it works

A small Singapore studio. Founders hire us to take the brand and operations work off them. AI handles the consistent execution; humans handle the judgment.

Eyebrow (mono) → H1 (sans) → lede (sans, muted) → tagline (display serif, Signal-coloured) → H3 (sans, semibold) → body (sans). Six type roles in one composition.

09
Atmosphere

How surfaces breathe.

Layered radial mesh gradients — warm Signal ellipses joined by cool Verdant and Sapphire layers, blurred, slow. On identity surfaces. Static restraint on functional surfaces. Content carries colour; chrome stays neutral.

Atmosphere lives in the field.
PRINCIPLE · 01
Light throughout
No dark backgrounds anywhere in the brand. Cinematic depth comes from typography, motion, and warm colour washes — never from inverting the canvas.
PRINCIPLE · 02
Mesh, not solid
Atmospheric surfaces use multi-layer blurred radial gradients in low opacity — Signal warmth at 18-22%, Verdant and Sapphire as cool counterpoints at 8-14%. Never garish, never high-contrast.
PRINCIPLE · 03
Slow motion
Mesh layers drift over 30+ seconds. No fast animation, no abrupt transitions. Atmospheric movement is barely perceptible — the surface feels alive, not active.
PRINCIPLE · 04
Drop the atmosphere when not needed
Functional surfaces — methodology details, pricing, contact, technical documentation — drop the mesh entirely. Rely on type architecture and generous whitespace. Cinematic moments earn the atmosphere; working surfaces breathe in chrome alone.
10
In use

Three working surfaces.

Preview pages that demonstrate the system applied to real brand touchpoints. Each surface chooses a different register from the system.

Homepage

The chrome baseline.

Hero with atmospheric mesh + bento section. Calm, generous, type-led. Signal accents only.

Manifesto

The cinematic register.

Three acts on light. Layered mesh per act. Scroll-driven text reveals. Closing tagline at near-max scale.

Methodology

The functional treatment.

Metrics + bento. Stripe / Mercury discipline. Information-dense without performance.

11
Misuse

What NOT to do.

Nine categories of common misuse, paired side-by-side with the on-brand version. When in doubt whether something is on-brand, this is the reference. The red disc marks what to avoid; the green disc marks what to do instead.

1 — Palette

Don't
Off-palette colours. Bright orange, neon teal, purple, mustard — none from the locked six tokens. Breaks the system.
Do
Use only the locked six palette tokens: Canvas, Ink, Muted, Signal, Verdant, Sapphire. The system is the system.

2 — Typeface

Don't
Times New Roman, Arial, Comic Sans
Don't substitute system fonts or default-installed typefaces. Wrong proportions, wrong register, breaks the editorial-craft signal. Even close substitutes degrade the brand.
Do
DM Sans, Newsreader, DM Mono
Canonical (sole): DM Sans (body + UI + wordmark Bold 700) + Newsreader (display) + DM Mono (system) — all free Google Fonts. The licensed type is the brand's voice; substitutes are not. (The earlier production-aspirational pair — Klim Söhne + Tiempos — was dropped 2026-05-17 in favour of the free Google Fonts as sole canonical for licensing simplicity.)

3 — Lockup spacing

Don't
RTSN
Tightening the gap below ⅓ cap-height ink-to-ink. The cascade and wordmark collide visually; reads as crowded. The gap is calibrated; don't tighten it for "more impact."
Do
RTSN
⅓ cap-height ink-to-ink (0.165em CSS gap with R-sidebearing adjustment). Variant C as documented in Section 06. The construction is the construction.

4 — Wordmark casing

Don't
rtsn · Rtsn · RtSn
Lowercase, sentence-case, or camel-case wordmark. Breaks the system identity; reads as inconsistent. The wordmark is always uppercase.
Do
RTSN
Uppercase always. DM Sans Bold (700). Letter-spacing 0.02em. Consistency at every scale.

5 — Copy tone

Don't
"Unleash your team's potential with our AI-powered, world-class brand operations platform — transform your business today!"
Hype-Magician + Cringe SaaS-template + Theatre — three of the four voice failure modes in one sentence. Banned words: unleash, AI-powered, world-class, platform, transform. Exclamation marks banned. This is the brand's anti-voice.
Do
"We run brand and operations alongside your team. AI handles the consistent execution, so your team can focus on what matters."
Calm-capable, reader-first, customer-as-subject. Short declarative sentences. Names the mechanism (AI handles X), not the brand of AI. The voice spec in one paragraph.

6 — Photography

Don't
"Diverse team smiling at laptop in open-plan office, high-key lighting, generic background" (stock-image search result, first page)
Generic stock photography, posed models, "DEI-checkbox" group shots, sterile lighting. Reads as inauthentic; instantly recognisable as not-real. The brand explicitly sacrifices this category of imagery.
Do
"Real founder in real workspace, natural window light, candid-considered framing, off-camera eye-line" (per Photography brief)
Real founders + operators in real environments. Natural ambient light, warm-restrained grading, generous negative space. Per brand/v5-art-direction-photography.md. Photography earns its place by being real.

7 — Motion

Don't
Bouncy springs · 200ms major transitions · scroll-driven parallax cubic-bezier(0.68, -0.55, 0.265, 1.55)
Bouncy/elastic curves (theatrical register), aggressive durations (urgency register), attention-grabbing scroll effects (performance register). Motion that calls attention to itself is wrong-brand.
Do
Calm easing · 400-600ms standard moves · barely-perceptible atmospheric drift cubic-bezier(0.32, 0.72, 0, 1)
Calm-default curve, considered durations, atmospheric mesh drift over 30 seconds. Per brand/v5-art-direction-motion.md. The surface should feel alive on second look, not active on first.

8 — Icons

Don't
Gradients, multi-stroke decoration, anthropomorphised smiling face, off-palette colours, varying stroke weights. Every anti-pattern from the iconography brief in one icon.
Do
Geometric primitives, 2px stroke (or solid fill), currentColor, palette-only, no decoration. Per brand/v5-art-direction-iconography.md. Same geometric DNA as the cascade.

9 — Illustration

Don't
Decorative blob illustration, organic curves, off-palette colours, anthropomorphic suggestion. The "Corporate Memphis" SaaS-illustration aesthetic. Wrong vocabulary entirely.
Do
Geometric primitives, palette-only, one accent (Sapphire here for the system-register illustration). Reads as drawn from the cascade vocabulary. Per brand/v5-art-direction-illustration.md. Structural, not decorative.

The discipline in one sentence

If a piece of work would have been more at home on a generic SaaS launch page than in The New Yorker, in a Pentagram case study, or on Aesop's website — it's wrong-brand. Rewrite, redesign, or reject.

12
Mascot

Mini Mason. Cascadia Plus.

A two-character system. One mascot for marketing, one for product. Both built from the cascade. Both pixel-native. Ten states for the character, one face for the icon-form.

The principle

The mascot system has two halves. Mini Mason (24×24 pixels) is the marketing character — small chibi figure with the cascade as a hat, ten emotional/operational states, used in campaigns, social posts, illustration, and any moment where the brand needs a someone. Cascadia Plus (16×16 pixels) is the icon-form mascot — the cascade with two stacked dot eyes, used in favicons, signatures, product UI presence, and any place where the brand needs a marker too small for a full character.

Both are pixel-art native. Both use only the locked six-token palette (plus computed tonal highlights/shadows). Both follow strict animation discipline — pixel-correct frame-step transitions, never smooth interpolation. Neither has a backstory or a public name. They are presence, not personality on a plate.

State library — Mini Mason

Ten states. Each has a colour, a trigger context (where it appears), and a forbidden context (where it must never appear). Static renders shown — animations live in assets/mascot/mascot.css.

01 · At rest
02 · Breathing
03 · Working
04 · Building
05 · Thinking
06 · Coffee Break
07 · Compounding
08 · Asleep
09 · Together (32×24, special)
10 · Greeting

State-to-context mapping

At rest / Breathing · default · web hero · app login · static surfaces
Ink
Working · case studies · delivery pages · outcome reports
Verdant
Building · launches · shipping moments · active campaigns
Signal
Thinking · methodology · research · decision logs
Sapphire
Coffee Break · team posts · casual updates · year-end
Ink + Verdant mug
Compounding · anniversary · year-in-review · brand-moments
Ink + mesh halo
Asleep · out-of-office · paused · holiday
Muted
Together · partnerships · team posts · joint announcements
Ink ×2
Greeting · welcome modals · onboarding · greetings
Ink + wave

Tier 3 ships 13 sprite-atlas animations for Mini Mason — the game-ready motion vocabulary that turns the marketing character into an interactive presence for the website, web component, and any game-engine surface. Atlas at assets/mascot/sprite/mason-motion.png (1001×26, 40 frames, 26 tags). Atlas JSON sidecar at mason-motion.json in Aseprite format with RTSN-enriched pivot + anchor extensions for Phaser 3 createFromAseprite().

AnimationFramesCadenceDirectionTrigger / use
walk-r / walk-l3 (0-2)8fps · 500msping-pongContinuous walking loop
jump-r / jump-l4 (3-6)8fps · 500msforward one-shotTriggered by jump-event
land-r / land-l2 (7-8)varied · 250msforward one-shotFollows jump on ground-contact
run-r / run-l3 (9-11)10fps · 400msping-pongFaster locomotion; wider stride than walk
celebrate-r / celebrate-l4 (12-15)6fps · 1002msping-pongJoy moment; arms raise + bounce
look-around-r / look-around-l3 (16-18)4fps · 1000msping-pongEyes shift L → C → R; head + body unchanged
nod-yes-r / nod-yes-l3 (19-21)4fps · 1000msping-pongHead bobs vertically; affirmation
shake-no-r / shake-no-l3 (22-24)4fps · 1000msping-pongHead shifts horizontally; negation
curious-tilt-r / curious-tilt-l2 (25-26)5fps · 400msping-pongHead tilts right (thoughtful)
eureka-r / eureka-l2 (27-28)300+700ms asymmetricping-pongSIGNAL sparkle at top-left + eyes widen vertically; the "AHA!" moment held 2.3× longer than the build for emphasis
dance-r / dance-l4 (29-32)5fps · 800msforward loopRestrained Sage-register bounce + arm swing
surprise-r / surprise-l5 (33-37) asymmetric400+150+200ms · 750msone-shot (R FORWARD, L REVERSE)Peak shock → mid-rebound → canonical recovery; 2px body-shift recoil + 1×3 alert eyes + canonical mouth (Sage restraint preserves the wise-advisor register)
point-r / point-l2 (38-39) asymmetric · staticheld while pointingstaticArm extended horizontally; directional indicator

Mason-symmetry pattern (11 of 13 animations). Mason has no facing-direction features — no nose, symmetric eyes, no held props in motion poses. Horizontal mirroring across the body centerline is a visual no-op: mirrored pixel positions are identical to originals (only the semantic labels "left arm" vs "right arm" swap). The atlas exploits this by giving R/L tag pairs the same frames; explicit -l tags exist so game engines never reach for sprite-flip (which would invert the hat). The hat-preservation discipline is enforced by providing the L tag, not by changing pixels. ~27% smaller atlas vs the naive author-each-direction estimate.

Shared-recovery trick (surprise). Surprise-r and surprise-l share the canonical recovery frame via REVERSE-direction tag. Using Aseprite's 1-indexed convention (F34, F35, F36, F37, F38 — corresponding to the table's 0-indexed range 33-37 above): F34 wide-r → F35 mid-r → F36 canonical (surprise-r tag, FORWARD); F38 wide-l → F37 mid-l → F36 canonical (surprise-l tag, REVERSE). Both tags overlap on F36 but never play each other's wide frame. Saves 1 frame per pair. (Note: the table above uses JSON 0-indexed ranges 33-37; this paragraph uses Aseprite 1-indexed labels F34-F38 — same frames, different counting convention by source format.)

Authoring pipeline. Atlases authored via Aseprite (secure-from-source compile, WebSocket disabled) + Lua scripts + PowerShell wrapper at assets/mascot/aseprite/scripts/. Six hard-won lessons-learned rules documented in scripts/README.md (Aseprite headless quirks, tag auto-extension defensive snapshot+restore pattern, PowerShell ASCII discipline, etc.). For future characters or expansion animations, fork the create-mason-*.lua scripts as templates and follow the existing 6-batch authoring cadence (PRs #271-285 are the reference implementation).

Sixteen-pixel mascot for favicon, signature, and product-UI presence. The cascade with two 1×2 stacked dot eyes on the top block (Curious face). No mouth. Tier 1/2 CSS-driven blink: open eyes 5060ms, closed eyes 220ms, matching the v6 CSS asymmetric timing. (The Tier 3 atlas-driven blink uses a tighter 1000/150ms ping-pong cycle — see the Tier 3 vocabulary table below; use Tier 3 timings when consuming the cascadia-motion.png sprite atlas, Tier 1/2 timings when using the SVG + CSS pattern.)

96px · 48px · 24px — scales clean

Tier 3 ships a 4-expression vocabulary + blink + cascade-pulse loading state + bare-body for Cascadia — turning the icon-form mascot into an interactive state-indicator for the website, web component, and animated favicon. Atlas at assets/mascot/sprite/cascadia-motion.png (171×18, 10 frames, 7 tags). All expressions use vertical eye-position to convey state (raised → canonical → taller → lowered); the cascade body never changes shape so the brand mark stays intact.

default · 1×2 eyes
happy · 1×1 raised
surprise · 1×3 + spark
busy · 1×1 lowered
cascade-pulse · mid frame
TagFramesDurationTrigger / use
default1 staticAt-rest state; the canonical Cascadia presence
blink2 (default + eyeless) ping-pong1000ms open + 150ms closedSubtle liveness signal; runs on idle
happy1 staticPositive interaction acknowledgement; successful action
surprise1 staticUnexpected event; reveal moment. Includes 1px SIGNAL spark in empty top-left space
busy1 staticFocused/working state; eyes looking-down concentration
cascade-pulse4 frames forward loop150ms/frame · 600ms cycleLoading state. SIGNAL color highlights each cascade block in sequence (bottom → middle → top → reset). Eyes remain CANVAS-carved during pulse — Cascadia stays "alive" during the loading animation. The cascade brand mark visually "powers up" as the loading wave sweeps
bare-body1 staticCascade blocks only, no eyes. For SVG-overlay pipelines that composite eyes as a separate layer (preserves the Tier 1 + Tier 2 multi-layer pattern)

Interactive-state language for the web component. The web component (deferred — ships after Claude Design + website build kicks off) consumes this atlas to render Cascadia state-by-state in the page-corner widget + favicon + tab-title indicator:

  • Page idledefault (with occasional blink for liveness)
  • Page loading / data fetchingcascade-pulse looping until ready
  • Operation in progress (long task) → busy static
  • Operation complete / success → brief happy hold (300-500ms), then return to default
  • Unexpected event / notification arrival → brief surprise hold (400ms), then return to default

Pixel form spec

  • Mini Mason canvas: 24×24 pixels native. Hat occupies upper-right area (3 blocks ascending up-right from (8,5) to (12,1) at 2×2 each). Head 8×6 below the hat. Body 8×5 below the head. Feet 2×3 each.
  • Cascadia Plus canvas: 16×16 pixels native. Cascade blocks 4×4 each, ascending from (2,10) bottom-left to (10,2) top-right.
  • Both share rendering attributes: shape-rendering="crispEdges" and CSS image-rendering: pixelated for pixel-perfect output at any display scale.
  • Together state exception: 32×24 viewBox (non-uniform), excluded from the canonical Mason sprite sheet. Preserved as standalone composition for partnership and team contexts.

Palette mapping (per-state colour + computed tonal variants)

All seven tonal hex values verified by linear sRGB blend formula (audit-confirmed):

Signal base / +15% Canvas highlight / +20% Ink shadow
#C0533A · #C86B55 · #9D4531
Verdant base / +15% Canvas highlight / +20% Ink shadow
#3D7A72 · #598C85 · #34655E
Sapphire base / +15% Canvas highlight / +20% Ink shadow
#2E5F82 · #4C7592 · #284F6B
Ink base / +15% Canvas highlight / shadow N/A (Ink is darkest in palette)
#0F0F0F · #323130 · —

Pixel-art motion is frame-stepped, never smoothly interpolated. Tier 1 SVG+CSS animations use steps(N) timing functions (rule set at assets/mascot/mascot.css). Tier 3 motion atlases are driven by sprite frames advanced at fixed per-frame durations (no easing, no interpolation between frames). Smooth easing is reserved for non-pixel motion only (gradient opacity, mesh-halo backgrounds).

FPS allowances by animation category (revised in Tier 3 spec; supersedes the blanket 2fps rule):

Still-state animations (breathing, smoke, mesh-halo, eye blink, thought particles)2 fps maxCalm-capable Sage register; faster reads as anxious
Joy moments (look-around, surprise, dance, eureka, curious-tilt, nod-yes, shake-no)4-6 fpsDiscrete joy expression; composed but visible
Celebrate (motion-cycle joy)6 fpsBridge between joy and locomotion; restrained energy
Locomotion (walk, run, jump, land)8-10 fpsStandard pixel-art convention; needed to read as movement
Loading state (cascade-pulse on Cascadia)~6.7 fps (150ms/frame)Cascade highlight sweep at activity-state cadence

No animation exceeds 10 fps in any category. Smooth 24fps interpolation remains explicitly banned. The bounce/elastic/jump-cut prohibition holds across all categories.

Cascade-hat directional rule. The cascade ascends up-right by definition. Mini Mason's hat preserves this direction. Engine-flipping for left-facing motion reverses the cascade to up-left — which breaks the brand mark. The rule, refined by the Tier 3 bilateral-symmetry discovery:

  • Symmetric animations (walk, run, jump, land, celebrate, look-around, nod-yes, shake-no, curious-tilt, eureka, dance) — Mason has no facing-direction features (no nose, symmetric eyes, no held props), so left-facing variants are mathematically identical to right-facing after engine-flip. Tier 3 atlases provide explicit -l tags pointing at the same frames so game engines never reach for sprite-flip (which would invert the hat to up-left). Use the tag, not the flip.
  • Asymmetric animations (surprise, point) — direction is baked into geometry (body step-back direction, pointing arm). Separate L/R frames authored; no flip discipline needed because each direction has its own frames.
  • Brand-identity surfaces (logo lockup, hero illustration, signature) — right-facing only.
  • Cascadia Plus — never flips. Anywhere. Ever. Flipping is a logo violation.

Do's

  • Use Mini Mason for marketing, campaigns, social, illustration
  • Use Cascadia Plus for favicon, signature, product UI
  • Match the state to the surface — Verdant Working on delivery pages, Signal Building on launches, Sapphire Thinking on methodology
  • Right-facing Mason for all brand-identity surfaces; engine-flip for motion only
  • Stay within the six locked palette tokens — accents only via the computed tonal variants above
  • Use pixel-art rendering attributes (shape-rendering="crispEdges", image-rendering: pixelated) on every container

Don'ts

  • Sales, pricing, contract, invoice surfaces — the mascot is not a salesperson
  • Crisis, apology, support error states — the mascot is not a deflection device
  • Legal or compliance contexts — the mascot trivialises serious content
  • Combined with the logo lockup on the same surface — they are the same mark in two modes
  • Distorted, rotated, or skewed
  • Engine-flip Cascadia Plus — the cascade has fixed up-right direction; flipping is a logo violation
  • Hurt, attack, defeat, or death animations — outside the brand vocabulary. Mason is observer/traveller, not fighter. For damage/loss feedback in game contexts: dim the cascade, fade to Muted, or switch to Asleep
  • Smooth easing on pixel motion — use steps(N) timing only; smooth interpolation produces sub-pixel anti-aliasing that violates pixel-art discipline
  • Animation with bounce/elastic/jump-cut motion or smooth 24fps interpolation — frame-stepped only, no easing between frames. (See Animation discipline above for tiered FPS allowances per category — still-state 2fps max, joy 4-6fps, locomotion 8-10fps.)

All mascot files at assets/mascot/. Folder structure:

  • svg/ — 12 source SVGs (10 Mason states + Cascadia Plus default + Cascadia blink frame)
  • png/512/, png/192/, png/180/ — pixel-perfect PNG exports at canonical sizes
  • sprite/ — atlas inventory:
    • Tier 3 motion atlases (canonical for game-engine + web-component consumption):
      • mason-motion.png + mason-motion.json — 1001×26, 40 frames, 26 tags (13 animations × R/L variants per Mason-symmetry pattern)
      • cascadia-motion.png + cascadia-motion.json — 171×18, 10 frames, 7 tags (4 expressions + blink + cascade-pulse + bare-body)
    • Tier 2 layer-composed atlases (reference for Tier 1 SVG-overlay pipelines):
      • mason.png (651×76, 54 frames in 3 rows — body + eyes + baked)
      • cascadia.png (35×52, 5 frames in 3 rows)
      • mason-together.png (32×24 standalone, exempt from atlas)
    All Aseprite-compatible JSON sidecars carry frame tags + anchor pivot + (Tier 2 only) source-SVG hashes for Phaser 3 / PixiJS.
  • aseprite/ — Tier 3 authoring pipeline: cascadia-motion.aseprite + mason-motion.aseprite source files plus scripts/ directory (Lua authoring scripts, lib-rtsn-brand.lua palette, build-atlas.ps1 wrapper, repair-tag-ranges helper, six lessons-learned rules in README.md). Aseprite binary at D:\Tools\aseprite-source\build\bin\aseprite.exe (compiled secure-from-source with WebSocket disabled).
  • favicon/ — 6-file favicon kit (SVG + ICO + Apple Touch + Android 192/512 + manifest)
  • mascot.css — 13 Tier 1 animation rules (SVG + CSS keyframes for the original 10 Mason states + Cascadia blink). Tier 3 motion is driven by sprite atlases, not CSS.
  • mascot-sprite.svg — 11 <symbol> elements for CDN-served sprite pattern (Tier 1 still-states only; Tier 3 motion frames are PNG, not SVG)
  • README.md — usage guide for inline / sprite / Phaser / favicon integration

Per-state frame counts. Tier 2 atlas (eyes always open in state frames; eye overlay handles blink): at-rest 1, breathing 4, working 1, building 2, thinking 4, coffee-break 6, compounding 4, asleep 2, greeting 2. State animation cycles range 1.2-4s; eye overlay blink is asymmetric 5060/220ms. Tier 3 motion atlas (mason-motion): see the Tier 3 motion vocabulary section above for the 13-animation breakdown.

Visual viewers. Tier 2: preview/sprite-sheet-viewer.html — 3-layer atlas overview with body+eyes-overlay compositing. Tier 3: per-character Downloads previews at C:/Users/kenny/Downloads/rtsn-mascot-motion/preview.html (Mason, 13 animations) and C:/Users/kenny/Downloads/rtsn-cascadia-motion/preview.html (Cascadia, 4 expressions + cascade-pulse). Build pipeline: Tier 2 via scripts/build-mascot-sprite-sheets.js (idempotent, regenerates Tier 2 outputs from svg/); Tier 3 via assets/mascot/aseprite/scripts/build-atlas.ps1 (Aseprite headless + Lua, with palette enforcement + binary-alpha verification). Verification: scripts/verify-sprite-sheets.js (31/31 checks passing — confirms dimensions, frame bounds, anchor pivots, source-SVG hash freshness across the consolidated sprite sheets).

Tier 3 SHIPPED (2026-05-17). The Tier 3 game-ready expansion documented at research/mascot-game-ready-framework.md shipped over Phase 3.0-3.4: Mason motion atlas (40 frames / 26 tags / 13 animations) at PRs #271-285, Cascadia motion atlas (10 frames / 7 tags / 4 expressions + cascade-pulse) at PR #286. Full frame-by-frame authoring spec at research/mascot-tier3-frame-spec.md. Deliverable spec at research/mascot-deliverable-framework.md.

The mascot system is not a side asset — Mason and Cascadia carry meaningful weight in every customer-facing artefact the studio ships. The patterns below codify where each character appears, what state per surface, and what's off-limits. Apply them when producing decks, brand-book pages, content artefacts, proposals, product UI, and signatures — anywhere the brand speaks.

Decks + presentations · title slide
Mini Mason · pose matches deck topic (Verdant Working for delivery decks · Signal Building for pitch decks · Sapphire Thinking for methodology decks)
Decks · section dividers
Mini Mason · Coffee Break or Compounding for transitions; Asleep for "end of section" pause
Decks · master slide header/footer
Cascadia Plus · default state · 16px in footer corner · persistent presence
Brand-book pages (like this one)
Mini Mason embedded inline at section openers · Cascadia Plus default in nav · meta-demonstration of the system
Content artefacts · LinkedIn post, blog header
Mini Mason · state matches content (Compounding for year-in-review; Building for launches; Thinking for methodology essays; Greeting for welcome posts)
Content artefacts · newsletter, byline
Cascadia Plus · default · 16-24px next to author name
Proposals + SOWs (sales-track docs)
Cascadia Plus only · default in document header · NO Mini Mason per Don'ts (mascot is not a salesperson)
Product UI · app surfaces, dashboards
Cascadia Plus in nav · state-driven (default → busy → happy → cascade-pulse) · Mini Mason as completion celebration on milestone moments
Email signatures
Cascadia Plus favicon · 16px next to DM Sans wordmark
Documentation · methodology pages, reference materials
Mini Mason in Thinking pose at section openers · Cascadia Plus in nav · both subtle, both purposeful
Social media · Instagram post, story
Mini Mason centred in Canvas · state per post · 48-96px display · pixel-rendering attributes mandatory
Internal templates · agent personas, kickoff docs
Cascadia Plus only · default · no Mini Mason (internal use; not customer-facing)

Discipline: mascots appear where the brand needs warmth or presence — never where the brand needs distance (sales, legal, crisis). The Do's + Don'ts above are the floor; the table above is the holistic playbook. When in doubt, ask: is this surface a moment for the brand to be a someone, or a moment for the brand to be a service? Mascot if the former, type-only if the latter.

Sizing across surfaces: Mini Mason renders at 48-96px for editorial moments (deck title slides, blog headers, social posts), 24-48px for inline body embeds, 16-24px for footer/sidebar presence. Cascadia Plus renders at 16px for favicon-class use (email signatures, document corners), 24-48px for nav/header presence, 96px+ for hero moments. Below 16px, both characters lose pixel clarity — use the wordmark or lockup instead.

The website is the studio's primary brand artefact, and the mascot system is its most distinctive interactive layer. Apply the patterns below across every page of the website + the design-system documentation page (/the-system). The interactive web component spec below documents the underlying mechanism.

Cascadia Plus — persistent nav presence

Cascadia lives in the primary nav corner across every page. State is driven by site events:

Page idle (no activity)
default · with occasional blink every 5-8 seconds for liveness
Navigation transition (link clicked, page loading)
cascade-pulse · 4-frame 600ms loop until new page paints
Async data fetch (form submission, search query, atlas load)
busy · static · held for duration of fetch
Operation success (form submitted, action completed)
Brief happy · 300-500ms hold · returns to default
Unexpected event (modal opens, notification arrives, surprise reveal)
Brief surprise · ~400ms hold · returns to default
User hovers Cascadia directly
Brief happy on enter · returns to default on leave
User clicks Cascadia directly
Brief surprise on click · returns to default after 400ms
Page scroll past 50% (reader engaged)
No state change · Cascadia is presence, not performance
User idle > 60 seconds
No state change · brand voice does not call attention back

Mini Mason — editorial moments

Mason appears at meaningful section breaks, in margin commentary, in case studies (state-coloured to match), and in the methodology flow as the user's reading companion. Each appearance is purposeful — not gratuitous. Page-by-page expectations:

Home hero
Mason At Rest · breathing animation · 96px right of headline
Manifesto cinematic
Mason Compounding · centred · 192px · with atmospheric mesh halo
Methodology gates flowchart
Mason Thinking · positioned at the current gate node · animated walk between nodes on user navigation
Case study hero
Mason in case-state-matched pose · Verdant Working for delivery cases · Signal Building for launches · Sapphire Thinking for methodology cases
Long-form article section breaks
Mini Mason 24-48px inline · Coffee Break for casual pauses · Thinking for analysis transitions · Greeting for welcome modals
Form submission success
Mason Celebrate Tier 3 · 4-frame ping-pong · 1002ms cycle · plays once then returns to At Rest
Empty states (no engagements yet, no notifications)
Mason Asleep · Muted · with one-line factual copy ("No engagements yet.")
404 / unfound page
Mason Asleep + factual recovery copy · brand voice does not joke at error states

Where mascots DON'T appear on the website

  • Pricing page (if/when shipped) — type-only, no mascots, brand voice is straightforward + commercial
  • Contract execution surfaces (engagement letter signing, payment confirmation) — type-only
  • Legal pages (privacy, terms, cookies) — type-only
  • Crisis/incident pages — type-only, factual, brand voice does not deflect with character moments
  • The wordmark or logo lockup is on the same surface — never combine the lockup + Mini Mason (they are the same mark in two modes; combining is a doubling-down that reads as overcommitment)

The website consumes both atlases (mason-motion.png + cascadia-motion.png) via a small interactive web component. The component handles atlas loading, frame advancement, state transitions, and pointer-event reactions. Three implementation options exist; pick based on the surface's needs.

Architecture options

ApproachWhen to useCost
Vanilla canvas (~150 LOC)Default. Marketing website. Single Cascadia in nav + occasional Mini Mason embeds. No collision detection or physics needed.Zero dependencies; fastest first paint; minimum bundle weight.
Phaser 3 (createFromAseprite())If the site needs game-engine features (interactive scenes, gamified onboarding, in-product mascot interactions). Loads Phaser 3 (~600 KB).Higher bundle weight; more capabilities; battle-tested atlas consumption.
Pure SVG + CSS keyframesFor Cascadia-only contexts where atlas is overkill (favicon animation, single-state badges, brand-book inline demos like the one below).Zero JavaScript; works in CSS-disabled contexts via static fallback; limited to predetermined state transitions.

Atlas loading + state machine

Both atlases ship as PNG + Aseprite-format JSON sidecar. The sidecar carries per-frame durations + per-tag direction (FORWARD / REVERSE / PING_PONG) + RTSN-enriched pivot (per-frame anchor) + anchor (sprite-level bottom-centre alignment). Load pattern:

// Load atlas once at page init
const atlas = await fetch('/assets/mascot/sprite/cascadia-motion.json').then(r => r.json());
const img = new Image();
img.src = '/assets/mascot/sprite/cascadia-motion.png';
await img.decode();

// State machine: event → tag transition
const cascadia = new MascotRenderer({ atlas, img, anchor: atlas.meta.anchor });
cascadia.mount(document.querySelector('#nav-cascadia'));
cascadia.play('default');

// Wire site events to state changes
window.addEventListener('navigation:start',    () => cascadia.play('cascade-pulse'));
window.addEventListener('navigation:complete', () => cascadia.play('default'));
window.addEventListener('form:submitting',     () => cascadia.play('busy'));
window.addEventListener('form:success',        () => cascadia.playOnce('happy', 400).then(() => cascadia.play('default')));
window.addEventListener('form:error',          () => cascadia.playOnce('surprise', 400).then(() => cascadia.play('default')));

// Direct pointer reactions
nav.addEventListener('mouseenter', () => cascadia.playOnce('happy', 300));
nav.addEventListener('click',      () => cascadia.playOnce('surprise', 400));

Frame advancement loop

Vanilla canvas implementation: a single requestAnimationFrame loop reads the current tag's frame durations from the JSON sidecar, advances the active frame index when accumulated time exceeds the current frame's duration, and draws the source-rect from the atlas PNG to the canvas. Honours tag direction:

  • FORWARD — advance frame index by 1; on reaching the last frame, loop to first (or stop, for one-shot tags)
  • REVERSE — advance frame index by −1 from last to first
  • PING_PONG — advance forward to last, then reverse to first, then forward — without replaying the endpoints

The eureka tag is the only animation with asymmetric per-frame durations (300ms build + 700ms held AHA per the source JSON). All other tags use uniform durations within a tag. The renderer must read frame.duration per-frame rather than assuming a fixed FPS per tag.

Pointer event reactions

  • Hover Cascadia → enter handler triggers happy; leave handler returns to default
  • Click Cascadia → triggers surprise for 400ms one-shot, then default
  • Scroll triggers for embedded Mini Mason: when Mason enters viewport, play the entry animation appropriate to context (Greeting for welcome moments; Building for launches; Thinking for analysis sections). When Mason exits viewport, stop animation to conserve CPU.
  • Form-element focus in vicinity of Cascadia → Cascadia goes to busy while form has focus; returns to default on blur
  • Modal open / close → Cascadia in nav goes to busy while modal is open (signals attention focused elsewhere)

prefers-reduced-motion + performance

  • Respect @media (prefers-reduced-motion: reduce) globally. When set: animations disabled; mascots render as static default state only. Hover affordances remain (cursor change) but no state transitions trigger.
  • Use transform: translateZ(0) on the canvas element for GPU acceleration. No top / left animation; transform: translate() only.
  • Stop the requestAnimationFrame loop when the mascot is offscreen (use IntersectionObserver). Resume on re-entry.
  • Lazy-load the Mason atlas (60% of bundle weight) — only the Cascadia atlas needs to be on the critical path for first paint. Mason atlas loads after page-idle event.
  • Atlas PNG is <2 KB per character; both atlases total ~3 KB. Render canvas at the target display size with image-rendering: pixelated CSS; do not upscale via canvas drawImage (loses crispness).

Below is the cascade-pulse loading animation running live in this brand book — implemented via pure SVG + CSS keyframes (no JS dependency) as a proof-of-pattern for the SVG + CSS option above. The cascade blocks cycle SIGNAL through bottom → middle → top → reset at 150ms per phase (600ms total cycle). The eyes carved from the top block remain visible throughout the pulse, preserving Cascadia's "alive" presence during the loading state.

cascade-pulse · live · 600ms loop
interactive · hover for happy · click for surprise

Pattern proven:

  • SVG + CSS keyframes drive the cascade-pulse loop with zero JavaScript dependency
  • Tiny vanilla JS handles hover/click state transitions (~20 lines below)
  • Both demos honour prefers-reduced-motion — animations replaced with static default state when reduced motion is requested
  • Same atlas geometry (cascade blocks at canonical positions; eye pixels at (11,3) (13,3) 1×2) — production atlas would substitute these SVG primitives with sprite-frame draws from cascadia-motion.png

Production-grade implementation (vanilla canvas atlas renderer, ~150 LOC):

class MascotRenderer {
  constructor({ atlas, img, anchor }) {
    this.atlas = atlas;           // parsed Aseprite JSON
    this.img = img;               // loaded HTMLImageElement
    this.anchor = anchor;         // { x: 0.5, y: 13/16 } for Cascadia
    this.canvas = document.createElement('canvas');
    this.ctx = this.canvas.getContext('2d');
    this.ctx.imageSmoothingEnabled = false;  // pixel-perfect
    this.currentTag = null;
    this.frameIdx = 0;
    this.direction = 1;           // 1 for FORWARD, -1 for REVERSE/PING_PONG-back
    this.elapsed = 0;
    this.lastTime = 0;
    this.rafId = null;
  }
  mount(host) {
    host.appendChild(this.canvas);
    this.canvas.style.cssText = 'image-rendering:pixelated; transform:translateZ(0);';
    this._observe(host);  // IntersectionObserver to pause when offscreen
  }
  play(tagName) {
    const tag = this.atlas.meta.frameTags.find(t => t.name === tagName);
    if (!tag) throw new Error(`Unknown tag: ${tagName}`);
    this.currentTag = tag;
    this.frameIdx = tag.direction === 'reverse' ? tag.to : tag.from;
    this.direction = tag.direction === 'reverse' ? -1 : 1;
    this.elapsed = 0;
    if (!this.rafId) this._startLoop();
  }
  playOnce(tagName, ms) {
    return new Promise(resolve => {
      this.play(tagName);
      setTimeout(() => resolve(), ms);
    });
  }
  _startLoop() {
    this.lastTime = performance.now();
    const tick = (now) => {
      const delta = now - this.lastTime;
      this.lastTime = now;
      this.elapsed += delta;
      const frame = this.atlas.frames[`frame-${this.frameIdx}`];
      if (this.elapsed >= frame.duration) {
        this.elapsed = 0;
        this._advanceFrame();
      }
      this._draw();
      this.rafId = requestAnimationFrame(tick);
    };
    this.rafId = requestAnimationFrame(tick);
  }
  _advanceFrame() {
    const { from, to, direction } = this.currentTag;
    this.frameIdx += this.direction;
    if (direction === 'pingpong') {
      if (this.frameIdx > to) { this.frameIdx = to - 1; this.direction = -1; }
      else if (this.frameIdx < from) { this.frameIdx = from + 1; this.direction = 1; }
    } else if (this.frameIdx > to) { this.frameIdx = from; }
    else if (this.frameIdx < from) { this.frameIdx = to; }
  }
  _draw() {
    const f = this.atlas.frames[`frame-${this.frameIdx}`].frame;
    this.canvas.width = f.w;
    this.canvas.height = f.h;
    this.ctx.clearRect(0, 0, f.w, f.h);
    this.ctx.drawImage(this.img, f.x, f.y, f.w, f.h, 0, 0, f.w, f.h);
  }
  _observe(host) {
    const io = new IntersectionObserver(entries => {
      entries.forEach(e => {
        if (!e.isIntersecting && this.rafId) { cancelAnimationFrame(this.rafId); this.rafId = null; }
        else if (e.isIntersecting && !this.rafId) { this._startLoop(); }
      });
    });
    io.observe(host);
  }
}

Above pattern works for both Cascadia (16×16) and Mason (24×24) — the renderer is dimension-agnostic. Drop into any page surface; wire to events. For framework integrations, the renderer can be wrapped as a React hook (useMascot(tagName, options)), Vue composable (useMascot()), Svelte action, or Web Component (<rtsn-mascot character="cascadia" state="default">) — pick the wrapper that matches the host stack.

The two characters are coordinated, not isolated. Cascadia handles persistent state in the nav corner; Mini Mason handles editorial moments inline with content. When both are present on the same page, they obey relational rules:

  • Cascadia leads on system state. Page loading, async fetches, error/success feedback — all flow through Cascadia in the nav. Mini Mason never duplicates these signals.
  • Mason leads on editorial moments. Section transitions, manifesto cinematic, case study heroes, methodology guidance — these are Mason's territory. Cascadia stays at default during editorial moments unless a site-state event interrupts.
  • Coordinated celebration. On form submission success, Cascadia briefly goes happy (nav corner) while Mason plays celebrate at the form completion location. Two-place celebration reads as "the system noticed your action AND celebrates with you." 300-500ms hold then both return to defaults.
  • Coordinated recovery. On form submission error, Cascadia goes busy (focused on solving) and Mason stays at at-rest (does not react theatrically). Recovery copy is factual; mascots support the calm-capable register.
  • Frequency restraint. Maximum 1 Cascadia in nav + 1-2 Mini Masons visible per scroll viewport. Above this, the page reads as mascot-heavy / playful, which violates the Sage register.

For the design-system documentation page (/the-system), all 13 Mason animations and all 7 Cascadia states should be demonstrated in isolation with their trigger contexts annotated — this serves both as developer reference and as a brand artefact showing the system's craft.

13
Provenance

The work behind the work.

When everything locked, and what informed it.

Locked dates

Strategic substrate (H1, subhead, tagline, vision, mission, manifesto, voice spec)
2026-05-16
Cascade mark (R1 diagonal cascade — 3 squares at 6/18/30 on 48×48)
2026-05-16
Palette (Canvas, Ink, Muted + Signal, Verdant, Sapphire)
2026-05-17
Typography (DM Sans body + Newsreader display + DM Mono — Google Fonts; Klim Söhne + Tiempos aspiration dropped 2026-05-17 in favour of free preview pair as the practical canonical)
2026-05-17
Logo lockup (Variant C Symbol-led, 1.1cap centred on cap-band, DM Sans Bold wordmark)
2026-05-17
Mascot Tier 3 motion atlases (mason-motion 40 frames / 26 tags / 13 animations; cascadia-motion 10 frames / 7 tags / 4 expressions + cascade-pulse)
2026-05-17

v4 → v5 substrate migration

The v5 brand substrate locked in this book is the canonical reference for all new work. The rtsnstudios.com website has been rebuilt on the v5 brand and cut over — the live site renders v5. The internal token pipeline (the codegen palette source, the design engine, and the brand validators) is being migrated from v4 to v5; until that migration lands, some engine-rendered templates may still produce v4-styled output. New customer-facing artefacts should be reviewed against this brand book (v5).

References

Voice calibrated against twelve contemporary B2B brand homepages: Stripe, Mercury, Linear, Pilot, Notion, Vanta, Loom, Webflow, Vercel, Anthropic, Figma, Ramp. Visual orbit informed by Stripe, Mercury, Immersive Garden, David Whyte. Palette neighbourhood: Aesop, COMO, Anthropic. Logo construction methodology: Pentagram (Mastercard 2016, Slack 2019), Wolff Olins, Collins, DesignStudio (Airbnb Bélo). Typography: free Google Fonts (DM Sans + Newsreader + DM Mono) carrying the same editorial-functional register as the Klim Söhne + Tiempos standard (The Guardian, Stripe Press, Anthropic) — the licensed Klim pair was considered but the free pair carries the register sufficiently and simplifies downstream licensing.

Research

Three research memos informed the locked decisions:

  • research/visual-references-analysis.md — Stripe / Mercury / Immersive Garden / David Whyte teardown
  • research/color-theory-refinement.md — LCH-calibrated accent family + Anthropic / Aesop neighbourhood
  • research/logo-construction-methodologies.md — Pentagram-style construction with cap-height as unit + Mastercard precedent

Engagement

This brand book is the working reference for engagement rtsn-studios-v5. Singapore-based. v5 replaced shelved earlier work; the previous engagement at engagements/rtsn-studios-v4/ closed. The book lives in git on branch claude/v5-brand-foundation, based on origin/main.

Single self-contained HTML file. Renders in any browser. Refresh whenever the locked artefacts change.

Export + packaging

For PDF export, asset-library packaging, and client handoff: see brand/v5-export-guide.md. Three PDF-export tiers documented (browser print / print-CSS / headless Chrome via puppeteer), with a generation-script template for assembling the full handoff package (Brand Book PDF + Asset Library SVGs + PNG exports + brand spec docs + walkthrough). Logo assets live at assets/logo/ — symbol + lockup in 12 SVG variants covering currentColor + 5 backgrounds, all production-ready.

Keep building.
RTSN
Singapore · MMXXVI