Inspiration

Every photographer has been there — you drive an hour to a viewpoint, set up your gear, and watch the light turn flat and lifeless. You had the spot. You just didn't have the moment.

Apps like Google Maps tell you where. Nothing tells you when.

We wanted to build the platform the photography community never had: one where the world's best photographers don't just post pretty pictures, they share the exact spot, the exact direction, and the exact time of day that made the shot. A living map of the world's best light, curated by the people who chase it for a living.

What it does

PhotoSpots is a mobile-first web app that helps photographers discover great locations and shoot them at the right moment.

  • Golden Hour Tracking — a real-time 24h solar timeline shows morning and evening golden windows for any location, with a live countdown ticking to the second
  • Map-first discovery — an interactive dark-mode map with spot markers, proximity search, and category filtering
  • Rich spot pages — each location includes compass bearing, gear recommendations, photographer attribution, and community comments
  • Ambient golden hour pulse — during active golden windows, the map UI itself glows warm, making the interface respond to real-world light conditions in real time

How we built it

The frontend is built on Next.js 16 (App Router) with React 19 and TypeScript, styled with Tailwind CSS v4 and animated with Framer Motion. Maps run on react-leaflet. Solar geometry — sunrise, sunset, golden hour windows — is computed client-side using suncalc.

On the backend, AWS DynamoDB handles all data storage via the DynamoDB Adapter, and AWS S3 manages photo uploads with presigned URLs. Auth is handled by NextAuth v4 with Google OAuth. Data fetching uses SWR for stale-while-revalidate caching. The project is tested with Vitest and ships with Vercel Analytics built in.

Challenges we ran into

Solar math meets React hydration. The golden hour bar renders a live needle based on the current time. Server-rendered and client-rendered HTML disagreed by milliseconds — enough to break React's hydration check. The fix: defer the initial Date to a useEffect, render a skeleton server-side, and hydrate cleanly on the client.

Information density vs. breathing room. A map UI has to compete with itself — the map is the content, but search, filters, and spot cards all live on top of it. Getting the balance right meant stripping every unnecessary pixel, collapsing the bottom sheet, and replacing generic cards with inline layouts wherever possible.

Making the interface feel alive without feeling busy. The ambient glow, the pulsing golden hour badge, the live countdown — each one had to add meaning without adding noise. If motion doesn't serve the user, it doesn't ship.

Accomplishments that we're proud of

  • A golden hour indicator that feels genuinely useful — not a gimmick, but a tool photographers would actually open before a shoot
  • A dark, cinematic UI that matches the aesthetic of the community it serves, without feeling like a generic "dark mode" afterthought
  • Real solar geometry powering live UI state — the app literally knows what the light is doing outside right now
  • A clean, scalable backend on DynamoDB + S3 that handles geo queries, community content, and photo storage without a traditional database

What we learned

That the best community products don't just aggregate content — they encode expertise into the product itself. A photographer sharing a spot on PhotoSpots isn't just dropping a pin. They're telling the next person: face this direction, be here at this time, bring this lens.

The platform's job is to make that knowledge impossible to lose.

We also learned that real-world constraints — the angle of the sun, the distance to a location, the direction a cliff face points — are the most interesting design inputs you can work with. When the interface responds to physics, it stops feeling like software.

What's next for PhotoSpots

  • Native mobile app — the core experience is map and moment, which belongs in your pocket on the way to a shoot
  • Shot matching — upload a reference photo and find spots where the geometry, light angle, and focal length match
  • Seasonal planning — multi-day golden hour forecasts layered with weather data so photographers can plan shoots weeks out
  • Photographer profiles — verified portfolios, follower graphs, and curated spot collections from the community's best contributors
  • Gear lending — connect photographers in the same city to borrow and lend equipment for specific shoots

Built With

Share this project:

Updates