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 ( +