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