Choosing a place and shaping a complete outing involves too many disconnected decisions.
Read the full context
Finding a place in Makkah or Jeddah requires more than a name and category. Users need practical context such as the place signal, atmosphere, opening hours, expected price range, location, and what to know before visiting. The decision becomes more fragmented when an outing includes multiple stops. Users must search for options, save them, compare their suitability, and manually arrange them around time, group size, and preferences. Traditional place lists expose information, but they do not connect discovery, evaluation, and planning into one continuous experience.
The idea
Pulse converts place discovery into a decision system built around live-feeling status signals, useful place context, comparison, saved collections, and multi-stop planning.
Product Strategy
UI/UX Design
Flutter
Riverpod
GoRouter
Repository Architecture
Local Persistence
Automated Tests
01
City Radar
Ranked sections such as Top Signal and Moving Now surface places through status, distance, category, and why-now context instead of a static directory.
02
Place Intelligence
Place pages combine status signals, opening hours, price range, vibe, practical notes, menu context, gallery media, and comparable alternatives.
03
Plans & Collections
Users can save places into collections, compare options, and generate multi-stop plans under time, budget, city, and preference constraints.
04
Local-First Bilingual UX
Flutter, Riverpod, repositories, structured JSON, and SharedPreferences keep the frontend modular while supporting Arabic/English direction changes and persistent preferences.
Design decisions
The key choices that shaped place discovery, decision-making, and outing planning.
01
Representing each place as a readable signal
Why?One signal language (status, movement, score) reads the same on the feed, the cards and the map.
Rather than organizing discovery around categories alone, Pulse assigns each place one of nine status families, a movement direction, a Pulse score, and an opening state. The same visual language is used across the home feed, viral view, cards, and map, allowing users to understand and compare places without relearning the interface on every screen.
02
Turning the place page into a decision hub
Why?The questions that come before a visit are answered on one page.
The details experience was designed to answer the questions that come before a visit instead of presenting only a description and image. It combines a quick read, recommended move, value note, atmosphere, pricing, opening hours, menus, parking and seating information, galleries, and parent-child venue relationships. This reduces the need to switch between several sources before making a decision.
03
Connecting discovery, saving, comparison, and planning
Why?Alternatives and actions sit under every place, so a choice keeps moving toward a plan.
Collections and planning are not treated as isolated tools. A place can become a plan anchor directly from its details page, while saved items or a specific collection can become the plan source. Users can compare two options before planning, then preserve preferred stops or replace unsuitable ones without losing the context of the original decision.
On mobile
From City Signals to an Outing Plan
City RadarRanked signals explain what is moving now and why each place is relevant.
City MapPlace signals are explored spatially with a selected-place preview.
Gallery & AlternativesMedia, opening hours, comments, and similar places extend the place read.
How it's built
From the screen to the database.
Flutter UIResponsive bilingual product screens
Riverpod StateFeature controllers and derived state
Repository LayerReplaceable local data sources
Structured JSON + SharedPreferencesPlace data and persisted preferences
IntegrationsGoRouterArabic / EnglishFlutter Test
Engineering evidence
Feature folders separate controllers, screens, widgets, domain entities, repositories, and use cases.
SharedPreferences persists language, city, onboarding, account data, saved collections, reservations, and planning history.
Domain use cases handle ranking, filters, opening status, price formatting, comparisons, place reads, menu picks, and plan generation.
Automated tests cover domain behavior, controller state, storage and routes, and reusable widgets.
Validation
Flutter analysis and test suites cover domain use cases, state controllers, storage, routing, and widgets.
Arabic/English switching and persisted city and preference behavior are verified through storage and route tests.
The deployed private version runs the complete interactive journey.
Outcome
An interactive product that connects place discovery with outing decisions and multi-stop planning.
Read the full context
Pulse delivers a connected functional journey across 66 structured place records for Makkah and Jeddah, supported by 544 local content images and organized data for opening hours, pricing, menus, and before-you-go details. Users can move from reading a place signal to reviewing its details, saving it into a collection, comparing it with another option, or using it as the foundation of an outing plan. The planning journey generates two to four stops based on the available time, group size, outing intent, and selected rules. Plans can use different sources, preserve locked stops, replace individual choices, and be copied or stored in local history. The project demonstrates the design and implementation of a multi-flow Flutter product with clear information architecture, connected state management, and complete Arabic and English interface support. Pulse is in active development, and the current version runs on local data and on-device persistence.