APB-DOCS-PROD
Both sites are script-built. Scripts are idempotent by recreation: they delete the node by title and rebuild it. Node IDs change. Anything that must point at the front page must read system.site page.front.
Roles of the two sites
demo.apb.aero.net is the product site, the frozen component gallery, and the labs (capabilities, advanced, articles, international, forms, components). docs.apb.aero.net is this documentation library. Do not hand-edit Composer-managed code under web/ on either site. Do not edit the 18 apbuilder_examples nodes.
Rebuild this site
cd /export/home/www/apbuilder_docs
./vendor/bin/drush --root=web --uri=https://docs.apb.aero.net php:script scripts/docs-foundation.php
./vendor/bin/drush --root=web --uri=https://docs.apb.aero.net php:script scripts/docs-content.php
./vendor/bin/drush --root=web --uri=https://docs.apb.aero.net php:script scripts/docs-components.php
Always pass --uri. Secrets stay in .env (never committed): sudo password, OpenAI key, database credentials.
Recording stack (demo host)
OpenScreen is the polish/export layer. Capture on this EC2 box uses headed Chrome on Xvfb :99 at 1440×900, CDP 127.0.0.1:9222, ffmpeg x11grab. Session wrapper: scripts/tutorial/chrome-recording-session.sh on the demo repo. Narration is OpenAI TTS (voice coral, gpt-4o-mini-tts with fallbacks) using the OPENAI key. Never print that key. Login scenes use demo_editor, never uid 1.
Branding
Aero balloon, never Gin’s droplet. Gin accent #2452A6. Copy is US English in Aero’s voice: short verbs, concrete claims, no invented enthusiasm. Admin recordings stay on Gin light mode, no per-user theme overrides.