About

A TypeScript take-home project built for a Lead and Senior Engineer technical test. The app accepts a city or town and ranks how good the next seven days are for skiing, surfing, outdoor sightseeing and indoor sightseeing.

The goal was not a fully featured travel product. The implementation prioritises clear boundaries, maintainable domain logic, typed contracts, and explicit trade-offs.

Key Features

  • Explainable scoring. Every activity gets a 0 to 100 score per forecast day alongside a reason the user can read, rather than an opaque number.
  • Skiing. Favours colder days, snowfall and lower wind.
  • Surfing. Favours rideable wave height, longer wave period and milder weather, using marine forecast data.
  • Outdoor sightseeing. Favours comfortable, dry, low-wind days.
  • Indoor sightseeing. Scores higher when conditions outside are rainy, windy, too cold or too hot.
  • Schema-first GraphQL. A shared SDL contract is the source of truth, with generated types across frontend and backend.
  • Provider resilience. One isolated weather client owns validation, retries, timeouts and caching, instead of scattering them through resolvers.

Tech Stack

  • TypeScript
  • Bun workspaces + Turborepo
  • Node.js
  • Hono
  • GraphQL Yoga
  • React
  • Vite
  • urql
  • Open-Meteo APIs
  • Zod
  • Pino
  • Vitest
  • Docker

Source Code

Screenshots