A modern, performant website for OpenTimelineIO built with Next.js 16. This project showcases the power of OTIO through interactive demos, comprehensive documentation, and real-world integrations.
- Getting Started
- Project Architecture
- Page Data Sources
- Adding Integrations
- Advanced Features
- Technology Stack
- Project Structure
- Styling & Theming
- Content Management
- Deployment
- Contributing
- Resources
- Node.js >= 22.0.0
- Yarn package manager
- Install dependencies
yarn install- Setup HTTPS certificates (required for WASM features)
yarn dev:setup- Start the development server in HTTPS mode
yarn dev:httpsOpen https://localhost:443 with your browser to see the result.
Note: HTTPS mode is required for the WASM build of Raven (the interactive timeline player) to work properly due to
SharedArrayBufferrequirements.
This project leverages several cutting-edge Next.js 16 features:
- All pages use Server Components by default for optimal performance
- Data fetching happens on the server, reducing client-side JavaScript
- Pages like Contributors, Releases, and Documentation fetch data at build/request time
- File-system based routing with the
app/directory - Nested layouts with
layout.tsxfor consistent page structure - Support for loading states, error boundaries, and parallel routes
unstable_cacheAPI for fine-grained caching control- Time-based revalidation for GitHub API data
- Static page generation where possible with dynamic data updates
turbopackFileSystemCacheForDev: truefor faster development builds- Significantly improved hot-reload performance
- Next.js
Imagecomponent with remote patterns - Automatic image optimization and lazy loading
- Support for external images from GitHub, Clearbit, etc.
- COOP/COEP headers for WASM SharedArrayBuffer support
- Required for the Raven timeline player to function
Data Source: Local markdown files
Location: content/homepage/timelines/introduction.md
The homepage features an interactive Non-Linear Editor (NLE) timeline that reads markdown content to demonstrate OTIO's timeline editing capabilities. The timeline component parses markdown and renders it as an interactive timeline interface.
Key Files:
src/app/page.tsx- Server component that loads markdownsrc/components/nle/index.tsx- Interactive timeline editor component
Data Source: Local JSON file
Location: content/integrations/integrations.json
Displays all applications and tools that support OpenTimelineIO. Features include:
- Filterable category sidebar
- Search functionality
- Detail modal with media galleries
- Both apps and development tools
Key Files:
src/app/apps-and-tools/page.tsx- Client component with filteringsrc/lib/integrations.ts- Integration data utilitiessrc/components/github/edit-in-github.tsx- GitHub edit button componentcontent/integrations/integrations.json- Integration definitions
Data Source: GitHub API
API: https://api.github.com/repos/AcademySoftwareFoundation/OpenTimelineIO/contributors
Fetches real-time data about project contributors including:
- All contributors with pagination support
- Repository statistics (stars, forks, watchers)
- Contributor avatars and profiles
- Total contribution counts
Cache Strategy: 24-hour revalidation
Key Files:
src/app/contributors/page.tsx- Server componentsrc/lib/github-contributors.ts- GitHub API integration
Data Source: GitHub Repository + Local Content
API: https://api.github.com/repos/AcademySoftwareFoundation/OpenTimelineIO/contents/docs
Documentation is dynamically pulled from the main OTIO GitHub repository's docs/ folder. The system:
- Fetches RST and Markdown files from GitHub
- Converts RST to Markdown on-the-fly
- Extracts H1 titles for page titles
- Auto-categorizes into Quick Start, Tutorials, and Use Cases
- Generates table of contents from headings
Key Files:
src/app/docs/[...slug]/page.tsx- Dynamic route handlersrc/lib/github-docs.ts- GitHub docs fetchingsrc/lib/docs-manifest.ts- Documentation structure generatorsrc/lib/rst-converter.ts- RST to Markdown conversion
Data Source: Local CSV file
Location: content/features/feature-matrix.csv
Interactive data grid showing feature support across different timeline formats. Features include:
- Papa Parse for CSV parsing
- TanStack Table for interactive grid with sorting and filtering
- Server-side data loading
- Interactive GitHub PR Previews - Hover over PR numbers (like
#123) to see a live preview card with the PR title, description, and status fetched from GitHub's API!
Key Files:
src/app/features/page.tsx- Server componentsrc/components/data-grid/feature-matrix.tsx- Interactive table with GitHub preview integration
Data Source: GitHub API
API: https://api.github.com/repos/AcademySoftwareFoundation/OpenTimelineIO/releases
Displays all OTIO releases with:
- Release notes rendered as markdown with syntax highlighting
- Download assets and statistics
- Author information
- Pre-release and draft filtering
- Interactive GitHub PR/Issue Previews - Hover over any issue or PR mention in release notes to see a detailed preview
Cache Strategy: 6-hour revalidation
Key Files:
src/app/releases/page.tsx- Server componentsrc/lib/github-releases.ts- GitHub API integrationsrc/components/github/releases-client.tsx- Client-side renderingsrc/components/github/release-notes-renderer.tsx- Markdown rendering with GitHub link detection
We provide a CLI tool to easily add new apps and tools to the integrations page.
yarn add-integrationThe interactive CLI will guide you through:
- Type selection (app or tool)
- Basic information (name, company, description)
- Category selection
- Media upload
Edit content/integrations/integrations.json and add a new entry:
{
"id": "unique-id",
"type": "app",
"name": "Integration Name",
"description": "Brief description of the integration",
"company": "Company Name",
"logo": "https://example.com/logo.png",
"categories": ["Category1", "Category2"],
"media": [
{
"type": "image",
"url": "/integrations/image.png",
"isHero": true
}
]
}- id: Unique identifier (kebab-case)
- type: Either "app" or "tool"
- name: Display name of the integration
- description: Short description (1-2 sentences)
- company: Company or author name
- logo: URL to logo image (can be external URL or path to
/public/integrations/) - categories: Array of category tags (Player, Editor, Review, Compositor, Plugin, etc.)
- media: Array of images/videos
- type: "image" or "video"
- url: Path to media file in
/public/integrations/ - isHero: Boolean to mark the hero/preview image
- thumbnail: For videos, path to thumbnail image
Place any images, logos, or videos in /public/integrations/ and reference them with /integrations/filename.ext in the JSON.
One of the coolest features of this website is the interactive GitHub issue and pull request preview system. When users hover over GitHub issue or PR links throughout the site, a beautifully styled preview card appears with live data fetched from the GitHub API.
How It Works:
- Automatic Detection: Links to GitHub issues/PRs are automatically detected in markdown content and release notes
- Hover-to-Preview: On hover, a delayed popover appears (180ms delay) to avoid accidental triggers
- Live Data Fetching: Data is fetched from the GitHub API via a custom API route (
/api/github-preview) - Smart Caching: Responses are cached for 1 hour both in-memory and with HTTP cache headers
- Beautiful UI: Status-themed cards with color-coding (open = green, closed = red, merged = purple)
Preview Card Contents:
- Issue/PR title
- Status badge (Open, Closed, Merged)
- Issue number and author
- Last updated date
- Full description rendered as markdown
- Direct link to GitHub
Usage Example:
The feature is used throughout the site:
- Feature Matrix (
/features) - Hover over PR numbers like#123to see what features they add - Release Notes (
/releases) - Hover over issue/PR mentions to see what was fixed - Documentation - Any markdown content can include GitHub links with auto-previews
Key Files:
src/app/api/github-preview/route.ts- Next.js API route that fetches from GitHub APIsrc/components/github/github-preview.tsx- React component with Popover and themingsrc/components/data-grid/feature-matrix.tsx- Integration in the feature matrix tablesrc/components/github/release-notes-renderer.tsx- Integration in release notes
Performance Optimizations:
- In-memory cache with 1-hour TTL
- HTTP cache headers (
s-maxage=3600, stale-while-revalidate=7200) - Lazy loading (only fetches when popover opens)
- Debounced hover handlers to prevent excessive requests
- Request deduplication to prevent double-fetching
Design Features:
- Dark/light mode support with custom themes per status
- Smooth animations and transitions
- Responsive sizing (max 520px width)
- Scrollable content area for long descriptions
- External link button to open in GitHub
- Error handling with retry functionality
- Loading states with animated spinner
This feature significantly enhances the documentation experience by providing instant context about GitHub references without requiring users to leave the page!
- Next.js 16 - React framework with App Router
- React 19 - Latest React with concurrent features
- TypeScript 5 - Type safety
- Tailwind CSS 4 - Utility-first CSS framework
- Radix UI - Accessible component primitives
- Lucide Icons - Beautiful icon library
- Motion - Animation library (Framer Motion successor)
- Unified, Remark, Rehype - Markdown/RST processing pipeline
- remark-gfm - GitHub Flavored Markdown support
- rehype-autolink-headings - Automatic heading links
- react-markdown - Markdown rendering
- TanStack Table - Powerful table/data grid
- Papa Parse - CSV parsing
- Next Themes - Dark mode support
- GitHub REST API - Contributors, releases, documentation
- Algolia DocSearch - Documentation search
/Users/jeff/Code/aswf/otio-website-v3-1/
βββ src/
β βββ app/ # Next.js App Router pages
β β βββ page.tsx # Homepage with NLE timeline
β β βββ apps-and-tools/ # Integrations showcase
β β βββ contributors/ # GitHub contributors
β β βββ docs/ # Dynamic documentation
β β βββ features/ # Feature matrix
β β βββ releases/ # Release notes
β β βββ api/ # API routes (GitHub preview, OG images, etc.)
β βββ components/ # React components
β β βββ nle/ # Timeline editor components
β β βββ docs/ # Documentation navigation & rendering
β β βββ github/ # GitHub integration components
β β β βββ edit-in-github.tsx
β β β βββ github-preview.tsx
β β β βββ release-notes-renderer.tsx
β β β βββ releases-client.tsx
β β βββ markdown/ # Markdown rendering utilities
β β βββ data-grid/ # Feature matrix table components
β β βββ media/ # Media components (lightbox, etc.)
β β βββ layout/ # Layout components (nav, header, etc.)
β β βββ ui/ # Reusable UI primitives (buttons, cards, etc.)
β βββ lib/ # Utilities and data fetching
β β βββ github-*.ts # GitHub API integrations
β β βββ integrations.ts # Integration utilities
β β βββ markdown-utils.ts # Markdown processing
β β βββ rst-converter.ts # RST to Markdown conversion
β βββ types/ # TypeScript definitions
βββ content/ # Static content
β βββ integrations/ # Apps & tools data
β βββ features/ # Feature matrix CSV
β βββ homepage/ # Homepage content
βββ public/ # Static assets
β βββ integrations/ # Integration media
β βββ icons/ # Icon assets
β βββ images/ # General images
βββ scripts/ # Build/utility scripts
βββ create-integration.mjs # Integration CLI tool
The site features a custom design system with:
- Dark/Light mode support via
next-themes - CSS Variables for consistent theming
- Responsive design optimized for mobile, tablet, desktop
- Animations using Motion for smooth transitions
Theme configuration: src/app/globals.css
Documentation search is powered by Algolia DocSearch, configured to index:
- Documentation pages
- Tutorial content
- Feature descriptions
Documentation is automatically synced from the main OpenTimelineIO repository. The system converts RST files to Markdown and renders them with proper styling and navigation.
Managed via content/integrations/integrations.json with CLI tooling for easy additions.
Edit content/features/feature-matrix.csv directly to update the feature comparison table.
yarn buildyarn startThis project is optimized for Vercel deployment:
The site benefits from:
- Automatic HTTPS
- Edge caching
- Incremental Static Regeneration
- Serverless functions for API routes
Contributions are welcome! Areas for contribution:
- Adding new integrations
- Improving documentation
- Enhancing the timeline editor
- Fixing bugs or adding features
This project is part of the Academy Software Foundation's OpenTimelineIO project.






