Horizontal · flydubai design squad

flydubai Squad Playbook

How the squad builds the flydubai design system in Figma with Claude Code, one shared Git repo and a set of commands that remember every rule we've agreed.

MASTER N3BmCXRDK6mbgyA6ZewqH9Repo bmaniya1/flydubai-design-squadUpdated 10 Nov 2026
01 · How to use this

How to use this

  • New to the squad? Read sections 2 to 4 (15 minutes), then do the setup in section 3. Allow about 20 minutes, plus waiting for fonts.
  • About to build or fix a component? Section 6 tells you which command to run, section 7 which files it reads.
  • Something failed? Section 11 lists the errors we've already hit and the fix for each.
  • Want to automate something new? Sections 9 and 10 show how to write a prompt, turn it into a command and share it.
Overlap with Tourism Australia

The method came from the TA build, so parts will feel familiar. flydubai has its own repo, file, tokens and rules; TA decisions don't apply here.

02 · Why Git + Claude

Why we work this way

Until November, Sneha, Nikita and Zeeshan each used Claude differently, in separate streams. Every rule a reviewer gave lived in one person's chat and was lost to the others. The repo fixes that: Claude reads the same rules, logs and commands in every session, for everyone.

What you get

Shared memory

Every rule Sneha gives ("use the spacing scale only", "mobile never truncates") is written to a file once and loaded into every teammate's session automatically.

What you get

Resume anywhere

Each component has a build-state file with node ids, tokens, decisions and open items, so anyone can pick up where the last session stopped.

What you get

Same steps every time

Slash commands such as /fd-component run the agreed build: reference first, sign-off before writing, Grid Builder plugin, QA.

What you get

History and backup

A hook commits after every Claude turn. You push from GitHub Desktop, and anything can be traced or restored.

Never in Git

Commercial terms (project-instructions.md), client meeting notes (project-docs/) and licensed fonts (_local/) are git-ignored. The commit hook also blocks any file containing contract figures or API tokens.

03 · Set up

Set up your Mac

Everything runs in Claude Code on your own Mac. Cloud sessions can't load the flydubai fonts or drive the hidden browser, so they can't write text into Figma.

  1. Install Claude Code

    Desktop app or CLI, signed in with your Horizontal account.

  2. Clone the repo with GitHub Desktop

    File › Clone repository › bmaniya1/flydubai-design-squad. Save it at exactly this path; the scripts expect it:

    ~/Desktop/flydubai-design-squad
  3. Install the fonts

    Ask Sneha for Effra (Light, Regular, Medium) and Frutiger LT Arabic (45, 55, 65). Double-click each › Install. Keep the Figma font agent running. They are licensed: never put them in Git.

  4. Install Chrome Beta and Node 18+

    Chrome Beta is the hidden browser that writes text into Figma, captures the live site and runs the Grid Builder plugin. Download it from google.com/chrome/beta and Node from nodejs.org.

  5. Run the setup script

    It copies the commands, checks Node, Chrome Beta and the fonts, installs the browser library, logs the runner into Figma once, starts it and runs a test. Safe to re-run.

    zsh ~/Desktop/flydubai-design-squad/bin/setup.sh
  6. Connect Figma in Claude Code

    In Claude Code type /plugin, choose figma and log in with your Horizontal Figma account. Check it with: "Run Figma whoami". You should see the Horizontal Enterprise plan.

  7. Let the auto-sync push for you (optional)

    Without this, the hook commits and you push from GitHub Desktop. With it, every turn also pushes. In Claude Code, run:

    ! gh auth login
    ! gh auth setup-git
  8. Test

    Open Claude Code inside the repo folder and ask:

    Run a ping job through scripts/fz-bg.mjs that loads Effra and returns the current page name.

    A page name back means you're ready. Then try /fd-visual-ref Footer FD-12 ↳ Footer ✅.

04 · How it works

How the automation fits together

When you open Claude Code in the repo, it loads CLAUDE.md. That pulls in the project context, the build template, the method and every standing rule. A command then drives two routes into Figma:

flowchart LR
  A[You in Claude Code] --> B[CLAUDE.md loads context, template, rules]
  B --> C{Slash command}
  C --> D[Figma MCP: read, structure, tokens, uploads]
  C --> E[Hidden Chrome Beta runner: text in Effra and Frutiger, Grid Builder plugin, live captures]
  D --> F[(MASTER Figma file)]
  E --> F
  C --> G[Build-state files, rules, gotchas]
  G --> H[Stop hook: scan, commit]
  H --> I[GitHub Desktop: push]
  I --> J[(Shared repo)]
  J --> B
RouteUse it forIt can't
Figma MCP (use_figma, screenshots, metadata)Reading the file, checking layers, creating and aliasing tokens (it can reach the Foundations library), uploading imagesLoad Effra or Frutiger, so it can't create or edit text
Hidden runner (scripts/fz-bg.mjs <job>)Any write that touches text, building variants, the Component Grid Builder plugin, live-site captures, contrast measured from a renderReach the team library (no figma.teamLibrary); no undo, so jobs must be safe to re-run
Golden rule

Never open a visible browser over someone's apps, and never type keys on the Figma canvas. Typing once triggered shortcuts and dropped a rectangle into a doc table.

05 · A working day

A working day

  1. Start

    Pull in GitHub Desktop, start the hidden runner, then open Claude Code in the repo folder.

    ~/Desktop/flydubai-design-squad/scripts/fz-bg-start.sh
  2. Pick up

    Ask Claude what's open: it reads open-items-next-session.md and the component's build-state file.

  3. Build

    Run one command per component (section 6). Claude captures live references first, then asks you to sign off the variant count before it writes anything. Answer that question; Figma writes can't be undone.

  4. Review in Figma

    Give corrections in plain words ("no truncation", "keep the height when the header is off"). Claude fixes it and records the rule so it isn't repeated.

  5. Close

    Run /fd-learn (rules into the right files), then /fd-wrap-session (handoff). Push in GitHub Desktop.

06 · Commands

Which command, when

When you want to…RunWhat it does
Build a new component/fd-component <Component> <FD-ID> <Page>Sources (FigJam, concept, live, MASTER) → reference frame → states list → your sign-off → sets, tokens, Grid Builder → doc frames → QA → build-state file
Bring an existing component onto the template/fd-conform <Component> <FD-ID> <Page>Copies the built sets into the template (never moves them), amends the copies, rebuilds the docs
Capture the live site only/fd-visual-ref <Component> <FD-ID> <Page>Every state at 1440 / 768 / 375 in the hidden browser, placed in the Reference (Design) frame with linked sources, set to 0% opacity
Save what you learned today/fd-learnRoutes each lesson: build rule, standing rule, gotcha, build state or open item
End the session/fd-wrap-session [focus]Writes only what's missing, checks it, prints a handoff block

Helper scripts Claude runs for you

ScriptPurpose
scripts/fz-bg-start.shStarts the hidden Chrome Beta runner (port 9333)
scripts/fz-bg.mjs jobs/<job>.jsRuns a Figma job in the runner with the flydubai fonts loaded
scripts/fz-grid-open.mjs <setId> open · fz-grid-axis.mjs <Property> <X|Y> · fz-organize.mjs <setId>Opens the Component Grid Builder plugin, sets each property's axis, clicks Organize
scripts/fz-reload.mjsReloads the runner's Figma tab after token values change through MCP
bin/sync-fd.shThe end-of-turn hook: scans for private terms, commits, tries to push
07 · Files to read

Files Claude reads (and you should know)

FileWhat it holdsWhen
CLAUDE.mdEntry point; loads everything belowEvery session, automatically
flydubai-claude-context/component-doc-template.mdThe page format: 9 doc frames, type and spacing, matrix rulesEvery build
flydubai-claude-context/component-build-method-2026-10-23.mdSet naming, token tiers, Zeeshan's 10-check QAEvery build
memory/fd-*.mdStanding rules, one per file, with the reason and how to apply itEvery session, automatically
flydubai-claude-context/<component>-build-state.mdNode ids, tokens, decisions and open items for one componentBefore touching that component
flydubai-claude-context/open-items-next-session.mdEverything left to do or decideStart of a session
reference/ds-automation-pack/01-figma-plugin-api-gotchas.mdError → cause → fix, by symptomBefore any Figma write, and when something fails
flydubai-claude-context/prompts/01–03The long-form prompts behind the commandsWhen writing your own
TEAMMATE-SETUP.mdSetup detail behind section 3Once
08 · Standing rules

Rules every build follows

These come from Sneha's reviews and live in memory/ and the build commands. Claude applies them automatically. Knowing them helps you review.

Sources
  • The Reference (Design) frame with live captures comes first, before any token or set.
  • Priti's FigJam is the functional spec; the concept decides placement, copy and button styles.
  • Merge or split FD-IDs only as the concept groups them, and ask first.
Building
  • Sign off the variant count before any write.
  • Always run the Component Grid Builder plugin; never script the matrix.
  • Use atoms (Button, Icon Button, Input) as designed; copy sets, never move them.
Tokens and spacing
  • Every spacing value aliases the Foundations scale (0 · 2 · 4 · 8 · 12 · 16 · 20 · 24 · 32 …). No invented values.
  • Never borrow another component's token; own colours get their own token or style.
  • Main set frame: #F5F5F5, no outline, radius 12.
Text and heroes
  • No truncation unless asked: text wraps and the component grows.
  • Heroes follow the concept's viewport rule (range → lower end), drawn at 1440 × 900 and 360 × 640.
  • Header and booking widget stay placeholders until FD-13 / FD-30 are designed; hiding the header never changes the height.
Docs

Short Breadcrumb Min format: one line per property, ~6 Do / Don't pairs, Usecases only for what the variants can't show. Write the brand as "flydubai", always lowercase.

09 · Write a prompt

Write your own prompt

Good prompts here read like a short brief to a colleague. The build prompts all follow the same shape:

  1. Scope in one line

    What, which FD-ID, which page or node link. Paste the Figma link; Claude reads the node id from it.

  2. Sources to read

    FigJam section, concept frame, live URL, the build-state file.

  3. The first write

    Usually the reference capture, so the design is checked against live.

  4. A gate

    "Ask me to sign off … before any Figma change." This stops costly rebuilds.

  5. Rules and checks

    Point to the files instead of repeating them; add only what is special to this task.

  6. Where to save the result

    Usually the component's build-state file.

Check every hero for text that runs under the header placeholder at x-sm. Read inner-page-hero-build-state.md first. Report the cases; don't change anything until I say so.
Tips

Quote the reviewer's exact words and the date when a rule comes from them. Give one correction at a time. If a result is wrong, say what's wrong in a sentence ("the header moved"); Claude records the cause as a gotcha.

10 · Make a command

Turn a prompt into a command or skill

A slash command is a Markdown file. Put it in the repo's commands/ folder so the whole squad gets it, and in ~/.claude/commands/ so your Claude Code sees it. The setup script copies the repo's commands for everyone.

--- description: Audit a flydubai component's tokens and spacing against the scale argument-hint: <Component> <Page link> --- # flydubai — token audit **In scope:** $ARGUMENTS 1. Read memory/fd-spacing-scale-only.md and the component's build-state file. 2. List every padding and gap that is unbound or off the scale. 3. Report only; ask before fixing.
You wantMakeWhere
A repeatable task with argumentsSlash command (fd-<name>.md)commands/ + ~/.claude/commands/
A rule that should apply in every sessionMemory file (memory/fd-<slug>.md: rule, Why, How to apply)Plus one @../memory/fd-<slug>.md line in flydubai-claude-context/CLAUDE.md
A step inside the buildOne line in fd-component.md at the step it governs~/.claude/commands/fd-component.md (the hook copies it into the repo)
A bigger reusable workflow with its own filesA skill (folder with SKILL.md)Ask Claude: "turn this into a skill"; keep it in the repo
Easiest route

Work through a task once with Claude, then say "turn what we just did into an /fd- command". Run /fd-learn afterwards so any new rule lands in the right file.

11 · When it breaks

Errors we've already hit

You seeCauseFix
unloaded font "Effra Regular"The MCP can't load the licensed fontsText writes go through the hidden runner (fz-bg.mjs)
Browser context management is not supportedThe hidden Chrome has no open tabcurl -X PUT "http://127.0.0.1:9333/json/new?about:blank"
New token values don't show; heights unchangedThe runner's tab has a stale copy of the filenode scripts/fz-reload.mjs, then re-measure
New tokens silently not boundCreated through MCP seconds earlier; the runner hadn't syncedReload, re-bind, read boundVariables back
flydubai NOT committed - private terms foundA file matches the contract-figure checkRemove the figure; never weaken the check without asking Sneha
could not read Username for 'https://github.com'The command line isn't logged into GitHubPush from GitHub Desktop, or gh auth login + gh auth setup-git
Grid Builder axis won't changeMouse click missed after the panel movednode scripts/fz-grid-axis.mjs <Property> <X|Y>
Hero stays 900 at xl / lgA fill-height child inside a hug-height frame never shrinksBind the frame's height to the viewport token

The full list, by symptom, is in reference/ds-automation-pack/01-figma-plugin-api-gotchas.md.

12 · flydubai context

flydubai at a glance

ThingWhere
Design system (build here)Figma "Design system - MASTER" N3BmCXRDK6mbgyA6ZewqH9
Functional specPriti's FigJam "Components Analysis" oCKyJubheVvcgOlObrVaq6, page 3b Component annotations
Concept designsFigma "flydubai - Design Concept" Gq8Al7kdWTJQH8myvpdanl
Template of record"Breadcrumb Min" 6150:25776 on ↳ Breadcrumb ✅
Brand modesflydubai · Training · Holidays · Skywards Blue / Silver / Gold / Diamonds
Breakpointsx-sm · sm · md · lg · xl · 2xl · 3xl (variants built at 2xl, md, x-sm)
LanguagesEnglish and Arabic as variants; Russian checked in Usecases
Who decidesSneha (design system) · Priti (FigJam / UX) · Nikita (sets, tokens, theming) · Zeeshan (QA) · Liliane (scope, PM)
Scope

New components, merges or variants that change the component count go to Liliane before they're logged as scope. Claude will flag these; pass them on.