Planning a jump in the UK? This app helps skydivers check the latest weather at selected dropzones and see if conditions are safe for beginners or experienced jumpers.
Because sometimes the biggest leap isnβt out of the planeβitβs trusting the weather. π€οΈ
-
Frontend
- React + TypeScript
- React Router β slug-based navigation (
/dropzone/skydive-langar) - Recharts β interactive bar charts & heatmaps
- Responsive CSS + tooltips
-
Backend
- AWS Lambda + API Gateway β serverless forecast API
- Python + Pandas β data analytics & safety rules
- Open-Meteo API β free forecast provider
-
Automation
- Python Scraper (Playwright + Google Geocoding API) β updates
dropzones.jsonautomatically - GitHub Actions β automates: scraper β commit β Lambda deploy β frontend build & deploy
- Python Scraper (Playwright + Google Geocoding API) β updates
-
UK Dropzones β includes all official British Skydiving dropzones (scraped automatically).
-
π Smart Dropzone Search
- Autocomplete suggestions while typing.
- Navigate with β¬οΈ / β¬οΈ keys + Enter to jump directly.
- Mobile-friendly and responsive design.
-
Beginner vs Experienced Rules β conditions assessed differently for new vs seasoned skydivers.
-
Weather Insights β daily forecasts include:
π‘ Temperature Β· π§ Rain chance Β· π¨ Wind speed (mph) Β· βοΈ Cloud cover Β· βοΈ Simple text summary -
Safe/No Jump Indicators β βGOOD β β or βNO Jumping ββ guidance per day.
-
Mobile-friendly UI β scrollable forecast cards, responsive layouts.
-
Educational Tooltips β explain safe skydiving conditions (sourced from British Skydiving).
Iβve added an analytics layer to help skydivers understand conditions at a glance β not just raw numbers.
The backend now summarizes the raw forecast into meaningful insights, including:
- π‘ Average temperature over the forecast period.
- π¨ Average wind speed.
- β Number of safe jump days for Beginners vs Experienced skydivers.
- π― Best Jump Day β automatically highlighted in a banner at the very top. Click it to instantly view full forecast details in the main card.
When you request the forecast for a dropzone, the app also returns an analytics summary like this for each selected dropzone:
"analytics": {
"avg_temp": 18.6,
"avg_wind": 12.2,
"jumpable_days_beginner": 3,
"jumpable_days_experienced": 6,
"total_days": 10
}
Explained:
- π‘ avg_temp β average daily max temperature (18.6Β°C).
- π¨ avg_wind β average wind speed (12.2 mph).
- β jumpable_days_beginner β safe days for beginners (3 days).
- β jumpable_days_experienced β safe days for experienced skydivers (6 days).
- π total_days β number of forecast days (10).
So in this example:
- Beginners can expect 3 safe days in the next 10.
- Experienced skydivers have more flexibility with 6 safe days.
- Average conditions are 18.6Β°C with winds around 12 mph.
The frontend uses Recharts to display:
- Bar Chart β safe days for Beginners vs Experienced.
- Heatmap Calendar β daily jumpability (π’ good, π‘ marginal, π΄ unsafe).
- Key Stats Cards β quick view of average temp π‘ and wind speedπ¨.
One of the most useful features of the app is that you can click on any forecast card (either in the row of small daily cards, or in the heatmap) and it will instantly show more details in the big main card.
- The app always keeps track of which day is currently selected.
- By default, it starts with the first forecast day.
- When you click on a mini card, the app updates that selection.
- The big card then shows the details for the selected day.
So you can quickly scroll through the week and see full details for any day with just one click.
// Keep track of which forecast day is selected
const [selectedDay, setSelectedDay] = useState<ForecastDay | null>(null);
// Show the first day by default
setSelectedDay(parsed.forecast[0]);
// Mini cards: when clicked, update the selected day
<div
key={day.date}
className={`mini-weather-card ${
selectedDay?.date === day.date ? "active" : ""
}`}
onClick={() => setSelectedDay(day)} // β
updates the selected day
>
<WeatherCard day={day} isBig={false} />
</div>
// Big card: always shows the currently selected day
{selectedDay && (
<div className="big-weather-card">
<WeatherCard day={selectedDay} isBig={true} />
</div>
)}
- Python scraper (
tools/scraper.py) fetches dropzone names from British Skydiving. - Uses Google Geocoding API for lat/lon.
- Updates
public/dropzones.jsonautomatically.
- Workflow (
.github/workflows/update-dropzones.yml) automates:- Running the scraper
- Committing
dropzones.json - Deploying Lambda
- Building & publishing frontend to GitHub Pages
- Before: fetched forecasts for all dropzones β very slow.
- Now: fetches only the requested dropzone via
?dz=DropzoneName. - Applies beginner/experienced rules server-side.
- β Faster, smaller payloads
- β Always in sync with scraper updates
-
Scraper (Python + Playwright + Google API)
- Scrapes dropzones β geocodes β saves to
dropzones.json. - GitHub Actions commits updates.
- Scrapes dropzones β geocodes β saves to
-
Frontend (React, GitHub Pages)
- Loads dropzones from JSON.
- Renders forecasts + analytics visually.
-
API Gateway + Lambda (Python + Pandas)
- Handles requests (
?dz=DropzoneName). - Fetches forecast from Open-Meteo.
- Applies safety rules.
- Returns forecast + analytics + heatmap.
- Handles requests (
-
Frontend UI
- Displays daily forecasts, analytics cards, bar charts, and heatmaps.
The app has been styled in CSS to ensure the layout works across all devices:
- On desktop screens, the analytics card and heatmap sit side by side, filling the page width.
- On mobile and tablets, the cards stack vertically for easy scrolling.
- Mini forecast cards are scrollable horizontally on smaller screens.
- Font sizes, icons, and padding adapt fluidly so the experience feels natural whether youβre on a phone, tablet, or large monitor.
This means the interactive forecast is not only functional but also responsive, filling the page across all screen sizes.
- Clone the repo
git clone https://github.com/yourname/skydive-forecast.git cd skydive-forecast - Install dependencies
npm install
- Start the app locally
npm run dev
- Deploy ( GitHub Pages) In App.tsx, make sure the router is wrapped with:
<Router basename="/skydive-forecast">
Then build and publish with:
npm run build
npm run deploy
- Add more dropzones (UK & worldwide π).
Added β
- Notifications/alerts when a βGOOD β β day is coming up.
Added β
-
Altitude-adjusted forecasts β calculate conditions at jump altitude (not just ground).
-
Data analytics & graphs:
-
Use Pandas to process the fetched weather data.
-
Show averages, min, max of wind speed, temperature, and cloud cover.
Added β
-
Highlight how many βGOOD β β days are expected in the next 10 days.
-
Add trend charts (line graphs of wind speeds, temperatures, rain probability).
- Visual dashboards:
-
Bar charts for βjumpable vs no-jump daysβ per dropzone.
-
Pie charts comparing beginner vs experienced safe days.
Added β
- Rolling averages to show seasonal patterns (e.g., best months to jump).
- User experience features:
-
Allow users to favourite dropzones and view combined stats.
-
Compare two dropzones side by side (e.g., Hibaldstow vs Langar).
-
Export reports (PDF or CSV) with conditions summary.
- Machine learning ideas:
-
Predict the best jump days using past data + forecast trends.
-
Show βconfidence scoresβ for forecasts.
- British Skydiving β official safety guidelines & DZ list.
- Open-Meteo β free weather data.
- Adobe Firefly β used to generate the skydiver cartoon character for the preloader animation.
- Tools & packages that power this project.
