Zenith is a dark-themed astronomy planning platform built with Next.js, Prisma, PostgreSQL, Auth.js, and Leaflet. It helps users find stargazing locations, review sky conditions, inspect astronomy data, and organize community meetups.
Zenith combines a location-first map experience with authenticated dashboards and meetup coordination. The app is designed as a portfolio-ready full-stack project with a strong emphasis on responsive UI, clear data flow, and production-oriented runtime behavior.
- Interactive map for finding and saving dark-sky locations.
- Weather, light pollution, Zenith Score, and astronomy intelligence panels.
- Community meetup browsing with pagination, filtering, and sorting.
- Protected dashboard with saved-location and meetup analytics.
- Google OAuth sign-in with optional GitHub sign-in.
- Loading, empty, and error states across the major routes.
- Accessible navigation, menu controls, and form interactions.
Browser
|
v
Next.js App Router
|-- Server Components / Server Actions
|-- Route Handlers
|-- Metadata / SEO
|
+--> Auth.js + Prisma Adapter ---> PostgreSQL (Users, Accounts, Sessions)
|
+--> Meetup Service (Prisma skip/take pagination)
+--> Dashboard Stats Service
+--> Weather API (OpenWeather)
+--> Map Search / Reverse Geocoding (Nominatim)
+--> Astronomy + Zenith Score services
|
v
Leaflet client map + UI components
The repository includes a full proof set in Zenith-Proofs/ so the README can show the real product flow, not just a summary.
| What is included | Count |
|---|---|
| Screenshots | 14 |
| Demo videos | 2 |
![]() Login page |
![]() Dashboard |
![]() Meetups listing |
![]() New location |
![]() Weather intelligence |
![]() Light pollution intelligence |
![]() Astronomy intelligence |
![]() Zenith score |
![]() Score breakdown |
![]() Upcoming astronomical events |
![]() Create meetup |
![]() Meetup creation |
![]() Address lookup |
![]() New location light pollution |
- Next.js 16 App Router
- React 19
- TypeScript
- Tailwind CSS
- Prisma ORM 7
- PostgreSQL
- Auth.js / NextAuth
- Leaflet + React Leaflet
- OpenWeather API
- Nominatim geocoding
- SunCalc for astronomy calculations
Core data is modeled in Prisma with PostgreSQL:
Userstores account identity, roles, and profile metadata.Account,Session, andVerificationTokenpower Auth.js session storage.Locationstores saved stargazing spots and score data.FavoriteLocationconnects users to saved locations.Meetupstores meetup lifecycle data, host linkage, and location details.MeetupParticipantstores RSVP membership.AstronomicalEventstores upcoming astronomy events.
Meetup browsing uses Prisma skip / take pagination with filter and sort preservation.
- User clicks Google sign-in from
/login. - Auth.js redirects to Google OAuth.
- Google returns to
/api/auth/callback/google. - Auth.js links or creates the Prisma user/account.
- Auth.js creates a database session.
- The app redirects the user to the requested callback URL.
- Protected pages read the session through
auth()and middleware.
npm install
npx prisma generate
npx prisma migrate deploy
npm run devOpen http://localhost:3000 in your browser.
Required:
DATABASE_URLOPENWEATHER_API_KEYAUTH_SECRETAUTH_GOOGLE_IDAUTH_GOOGLE_SECRET
Optional:
AUTH_GITHUB_IDAUTH_GITHUB_SECRET
- Set all required environment variables in your hosting provider.
- Run Prisma migrations before the first production boot.
- Set Google OAuth redirect URIs for your deployed domain and local development.
- Build the app with
npm run build. - Deploy the application.
- Verify sign-in, dashboard access, meetup browsing, and logout.
- Replace the remaining
middleware.tswarning withproxy.ts. - Add screenshot assets to the repository.
- Expand meetup filters by region or date range.
- Add user profile editing and saved-location management.
- Add richer astronomy event detail pages.
- Add background jobs for periodic weather and astronomy refreshes.
- Integrate AI based searching which helps user to find the nearby places which are suitable for Observing Celestial Objects.
















