Brand guidelines · version 1.0 · September 2026

The spark on the i

Every great site starts with a spark.

The whole identity is one idea: the dot of the i is a star, and it is alive. Everything on this page follows from that.

Start here

The idea

The magic lives inside the name.

BuildSpark is named after the moment before the work, not the work. So the mark is not a symbol bolted on beside the name. It is in it. The dot of the i becomes a star, it breathes, and wherever the name appears the wonder is already there.

What it has to say

Wonder, and ease. Someone describes the website they want and it appears. That should feel like a wish granted, not like software being operated.

What it must never say

Not a tool, not a dashboard, not a machine. The four-point twinkle is the most borrowed symbol on the internet, so ours earns its place by where it sits and how it moves, never by being drawn louder.


The mark

One star, four parts.

It is built from a long four-point star with soft shoulders, so it reads as light rather than as a shape. Three layers move around it, and a white core holds the centre when it gets small.

How it is drawn

r 0.44r
  • The halo. Gold into pink into nothing. It swells and fades on the beat.
  • The counter-star. Pink, 44% scale, turned 45°, drifting the other way.
  • The star. White at the centre, gold at the tips, with a soft bloom around it.
  • The core. A flat white dot, r = 4.5. It is the last thing standing at 16 px.
96 px
48 px
24 px
16 px, solid

Below 24 px the halo and the counter-star are dropped and the star is filled flat, because the bloom turns to mud at that size. Never draw the star smaller than 16 px.


The wordmark

Lowercase, one word, dotless i.

The wordmark is set in Sora 700 at −0.04em, all lowercase, as a single word. The i is typed as a dotless ı so the star can take its place. In running prose the company is written BuildSpark; only the wordmark is lowercase.

On Midnight

The default. The star carries its halo and its gold.

On white

On a light ground the star body turns Wish violet and keeps a gold core. Gold alone holds only 1.7:1 on white, so it would dissolve.

Clear space is the height of the star, on every side. Nothing else goes inside the dashed line, and the star above the i is never clipped by the edge of a container.

The app icon and the favicon

The star stands alone on a Midnight tile with a corner radius of 22% of the width. It fills roughly 68% of the tile, so the points nearly touch the safe area without crowding it.

App, 96 px
48 px
32 px
16 px

Colour

A night sky, lit from one point.

Midnight is the ground of everything. Violet is the light in the sky. Gold is the spark, and it is rationed to almost nothing, which is exactly why it works. Select any swatch to copy its value.

Gold lives inside the mark and nowhere else. Not headlines, not buttons, not rules, not icons, not links. The moment gold appears as text the brand stops being a night sky with one star in it and starts being an ordinary yellow-and-purple website.

Every pair measured against WCAG 2.2 AA: 4.5:1 for body text, 3:1 for large text and graphics. Re-run _build/contrast_spark.py after any change; it exits non-zero on a failure.
Where it is usedSampleMeasuredNeedsVerdict
Body and headlines on MidnightAa 12319.07:14.5:1Pass
Lead paragraphs on MidnightAa 12316.07:14.5:1Pass
Captions and labels on MidnightAa 12311.26:14.5:1Pass
Links and kickers on MidnightAa 1239.00:14.5:1Pass
Body on Deep nightAa 12319.94:14.5:1Pass
Captions on Deep nightAa 12311.78:14.5:1Pass
Body on a Night cardAa 12317.77:14.5:1Pass
Captions on a Night cardAa 12310.50:14.5:1Pass
Midnight text on a white buttonAa 12319.07:14.5:1Pass
Midnight text on LavenderAa 1239.00:14.5:1Pass
White text on a Wish 600 buttonAa 1235.18:14.5:1Pass
Confirm label on MidnightAa 12312.40:14.5:1Pass
Glow as a large label on MidnightAa 1236.77:13.0:1Pass
Wish as a graphic edge on MidnightAa 1234.39:13.0:1Pass
The spark inside the mark on MidnightAa 12312.08:13.0:1Pass
Midnight inside a gold sparkAa 12312.08:14.5:1Pass

Wish 500 carries white text at only 4.34:1, which is why every filled violet button is Wish 600 instead. Wish 500 stays for glows, edges and large shapes.


Type

Sora for the wonder, DM Sans for the work.

Two faces, no exceptions. Sora is round and confident and does the promising; DM Sans is quiet and does the explaining. Both are subsetted and inlined in the page, never fetched from a font CDN.

Display

Sora 700

abcdefghijklmnopqrstuvwxyz 0123456789

Dotless i
ı U+0131, the character the wordmark uses
Used for
The wordmark, every heading, big numbers
Tracking
−0.035em headings, −0.04em wordmark, −0.05em display
Line height
0.92 to 1.12, tightening as it gets bigger
Weights
700 only

Body

DM Sans

abcdefghijklmnopqrstuvwxyz 0123456789

Used for
Paragraphs, labels, buttons, tables, captions
Tracking
Normal, or 0.1em to 0.16em for uppercase labels
Line height
1.6 body, 1.3 to 1.45 in small print
Weights
400, 500, 600, 700
Displaybuildspark
Heading 2Every great site starts with a spark
Heading 3One star, four parts
LeadThe dot of the i is a star, and it is alive.
BodyDescribe the website you want and it appears.
LabelThe mark

Never set a wrapping block with a ch max-width. The ch unit is the width of a zero in the font actually in use, so it changes when the fallback face is swapped for the real one and the text reflows underneath the reader.


Motion

It has to be alive, or it is just a star.

A static four-point twinkle belongs to every AI feature button on the internet. Ours is ours because it breathes. One clock, 3.6 seconds, three parts moving at different rates so the loop never looks mechanical.

01

The breath

The star scales from 0.8 to 1.07 and rotates 12° over 3.6 s, eased at both ends. The counter-star shrinks and turns the other way. The halo swells a beat behind them.

02

Out of step

Where several stars share a view, each is offset by a fraction of the cycle. They must never pulse in unison, which reads as a loading indicator rather than a sky.

03

The sky

Embers drift upward behind every page on a canvas, between 0.1 and 0.5 px a frame, a tenth of them drawn with a cross flare. They sit behind the content and never compete with it.

Reduced motion stops all of it, and nothing is lost when it does. Every page carries this control:

Using it

Short list, held firmly.

Do

Put it on Midnight wherever you can. The brand is a night sky and the mark is the only thing lit in it.

On white, use the Wish star with its gold core, and set the word in Midnight.

Let the star stand alone once the name has been said: as the icon, the favicon, a bullet, a loading state.

Give it clear space of one star height, and keep the star unclipped at the top.

Don't

buildspark

Don't use gold for type of any size. Gold is the spark, not a colour you write in.

Don't set the wordmark in capitals or in title case, and don't split it into two words.

Don't tint the wordmark or recolour the star. It is white on dark, Midnight on light, and the star keeps its own colours.

Don't stretch, squash, outline, emboss or add a second star beside the first.


The tokens

Everything above, as code.

This is the whole brand in one block. It is the same declaration every BuildSpark page opens with.

/* BuildSpark, the spark on the i. Gold lives inside the mark and nowhere else. */
:root{
  --night: #0E0B2B;       /* Midnight */
  --night-deep: #08061C;  /* Deep night */
  --night-card: #171239;  /* Night card */
  --wish: #7C5CFF;        /* Wish */
  --wish-600: #6D4DF7;    /* Wish 600 */
  --lav: #B7A6FF;         /* Lavender */
  --glow: #FF5FA8;        /* Glow */
  --pink: #FF8FC8;        /* Pink */
  --spark: #FFC53D;       /* Spark gold */
  --starlight: #FFF7E0;   /* Starlight */
  --text: #FFFFFF;        /* White */
  --soft: #EDE9FF;        /* Soft */
  --muted: #C8C2EE;       /* Muted */
  --ok: #6EE7A8;          /* Confirm */
  --line: rgba(255,255,255,.1);
  --glass: rgba(255,255,255,.06);

  --display: "Sora", "Sora Fallback", system-ui, sans-serif;
  --body: "DM Sans", "DM Sans Fallback", system-ui, -apple-system, "Segoe UI", sans-serif;

  color-scheme: dark;
}

The marks themselves are drawn in code, not stored as files: _build/partials/spark-base.js builds every star from one path, so there is no logo file to go stale.