Rebrand Wownero Moon Launch → Such Moon Launch

Visible-name rebrand for the game ahead of Play Store + App Store launch.
The Wownero theme stays in the game itself; this is purely about the
product name.

- Rename slug: /products/wownero-moon-launch → /products/such-moon-launch
- Rename blog post file + flip from draft → published with rewritten
  origin story (first game ever → Tabby Labs test app → full rebuild
  with tilt-to-steer controls + 11 levels)
- New "The Story" section on the product page
- StoreButtons: accept null href to render disabled "Coming Soon"
  buttons; add SuchMoonLaunchStoreButtons preset (Google + Apple null
  pending review, web link present, itch removed — no itch page exists)
- Add Such Moon Launch entry to /apps with coming-soon store buttons
- Bump privacy + terms last-updated dates to May 18, 2026
- Theme color: orange → amber to match the new brand palette
- Sweep all remaining "Wownero Moon Launch" / "wownero-moon-launch"
  references in product listing, sitemap, top-level privacy index, and
  website-relaunch blog post
This commit is contained in:
jwinterm
2026-05-18 09:59:23 -04:00
parent a6dc211ef6
commit d2ee3ffb55
11 changed files with 186 additions and 122 deletions
+13
View File
@@ -19,6 +19,19 @@ export const metadata: Metadata = {
};
const apps = [
{
name: "Such Moon Launch",
tagline: "Vry rocket. Much landing. Wow!",
icon: "/images/products/such-moon-launch.png",
color: "text-amber-600 dark:text-amber-400",
borderColor: "border-amber-500/20",
href: "/products/such-moon-launch",
links: [
// null = render disabled "Coming Soon" button; flip to real URLs once live.
{ platform: "google" as const, href: null },
{ platform: "apple" as const, href: null },
],
},
{
name: "Vegan IQ",
tagline: "Plant-based trivia backed by real data",
+1 -1
View File
@@ -37,7 +37,7 @@ export default function PrivacyPage() {
<li><Link href="/products/vegan-iq/privacy" className="text-blue-600 dark:text-blue-400 hover:underline">Vegan IQ Privacy Policy</Link></li>
<li><Link href="/products/bauhaus-echo/privacy" className="text-blue-600 dark:text-blue-400 hover:underline">Bauhaus Echo Privacy Policy</Link></li>
<li><Link href="/products/suchoice/privacy" className="text-blue-600 dark:text-blue-400 hover:underline">Suchoice Privacy Policy</Link></li>
<li><Link href="/products/wownero-moon-launch/privacy" className="text-blue-600 dark:text-blue-400 hover:underline">Wownero Moon Launch Privacy Policy</Link></li>
<li><Link href="/products/such-moon-launch/privacy" className="text-blue-600 dark:text-blue-400 hover:underline">Such Moon Launch Privacy Policy</Link></li>
</ul>
</section>
+5 -5
View File
@@ -8,7 +8,7 @@ import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Products | Such Software",
description: "Tools and applications built by Such Software. Neroswap, Webshops, Custom Websites, Smirk Wallet, Bauhaus Echo, Suchoice, Vegan IQ, and Wownero Moon Launch.",
description: "Tools and applications built by Such Software. Neroswap, Webshops, Custom Websites, Smirk Wallet, Bauhaus Echo, Suchoice, Vegan IQ, and Such Moon Launch.",
alternates: { canonical: "/products" },
openGraph: {
title: "Products | Such Software",
@@ -68,10 +68,10 @@ const products = [
icon: "/images/products/vegan-iq.png",
},
{
slug: "wownero-moon-launch",
title: "Wownero Moon Launch",
description: "Crypto-themed space landing game. 11 levels, 4 weapons, endless mode. Android, iOS, Web, Desktop.",
color: "orange",
slug: "such-moon-launch",
title: "Such Moon Launch",
description: "Vry rocket. Much landing. Wow! Wownero-themed pixel rocket arcade. 11 levels, 4 weapons, tilt-to-steer, endless mode. Android, iOS, Web, Desktop.",
color: "amber",
icon: "/images/products/such-moon-launch.png",
},
];
@@ -1,17 +1,17 @@
import { Header } from "@/components/layout/header";
import { MobileNav } from "@/components/layout/mobile-nav";
import { Card } from "@repo/ui/components/card";
import { Button } from "@repo/ui/components/button";
import { SuchMoonLaunchStoreButtons } from "@/components/store-buttons";
import Link from "next/link";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Wownero Moon Launch | Such Software",
description: "Crypto-themed space landing game. Fly your rocket across the solar system, dodge hazards, collect crypto, upgrade your ship. Android, iOS, Web, Desktop.",
alternates: { canonical: "/products/wownero-moon-launch" },
title: "Such Moon Launch | Such Software",
description: "Vry rocket. Much landing. Wow! A pixel-art rocket-flying arcade with 11 levels, 4 weapons, and an endless mode. Wownero-themed. Android, iOS, Web, Desktop.",
alternates: { canonical: "/products/such-moon-launch" },
openGraph: {
title: "Wownero Moon Launch | Such Software",
description: "Crypto-themed space landing game. Fly your rocket across the solar system, dodge hazards, collect crypto, upgrade your ship. Android, iOS, Web, Desktop.",
title: "Such Moon Launch | Such Software",
description: "Vry rocket. Much landing. Wow! A pixel-art rocket-flying arcade with 11 levels, 4 weapons, and an endless mode. Wownero-themed.",
type: "website",
},
};
@@ -38,7 +38,7 @@ const weapons = [
{ name: "💥 EMP", description: "Area blast, destroys all nearby enemies" },
];
export default function WowneroMoonLaunchPage() {
export default function SuchMoonLaunchPage() {
return (
<main className="relative min-h-screen flex flex-col items-center bg-background text-foreground">
<Header />
@@ -47,34 +47,46 @@ export default function WowneroMoonLaunchPage() {
← Back to Products
</Link>
<h1 className="text-4xl md:text-5xl font-bold mb-6 text-orange-600 dark:text-orange-400">
Wownero Moon Launch
<h1 className="text-4xl md:text-5xl font-bold mb-2 text-amber-600 dark:text-amber-400">
Such Moon Launch
</h1>
<p className="text-base text-muted-foreground mb-6">Vry rocket. Much landing. Wow!</p>
<div className="prose dark:prose-invert max-w-none mb-12">
<div className="prose dark:prose-invert max-w-none mb-8">
<p className="text-xl text-muted-foreground leading-relaxed">
A crypto-themed space landing game. Fly your rocket across the solar system, dodge
Martians, asteroids, gamma rays, and black holes. Collect crypto, upgrade your ship,
and unlock 13 ship skins. 11 story levels plus a procedural endless mode.
A Wownero-themed pixel-art rocket arcade. Fly across the solar system, dodge Martians,
asteroids, gamma rays, and black holes. Collect crypto, upgrade your ship, and unlock
13 ship skins. 11 story levels plus a procedural endless mode — with tilt-to-steer
controls on mobile.
</p>
</div>
<div className="flex flex-wrap gap-4 mb-12">
<a href="https://moonlaunch.such.software" target="_blank" rel="noopener noreferrer">
<Button size="lg">Play on Web</Button>
</a>
<a href="https://suchsoftware.itch.io/wownero-moon-launch" target="_blank" rel="noopener noreferrer">
<Button variant="outline" size="lg">
Play on itch.io
</Button>
</a>
<p className="flex items-center text-sm text-muted-foreground">
Google Play &amp; App Store — Coming Soon
<div className="mb-12">
<SuchMoonLaunchStoreButtons />
</div>
<h2 className="text-2xl font-bold mb-6">The Story</h2>
<div className="section-container border-l-4 border-amber-500 mb-12 text-muted-foreground space-y-4">
<p>
Such Moon Launch is the greatly expanded re-release of <strong>the very first game I ever wrote</strong>.
The original — <em>Meowlet Moon Launch</em> — was a single-level rocket-landing prototype
published years ago as a test app under our old <strong>Tabby Labs</strong> developer account.
One level, simple physics, no music, no juice. But it shipped, and people played it.
</p>
<p>
This release is a near-complete rebuild. 11 hand-tuned story levels across the solar system,
a procedural endless mode, 4 weapons, 8 ship upgrades, 13 skins, achievements on Google Play
Games and Apple Game Center, cloud save, a global leaderboard backend, a 3D landing
mini-game on final approach, and proper <strong>tilt-to-steer</strong> controls calibrated
for phones — no drift, no fight. All wrapped in a Wownero-themed pixel-art aesthetic.
</p>
<p>
Same rocket, same Moon. Almost everything else is new.
</p>
</div>
<h2 className="text-2xl font-bold mb-6">How It Works</h2>
<div className="section-container border-l-4 border-orange-500 mb-12">
<div className="section-container border-l-4 border-amber-500 mb-12">
<ol className="space-y-4 text-muted-foreground">
<li><strong>1. Launch</strong> — Blast off from Earth with limited fuel.</li>
<li><strong>2. Navigate</strong> — Fly through space, dodging hazards and collecting crypto.</li>
@@ -86,7 +98,7 @@ export default function WowneroMoonLaunchPage() {
<h2 className="text-2xl font-bold mb-6">11 Levels + Endless Mode</h2>
<div className="grid md:grid-cols-3 gap-4 mb-12">
{levels.map((level) => (
<Card key={level.name} className="glass-card border-orange-500/20">
<Card key={level.name} className="glass-card border-amber-500/20">
<h3 className="font-bold mb-1">{level.name}</h3>
<p className="text-sm text-muted-foreground">{level.description}</p>
</Card>
@@ -96,7 +108,7 @@ export default function WowneroMoonLaunchPage() {
<h2 className="text-2xl font-bold mb-6">Weapons</h2>
<div className="grid md:grid-cols-2 gap-6 mb-12">
{weapons.map((weapon) => (
<Card key={weapon.name} className="glass-card border-orange-500/20">
<Card key={weapon.name} className="glass-card border-amber-500/20">
<h3 className="text-lg font-bold mb-2">{weapon.name}</h3>
<p className="text-muted-foreground">{weapon.description}</p>
</Card>
@@ -105,46 +117,46 @@ export default function WowneroMoonLaunchPage() {
<h2 className="text-2xl font-bold mb-6">Features</h2>
<div className="grid md:grid-cols-3 gap-6 mb-12">
<Card className="glass-card border-orange-500/20">
<Card className="glass-card border-amber-500/20">
<h3 className="font-bold mb-2">13 Ship Skins</h3>
<p className="text-sm text-muted-foreground">8 purchasable + 4 achievement unlocks + default</p>
</Card>
<Card className="glass-card border-orange-500/20">
<Card className="glass-card border-amber-500/20">
<h3 className="font-bold mb-2">8 Ship Upgrades</h3>
<p className="text-sm text-muted-foreground">Thrust, fuel, shield, armor, landing gear, magnet, and more</p>
</Card>
<Card className="glass-card border-orange-500/20">
<Card className="glass-card border-amber-500/20">
<h3 className="font-bold mb-2">Star Ratings</h3>
<p className="text-sm text-muted-foreground">1–3 stars per level based on time and fuel</p>
</Card>
<Card className="glass-card border-orange-500/20">
<Card className="glass-card border-amber-500/20">
<h3 className="font-bold mb-2">Global Leaderboards</h3>
<p className="text-sm text-muted-foreground">Per-level rankings across all platforms</p>
</Card>
<Card className="glass-card border-orange-500/20">
<Card className="glass-card border-amber-500/20">
<h3 className="font-bold mb-2">Cloud Save</h3>
<p className="text-sm text-muted-foreground">Progress synced to our backend, restore anytime</p>
</Card>
<Card className="glass-card border-orange-500/20">
<Card className="glass-card border-amber-500/20">
<h3 className="font-bold mb-2">Cross-Platform</h3>
<p className="text-sm text-muted-foreground">Android, iOS, Web, Windows, macOS, Linux</p>
</Card>
<Card className="glass-card border-orange-500/20">
<Card className="glass-card border-amber-500/20">
<h3 className="font-bold mb-2">3D Landing Mode</h3>
<p className="text-sm text-muted-foreground">Final approach in 3D with cockpit HUD</p>
</Card>
<Card className="glass-card border-orange-500/20">
<Card className="glass-card border-amber-500/20">
<h3 className="font-bold mb-2">Warp Tunnel</h3>
<p className="text-sm text-muted-foreground">Hyperspace transition between levels</p>
</Card>
<Card className="glass-card border-orange-500/20">
<Card className="glass-card border-amber-500/20">
<h3 className="font-bold mb-2">Crypto Theme</h3>
<p className="text-sm text-muted-foreground">WOW, XMR, BTC, DOGE collectibles as in-game currency</p>
</Card>
</div>
<h2 className="text-2xl font-bold mb-6">Space Hazards</h2>
<div className="section-container border-l-4 border-orange-500 mb-12">
<div className="section-container border-l-4 border-amber-500 mb-12">
<ul className="space-y-2 text-muted-foreground">
<li><strong>Martians</strong> — enemy ships that chase your rocket</li>
<li><strong>Gamma Rays</strong> — periodic lethal beams across the level</li>
@@ -156,11 +168,11 @@ export default function WowneroMoonLaunchPage() {
</div>
<div className="flex items-center gap-4 text-sm text-muted-foreground">
<Link href="/products/wownero-moon-launch/privacy" className="hover:text-foreground transition-colors">
<Link href="/products/such-moon-launch/privacy" className="hover:text-foreground transition-colors">
Privacy Policy
</Link>
<span>•</span>
<Link href="/products/wownero-moon-launch/terms" className="hover:text-foreground transition-colors">
<Link href="/products/such-moon-launch/terms" className="hover:text-foreground transition-colors">
Terms of Service
</Link>
<span>•</span>
@@ -4,29 +4,29 @@ import Link from "next/link";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Privacy Policy | Wownero Moon Launch | Such Software",
description: "Privacy policy for Wownero Moon Launch mobile game. GDPR and CPRA compliant.",
alternates: { canonical: "/products/wownero-moon-launch/privacy" },
title: "Privacy Policy | Such Moon Launch | Such Software",
description: "Privacy policy for Such Moon Launch mobile game. GDPR and CPRA compliant.",
alternates: { canonical: "/products/such-moon-launch/privacy" },
};
export default function WowneroMoonLaunchPrivacyPage() {
export default function SuchMoonLaunchPrivacyPage() {
return (
<main className="relative min-h-screen flex flex-col items-center bg-background text-foreground">
<Header />
<div id="main-content" className="z-10 w-full max-w-4xl mx-auto py-20 px-4 pb-24 md:pb-20">
<Link href="/products/wownero-moon-launch" className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-flex items-center gap-2 transition-colors">
← Back to Wownero Moon Launch
<Link href="/products/such-moon-launch" className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-flex items-center gap-2 transition-colors">
← Back to Such Moon Launch
</Link>
<div className="glass-card mt-6">
<header className="mb-8 pb-6 border-b border-border">
<h1 className="text-3xl md:text-4xl font-bold">Privacy Policy for Wownero Moon Launch</h1>
<p className="text-muted-foreground mt-2">Last Updated: March 12, 2026</p>
<h1 className="text-3xl md:text-4xl font-bold">Privacy Policy for Such Moon Launch</h1>
<p className="text-muted-foreground mt-2">Last Updated: May 18, 2026</p>
</header>
<div className="prose dark:prose-invert max-w-none">
<p>
<strong>Such Software LLC</strong> (&quot;we,&quot; &quot;us,&quot; or &quot;our&quot;) operates the Wownero Moon Launch
<strong>Such Software LLC</strong> (&quot;we,&quot; &quot;us,&quot; or &quot;our&quot;) operates the Such Moon Launch
application (the &quot;App&quot;). This page informs you of our policies regarding the collection,
use, and disclosure of personal data when you use our App.
</p>
@@ -197,7 +197,7 @@ export default function WowneroMoonLaunchPrivacyPage() {
<h2>Cryptocurrency</h2>
<p>
Wownero Moon Launch is a <strong>crypto-themed game</strong>. The in-game collectibles (WOW, XMR, BTC, DOGE)
Such Moon Launch is a <strong>crypto-themed game</strong>. The in-game collectibles (WOW, XMR, BTC, DOGE)
are purely virtual game items with no real-world monetary value. The App does not:
</p>
<ul>
@@ -236,7 +236,7 @@ export default function WowneroMoonLaunchPrivacyPage() {
<strong>Opt out of personalized ads</strong> via your device settings:
<ul>
<li>Android: Settings → Google → Ads → Opt out of Ads Personalization</li>
<li>iOS: Settings → Privacy → Tracking → Disable tracking for Wownero Moon Launch</li>
<li>iOS: Settings → Privacy → Tracking → Disable tracking for Such Moon Launch</li>
</ul>
</li>
<li><strong>Request deletion</strong> of your leaderboard or cloud save data by contacting us</li>
@@ -288,7 +288,7 @@ export default function WowneroMoonLaunchPrivacyPage() {
<hr />
<h2>Consent</h2>
<p>By using Wownero Moon Launch, you consent to this Privacy Policy.</p>
<p>By using Such Moon Launch, you consent to this Privacy Policy.</p>
</div>
</div>
</div>
@@ -4,29 +4,29 @@ import Link from "next/link";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Terms of Service | Wownero Moon Launch | Such Software",
description: "Terms of service for Wownero Moon Launch mobile game.",
alternates: { canonical: "/products/wownero-moon-launch/terms" },
title: "Terms of Service | Such Moon Launch | Such Software",
description: "Terms of service for Such Moon Launch mobile game.",
alternates: { canonical: "/products/such-moon-launch/terms" },
};
export default function WowneroMoonLaunchTermsPage() {
export default function SuchMoonLaunchTermsPage() {
return (
<main className="relative min-h-screen flex flex-col items-center bg-background text-foreground">
<Header />
<div id="main-content" className="z-10 w-full max-w-4xl mx-auto py-20 px-4 pb-24 md:pb-20">
<Link href="/products/wownero-moon-launch" className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-flex items-center gap-2 transition-colors">
← Back to Wownero Moon Launch
<Link href="/products/such-moon-launch" className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-flex items-center gap-2 transition-colors">
← Back to Such Moon Launch
</Link>
<div className="glass-card mt-6">
<header className="mb-8 pb-6 border-b border-border">
<h1 className="text-3xl md:text-4xl font-bold">Terms of Service for Wownero Moon Launch</h1>
<p className="text-muted-foreground mt-2">Last Updated: March 12, 2026</p>
<h1 className="text-3xl md:text-4xl font-bold">Terms of Service for Such Moon Launch</h1>
<p className="text-muted-foreground mt-2">Last Updated: May 18, 2026</p>
</header>
<div className="prose dark:prose-invert max-w-none">
<p>
These Terms of Service (&quot;Terms&quot;) govern your use of the Wownero Moon Launch application
These Terms of Service (&quot;Terms&quot;) govern your use of the Such Moon Launch application
(the &quot;App&quot;) operated by <strong>Such Software LLC</strong> (&quot;we,&quot; &quot;us,&quot; or &quot;our&quot;).
By downloading, installing, or using the App, you agree to be bound by these Terms.
</p>
@@ -35,7 +35,7 @@ export default function WowneroMoonLaunchTermsPage() {
<h2>1. Use of the App</h2>
<p>
Wownero Moon Launch is a video game provided for entertainment purposes. You may use the App
Such Moon Launch is a video game provided for entertainment purposes. You may use the App
on any supported device for personal, non-commercial use.
</p>
<p>You agree not to:</p>
@@ -100,7 +100,7 @@ export default function WowneroMoonLaunchTermsPage() {
<p>
You may remove ads by purchasing the &quot;Remove Ads&quot; upgrade within the App.
Ad display is subject to our{" "}
<Link href="/products/wownero-moon-launch/privacy">Privacy Policy</Link>.
<Link href="/products/such-moon-launch/privacy">Privacy Policy</Link>.
</p>
<hr />
+1 -1
View File
@@ -14,7 +14,7 @@ export default function sitemap(): MetadataRoute.Sitemap {
{ url: `${base}/products/bauhaus-echo`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.8 },
{ url: `${base}/products/vegan-iq`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.8 },
{ url: `${base}/products/suchoice`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.7 },
{ url: `${base}/products/wownero-moon-launch`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.7 },
{ url: `${base}/products/such-moon-launch`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.7 },
{ url: `${base}/services`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.9 },
{ url: `${base}/about`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.7 },
{ url: `${base}/support`, lastModified: new Date(), changeFrequency: "monthly", priority: 0.5 },
+27 -1
View File
@@ -5,7 +5,8 @@ import { Button } from "@repo/ui/components/button";
type StoreLink = {
platform: "apple" | "google";
href: string;
/** Live store URL, or `null` to render a disabled "Coming Soon" button. */
href: string | null;
};
type StoreButtonsProps = {
@@ -23,6 +24,14 @@ export function StoreButtons({ links, extraLinks }: StoreButtonsProps) {
<div className="flex flex-wrap gap-4 not-prose">
{links.map(({ platform, href }) => {
const { icon: Icon, label } = platformConfig[platform];
if (href === null) {
return (
<Button key={platform} variant="outline" size="lg" disabled>
<Icon className="h-5 w-5 mr-2" aria-hidden="true" />
{label} — Coming Soon
</Button>
);
}
return (
<a key={platform} href={href} target="_blank" rel="noopener noreferrer">
<Button variant="outline" size="lg">
@@ -62,6 +71,23 @@ export function SuchoiceStoreButtons() {
);
}
export function SuchMoonLaunchStoreButtons() {
// Both stores submitted 2026-05-18; pending review. Flip null → real URLs
// once the app is live (Apple assigns the appstore.com /id<NUM> at first
// approval; Google URL is predictable as id=com.suchsoftware.suchmoonlaunch).
return (
<StoreButtons
links={[
{ platform: "google", href: null },
{ platform: "apple", href: null },
]}
extraLinks={[
{ href: "https://moonlaunch.such.software", label: "Play on Web" },
]}
/>
);
}
export function BauhausEchoStoreButtons() {
return (
<StoreButtons