Files
OpenMontage/render-demo.sh
calesthio 5223eec21c Zero-key video formula: fix rendering bugs, add 8 demo compositions, update skills
Fix ComparisonCard and CalloutBox dark-theme passthrough in SceneRenderer.
Add 8 demo-props JSON files (3 fixed originals + 5 new compositions).
Update scene-director and compose-director skills with all 10 Remotion
scene types and zero-key rendering guidance. Document the proven
all-dark-background formula in remotion.md. Add cinematic renderer,
onboarding skill, prompt gallery, and demo render script.
2026-03-30 13:23:28 -07:00

121 lines
3.1 KiB
Bash

#!/usr/bin/env bash
# render-demo.sh — Render zero-key demo videos using only Remotion components
# No API keys, no external services, no GPU required.
#
# Usage:
# ./render-demo.sh # Render all demos
# ./render-demo.sh world-in-numbers # Render one specific demo
# ./render-demo.sh --list # List available demos
#
# Prerequisites: Node.js 18+, npm install in remotion-composer/
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
COMPOSER_DIR="$SCRIPT_DIR/remotion-composer"
PROPS_DIR="$COMPOSER_DIR/public/demo-props"
OUTPUT_DIR="$SCRIPT_DIR/projects/demos/renders"
# Available demos
declare -A DEMOS=(
["world-in-numbers"]="The World in Numbers — 45s data visualization showcase"
["code-to-screen"]="From Code to Screen — 50s developer education explainer"
["focusflow-pitch"]="FocusFlow Pitch — 40s startup pitch deck video"
)
# Colors
GREEN='\033[0;32m'
CYAN='\033[0;36m'
YELLOW='\033[1;33m'
NC='\033[0m'
list_demos() {
echo ""
echo -e "${CYAN}Available zero-key demos:${NC}"
echo ""
for name in "${!DEMOS[@]}"; do
echo -e " ${GREEN}$name${NC} ${DEMOS[$name]}"
done
echo ""
echo "Usage: ./render-demo.sh [demo-name]"
echo " ./render-demo.sh (renders all)"
echo ""
}
render_demo() {
local name="$1"
local props_file="$PROPS_DIR/$name.json"
local output_file="$OUTPUT_DIR/$name.mp4"
if [ ! -f "$props_file" ]; then
echo "Error: Props file not found: $props_file"
exit 1
fi
mkdir -p "$OUTPUT_DIR"
echo ""
echo -e "${CYAN}Rendering:${NC} ${DEMOS[$name]:-$name}"
echo -e "${CYAN}Props:${NC} $props_file"
echo -e "${CYAN}Output:${NC} $output_file"
echo ""
cd "$COMPOSER_DIR"
npx remotion render src/index.tsx Explainer "$output_file" \
--props "$props_file" \
--codec h264
if [ -f "$output_file" ]; then
local size=$(du -h "$output_file" | cut -f1)
echo ""
echo -e "${GREEN}Done!${NC} $output_file ($size)"
else
echo "Render may have failed — check output above."
fi
}
# Main
if [ "${1:-}" = "--list" ] || [ "${1:-}" = "-l" ]; then
list_demos
exit 0
fi
if [ "${1:-}" = "--help" ] || [ "${1:-}" = "-h" ]; then
echo "render-demo.sh — Render zero-key demo videos"
echo ""
echo "These demos use ONLY Remotion components (animated charts, text cards,"
echo "stat reveals, comparisons) — no API keys, no images, no external services."
echo ""
list_demos
exit 0
fi
# Check prerequisites
if ! command -v node &> /dev/null; then
echo "Error: Node.js is required. Install from https://nodejs.org/"
exit 1
fi
if [ ! -d "$COMPOSER_DIR/node_modules" ]; then
echo -e "${YELLOW}Installing Remotion dependencies...${NC}"
cd "$COMPOSER_DIR" && npm install
fi
if [ -n "${1:-}" ]; then
# Render specific demo
if [ -z "${DEMOS[$1]+x}" ]; then
echo "Unknown demo: $1"
list_demos
exit 1
fi
render_demo "$1"
else
# Render all demos
echo -e "${CYAN}Rendering all zero-key demos...${NC}"
for name in world-in-numbers code-to-screen focusflow-pitch; do
render_demo "$name"
done
echo ""
echo -e "${GREEN}All demos rendered!${NC} Check $OUTPUT_DIR/"
fi