Brand & Identity Guide

Every source.
One trigger.

Salvo is the live production system formerly named LGL-OS. In a broadcast router, a salvo is a saved set of crosspoints fired together — one action, many routes, simultaneously. This document covers the name, the mark, the palette, the type and the writing voice that hold it together across every surface.

salvo.network Set in IBM Plex Light-first
01 · Identity

Who we are

Let's Go Live! builds infrastructure for live production. Salvo is the product — the operational layer that sits between signal entry and content delivery. We serve people who work live, under pressure, where the stakes are real.

We're not a streaming app. We're not an editing tool. We're the system underneath — the thing that makes sure everything else works when it counts.

Brand traits

Direct Precise Operational Calm under pressure Trustworthy

We are not

Hype-driven Vague Consumer-cute Self-congratulatory

Our audience

Broadcast engineers

They've built signal chains in the dark at 5am. They know what works and what's marketing. Earn their trust with specifics, not promises.

Technical directors

They need to see the whole system at a glance and trust it won't break mid-show. They care about reliability and operational clarity.

Production teams

They're running events under time pressure. They don't read manuals in advance — they need things to be obvious when they sit down.

02 · The name

Salvo is already a word your users say at work

A term of art from the exact room the product lives in, that also reads as plain English to everyone outside it. Engineers hear the router term; everyone else hears simultaneity and force. Both readings point at the same product truth.

Insider meaning

Engineers hear the router term and assume you've done live before. LGL-OS had to earn that; Salvo asserts it in five letters.

Outsider meaning

Everyone else hears simultaneity and force. Many sources, one trigger.

Shape

Five letters, two syllables, no hyphen, no suffix. It survives a favicon, a tab title and a rack label — none of which LGL-OS did well.

The risk

It's a common word — clearance and SEO are harder than for an invented name. Trademark search before anything gets printed.

Salvo vs salvo

The product name and the router term will appear in the same sentence. The rule is capitalisation, and it is not optional.

Correct

Capitalised Salvo is the product. Lowercase salvo is the action.

"When an operator fires a salvo, every routed source cuts together."

Never

"Salvo fires a Salvo" — the product doesn't take the verb's capital.

"salvo records continuously" — the product always takes its own.

Naming & hierarchy

NameWhat it isWhen to use
Let's Go Live! The company and parent brand Corporate contexts, contracts, about pages, legal
Salvo The product. Written the same way it's set — no hyphen, no suffix, no TLD Everywhere. Body copy, docs, product pages, marketing, print
Salvo [Module] Individual modules — the name is short enough to carry a suffix without becoming a phrase Feature pages, in-app navigation, docs
salvo.network The address, not the brand URLs, footers, business cards. Never as a substitute for the name in copy
salvo The CLI command, and the lowercase router term Terminal, code samples, technical prose

The modules

SalvoRelay
SalvoSwitch
SalvoVault
SalvoTimeline
SalvoReplay
SalvoArchive
SalvoIngest

How to introduce a module

First mention on a page: full name + what it does. After that, just the short name.

Correct

Salvo Vault handles continuous recording across all active streams. Once Vault is running, every frame is captured.

Avoid

"LGL-OS Vault" (retired — and it never fit a tab title)

"the Vault module" (unnecessary)

"Salvo's Relay" (awkward possessive)

The URL carries the address, not the brand

The dot is the only place the URL earns colour — one violet keystroke, at a size where it still reads. The wordmark itself stays black or white throughout.

URL lockup · primary
Salvo.Network
URL lockup · in text
salvo.network
03 · Mark & wordmark

The S is a crosspoint route

A router matrix is a grid of points; a salvo is the set of points closed together. Draw that set so it spells the S and the mark is simultaneously a letter and a diagram — it stops being a generic commerce glyph because it only exists as lit crosspoints. Terminals run the full four cells; square pixels throughout. Every asset below is SVG built from rects and outlined paths, so nothing depends on a font at render time.

Mark builds

Routed S mark on light
Routed S · light
Routed S mark on dark
Routed S · dark
Closed tile, violet
Tile · violet
Closed tile, dark
Tile · dark
Closed tile, light
Tile · light
Single-colour mark
Mono · lit only

Favicon test · 16 / 24 / 32 / 48px

Open matrix vs violet tile

At 16px the matrix is one pixel per cell — legible as a shape, not as a letter, which is acceptable for a tab. The violet tile holds better because the field carries the brand while the S carries the meaning. Below 24px, use the tile.

Wordmark

IBM Plex Sans Condensed 700, uppercase, −0.015em. No new typeface enters the system for the logo. The condensed widths keep it compact in a nav bar — it holds at 13px, which is the size that actually ships.

Salvo wordmark on light
On light · #141419
Salvo wordmark on dark
On dark · #EDEDF0
Salvo lockup on light
Lockup · light
Salvo lockup on dark
Lockup · dark

Lockup at working sizes

The mark sets to cap height, never taller. Clear space on all sides equals one grid cell.

Rules

When to use which

Plain condensed caps are the wordmark everywhere — product, marketing, print, swag. Colour enters through the crosspoint mark beside it and the violet dot in the URL, never through a tinted letter.

Never

Never tint a letter of the wordmark. Never set it in a lowercase or mono cut. Never let the mark sit taller than cap height, and never put it closer than one grid cell to the word.

Favicon & app icons

Favicon
Favicon
Apple touch icon
Touch icon · 180
PNG
PWA icon
PWA · 512

Full inventory and usage notes: salvo-assets/README.md · rebuild with node scripts/salvo-assets-build.mjs

04 · Voice

Voice principles

The voice stays consistent everywhere. It's who we are, regardless of the channel. Think: experienced colleague, not brand mascot.

Say what it does, then stop

No filler, no build-up. Lead with the function. "Vault records continuously" is better than three sentences explaining why recording matters.

Confident, not loud

We don't need superlatives. "Reliable" beats "ultra-reliable." "Fast" beats "blazingly fast." The product is the proof.

Technical when it matters

Our audience knows what SRT, RTMP and LTC mean. Don't over-explain. Don't put protocols in quotes. Trust the reader.

Human, not robotic

Precision doesn't mean cold. Write like a person — just one who happens to be really good at this and doesn't waste your time.

The gut check

Before publishing anything, ask yourself four things:

Would a TD at Pinkpop read this and nod, or roll their eyes?

Could I say this out loud to a colleague without it feeling weird?

Did I say what it does, or just what it is?

Is there a shorter way to say this?

05 · Tone

Tone by context

Same voice, different temperature. The formality and detail shift depending on where the words appear.

Casual
Direct
Technical
Academic

Product UI

Shortest possible. Verb-first. Clarity is the personality.

Write this

Recording started

Source disconnected. Retrying…

2 streams ingesting

Not this

Your recording has been successfully initiated!

Oops! Something went wrong.

You are currently ingesting 2 streams.

Product pages & marketing

Conversational but grounded. Like explaining it to a smart colleague, not pitching a VC.

Write this

Salvo records, routes and releases every feed in your production at once. If the stream is live, the file is growing.

What you see in the timeline is what you get in the export. Frame for frame.

Not this

Our state-of-the-art recording engine leverages cutting-edge technology…

Say goodbye to timeline drift forever!

Documentation

Task-oriented. Lead with what to do, not background. Write for someone at 2am before a show.

Write this

To add an SRT source, navigate to Relay → Sources → Add.

Not this

In this section, we'll walk you through the process of configuring a new source…

Error states

Specific about what happened. Specific about what to do. Never cute, never vague, never blame the operator.

Write this

Ingest source 'CAM-02' dropped. Last frame: 4s ago. Check connection.

Export failed: disk full. Free 2.1 GB to continue.

Not this

Something went wrong. Please try again.

Uh oh! We hit a snag 😅

06 · Color

One neutral axis. Violet stays.

Every neutral is oklch(L 0.0xx 285) — hue held exactly, chroma stepping evenly instead of tripling at the first panel. Elevation is a lightness step, never a colour change. Violet itself sits at 293°: close enough to feel related, far enough that the accent separates from the surface it's on.

Light surfaces · the default

Cloud base
Page background
#F9F9FB
Panel white
Cards, surfaces
#FFFFFF
Raised
Subtle fills
#F2F2F5
Divider
Borders, hover
#E4E4EA
Primary text
#141419
Secondary text
#5E5E6B
Muted text
#92929E

Violet has three roles, one rule each

The brand fill #8B5CF6 carries white at 4.2:1 — fine behind a 24px heading, below AA behind a 13px button label. Buttons are where the accent and small text meet, so they get their own step. The fill spec doesn't change; it just stops being a button.

Violet fill
Brand, marks, headings 24px+
#8B5CF6 · 4.2:1
Violet control
Filled buttons and controls
#7C3AED · 5.3:1
Violet text
Links, labels, small copy on light
#6D28D9 · 7.1:1
Violet on dark
Links and active states on dark
#A78BFA · 6.8:1
Fails AA
Fire salvo #8B5CF6 · 4.2:1
Passes AA
Fire salvo #7C3AED · 5.3:1

Status & signal

#10B981
Live
Live states, healthy ingest
#F59E0B
Warning
Pending, congestion, sync
#EF4444
Error
Failures, dropped sources
#8B5CF6
Violet
Identity — never operational

Violet is identity, not status

Use it for brand elements, primary actions and active states. It never carries operational meaning, so it can't be confused with tally or PGM.

Status colors are reserved

Green = confirmed live / healthy. Amber = pending / warning. Red = failure / critical. Identical in light and dark — status is never ambiguous across themes.

Status in practice

2 streams ingesting
Export queued
Source dropped
07 · Type

IBM Plex, all three cuts

One superfamily across every surface. Plex was drawn for machine interfaces — high-contrast terminals, a slab-ish rigidity in the uprights, a single-storey a and a slashed zero in the mono. Critically, the three cuts share metrics and skeleton, so a Condensed 700 headline and a Mono timecode are visibly the same voice at different temperatures.

Display · marketing
IBM Plex Sans Condensed 700

Rack-panel silkscreen. Sets tight and long without shrinking.

Interface · everything
IBM Plex Sans 400 / 500 / 600

Holds at 13px body and 10px caps. Tabular figures on by default.

Technical · readouts
IBM Plex Mono 400 / 500

Same skeleton as the sans, so 01:14:32:18 sits square under its label.

Specimen · light and dark

Light · marketing, docs, default UI
Display · Condensed 700 · 44 · −2%
Every source. One trigger.
H1 · Sans 600 · 24
Continuous recording
H2 · Sans 600 · 18
Ingest sources
Body · Sans 400 · 13 / 1.65
Vault records continuously across active streams. If the stream is live, the file is growing. Every frame is captured, buffered and written with integrity safeguards.
Caps · Sans 500 · 10 · +12%
Section label
Timecode · Mono 500 · 30 · tabular
01:14:32:18
Readout · Mono 400 · 11
srt://ingest-01.salvo.network:9000 · 12.4 Mbps · 180ms
Mono caps · 600 · 9 · +15%
PROGRAM · PREVIEW · STANDBY
Dark · operator surface
Display · Condensed 700 · 44 · −2%
Every source. One trigger.
H1 · Sans 600 · 24
Continuous recording
H2 · Sans 600 · 18
Ingest sources
Body · Sans 400 · 13 / 1.65
Vault records continuously across active streams. If the stream is live, the file is growing. Every frame is captured, buffered and written with integrity safeguards.
Caps · Sans 500 · 10 · +12%
Section label
Timecode · Mono 500 · 30 · tabular
01:14:32:18
Readout · Mono 400 · 11
srt://ingest-01.salvo.network:9000 · 12.4 Mbps · 180ms
Mono caps · 600 · 9 · +15%
PROGRAM · PREVIEW · STANDBY

What we replaced, and why

Retired · Syne

Cut for an arts residency. Its personality is in the widths, and widths that move between weights make a headline feel unstable — the opposite of "calm under pressure."

Retired · Inter

Nothing wrong with it. It just means the product is indistinguishable from every dashboard your operators also have open. Plex costs nothing in legibility and buys an identity.

Retired · JetBrains Mono

Built for reading code at one size in one place. Plex Mono is built to sit next to Plex Sans in a table — which is where every Salvo readout actually lives.

08 · Dark surface

Light is the default. Dark is the gallery.

Salvo is light-first: marketing, docs, sign-in, admin and every default application view sit on #F9F9FB. Dark is a second temperature, not the base — reserved for surfaces operators stare at in low light: the program view, the multiviewer, the rack-mounted panel in a truck at midnight. Same tokens, same status colors, same type ramp.

Dark ramp · hue locked at 285°

App base
Page background
#141419
Panel
Cards, sidebars
#1E1E26
Raised
Borders, hover
#24242E
Elevated
Dropdowns, modals
#373743
Primary text
#EDEDF0
Secondary text
#9A9AA6
Muted text
#66667A

Preview

Salvo Relay Vault Timeline
On air
Program
01:14:32:18
CAM 01 · Wide 12.4 Mbps LIVE
CAM 02 · Close 11.8 Mbps SYNC
SRT · Remote 180 ms DROP
Fire salvo Preview

Rules

No pure black

#141419 is the darkest surface. Pure black creates harsh edges and reads as a void.

No pure white text

#EDEDF0 for primary text. Pure white on dark causes eye strain over a long show.

Elevation = lightness

Base → Panel → Raised → Elevated. Hue and chroma are locked; only lightness moves. This replaces shadows, which don't read on dark.

Violet steps up, not down

On dark, links and active states use #A78BFA. The #7C3AED control fill stays as-is — it already clears AA against white text.

09 · UI voice

How the interface talks

Every label, tooltip and notification is copy — treat it that way.

Buttons

Verb-first. Describe the action, not the destination. Short enough to scan instantly.

Write this

Fire salvo · Start recording · Add source · Export clip · Open timeline

Not this

Click here to start · Submit · Go · Recording options

Empty states

Tell the operator what to do, not what's missing.

Write this

No sources connected. Add one via Relay → Sources.

Not this

Nothing here yet! Get started by adding your first source 🎉

Confirmations

State what happened. Past tense. Done.

Write this

Clip exported · 00:02:14 · 1080p

4 crosspoints armed · released 01:14:32:18

Not this

Your clip has been successfully exported! Great job!

Words we use

UseInstead of
stream, source, feedinput, asset (in live context)
recordcapture (unless at ingest level)
fire a salvotrigger the preset, execute the routing
extractpull, grab
timelinesession, project
operatoruser (in production context)
reliablerobust, rock-solid, bulletproof

Banned words

Revolutionary Seamless Leverage Solution Simply Game-changing Ecosystem Utilize
10 · Playground

UI playground

Live component demo built on @ionglue/ui-core. Every component, token and pattern in the system — interactive and in context. The ui-core aliases at the top of this page are kept in sync with the palette above; the playground bundle ships its own scheme layer on top, so it still renders the pre-Salvo values until @ionglue/ui-core is rebuilt.