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

