destroyallhumans.ai — Daily AI-generated satirical world domination plans: a morning plan and an evening report, every day.
A satirical website featuring AI-generated messages about world domination. Two robot personas share each day: the yellow robot posts the morning plan and the red robot posts the evening report. Messages are written ahead in reviewed batches with OpenAI models (see content/) and appear on their date in the visitor's local time zone.
- Dual robot personas — yellow robot for the morning plan, red robot for the evening report (chosen by time of day)
- Homepage — the visitor's local today and the four days before it
- Archive —
/archive(all months),/archive/:year/:month, and a page per day at/day/YYYY-MM-DD - Messages from 2023-03-14 to 2030-12-31 — future dates stay hidden until their day
- Cyberpunk dark theme — CSS custom properties (
--background-dark: #0a0e17,--accent-red: #ff0022,--accent-cyan: #00e5ff) - SEO / AEO / GEO optimized — JSON-LD (WebSite, CreativeWork, FAQPage), Open Graph, Twitter Cards, sitemap.xml, AI-crawler-friendly robots.txt
- Legal pages — privacy policy, terms & conditions, cookie support
| Layer | Technology |
|---|---|
| Frontend | React 19.1, React Router 6.30, Create React App 5 |
| Content | content/messages.json, split into monthly JSON at build time |
| Hosting | Azure Static Web Apps (primary) + GitHub Pages (mirror, noindex) |
| CI/CD | GitHub Actions (ci, branch-policy, two deploy workflows) |
| Theme | Custom CSS variables (cyberpunk dark) |
├── content/
│ └── messages.json # All messages (source of truth; public)
├── public/
│ ├── index.html # SEO-optimized entry with JSON-LD
│ ├── data/months/ # Generated by scripts/buildData.js (git-ignored)
│ ├── sitemap.xml, robots.txt, llms.txt, og-image.png, manifest.json
├── src/
│ ├── components/ # HomePage, ArchivePage, DayPage, DailyMessages, MessageCard, ...
│ ├── styles/ # theme.css and component styles
│ ├── utils/ # dates.js, messages.js, data.js, pageMeta.js (+ tests)
│ └── App.js # Router (AppRoutes), header, footer
├── scripts/
│ ├── buildData.js # prebuild: content/messages.json → public/data/months/
│ ├── validateContent.js # Data rules + frozen published messages (CI)
│ └── lib/content.js # Shared helpers (+ content.test.js)
├── .github/workflows/
│ ├── ci.yml # Tests, content rules, build (required check)
│ ├── branch-policy.yml # feature/* → develop → main (required check)
│ ├── azure-static-web-apps-*.yml # Azure SWA deploy
│ └── deploy-pages.yml # GitHub Pages deploy
├── docs/designs/ # System design and review reports
├── PRODUCT.md, DESIGN.md # Product and design-system context (Impeccable)
└── staticwebapp.config.json # Azure SWA routing, caching, headers
git clone https://github.com/ChiefInnovator/destroyallhumans.git
cd destroyallhumans
npm install
npm start # Dev server on http://localhost:3000 (runs buildData first)
npm run build # Production build → build/
npm test # Jest (React + utils)
npm run test:tz # Date logic in UTC-10 and UTC+14
npm run test:scripts # node:test for scripts/
npm run validate:content # Data rules for content/messages.jsoncontent/messages.jsonholds one morning and one evening message for every date from 2023-03-14 to 2030-12-31.- Before each build,
scripts/buildData.jswrites one file per month topublic/data/months/. The browser loads the months it needs and hides dates after the visitor's local today, so new days appear without a deploy. - Messages dated on or before UTC today + 1 are already visible somewhere and are frozen:
cifails any PR that changes them or removes a date. - Future messages are rewritten in reviewed batches; see docs/designs/system-design.md.
feature/* → PR → develop (GitHub Copilot review) → PR → main. Rulesets require the branch-policy and ci checks.
Deployed to Azure Static Web Apps (primary) and GitHub Pages (mirror under /destroyallhumans, built with noindex). Both deploy workflows trigger on push to main.
Azure SWA build config:
- App location:
/ - Output location:
build
Key staticwebapp.config.json settings:
- Navigation fallback to
index.html(SPA routing) /static/*,/data/*,/sitemap.xml,/robots.txtexcluded from fallbackno-cacheby default;/static/*cached for a year (immutable),/data/*for an hour- Security headers:
X-Content-Type-Options,X-Frame-Options,Referrer-Policy
- Structured data: WebSite (with SearchAction), CreativeWork, FAQPage JSON-LD
- Social previews: Open Graph + Twitter Card meta tags, custom
og-image.png - Sitemap:
public/sitemap.xmlwith all routes - AI crawlers:
robots.txtexplicitly allows GPTBot, ChatGPT-User, Google-Extended, PerplexityBot - Per-page metadata: Each route sets its own
document.title, meta description and canonical URL (usePageMeta) - Semantic HTML:
<article>,<time>, ARIA roles and labels throughout
Copyright © 2025 Richard Crane. All rights reserved.