Official website and documentation platform for OpenHD - Open Source Digital FPV System.
- Modern Documentation: Built with Docusaurus 3.8.1
- Version Management: Support for multiple OpenHD versions (Evo Latest & 2.0)
- Local Search: Fast client-side search functionality
- Responsive Design: Modern FPV-themed UI with HUD elements
- Community Integration: Direct links to Discord, Telegram, and other channels
- Asset Management: All images and assets locally hosted
- Docusaurus - Static site generator
- TypeScript - Type safety
- React - UI framework
- @easyops-cn/docusaurus-search-local - Local search
- Node.js 24+
- pnpm 9 (via
corepack enable)
# Clone the repository
git clone https://github.com/OpenHD/OpenHD-Website.git
cd OpenHD-Website
# Enable corepack (once per machine)
corepack enable
# Install dependencies
pnpm install
# Start development server
pnpm start# Build static files
pnpm build
# Serve built files locally
pnpm serve
# Build exactly like the staging site (served under /staging/, noindex)
STAGING=true pnpm buildNote: During pnpm build, a script converts .png/.jpg in static/img to .avif. Use the OptimizedImg component or CSS image-set(...) to prefer AVIF with fallback.
├── docs/ # Current documentation (Evo Latest)
├── versioned_docs/
│ └── version-2.0/ # Version 2.0 documentation
├── static/
│ └── img/
│ └── assets/ # Images and assets
│ └── v2-0/ # Version-specific assets
├── src/
│ └── pages/ # Custom pages (Homepage, etc.)
├── docusaurus.config.ts # Main configuration
└── sidebars.ts # Sidebar configuration
The site uses a custom FPV-themed design with:
- HUD-style elements and overlays
- OpenHD brand colors
- Responsive navigation
- Animated elements
- Create documentation in
docs/ - Run
pnpm docusaurus docs:version X.X - Assets go in
static/img/assets/vX-X/
pnpm start- Start development serverpnpm build- Build for productionpnpm serve- Serve built filespnpm clear- Clear cachepnpm swizzle- Eject components for customization
- AVIF conversion runs at build time for files under
static/img. - In React, use
src/components/OptimizedImg.tsx:<OptimizedImg path="/img/logo.png" alt="Logo" /> - In CSS, prefer:
background-image: image-set(url('/img/hero.avif') type('image/avif'), url('/img/hero.png') type('image/png'));
The site is hosted on GitHub Pages at openhdfpv.org. Each branch has exactly one job:
| Branch | Purpose | Published at | Indexed by search engines |
|---|---|---|---|
main |
Development / staging. All PRs target this branch. | openhdfpv.org/staging/ | No (noindex) |
production |
The live website. Only updated by promoting main. |
openhdfpv.org | Yes |
gh-pages |
Build output only. Written by CI, never edit by hand. | – | – |
feature branch ──PR──▶ main ──────────PR "Promote to production"──────────▶ production
│ │
▼ ▼
openhdfpv.org/staging/ openhdfpv.org/
- Pull requests to
mainorproduction: typecheck + full build. Nothing is deployed. - Push to
mainorproduction: CI builds only the pushed branch (mainwithSTAGING=true). The other half is taken from the currentgh-pages, then the wholegh-pagesbranch is replaced. Pages that were deleted or renamed therefore disappear from the live site as well. - Caching: pnpm store and
.image-cache(AVIF/WebP keyed by content hash). A warm image cache cuts the build from ~15–50 min to ~2 min, so keep its path stable.cache-keepalive.ymltouches it every 3 days so GitHub does not evict it (7-day limit). - Deploys are serialized (
pages-deployconcurrency group); the build and an offline ZIP of the production site are attached to every run as artifacts (7 days).
STAGING=true switches baseUrl to /staging/ and sets noindex, so staging never competes
with the live site in search results.
- Branch off
main, open a PR againstmain. - After merge, check the result on openhdfpv.org/staging/.
- To go live, open a PR
main→productionand merge it (fast-forward/merge, no squash). - Hotfixes on
productionmust be merged back intomainright away, so both branches don't drift apart.
- Fork the repository
- Create a feature branch from
main(git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request against
main(never againstproductiondirectly)
This project is licensed under the MIT License - see the LICENSE file for details.
- Join our Discord community
- Visit our Telegram channel
- Check the documentation
Made with ❤️ by the OpenHD Community and Devs