A collaborative project where students contribute GIFs to create animated mosaics for their cohorts.
- Students submit GIF URLs through JSON files in their cohort's directory
- GitHub Actions automatically processes submissions when merged to main
- A TypeScript script downloads GIFs and creates a 4K video mosaic
- The mosaic is uploaded to S3 and displayed on the GitHub Pages site
Navigate to your cohort's directory under submissions/
(e.g., submissions/C11/
) and create a new JSON file with your GitHub username:
{
"url": "https://media.giphy.com/media/YOUR-GIF-ID/giphy.gif",
"author": "your-github-username"
}
Once your PR is merged, the mosaic will be automatically regenerated with your GIF included!
- Output: 1920x1920 WebM video
- Duration: 10-second loop
- Grid: Dynamic sizing based on number of submissions
- Hosting: Videos stored on S3, site hosted on GitHub Pages
- Node.js 18+
- AWS S3 bucket with public read access
- GitHub repository secrets:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_REGION
S3_BUCKET_NAME
# Install dependencies
npm install
# Process GIFs locally (requires AWS credentials)
npm run process-gifs
# Run the website locally
npm run dev
Simply create a new directory under submissions/
with the cohort identifier (e.g., submissions/C12/
).
- TypeScript: Processing scripts and type safety
- Astro + React: Static site generation with interactive components
- GitHub Actions: Automated processing on merge
- AWS S3: Video storage
- ffmpeg: Video processing
- GIFs are downloaded with rate limiting protection (100ms delay between downloads)
- Downloads happen in batches of 5 concurrent requests
- Failed downloads are retried with exponential backoff
- Downloaded GIFs are cached locally to avoid re-downloading
- Consider using Giphy API keys for production use