diff --git a/README.md b/README.md
index e2b8b2d..1232b7b 100644
--- a/README.md
+++ b/README.md
@@ -7,10 +7,10 @@
**A semantic cache for LLM calls on Kotlin/JVM — that refuses to serve you the wrong answer.**
[](https://github.com/NaCode-Studios/Kmemo/actions/workflows/ci.yml)
-[](https://central.sonatype.com/artifact/io.github.nacode-studios/kmemo-core)
-[](LICENSE)
-[](https://kotlinlang.org)
-[](https://nacode-studios.github.io/Kmemo/)
+[](https://central.sonatype.com/artifact/io.github.nacode-studios/kmemo-core)
+[](LICENSE)
+[](https://kotlinlang.org)
+[](https://nacode-studios.github.io/Kmemo/)
An exact-match cache misses "how do I reverse a list in Python" when it has already answered "python
list reverse". A semantic cache does not: it embeds the prompt, finds the closest one it has seen, and
@@ -249,7 +249,8 @@ opening a pull request; if you change the public API, run `./gradlew apiDump` an
## License
-Licensed under the [Apache License 2.0](LICENSE).
+Licensed under the [Apache License 2.0](LICENSE). Brand assets — wordmark, symbol, and the colour and
+type tokens — are in [`docs/brand`](docs/brand).
## Sponsor
diff --git a/docs/brand/README.md b/docs/brand/README.md
new file mode 100644
index 0000000..e97e20d
--- /dev/null
+++ b/docs/brand/README.md
@@ -0,0 +1,36 @@
+# Kmemo brand assets
+
+The logo is the whole name — the node **K** followed by **memo**. The K on its own is a tile, not the
+logo, and "memo" is never separated from it.
+
+| File | Use |
+| --- | --- |
+| `kmemo-lockup-dark.svg` | the logo on a dark surface |
+| `kmemo-lockup-light.svg` | the logo on a light surface |
+| `kmemo-lockup-mono-dark.svg` / `-mono-light.svg` | one flat ink |
+| `kmemo-symbol.svg` / `kmemo-symbol-mono.svg` | the K on its own — internal use |
+| `kmemo-favicon.svg` / `-light.svg` / `kmemo-favicon-512.png` | favicon, avatar, app icon |
+| `kmemo-social-preview.png` | the GitHub social preview (2560×1280) |
+| `kmemo-tokens.css` | colour, type, space, radius and elevation tokens |
+| [`../kmemo-hero.png`](../kmemo-hero.png) | the README banner (2560×680) |
+
+Every SVG here is self-contained — the wordmark is outlined, so it renders identically whether or not
+Space Grotesk is installed.
+
+**Construction** — a 1000 em grid with a cap height of 700. The stem is 115 (Space Grotesk 600's stem
+weight, so the mark and the letters carry the same black); the diagonals are 105, 9% lighter, because at
+equal weight a diagonal reads heavier. Terminals are round (r 82) and overshoot cap line and baseline by
+10; the vertex sits at 55% of the height, not halfway. K/m kerns `-0.012em`, the wordmark tracks
+`-0.032em`. Clear space is the x-height. Minimum size is 15px of body — below that, only the K in its disc.
+
+**One accent** — amber on the high node. The low node is a terminal, not a second signal.
+
+**Type** — Space Grotesk 600 (headings and wordmark), IBM Plex Sans (body), JetBrains Mono (code,
+metrics, labels).
+
+**Colour** — ink `#05070E` → `#16203A`, borders `#1E2A45` / `#22314F`, text `#F2F6FF` down to `#6B7A96`.
+Blue `#5B9CFF` is primary, amber `#F5B54A` is the single accent, and Kotlin purple `#7F52FF` is reserved
+for platform references.
+
+**Don't** — separate "memo" from the K · make the low node amber · add gradients, shadows or outlines ·
+swap the typeface or alter the tracking · rotate, skew or stretch the K.
diff --git a/docs/brand/kmemo-favicon-512.png b/docs/brand/kmemo-favicon-512.png
new file mode 100644
index 0000000..0e77131
Binary files /dev/null and b/docs/brand/kmemo-favicon-512.png differ
diff --git a/docs/brand/kmemo-favicon-light.svg b/docs/brand/kmemo-favicon-light.svg
new file mode 100644
index 0000000..02ac05d
--- /dev/null
+++ b/docs/brand/kmemo-favicon-light.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/docs/brand/kmemo-favicon.svg b/docs/brand/kmemo-favicon.svg
new file mode 100644
index 0000000..c25d50a
--- /dev/null
+++ b/docs/brand/kmemo-favicon.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/docs/brand/kmemo-lockup-dark.svg b/docs/brand/kmemo-lockup-dark.svg
new file mode 100644
index 0000000..0d66aa9
--- /dev/null
+++ b/docs/brand/kmemo-lockup-dark.svg
@@ -0,0 +1,11 @@
+
diff --git a/docs/brand/kmemo-lockup-light.svg b/docs/brand/kmemo-lockup-light.svg
new file mode 100644
index 0000000..0a5c413
--- /dev/null
+++ b/docs/brand/kmemo-lockup-light.svg
@@ -0,0 +1,11 @@
+
diff --git a/docs/brand/kmemo-lockup-mono-dark.svg b/docs/brand/kmemo-lockup-mono-dark.svg
new file mode 100644
index 0000000..782353b
--- /dev/null
+++ b/docs/brand/kmemo-lockup-mono-dark.svg
@@ -0,0 +1,11 @@
+
diff --git a/docs/brand/kmemo-lockup-mono-light.svg b/docs/brand/kmemo-lockup-mono-light.svg
new file mode 100644
index 0000000..52726e2
--- /dev/null
+++ b/docs/brand/kmemo-lockup-mono-light.svg
@@ -0,0 +1,11 @@
+
diff --git a/docs/brand/kmemo-social-preview.png b/docs/brand/kmemo-social-preview.png
new file mode 100644
index 0000000..6b99326
Binary files /dev/null and b/docs/brand/kmemo-social-preview.png differ
diff --git a/docs/brand/kmemo-symbol-mono.svg b/docs/brand/kmemo-symbol-mono.svg
new file mode 100644
index 0000000..dba6b19
--- /dev/null
+++ b/docs/brand/kmemo-symbol-mono.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/docs/brand/kmemo-symbol.svg b/docs/brand/kmemo-symbol.svg
new file mode 100644
index 0000000..82d7b18
--- /dev/null
+++ b/docs/brand/kmemo-symbol.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/docs/brand/kmemo-tokens.css b/docs/brand/kmemo-tokens.css
new file mode 100644
index 0000000..4db4082
--- /dev/null
+++ b/docs/brand/kmemo-tokens.css
@@ -0,0 +1,72 @@
+:root {
+ /* Ink — dark first */
+ --kmemo-ink-950: #05070E;
+ --kmemo-ink-900: #080C18;
+ --kmemo-ink-850: #0B1020;
+ --kmemo-ink-800: #121A2E;
+ --kmemo-ink-700: #16203A;
+ --kmemo-border-600: #1E2A45;
+ --kmemo-border-500: #22314F;
+
+ /* Text */
+ --kmemo-text: #F2F6FF;
+ --kmemo-text-secondary: #C3CEE2;
+ --kmemo-text-muted: #94A3BE;
+ --kmemo-text-faint: #6B7A96;
+
+ /* Blue — primario */
+ --kmemo-blue-300: #BFD8FF;
+ --kmemo-blue-400: #7FB0FF;
+ --kmemo-blue-500: #5B9CFF;
+ --kmemo-blue-600: #3B82F6;
+ --kmemo-blue-700: #2563EB;
+
+ /* Amber — accento unico */
+ --kmemo-amber-300: #FFD79A;
+ --kmemo-amber-400: #F5B54A;
+ --kmemo-amber-500: #E09A26;
+
+ /* Kotlin purple — solo citazioni di piattaforma */
+ --kmemo-purple-500: #7F52FF;
+
+ /* Semantica cache */
+ --kmemo-hit: #3ED598;
+ --kmemo-below-threshold: #F5B54A;
+ --kmemo-rejected-guard: #FF6B6B;
+ --kmemo-verifier: #A78BFA;
+
+ /* Light mode derivato */
+ --kmemo-light-bg: #F7F9FD;
+ --kmemo-light-surface: #FFFFFF;
+ --kmemo-light-border: #DFE6F2;
+ --kmemo-light-text: #0B1020;
+ --kmemo-light-muted: #55637C;
+
+ /* Tipografia */
+ --kmemo-font-display: "Space Grotesk", system-ui, sans-serif;
+ --kmemo-font-body: "IBM Plex Sans", system-ui, sans-serif;
+ --kmemo-font-mono: "JetBrains Mono", ui-monospace, monospace;
+ --kmemo-tracking-display: -0.032em;
+
+ /* Spazio (base 4) */
+ --kmemo-space-1: 4px;
+ --kmemo-space-2: 8px;
+ --kmemo-space-3: 12px;
+ --kmemo-space-4: 16px;
+ --kmemo-space-6: 24px;
+ --kmemo-space-8: 32px;
+ --kmemo-space-12: 48px;
+ --kmemo-space-16: 64px;
+ --kmemo-space-24: 96px;
+
+ /* Raggi */
+ --kmemo-radius-sm: 6px;
+ --kmemo-radius-md: 10px;
+ --kmemo-radius-lg: 14px;
+ --kmemo-radius-xl: 20px;
+ --kmemo-radius-full: 999px;
+
+ /* Elevazione: nel dark è luce, non ombra */
+ --kmemo-elev-1: 0 0 0 1px var(--kmemo-border-500);
+ --kmemo-elev-2: 0 0 0 1px rgba(91,156,255,.08), 0 18px 40px -18px rgba(91,156,255,.35);
+}
diff --git a/docs/kmemo-hero.png b/docs/kmemo-hero.png
index f5b12f7..6b37ec6 100644
Binary files a/docs/kmemo-hero.png and b/docs/kmemo-hero.png differ