Brand
The pieces that make ShadowDB look like ShadowDB.
Logos, colours, type and words, for writing about us, linking to us or building with us. Please keep the logo as it is and don't imply a partnership we don't have.
Logo
The puzzle piece and the name.
The mark is a single piece that fits: a migration that slots into production without breaking it. Use the full logo wherever there's room; the mark alone where the name is already written nearby, or space is tight.
Usage
Give it room. Leave it alone.
Keep clear space around the logo equal to the height of the mark's knob, and never show the full logo smaller than 96 px wide (the mark: 16 px).
Don't stretch or squash it
Don't rotate it
Don't use off-palette colours
Don't add effects
Colour
Mostly ink, one green.
Interfaces are near-black and near-white; ShadowDB Green is the one brand colour. Signal colours carry meaning (a verdict, a severity), so never use them for decoration.
Brand
ShadowDB Green
Light
Dark
Green text
Light
Dark
Green tint
Light
Dark
Neutrals
Ink
Light
Dark
Muted
Light
Dark
Hairline
Light
Dark
Surface
Light
Dark
Canvas
Light
Dark
Signals
Safe
Light
Dark
Warning
Light
Dark
Blocked
Light
Dark
Critical
Light
Dark
Info
Light
Dark
Typography
Geist, sans and mono.
Geist Sans for everything people read, Geist Mono for code, SQL, identifiers and labels. Both are free under the SIL Open Font License.
Geist Sans
Aa
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
Geist Mono
Aa
CREATE INDEX CONCURRENTLY orders_status_idx ON orders (status);
- heading-32Rehearse every migration
- heading-20Index built without CONCURRENTLY
- copy-16Writes to orders were blocked for 3.9 s at 100k rows.
- label-13Seeded rows · PostgreSQL 16
Name & voice
Calm, exact, on your side.
We write like a senior engineer reviewing your PR: specific, measured, and never alarmist.
Writing the name
- ShadowDB
- Shadow DB
- Shadowdb
- SHADOWDB
- Shadow Database
One word, capital S, capital DB. It doesn't change in titles or at the start of a sentence.
Lead with what happened
Then why it matters, then what to do. “Index built without CONCURRENTLY. Writes to orders were blocked for 3.9 s at 100k rows. Use CREATE INDEX CONCURRENTLY.”
Qualify every number
Timings always come with the row count they were measured at. We report what happened in the rehearsal, never a production prediction.
Same words everywhere
Verdicts are Safe, Warnings, Blocked or Couldn't verify, in the check, the report and the badges alike.
Never blame the developer
When a run fails for a reason that isn't the pull request, we say so plainly.
ShadowDB catches risky PostgreSQL migrations before they reach production. A GitHub App, it replays every migration in a pull request on a throwaway PostgreSQL seeded with rows, measures the locks, rewrites and timings each statement causes, and reports a verdict as a GitHub check before anyone merges.
Need something else?
Press, partnerships or a format that isn't here, get in touch.