Inspiration
Stargazing is a magical experience, yet most people don't know when or where to go.
We thought to ourselves: Why canβt stargazing be as easy as checking the weather app?
This question sparked Lumina: a platform that helps people find the best places and times to stargaze, blending astronomy, weather intelligence, and geospatial visualization.
Stars are getting increasingly difficult to see with the amount of light pollution today. Lumina is our way to make that experience accessible, predictable, and personal through data and design.
What it does
Lumina is a platform that finds you the perfect locations to stargaze mathematically. We modeled this problem as an optimization of three main conditions:
$$ f(\text{Weather}, \text{Light Pollution}, \text{Proximity to User}) $$
Our goal is to maximize that score, giving users a location and time to create the best stargazing experience possible.
How we built it
π οΈ How We Built It
β¨ Frontend Magic
We built Luminaβs frontend using React 19 with Vite 7, giving us blazing-fast hot reloading, incremental builds, and a smooth developer experience. React Router powers seamless page transitions between the interactive globe view and the saved-places dashboard.
3D Globe Visualization:
- Powered by Mapbox GL JS in 3D globe mode.
- Supports smooth zoom, pan, and rotation interactions.
UI & Styling:
- Built with TailwindCSS for responsive design and Framer Motion for subtle animations.
- Used React-Date-Range to let users select optimal nights for stargazing.
- Designed polished gradient themes that shift from dusk to deep night tones.
Performance:
- Optimized rendering by keeping Mapbox and React states decoupled.
- Leveraged lazy loading for heavy components and background data fetching for a smooth UX.
βοΈ Backend Magic
The backend runs on Python Flask, acting as the analytical engine that processes coordinates, aggregates datasets, and generates stargazing insights.
Location Processing:
- Accepts user-entered locations and resolves them to latitude and longitude through the Mapbox Geocoding API.
Data Fusion Pipeline:
- Creates results from our in-house Light Pollution API, a Weather API, and proximity to the user to evaluate sky clarity.
- The Weather API includes information such as temperature, chance of rain, and cloud coverage.
Architecture Summary: Our backend pipeline fuses spatial and temporal data into a unified scoring model. Light pollution maps, real-time weather forecasts, and user proximity are normalized and weighted dynamically inside Flask. The result is a composite visibility index that updates on demand and drives recommendations. This architecture allows Lumina to not only suggest where to go but also when to go β giving each user the best moment to look up.
Constellation Rendering:
- Uses the Python starplot library to generate constellation charts based on the suggested location and date to stargaze
Challenges we ran into
- Data integration β pulling weather, light pollution, and location info from different sources and making them work together.
- Mapping UX β designing a responsive map interface that matches our design and our functionality requirements.
Accomplishments that we're proud of
- Built an immersive platform that actually helps users discover nearby stargazing locations in real-time.
- Built our own API for the light pollution feature.
What we learned
π§ Technical Insights
- APIs Need to Agree: Weather, location, and light pollution data came in different formats and required careful cleaning.
- Maps Are Tricky: Getting our globe to render real-time results without clutter smoothly took iteration.
π¨ Product Insights
- Clarity Wins: A clean map with just the essentials beats overloaded dashboards.
- Details Count: Simple features like travel distance went a long way.
What's next for Astralink
π Long-Term Vision
- Personalization: Favorites, custom alerts, tailored recs.
- Immersion: AR overlays to see the locations generated.
- Global: Worldwide coverage (Only the US currently).
Ultimate Goal
Make stargazing simple and enjoyable for all.

Log in or sign up for Devpost to join the conversation.