Overview:
Just a Plane Dashboard is a responsive web application (both desktop and mobile) that provides real-time flight and airport information. This app aims to address the accessibility gap in how flight data is presented.
Booking, ticketing, check-in, and cross-device sync are out of the flight path.
Team:
Solo role
Role:
Product Designer
As a frequent traveler, and aviation enthusiast, I've noticed that flight data is presented so differently across airports. Each has their own method of presenting flight information, all include the same critical information (flight number, arrival/departure time, airline, status, gate). Yet, the way this information is presented varies, and is not always accessible.
For such a large industry, there needs to be a centralized and accessible manner for users to receive the information they need. Whether it’s to keep up with one’s flight, pick up a loved one, or simply enjoy flight data, everyone deserves access to information.
Commercial aviation is one of the fastest growing industries in the consumer market. According to OAG, there was a ~2.9% increase in the busiest day for air travel in 2025, surging from 19.2M to 19.8M passengers. Airline companies too, have been investing in growth, with Bain and Company predicting a 2.4% growth annually in airline fleet size.


aria-live="polite" aria-atomic="true" on the clock.aria-labelledby. Seconds appear only in visual time.flightSrSummary() utility that generates one label: flight, codeshare, route, airline, estimated/actual times, terminal, gate, baggage, status.<tr> gets aria-label={flightSrSummary(...)} + tabIndex={0}. <article> card gets the same label. Inner fields are aria-hidden so one card = one announcement (matching desktop experience).<a> for Arrivals/Departures toggle. Query params navigate, so it seems 'okay'.<a> should lead to pages, not UI toggles. Plus, the pattern is tabs, users expect arrow keys, not link behavior. Screen readers wouldn't announce as tabs.<button role="tab">, role="tablist">, role="tabpanel">). Kept shareable URLs via router.push(?view=arrivals|departures).tabIndex={0} to airport <section>aria-labelledby (name, code, city, minute-only time)?iata= is setAn accessible, responsive web application that provides real-time flight and airport information. Built on Cursor, powered by AirLabs API and shipped in Vercel. Post-launch audit via WAVE and axeDevTools confirms 0 automated violations and 10/10 compliance score
<a> elements, which are meant to direct to other pages, and the table was built with <div>. The correct elements would be <tab> and <th>/<tr> respectively. It's important that the code matches the expected behavior, even if it looks correct.