Skip to content
CASE STUDY

Stockholm Escapes - finding a day trip without reading ten blog lists.

A Swedish, mobile-first discovery app for spontaneous day trips around Stockholm. Instead of searching across tourist sites and blog round-ups, you choose based on mood, travel time, weather and practical needs - and get a short list of places you can actually reach today.

Role
Product · UX · Frontend
Type
Self-initiated product
Stack
React 19, TypeScript, Tailwind v4
Status
Live
Stockholm Escapes
Stockholm Escapes start page in Swedish, with the heading 'Hitta din nästa Stockholmsutflykt', a call-to-action button and a row of daily destination tips
01The problem

Planning a spontaneous day trip around Stockholm usually means opening several tourist sites and blog lists, then manually working out how far each place is, whether it suits the weather and whether it fits the kind of day you want. The information exists - it is just scattered and slow to compare.

02My role

This is an AI-assisted build. I used an AI agent as an implementation partner while I defined the concept and requirements, directed the UX, content and prioritisation, iterated on and tested the experience, and reviewed the technical decisions and code. My contribution centred on product thinking, UX and content direction, quality assurance and technical judgement.

03Core UX and product decisions
  • Curated content, not a scraped feed

    A smaller, consistently structured selection of destinations beats an automated feed of uneven quality. It keeps descriptions useful and comparable.

  • Explainable rules instead of an AI chatbot

    Daily recommendations come from transparent weather and season rules, so the user can see why a place is suggested today rather than trusting a black box.

  • Filters that match how people actually decide

    Mood filters use OR semantics - any of the moods you pick is fine. Practical requirements use AND, because 'easy by public transport' and 'food available' are conditions, not preferences.

  • Filter state lives in the URL

    Filters are persisted and shareable through the URL, so a result set can be sent to a friend or reopened later without redoing the work.

  • No account, no database

    Saved trips are kept in localStorage. For this use case that is enough, and it avoids sign-up friction and unnecessary personal data.

  • Swedish and mobile-first by design

    The app is used on a phone, often on the way out the door, and by people planning trips in Swedish. Both were design constraints from the start, not translations added later.

04Technical architecture

The app is built with React 19, TypeScript and Tailwind CSS v4. Filter choices are synchronized to the URL, so a result set can be shared or reopened. External APIs provide current event and weather data, which supports the daily recommendation rules. The app also includes an interactive map, and saved trips are stored locally in the browser.

05Validation, accessibility and quality

28 unit tests run in Vitest, alongside TypeScript and production build verification. Accessibility work includes a skip link, a semantic main landmark and heading structure, aria-pressed states on filter toggles and visible focus styles for keyboard users. Query parsing is deliberately tolerant of malformed or outdated URLs, and error and 404 states are written in Swedish like the rest of the interface.

06Honest limitations

The destination content is curated by hand, so coverage is intentionally narrow rather than exhaustive. Recommendations are rule-based and will not capture every nuance of a good day out. Saved trips live in one browser and do not follow the user between devices. The app is Swedish-only for now.

07What I'd do next

Widen the destination set with the same editorial standard, add lightweight analytics to see which filters people actually use, and run a full accessibility review on the map and filter interactions with a screen reader.