Brand · Logo

How the lockup is built

The NorthBlue logo is not a drawing anyone can open and nudge. The letters are outlined paths with no weight axis, and the navigation mark's corners are generated from geometry rather than drawn. That makes it derived artwork — five numbers in, six SVGs out. This is the record of what those numbers are and why they sit where they do. For colour, voice, the glass and how the mark is used, see the identity.

01The system

One lockup: the stacked wordmark, "north" over "blue", with the navigation mark set after the "e". The mark can run alone where the full lockup is too wide, but the wordmark never runs without either the mark or a deliberate decision to drop it.

full lockup
250 px
small
120 px
reversed
on black
mark alone
56 px
Letter weight
3
units of stroke dilation
Mark scale
5.2
1.46× the x-height
Point radius
2.0
on the three points
Gap
60
from the "e" at x 880
Rise
7.5
tip above the baseline

Colour

The logo is black on light surfaces and white on dark ones — nothing else. There is no blue version. Blue exists in the identity only as light refracted through the glass material, never as a fill. The full rule is in the identity.

Clearspace

Keep clear space of at least the mark's own width — about 250 units, a quarter of the wordmark — on every side. The lockup's viewBox already carries 14 units of trailing padding; that is spacing, not clearspace, and does not count toward it.

02The letters have no weight axis

The wordmark arrived as outlined paths, not live text. There is no font file to re-set at a heavier cut, and the source family jumps straight from Medium to Bold with nothing between — which is a large step for a logo.

So the weight is synthetic. The nine letter paths sit in a group that strokes its own outlines in the fill colour, which dilates every stem by the stroke width. Base stem is 55 units; at the shipped value of 3 the stems read 58.

<g fill="#000000">
  <g stroke="#000000" stroke-width="3" stroke-linejoin="round" stroke-linecap="round">
    <!-- the nine letter paths -->
  </g>
  <path transform="translate(943.64 453.19) scale(5.2)" d="..."/>   <!-- the mark, unstroked -->
</g>

The mark sits outside that inner group deliberately. Letter weight must never thicken the mark — it is a solid shape, not a stroked one, and dilating it would blunt the point independently of the radius control.

The ceiling is about 12. Dilation is uniform, which is not what a real heavier cut does — a true Bold thickens stems more than curves and keeps counters open. Past roughly 13 units the "e" aperture and the "o" counters visibly close; past 16 the stems merge. If the wordmark ever genuinely needs to be heavier than that, the honest fix is to re-set the type in the source font at a heavier weight and re-outline, not to push this number.

03The mark's corners are generated

The mark arrived with its rounding baked in — corners hardcoded as Bézier curves, with no radius to adjust. Extending its four straight edges until they meet recovers the sharp quadrilateral underneath, and the corners are now generated from that quad at whatever radius is asked for.

tail · 51.9° tip · 43.0° notch · 142.1° left · 47.2° the sharp quad the edges imply radius 2.0 on the three points Radius 2.5 reproduces the original drawing to within 0.05 units. Below ~0.5 the tip aliases at favicon size; above ~5 it reads as a blob.

Each corner is a circular arc tangent to both edges. Tangent distance is r / tan(θ/2), so the same radius eats much more edge at the acute tip (43°) than at the obtuse notch (142°) — which is why the notch carries its own slightly larger radius, at 1.28× the point radius, to match the original drawing's proportions.

CornerSharp vertexInterior angleRole
tail49.472, −1.38651.9°Top right. The trailing edge of the sweep.
tip30.125, 53.99543.0°The point. Sharpest corner, so most sensitive to radius.
notch19.191, 29.122142.1°The concave fold. Rounds the other way.
left−3.677, 16.79247.2°The leading point, nearest the "e".

Radius changes the bounding box. A sharper point reaches further than a rounded one, so the mark's ink box is not fixed. Placement is computed from the box measured after the path is built — never from stored constants. Change the radius without re-measuring and the mark drifts off the baseline.

04Where it sits

Two measurements anchor the mark, both taken from the wordmark itself rather than from the canvas: the right edge of the "e" at x 880, and the baseline of the "blue" row at y 723.5.

gap 60 tip floats 7.5 above baseline 723.5 x 880 — the "e" ends viewBox 0 0 1208 827.73

05What is in the folder

Everything under public/brand/. The three wordmark variants differ only in fill; the geometry is identical.

FileUse it for
northblue-wordmark.svgFull lockup in black. The canonical file.
northblue-wordmark-white.svgReversed, for black grounds. Embedded by the LinkedIn assets.
northblue-wordmark-current.svgFill is currentColor — inline it where the logo should inherit text colour.
northblue-mark.svgMark alone, black, cropped to its own ink.
northblue-mark-white.svgMark alone, reversed.
northblue-mark-current.svgMark alone, inherits colour. Favicons, avatars, tight spaces.
northblue-linkedin-logo.pngCompany avatar, white on black, 400 × 400. -light is black on white.
northblue-linkedin-company-cover.pngCompany Page cover, 4200 × 700.
northblue-linkedin-profile-cover.pngFounder profile cover, 1584 × 396.
northblue-linkedin-launch-post.pngFirst-post image, 1200 × 627.
build-brand.pyRegenerates all six SVGs. The five knobs live at the top.

06Changing it

Edit the knobs at the top of build-brand.py and run it. Never hand-edit the SVGs — they are output, and the next run overwrites them.

python3 public/brand/build-brand.py

The four LinkedIn PNGs embed northblue-wordmark-white.svg by reference, so they go stale the moment the wordmark changes and must be re-exported.

macOS has no good SVG renderer installed here. The PNGs were exported with qlmanage, which always writes a square thumbnail and centre-crops anything that is not square — which silently cut "north" off the top of the covers the first time. The workaround is to wrap each non-square SVG in a square canvas, render, then crop back with sips -c <height> <width>. If you install a real renderer (rsvg-convert, Inkscape, or just open them in a browser and export), use that instead — it will give cleaner output and skip the whole dance.