Brand assets
The nikcli wordmark variants, how they're themed across surfaces, and where the assets live in each package.
Overview
nikcli ships three pixel wordmark variants, all derived from a single master
(packages/mobile/assets/wordmark.png). The web package, the mobile app, and the
Studio / dashboard reuse the same files so the brand stays consistent across surfaces.
Light letters
wordmark-dark.png — pale grey letters, transparent background. Use on dark or photographic surfaces.
Dark letters
wordmark-light.png — ink grey letters, transparent background. Use on light surfaces.
Master file
wordmark.png — original source asset, identical to wordmark-dark.png. Kept for archival and export pipelines.
All variants live in packages/mobile/assets/. The web package copies them into
public/brand/ at build time so the docs site can serve them statically without
depending on the mobile package at build.
Download the brand kit
One zip, every PNG the docs and apps serve, plus a README.md and a
MANIFEST.csv with byte sizes. Filenames and content match
packages/mobile/assets/; the un-suffixed names (icon.png,
wordmark.png, splash.png) are the masters used by desktop
shells and store pipelines, and they are duplicated as the dark variant so theme-aware
callers can pin a stable name.
What’s inside the zip 6 groups · 15 files
Wordmarks
-
wordmark-dark.png632×206 Pale grey letters for dark / photographic backgrounds. -
wordmark-light.png632×206 Ink grey letters for light / paper backgrounds. -
wordmark.png632×206 Identical to wordmark-dark.png. Kept for archival and export pipelines.
App icons
-
icon.png1024×1024 Dark-surface adaptive base. Identical content to icon-dark.png. -
icon-dark.png1024×1024 Explicit dark-mode pairing (same raster as icon.png). -
icon-light.png1024×1024 Light-surface icon for paper-like backgrounds.
Adaptive icons
-
adaptive-icon.png1024×1024 Dark surface adaptive layer. Identical to icon.png. -
adaptive-icon-light.png1024×1024 Light-surface adaptive layer. Identical to icon-light.png.
Icon marks
-
app-icon-mark.png128×128 Dark surface monogram for tab bars, sidebar, dock. -
app-icon-mark-light.png128×128 Light-surface monogram for paper-like chrome.
Favicons
-
favicon.png48×48 Dark surface favicon for <link rel="icon">. -
favicon-light.png48×48 Light-surface favicon for paper-like browser chrome.
Splash screens
-
splash.png1024×1024 Dark surface launch screen. Identical to splash-dark.png. -
splash-dark.png1024×1024 Explicit dark-mode launch screen. -
splash-light.png1024×1024 Light surface launch screen for paper-like backgrounds.
Or download individual files
Same rasterizations, one PNG at a time. Useful when you only need the wordmark, the favicon, or a specific dark / light pairing.
The zip is generated from packages/mobile/assets/ by
packages/web/script/build-brandkit.ts. After updating a source PNG,
re-run it so the served archive stays in sync:
bun run --cwd packages/web build:brandkit Wordmark variants
| File | Letter color | Background | Use when |
|---|---|---|---|
wordmark-dark.png | Pale grey, ~70% luminance | Transparent | Dark theme, photographic backgrounds, terminal chrome on macOS. |
wordmark-light.png | Ink grey, ~30% luminance | Transparent | Light theme, paper-like backgrounds, print material. |
wordmark.png | Pale grey, ~70% luminance | Transparent | Master / archival — same content as wordmark-dark.png. |
All three PNGs share the same dimensions: 632 × 206 pixels at native scale,
RGBA, non-interlaced. The intrinsic aspect ratio (≈ 3.07:1) lets us compute
width from a chosen height with width = height × (632 / 206).
Theme switching
Every consumer switches the wordmark variant using the same pattern: render one image for the light theme, one for the dark theme, and toggle visibility through CSS.
Web (Tailwind / Astro)
Tailwind's dark mode is configured with the [data-theme="dark"] selector in
tailwind.config.mjs. Two images are emitted, only one is visible at a time:
<img src="/brand/wordmark-light.png" class="h-8 w-auto dark:hidden" />
<img src="/brand/wordmark-dark.png" class="h-8 w-auto hidden dark:block" /> The navbar, footer, and the dashboard connect screen all use this pattern.
Mobile (React Native)
components/layout/BrandMark.tsx consumes the same files through
useAppTheme() and chooses the variant at render time:
import { Image } from "react-native"
import { useAppTheme } from "@/lib/theme"
const WORDMARK_DARK = require("@/assets/wordmark-dark.png")
const WORDMARK_LIGHT = require("@/assets/wordmark-light.png")
export function BrandMark({ height = 18 }: { height?: number }) {
const { isDark } = useAppTheme()
const width = Math.round(height * (632 / 206))
return (
<Image
source={isDark ? WORDMARK_DARK : WORDMARK_LIGHT}
style={{ width, height }}
resizeMode="contain"
accessibilityLabel="NIKCLI"
/>
)
} ScreenBrandHeader wraps the brand mark in a screen-aware container used by the
Sessions, Repos, and More tabs.
Where the assets live
| Path | Purpose |
|---|---|
packages/mobile/assets/wordmark.png | Master / archival source. Mobile app icons and splash derive from it. |
packages/mobile/assets/wordmark-dark.png | Used by the mobile app for dark themes and by the web package's navbar / footer. |
packages/mobile/assets/wordmark-light.png | Used by the mobile app for light themes and by the web package's navbar / footer. |
packages/web/public/brand/wordmark.png | Mirrored copy of the master, served as a static asset. |
packages/web/public/brand/wordmark-dark.png | Served by the docs navbar, footer, and dashboard connect screen. |
packages/web/public/brand/wordmark-light.png | Served by the docs navbar, footer, and dashboard connect screen. |
Don't import the wordmark directly from packages/mobile into
packages/web. Astro / Vite would need to bundle a React Native module just to
load a PNG. The web package copies the PNGs into public/brand/ and serves
them as plain static files.
Usage in code
Navbar (web)
The docs navbar uses a single wordmark link, no icon plate. Both variants are rendered and
swapped by Tailwind's dark: selector:
<a href="/" class="group flex items-center shrink-0" aria-label="nikcli home">
<img src="/brand/wordmark-light.png" alt="nikcli" width="158" height="52"
loading="eager" decoding="async" class="h-8 w-auto dark:hidden" />
<img src="/brand/wordmark-dark.png" alt="nikcli" width="158" height="52"
loading="eager" decoding="async" class="h-8 w-auto hidden dark:block" />
</a> loading="eager" and the explicit width/height
attributes keep the brand from shifting the layout while the rest of the page streams.
Footer
Footer wordmarks are smaller (height 20 px instead of 32 px) to match the typographic scale of the copyright line. The same two-image swap is used.
Dashboard connect screen
packages/web/src/dashboard/components/DashboardShell.tsx uses the wordmark at
h-10 (40 px) so the brand reads clearly above the connect form. The screen
renders both variants and lets dark: choose.
Do and don't
| Do | Don't |
|---|---|
| Use the dark-letter variant on light backgrounds and vice versa. | Tint, recolor, or apply opacity to the wordmark on top of busy backgrounds. |
| Preserve the 632 × 206 aspect ratio. | Stretch, skew, or rotate the wordmark. |
| Pair the wordmark with quiet, single-tone UI chrome. | Place the wordmark on top of saturated color, gradients, or photographs without a tonal check. |
Reuse BrandMark on mobile or the navbar / footer pattern on web. | Hand-rasterize the wordmark from scratch per surface. |
Reference wordmark.png only for archival / export pipelines. | Reference wordmark.png from a runtime surface — pick the themed variant instead. |
Source anchors
| Need | File |
|---|---|
| Source wordmarks | packages/mobile/assets/wordmark*.png |
| Web static copies | packages/web/public/brand/wordmark*.png |
| Web navbar | packages/web/src/components/Navbar.astro |
| Web footer (marketing) | packages/web/src/layouts/Layout.astro |
| Web footer (docs) | packages/web/src/layouts/DocsLayout.astro |
| Dashboard connect | packages/web/src/dashboard/components/DashboardShell.tsx |
| Mobile brand mark | packages/mobile/components/layout/BrandMark.tsx |
| Mobile screen header | packages/mobile/components/layout/ScreenBrandHeader.tsx |
| Mobile theme hook | packages/mobile/lib/theme.tsx |