From 44649ca2361f867503c1198f00d8b6f9e30ec194 Mon Sep 17 00:00:00 2001
From: Nathanial Henniges <19924836+nathanialhenniges@users.noreply.github.com>
Date: Sat, 4 Apr 2026 01:13:41 -0500
Subject: [PATCH 1/2] chore: refresh docs visual identity and document release
checklist
- Update documentation fonts to Unbounded and Instrument Sans.
- Introduce "Midnight" theme utilities and waveform animations.
- Update hero gradients and glow effects for better visual consistency.
- Add a standardized release checklist to CLAUDE.md to guide versioning and deployment.
---
CLAUDE.md | 12 ++++++++++
apps/docs/app/global.css | 51 ++++++++++++++++++++++++++++++++--------
apps/docs/app/layout.tsx | 14 ++++++++---
3 files changed, 64 insertions(+), 13 deletions(-)
diff --git a/CLAUDE.md b/CLAUDE.md
index ec99410..19beaaf 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -138,3 +138,15 @@ Follows [Semantic Versioning (SemVer)](https://semver.org/) — `MAJOR.MINOR.PAT
- **PATCH** — Bug fixes, security patches, code quality improvements
Version is set in `MARKETING_VERSION` in `project.pbxproj` (4 occurrences). `CURRENT_PROJECT_VERSION` (build number) must also be incremented with each release — Sparkle uses it as the primary version comparator in appcast.xml. Git tags use `v` prefix (e.g., `v1.0.1`). The release workflow triggers on `v*` tag pushes. Homebrew cask, CHANGELOG.md, and GitHub Release notes must all be updated to match.
+
+### Release Checklist
+
+Run through every item before pushing the release tag.
+
+1. **`apps/native/wolfwave.xcodeproj/project.pbxproj`** — bump `MARKETING_VERSION` (4 occurrences) and `CURRENT_PROJECT_VERSION` (4 occurrences). Sparkle uses the build number as its primary comparator.
+2. **`CHANGELOG.md`** — add `## [X.Y.Z] - YYYY-MM-DD` entry in Keep-a-Changelog format.
+3. **`apps/docs/content/docs/changelog.mdx`** — add `## vX.Y.Z — Month DD, YYYY` entry in MDX format.
+4. **Push git tag** — `git tag vX.Y.Z && git push origin vX.Y.Z` — triggers the release workflow (builds, signs, notarizes, creates GitHub Release).
+5. **Homebrew cask** — auto-updated by `update_homebrew.yml` after the GitHub Release is created. Verify the workflow ran successfully.
+
+> After tagging, verify the GitHub Actions release workflow completes cleanly before announcing.
diff --git a/apps/docs/app/global.css b/apps/docs/app/global.css
index ac4e8de..9ec3d60 100644
--- a/apps/docs/app/global.css
+++ b/apps/docs/app/global.css
@@ -39,9 +39,17 @@
}
}
+/* Midnight background utilities */
+.bg-midnight {
+ background-color: #080810;
+}
+.bg-midnight-card {
+ background-color: #0e0e1a;
+}
+
/* Hero gradient text */
.gradient-text {
- background: linear-gradient(135deg, hsl(217 91% 60%), hsl(195 90% 55%), hsl(217 91% 60%));
+ background: linear-gradient(135deg, #7c3aed, #22d3ee, #a855f7);
background-size: 200% 200%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
@@ -64,21 +72,44 @@
height: 500px;
background: radial-gradient(
ellipse at center,
- hsla(217 91% 60% / 0.08) 0%,
- hsla(200 90% 55% / 0.04) 40%,
+ rgba(124, 58, 237, 0.12) 0%,
+ rgba(34, 211, 238, 0.05) 45%,
transparent 70%
);
pointer-events: none;
z-index: 0;
}
-.dark .hero-glow {
- background: radial-gradient(
- ellipse at center,
- hsla(217 91% 60% / 0.06) 0%,
- hsla(200 90% 55% / 0.03) 40%,
- transparent 70%
- );
+/* Waveform animation */
+.waveform {
+ display: flex;
+ align-items: center;
+ gap: 3px;
+ height: 48px;
+}
+
+.waveform-bar {
+ width: 4px;
+ border-radius: 2px;
+ background: linear-gradient(to top, #7c3aed, #22d3ee);
+ animation: wave-bounce var(--duration, 1.2s) ease-in-out infinite alternate;
+ animation-delay: var(--delay, 0s);
+ height: 6px;
+}
+
+@keyframes wave-bounce {
+ 0% { height: 6px; opacity: 0.4; }
+ 100% { height: var(--peak, 40px); opacity: 1; }
+}
+
+/* Now Playing card pulse */
+.now-playing-pulse {
+ animation: card-pulse 3s ease-in-out infinite;
+}
+
+@keyframes card-pulse {
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(124, 58, 237, 0); }
+ 50% { box-shadow: 0 0 30px 4px rgba(124, 58, 237, 0.25); }
}
/* Feature cards */
diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx
index af19354..35b9899 100644
--- a/apps/docs/app/layout.tsx
+++ b/apps/docs/app/layout.tsx
@@ -1,10 +1,18 @@
-import { Inter } from "next/font/google";
+import { Unbounded, Instrument_Sans } from "next/font/google";
import type { Metadata } from "next";
import { Provider } from "@/components/provider";
import "./global.css";
-const inter = Inter({
+const unbounded = Unbounded({
subsets: ["latin"],
+ variable: "--font-unbounded",
+ display: "swap",
+});
+
+const instrumentSans = Instrument_Sans({
+ subsets: ["latin"],
+ variable: "--font-instrument",
+ display: "swap",
});
export const metadata: Metadata = {
@@ -52,7 +60,7 @@ export const metadata: Metadata = {
export default function Layout({ children }: LayoutProps<"/">) {
return (
-
+
{children}
From 8e863f3ed6ccdb2d765aeac75bd5d8374a1db31d Mon Sep 17 00:00:00 2001
From: Nathanial Henniges <19924836+nathanialhenniges@users.noreply.github.com>
Date: Sat, 4 Apr 2026 01:17:07 -0500
Subject: [PATCH 2/2] feat(docs): redesign landing page as dark marketing page
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Full rewrite of the docs home page with a midnight-studio aesthetic
targeting streamers. Adds animated waveform bars, a pulsing Now Playing
card mockup, proof bar pills, ADHD-friendly copy, and a developer callout
section — alongside the already-committed font and CSS changes.
Co-Authored-By: Claude Sonnet 4.6
---
apps/docs/app/(home)/page.tsx | 433 +++++++++++++++++++++++++---------
1 file changed, 327 insertions(+), 106 deletions(-)
diff --git a/apps/docs/app/(home)/page.tsx b/apps/docs/app/(home)/page.tsx
index be673ed..92c6b9c 100644
--- a/apps/docs/app/(home)/page.tsx
+++ b/apps/docs/app/(home)/page.tsx
@@ -1,132 +1,282 @@
import Link from "next/link";
-import { Music, MessageSquare, Radio, Wifi, Shield, Cpu, Zap, Download, BookOpen, ArrowRight } from "lucide-react";
+import { MessageSquare, Radio, Wifi, Shield, Download, ArrowRight, Github } from "lucide-react";
import { getAssetPath } from "@/lib/utils";
+// Animated waveform bars — CSS-driven, no client JS needed
+function WaveformBars() {
+ const bars = [
+ { peak: "18px", duration: "0.9s", delay: "0s" },
+ { peak: "32px", duration: "1.1s", delay: "0.1s" },
+ { peak: "40px", duration: "1.3s", delay: "0.05s" },
+ { peak: "28px", duration: "0.8s", delay: "0.2s" },
+ { peak: "44px", duration: "1.2s", delay: "0.15s" },
+ { peak: "36px", duration: "1.0s", delay: "0.25s" },
+ { peak: "44px", duration: "1.4s", delay: "0.0s" },
+ { peak: "30px", duration: "0.95s", delay: "0.18s" },
+ { peak: "40px", duration: "1.15s", delay: "0.08s" },
+ { peak: "22px", duration: "1.05s", delay: "0.3s" },
+ { peak: "34px", duration: "0.85s", delay: "0.12s" },
+ { peak: "18px", duration: "1.25s", delay: "0.22s" },
+ ];
+ return (
+
+ {bars.map((bar, i) => (
+
+ ))}
+
+ );
+}
+
+// Pulsing "Now Playing" card mockup
+function NowPlayingCard() {
+ return (
+
+
+ {/* Album art placeholder */}
+
+
+
+ Blinding Lights
+
+
The Weeknd
+
+
+ {/* Progress bar */}
+
+
+ 2:07
+ 3:20
+
+
+ );
+}
+
const features = [
- {
- icon: Music,
- title: "Apple Music",
- description: "Real-time track detection via ScriptingBridge. Artist, title, album, and artwork — instantly.",
- color: "text-sky-500 dark:text-sky-400",
- bg: "bg-sky-500/10 dark:bg-sky-500/10",
- },
{
icon: MessageSquare,
title: "Twitch Chat Bot",
- description: "!song and !lastsong commands via Twitch's modern EventSub + Helix API. No deprecated IRC.",
- color: "text-blue-500 dark:text-blue-400",
- bg: "bg-blue-500/10 dark:bg-blue-500/10",
+ description:
+ "!song in chat shows exactly what's playing. Powered by Twitch's modern EventSub API.",
+ accent: "#7c3aed",
},
{
icon: Radio,
- title: "Discord Rich Presence",
- description: "\"Listening to Apple Music\" on your Discord profile with dynamic album art and playback progress.",
- color: "text-indigo-500 dark:text-indigo-400",
- bg: "bg-indigo-500/10 dark:bg-indigo-500/10",
+ title: "Discord Status",
+ description:
+ "Show \"Listening to Apple Music\" with album art and live progress. Like Spotify — but your library.",
+ accent: "#22d3ee",
},
{
icon: Wifi,
- title: "Now-Playing Widget",
- description: "Live now-playing data for OBS overlays, web widgets, and custom integrations via WebSocket.",
- color: "text-cyan-500 dark:text-cyan-400",
- bg: "bg-cyan-500/10 dark:bg-cyan-500/10",
+ title: "Stream Overlay",
+ description:
+ "Live now-playing data over WebSocket. Drop it into OBS, browser source, or your custom widget.",
+ accent: "#a855f7",
+ },
+ {
+ icon: Shield,
+ title: "Privacy First",
+ description:
+ "All tokens in macOS Keychain. App Sandboxed. Nothing phoned home. Your music stays yours.",
+ accent: "#7c3aed",
},
] as const;
const steps = [
- { number: "1", title: "Download", description: "Grab the latest DMG from GitHub Releases." },
- { number: "2", title: "Configure", description: "Follow the onboarding wizard to connect Twitch, Discord, and your overlays." },
- { number: "3", title: "Enjoy", description: "Play music and it shows up on Twitch, Discord, and your widgets automatically." },
-] as const;
-
-const highlights = [
- { icon: Zap, title: "Zero Dependencies", description: "Built entirely with native Apple frameworks. No Electron, no bloat." },
- { icon: Shield, title: "Secure by Default", description: "All tokens in macOS Keychain. App Sandbox enabled. Hardened Runtime." },
- { icon: Cpu, title: "Modern APIs", description: "Twitch EventSub + Helix, Discord IPC, and ScriptingBridge. No workarounds." },
+ {
+ number: "1",
+ title: "Download",
+ description: "Grab the DMG from GitHub Releases. Under 10MB.",
+ },
+ {
+ number: "2",
+ title: "Connect",
+ description: "One-time setup wizard links Twitch, Discord, and OBS.",
+ },
+ {
+ number: "3",
+ title: "Stream",
+ description: "Hit play. Everything updates automatically.",
+ },
] as const;
export default function HomePage() {
return (
-
- {/* Hero Section */}
-
+
+ {/* Hero */}
+
-
-
-
-
-
-
-
- Your Music,
-
- Everywhere.
-
-
- Native macOS menu bar app that shares your Apple Music with Twitch,
- Discord, and now-playing widgets. Fast, lightweight, and private.
-
-
-
-
- Get WolfWave
-
-
-
- Documentation
-
+
+
+ {/* Left: text */}
+
+ {/* Version badge */}
+
+
+ v1.2.0 — Free & Open Source
+
+
+
+ Your Music,
+
+ Live Everywhere.
+
+
+
+ macOS menu bar app. Apple Music plays — Twitch chat, Discord,
+ and your stream overlay all update. Automatically.
+
+
+
+
+
+ {/* Right: visual */}
+
- {/* Features Grid */}
-
+ {/* Proof bar */}
+
+
+ {["Free Forever", "macOS 14+", "No Account Needed", "~10MB", "Open Source"].map((pill) => (
+
+ {pill}
+
+ ))}
+
+
+
+ {/* Features */}
+
-
+
+ Everything a streamer needs
+
+
+ One app. Four integrations. Zero monthly fees.
+
+
{features.map((feature) => (
-
-
-
-
-
- {feature.title}
-
-
- {feature.description}
-
+
+
+
+ {feature.title}
+
+
+ {feature.description}
+
))}
- {/* Get Started Steps */}
-
-
-
- Get Started in Minutes
+ {/* How it works */}
+
+
+
+ Up and running in 3 steps
+
+ No terminal. No config files. Just click through the wizard.
+
{steps.map((step) => (
-
-
+
+
{step.number}
-
+
{step.title}
-
+
{step.description}
@@ -135,34 +285,105 @@ export default function HomePage() {
- {/* Why WolfWave */}
-
-
-
- Built for Performance
-
-
- {highlights.map((item) => (
-
-
-
-
-
- {item.title}
-
-
- {item.description}
+ {/* For Developers */}
+
+
+
+
+
+ {"{}"}
+
+
+
+ For Developers
+
+
+ Open source, zero external dependencies, native Swift. The WebSocket API is
+ fully documented — build your own overlay, integrate with anything, or just
+ poke around.
+
+
+ Architecture
+
+
+
+ Development Guide
+
+
+
+ Security
+
+
+
- ))}
+
+
+
+
+
+ {/* CTA Footer */}
+
+
+ {/* Logo */}
+
+
+
+
-
+
+ Start streaming smarter.
+
+
+ Free forever. No account. Just music.
+
+
+
+
+ Download WolfWave
+
- Explore the documentation
-
+ Read the Docs
+