A dual-interface flight information display system featuring both a modern web UI and a terminal-based TUI, similar to airport departure/arrival boards.
- Enhanced CI/CD Pipeline: Workflows now feature concurrency control and dependency chains for reliable releases
- Multi-Architecture Docker Support: Images built for x86-64, Apple Silicon, and all ARM devices (Raspberry Pi, Orange Pi)
- Production Ready: All TypeScript compilation errors resolved for successful Docker builds
- Automatic Route Enrichment: Flights missing airport details are automatically enriched from adsb.im/adsb.lol
- Workflow Orchestration: Docker publishing requires CI tests to pass first, ensuring quality releases
- Concurrency Control: Duplicate workflow runs are automatically cancelled to save resources
- Complete Docker Support: Multi-stage builds with Next.js standalone output for minimal image size
- Multi-Provider Route Checking: Routes command intelligently queries all providers until success
- SBOM & Provenance: Docker images include software bill of materials and build attestations
- Automatic GitHub Releases: Version tags trigger full CI/CD pipeline and create releases
- Web Interface: Modern Next.js 15 application with photorealistic split-flap display animations
- Multiple Themes: 7 unique themes including Airport Classic, Modern, Minimalist, Retro Terminal, High Contrast, Matrix (with animated digital rain), and Super Thin
- Theme Persistence: User preferences saved in browser localStorage with light/dark/system mode support
- Terminal UI: Blessed-based TUI for command-line flight monitoring
- Real-time Updates: Auto-refreshing flight data with dynamic status changes
- Multiple Data Providers: Support for 8+ flight data APIs with intelligent fallback
- Automatic Route Enrichment: Missing flight details are automatically fetched from route providers
- Airport Information: Detailed airport data including location, timezone, and local time
- Enhanced Display: ICAO codes shown with city names, "????" for en-route flights, proper sorting by time and status
- Global CLI Tools: Three installable command-line utilities for different use cases
- Production Docker Support: Multi-stage builds with Next.js standalone output
- Complete CI/CD Pipeline: Automated testing, Docker builds, and GHCR publishing
- Smart Provider Selection: Configurable priority system with automatic fallback
- TypeScript Throughout: Full type safety in both web and CLI applications
- Node.js 18.0.0 or higher
- npm or yarn package manager
- Docker and Docker Compose (optional, for containerized deployment)
# Clone the repository
git clone https://github.com/airframes/flightboard.git
cd flightboard
# Install dependencies
npm install
# Install CLI tools globally (optional)
npm link
# Pull the latest stable version (auto-selects architecture)
docker pull ghcr.io/airframes/flightboard:latest
# Or pull a specific version
docker pull ghcr.io/airframes/flightboard:v1.0.0
# Run the container
docker run -p 3000:3000 --env-file .env.local ghcr.io/airframes/flightboard:latest
Supported Architectures:
linux/amd64
- Standard x86-64 (Intel/AMD processors)linux/arm64
- 64-bit ARM (Apple Silicon M1/M2/M3, AWS Graviton, newer Raspberry Pi)linux/arm/v7
- 32-bit ARM v7 (Raspberry Pi 2/3/4, Orange Pi, most 32-bit ARM boards)linux/arm/v6
- 32-bit ARM v6 (Raspberry Pi 1/Zero/Zero W, older ARM devices)
Docker will automatically pull the correct image for your architecture.
# Using Docker Compose (recommended)
docker-compose up
# Or build and run manually
docker build -t flightboard:latest .
docker run -p 3000:3000 --env-file .env.local flightboard:latest
npm install -g flightboard
FlightBoard includes 7 beautifully crafted themes, each with light and dark mode support:
- Airport Classic - Traditional split-flap board aesthetic with mechanical animations
- Modern - Clean, contemporary design with smooth animations
- Minimalist - Focus on content with subtle design elements
- Retro Terminal - Green phosphor CRT terminal style
- High Contrast - Maximum readability with stark contrasts
- Matrix - Cyberpunk theme with animated digital rain background featuring golden airplane symbols
- Super Thin - Ultra-compact terminal style with minimal spacing
Set available themes via environment variable:
# In .env.local
AVAILABLE_THEMES=airport,modern,minimalist,retro,highcontrast,matrix,superthin
# Or use a subset
AVAILABLE_THEMES=airport,modern,matrix
Themes remember user preferences in browser localStorage including:
- Selected theme
- Light/dark/system color mode
- Automatic theme application on page load
After installation, three global commands are available:
Start the web server:
flightboard-web
# or during development
npm run flightboard-web
Open http://localhost:3000 in your browser.
Web Interface Features:
- Theme selector dropdown with live preview
- Light/dark/system mode toggle
- Responsive split-flap displays
- Real-time clock showing local, airport, and UTC time
- Tabbed interface for departures and arrivals
- Flight status badges with appropriate colors
- Automatic sorting by time and status (active flights first)
Run the TUI application:
flightboard-tui
# or during development
npm run flightboard-tui
With options:
flightboard-tui --airport=KLAX # Set airport
flightboard-tui --theme=retro # Set theme
flightboard-tui --minimal # Minimal mode (no version/help text)
flightboard-tui --airport=KSFO --theme=matrix # Multiple options
TUI Features:
- 7 Color Themes: Classic, Modern, Retro Terminal, Matrix, High Contrast, Ocean, Sunset
- Version Display: Shows FlightBoard version and GitHub URL (hidden with
--minimal
) - Real-time Updates: Auto-refreshing flight statuses
- Theme Selection: Set via
--theme
flag at startup
TUI Controls:
Tab
orD
/A
: Switch between Departures and ArrivalsR
: Refresh flight dataQ
orEsc
: Quit- Arrow keys: Navigate through flights
Query flight data from various providers:
# List configured providers
flightboard-lookup list
# Test all providers for an airport
flightboard-lookup flights --airport=KSMF --provider=all
# Test specific provider
flightboard-lookup flights --airport=KLAX --provider=aviationstack
# Get airport information
flightboard-lookup airport --code=KSFO
# Fetch flight route information via adsb.im or adsb.lol
flightboard-lookup routes --flight UAL123 # Check all providers (default)
flightboard-lookup routes --flight AAL456 --provider adsbim # Use only adsb.im
flightboard-lookup routes --flight DAL789 --provider adsblol # Use only adsb.lol
flightboard-lookup routes --flight SWA1234 --lat 37.7749 --lng -122.4194 # With position data
flightboard-lookup routes --flight NKS246 --verbose # Show full details from all providers
# Routes command options:
# --flight <callsign> Flight callsign (required)
# --lat <latitude> Current latitude (optional, default: 0)
# --lng <longitude> Current longitude (optional, default: 0)
# --provider <provider> Provider to use: adsbim, adsblol, or all (default: all)
# --verbose, -v Show full response data including request details
# Make raw API request
flightboard-lookup raw --url "https://api.example.com/endpoint" --method GET
# Help
flightboard-lookup --help
Available Commands:
flights
: Test flight data providers for an airportairport
: Get detailed airport informationlist
: Show all configured providers and their statusroutes
: Query adsb.im or adsb.lol for flight route information (requires active flight callsign)raw
: Make custom API requests for testing
Create a .env.local
file to configure flight data providers:
cp env.example .env.local
-
Airframes.io
- Get API key: app.airframes.io/user/dashboard - click API Key button
- Free for all feeders, Patreons, and paid Discord supporters
AIRFRAMES_API_KEY=your_key
- Note: Paid API tiers coming in the future
-
AviationStack
- Sign up: Get your API key here *
- Free tier: 100 requests/month
AVIATIONSTACK_API_KEY=your_key
- * Affiliate link - helps support FlightBoard development
-
AirNav RadarBox
- Sign up: radarbox.com/api
AIRNAV_API_KEY=your_key
-
adsb.im (Free)
- Flight schedule and route lookup by callsign and position
- No API key required
- Endpoint:
POST /api/0/routeset
- Parameters:
callsign
(required),lat
,lng
(optional, defaults to 0) - Returns route information for active flights
- Use
flightboard-lookup routes
command for testing
-
adsb.lol (Free)
- Real-time ADS-B data with geographic search
- No API key required
- Endpoints:
/v2/lat/{lat}/lon/{lon}/dist/{radius}
- Search aircraft by location/api/0/routeset
- Look up flight routes (similar to adsb.im)/api/0/airport/{icao}
- Airport information
- Max radius: 250 nautical miles for geographic search
- Use
flightboard-lookup routes --provider adsblol
for route testing
-
OpenSky Network (Free)
- No configuration needed
- Rate limits apply
-
FlightAware AeroAPI (v4) - Paid Only
- Sign up: flightaware.com/commercial/aeroapi
- Portal: flightaware.com/aeroapi/portal
FLIGHTAWARE_API_KEY=your_key
- Pricing: Starting at $100/month (no free tier)
- Premium features from $1,000/month
- Provides real-time flight tracking, gate info, and accurate predictions
-
FlightRadar24 (Commercial API) - Paid Only
- Sign up: fr24api.flightradar24.com
- Commercial inquiries: [email protected]
FLIGHTRADAR24_API_KEY=your_key
- Pricing: Commercial licenses only (no free tier)
- Sandbox available for testing with paid account
- Provides real-time aircraft positions and flight data
- Documentation: fr24api.flightradar24.com/docs
Set the order in which providers are tried:
# In .env.local
FLIGHT_PROVIDER_PRIORITY=airframes,flightaware,aviationstack,flightradar24,airnav,adsbim,adsblol,opensky
# Default if not specified:
# airframes,flightaware,aviationstack,flightradar24,airnav,adsbim,adsblol,opensky
The app will automatically try providers in the specified order until it finds available data. If all providers fail, it falls back to simulated mock data.
- Free Providers:
- Airframes.io (free for feeders/supporters)
- AviationStack (100 requests/month free)
- adsb.im, adsb.lol, OpenSky (no API key needed)
- Paid-Only Providers:
- FlightAware ($100+/month)
- FlightRadar24 (commercial only)
- AirNav RadarBox (subscription required)
- Disabled Providers: If a provider doesn't appear in
FLIGHT_PROVIDER_PRIORITY
, it's disabled - Mock Data: Automatically used when no providers return data
Both web and TUI interfaces display detailed airport information:
- Airport name and ICAO/IATA codes
- City and country
- Current local time and UTC time
- Timezone information
Data sourced from Airframes.io airport API when available.
FlightBoard includes complete Docker support for easy deployment and development.
# Build the Docker image
npm run docker:build
# Run the container
npm run docker:run
# Or use docker-compose
npm run docker:compose
The included docker-compose.yml
file makes it easy to run FlightBoard with all environment variables:
# Start with docker-compose (uses .env file)
docker-compose up
# Build and start
docker-compose up --build
# Run in background
docker-compose up -d
# Build the image
docker build -t flightboard:latest .
# Run with environment file
docker run -p 3000:3000 --env-file .env.local flightboard:latest
# Run with individual environment variables
docker run -p 3000:3000 \
-e AIRFRAMES_API_KEY=your_key \
-e AVIATIONSTACK_API_KEY=your_key \
flightboard:latest
# Build everything
npm run build
# Build only CLI tools
npm run build:cli
# Start production server
npm start
FlightBoard includes a comprehensive GitHub Actions workflow for continuous integration:
- Multi-version Testing: Tests against Node.js 18.x and 20.x
- Code Quality: Runs ESLint and TypeScript type checking
- Automated Testing: Executes test suite on every PR and push
- Docker Validation: Builds Docker image to ensure containerization works
- Pull Request Checks: Automatically runs on all pull requests
- Concurrency Control: Cancels outdated workflow runs automatically
- Workflow Dependencies: Docker publish requires CI tests to pass first
- Multi-Architecture Builds: Creates images for x86-64, ARM64, ARMv7, and ARMv6
- Automatic Docker Publishing: Tags trigger multi-platform image builds
- GitHub Container Registry: Images published to ghcr.io/airframes/flightboard
- Release Automation: Version tags create GitHub releases with changelogs
- Build Attestations: Generates SBOM and provenance for supply chain security
The project includes two main workflows:
-
CI Pipeline (
ci.yml
)- Runs on all pull requests
- Pushes to
main
anddevelop
branches - Tests on Node.js 18.x and 20.x
- Validates Docker builds
- Concurrency control cancels outdated runs
- Can be called by other workflows
-
Docker Publish (
docker-publish.yml
)- Triggers on version tags (e.g.,
v1.0.0
) - Requires CI workflow to pass first
- Concurrency control prevents duplicate runs
- Builds multi-architecture images:
linux/amd64
(x86-64)linux/arm64
(Apple Silicon, AWS Graviton)linux/arm/v7
(Raspberry Pi 2/3/4, Orange Pi)linux/arm/v6
(Raspberry Pi Zero/1)
- Publishes to GitHub Container Registry with automatic architecture detection
- Creates GitHub releases automatically
- Generates SBOM and provenance attestations
- Triggers on version tags (e.g.,
To create a new release:
# Tag the version
git tag v1.0.0
git push origin v1.0.0
This will automatically:
- Run the full CI test suite
- Build multi-architecture Docker images (only if CI passes)
- Publish images to GitHub Container Registry
- Create a GitHub release with changelog
- Tag images with semantic version numbers and
latest
Note: The Docker publish workflow will only proceed if all CI tests pass successfully.
flightboard/
├── src/
│ ├── app/ # Next.js app router pages
│ ├── cli/ # CLI tools (TUI, lookup, web)
│ ├── components/ # React components
│ ├── lib/ # Shared libraries and providers
│ └── types/ # TypeScript type definitions
├── bin/ # CLI wrapper scripts
├── dist/ # Compiled CLI tools
├── .github/ # GitHub Actions workflows
│ └── workflows/
│ └── ci.yml # CI/CD pipeline
└── public/ # Static assets
- Next.js 15: React framework with App Router
- TypeScript: Type-safe development
- Tailwind CSS: Utility-first styling with CSS variables for theming
- shadcn/ui: High-quality UI components
- React Context API: Theme state management
- Canvas API: Matrix rain animation
- Blessed: Terminal UI library
- Commander: CLI argument parsing
- Chalk: Terminal string styling
- Node-fetch: HTTP client for Node.js
When using mock data, the system generates realistic flight information including:
- Major US airports
- Real airline codes and names
- Dynamic status updates (boarding, departed, delayed, etc.)
- Gate and terminal assignments
- Estimated and actual times
- Aircraft types
# Install dependencies
npm install
# Run web dev server
npm run dev
# Run TUI
npm run flightboard-tui
# Test flight lookups
npm run flightboard-lookup -- list
# Test route lookups
npm run flightboard-lookup -- routes --flight UAL123
# Link for global development
npm link
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
MIT License - see LICENSE file for details
If you encounter TypeScript compilation errors during Docker builds:
- Ensure all TypeScript types are properly defined
- Check that
next.config.ts
only contains valid Next.js configuration options - Verify that all imported modules exist and are properly typed
- Check API keys are correctly set in
.env.local
- Verify network connectivity to provider endpoints
- Review provider-specific rate limits
- Use
flightboard-lookup
to test individual providers
If the default port 3000 is in use:
- Change the port in Docker:
docker run -p 3001:3000 ...
- For development:
PORT=3001 npm run dev
FlightBoard is open source and free to use. If you find it useful, consider:
- Using our affiliate links when signing up for API services (marked with *)
- Contributing code or documentation
- Reporting bugs and suggesting features
- Sharing the project with others
Affiliate commissions help us maintain and improve FlightBoard. Thank you for your support!
- Airport data provided by Airframes.io
- Community ADS-B data from adsb.im and adsb.lol
- Flight data from various commercial and open-source providers
- UI inspiration from classic airport split-flap displays