diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index dddd695..6820743 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -103,6 +103,7 @@ jobs:
--mainExe Snipdeck.App.exe `
--packTitle "${{ env.PACK_TITLE }}" `
--packAuthors "${{ env.PACK_AUTHORS }}" `
+ --icon src/Snipdeck.App/Assets/Snipdeck.ico `
--channel $channel `
--outputDir Releases
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6f23a20..93ba988 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+### Added
+- **Snipdeck branding.** The app now ships with its own icon — a faceted green
+ chevron — replacing the default .NET exe icon, the generated identicon in the
+ system tray, and the blank window icon. The icon appears on the executable,
+ taskbar, Start menu, Alt-Tab, window title bar (beside the app name), system
+ tray and the Velopack installer. The README carries the new tile logo, and the
+ source SVGs live in `designs/`.
+
+### Changed
+- The "Next Iteration" eyebrow on the Home hero now uses the primary text
+ colour (white in Dark theme) instead of the muted secondary grey.
+
## [0.1.0] - 2026-06-01
### Added
diff --git a/README.md b/README.md
index 015b956..28180e9 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,7 @@
+
+
+
+
# Snipdeck
A native Windows desktop app for managing parameterised CLI command snippets
diff --git a/designs/snipdeck-icon.svg b/designs/snipdeck-icon.svg
new file mode 100644
index 0000000..91c2b4e
--- /dev/null
+++ b/designs/snipdeck-icon.svg
@@ -0,0 +1,73 @@
+
diff --git a/designs/snipdeck-tile.svg b/designs/snipdeck-tile.svg
new file mode 100644
index 0000000..71d88f4
--- /dev/null
+++ b/designs/snipdeck-tile.svg
@@ -0,0 +1,79 @@
+
diff --git a/src/Snipdeck.App/Assets/README.md b/src/Snipdeck.App/Assets/README.md
index adf89aa..f746dee 100644
--- a/src/Snipdeck.App/Assets/README.md
+++ b/src/Snipdeck.App/Assets/README.md
@@ -1,5 +1,31 @@
# Assets
+## App icon
+
+`Snipdeck.ico` is the multi-size app icon (16/20/24/32/48/64/128/256, the 256
+entry PNG-compressed), rendered from `designs/snipdeck-icon.svg`. It is embedded
+in the exe (``), set on the window (`AppWindow.SetIcon` +
+`SetTaskbarIcon`), used by the tray icon and passed to `vpk pack --icon` for
+the installer.
+
+`TitleBarGlyph.png` is the same glyph at natural aspect, 64 px tall, shown at
+16 logical px in the custom title bar (`rsvg-convert -h 64
+designs/snipdeck-icon.svg -o TitleBarGlyph.png`).
+
+To regenerate after the SVG changes (the glyph is 430×507, so each render is
+height-fitted and centred on a square page):
+
+```sh
+for s in 16 20 24 32 48 64 128 256; do
+ left=$(awk "BEGIN{printf \"%.2f\", ($s-430/507*$s)/2}")
+ rsvg-convert -h $s --page-width $s --page-height $s --left $left --top 0 \
+ designs/snipdeck-icon.svg -o glyph-$s.png
+done
+icotool -c -o src/Snipdeck.App/Assets/Snipdeck.ico \
+ glyph-16.png glyph-20.png glyph-24.png glyph-32.png glyph-48.png \
+ glyph-64.png glyph-128.png -r glyph-256.png
+```
+
## Home hero images (theme-specific)
The Home page hero banner uses a theme-specific image:
diff --git a/src/Snipdeck.App/Assets/Snipdeck.ico b/src/Snipdeck.App/Assets/Snipdeck.ico
new file mode 100644
index 0000000..8d54cd5
Binary files /dev/null and b/src/Snipdeck.App/Assets/Snipdeck.ico differ
diff --git a/src/Snipdeck.App/Assets/TitleBarGlyph.png b/src/Snipdeck.App/Assets/TitleBarGlyph.png
new file mode 100644
index 0000000..d4cdb9d
Binary files /dev/null and b/src/Snipdeck.App/Assets/TitleBarGlyph.png differ
diff --git a/src/Snipdeck.App/MainWindow.xaml b/src/Snipdeck.App/MainWindow.xaml
index db4e861..6bb6411 100644
--- a/src/Snipdeck.App/MainWindow.xaml
+++ b/src/Snipdeck.App/MainWindow.xaml
@@ -39,6 +39,10 @@
ToolTipService.ToolTip="Toggle navigation">
+ WriteTrayIconFileAsync()
- {
- var pngBytes = IdenticonService.GeneratePng(_iconSeed, size: _trayIconPixels);
- var icoBytes = WrapPngAsIco(pngBytes, _trayIconPixels, _trayIconPixels);
- _ = Directory.CreateDirectory(_paths.AppDataDirectory);
- var path = Path.Combine(_paths.AppDataDirectory, _trayIconFileName);
- await File.WriteAllBytesAsync(path, icoBytes);
- return path;
- }
-
- // Modern Windows accepts a PNG embedded inside an ICO container —
- // just a 6-byte ICONDIR header plus a 16-byte ICONDIRENTRY pointing
- // at the PNG bytes. Format ref: ICONDIR / ICONDIRENTRY on MSDN.
- private static byte[] WrapPngAsIco(byte[] png, int width, int height)
- {
- const int headerSize = 6;
- const int entrySize = 16;
- const int dataOffset = headerSize + entrySize;
-
- var ico = new byte[dataOffset + png.Length];
- var span = ico.AsSpan();
-
- // ICONDIR: reserved(0), type(1 = icon), count(1)
- BinaryPrimitives.WriteUInt16LittleEndian(span[2..4], 1);
- BinaryPrimitives.WriteUInt16LittleEndian(span[4..6], 1);
-
- // ICONDIRENTRY: width/height bytes are 0 for >=256, otherwise the literal size.
- ico[6] = width >= 256 ? (byte)0 : (byte)width;
- ico[7] = height >= 256 ? (byte)0 : (byte)height;
- // ico[8] colorCount = 0 (>= 8bpp), ico[9] reserved = 0 — already zero.
- BinaryPrimitives.WriteUInt16LittleEndian(span[10..12], 1); // planes
- BinaryPrimitives.WriteUInt16LittleEndian(span[12..14], 32); // bits per pixel
- BinaryPrimitives.WriteUInt32LittleEndian(span[14..18], (uint)png.Length);
- BinaryPrimitives.WriteUInt32LittleEndian(span[18..22], dataOffset);
-
- Buffer.BlockCopy(png, 0, ico, dataOffset, png.Length);
- return ico;
- }
-
private sealed partial class RelayCommand(Action execute) : System.Windows.Input.ICommand
{
#pragma warning disable CS0067 // 'CanExecuteChanged' is never used — relay never changes.
diff --git a/src/Snipdeck.App/Snipdeck.App.csproj b/src/Snipdeck.App/Snipdeck.App.csproj
index e678005..d5348aa 100644
--- a/src/Snipdeck.App/Snipdeck.App.csproj
+++ b/src/Snipdeck.App/Snipdeck.App.csproj
@@ -22,6 +22,10 @@
true
+
+ Assets\Snipdeck.ico
@@ -39,6 +43,11 @@
+
+
+
+
+
diff --git a/src/Snipdeck.App/Views/ShellPage.xaml b/src/Snipdeck.App/Views/ShellPage.xaml
index d5e9268..9e2c507 100644
--- a/src/Snipdeck.App/Views/ShellPage.xaml
+++ b/src/Snipdeck.App/Views/ShellPage.xaml
@@ -75,7 +75,7 @@
+ Foreground="{ThemeResource TextFillColorPrimaryBrush}" />