Tourify

ExpoReact NativeLaravelMySQL

Cross-platform mobile app to explore cities, points of interest and tourist events. Users can discover destinations, save favorites, review places, register for events and receive push notifications.


Tourify is a mobile application designed to centralize the tourist experience: it brings together in one place the scattered information about cities, places, categories and events, letting users discover destinations, organize their favorites and engage with the community through reviews and event registrations.

Architecture and Tech Stack

Core Architecture

  • Frontend: Expo + React Native 0.81 with React 19 and React Navigation 7
  • Backend: Laravel 13 as a REST API (PHP 8.3)
  • Authentication: Laravel Sanctum (personal access tokens)
  • Database: MySQL with versioned migrations
  • Notifications: Expo Push Service

Layered Architecture

The project cleanly separates client and server in a monorepo:

  • frontend/ — Client app (Expo / React Native) for iOS, Android and Web
  • backend/ — REST API (Laravel 13)

Communication happens over HTTP/JSON, with Bearer tokens managed by Sanctum and stored securely on the device via Expo Secure Store.

Key Features

Tourist Exploration System

The app organizes content into a navigable hierarchy:

  • Cities: Main destinations with their associated places and events
  • Categories: Thematic classification of places (food, culture, nature, etc.)
  • Places: Points of interest with detail view, images and reviews
  • Events: Dated activities the user can register for

User Interaction

Tourify implements social and personalization features:

  • Favorites: Polymorphic relationship that lets users save both places and events
  • Reviews: Polymorphic rating system for places and events
  • Event registration: Sign-up and cancellation with a "my registrations" list
  • Notifications: Notification inbox with read-marking and real-time push

Authentication System

  • Token-based register, login and password recovery
  • Persistent session via Expo Secure Store
  • Protected routes with auth:sanctum middleware
  • /auth/me endpoint to hydrate the user profile

Technical Highlights

API-First Architecture

  • Public resources (cities, categories, places, events) accessible without authentication
  • Protected resources (favorites, reviews, registrations, notifications) behind Sanctum
  • RESTful controllers organized by resource

Administration System

A complete admin module exists, separate from the public API:

  • is_admin middleware for role-based access control
  • Panel with controllers for Dashboard, Users, Cities, Categories, Places, Events, Reviews and Notifications
  • Role model for permission management

Polymorphic Relationships

The data model leverages Eloquent polymorphism so that Favorites, Reviews and Images can attach to either places or events, avoiding table duplication and simplifying the logic.

Push Notifications

  • Device token registration (/push-token)
  • Notification delivery through the Expo service
  • Sync with the internal notification inbox

Project Structure

backend/
├── app/
│   ├── Http/Controllers/      # Public REST controllers
│   │   └── Admin/             # Admin panel controllers
│   ├── Http/Middleware/       # IsAdmin
│   └── Models/                # City, Category, Place, Event, Review...
├── database/migrations/       # Versioned schema
└── routes/api.php             # Endpoint definitions

frontend/
├── App.js / Router.js         # Entry point and navigation
├── context/                   # AuthContext (session state)
├── services/                  # post.js (API), storage.js
├── hooks/                     # Reusable hooks
└── views/
    ├── public/                # Screens (Explore, Home, Detail...)
    └── components/            # auth, common, detail, explore, home

Data Model

Main entities: Users, Cities, Categories, Places, Events, Favorites, Reviews, Notifications, Images, Event Registrations, Roles.

  • A city groups places and events
  • A category classifies places
  • Favorites, reviews and images are polymorphic (places/events)
  • Users register for events (N:M relationship with extra data)

Impact and Scalability

  • Cross-platform: A single codebase for iOS, Android and Web thanks to Expo
  • Modular: The frontend/backend separation allows independent scaling and iteration
  • Extensible: The admin panel makes content management possible without touching code
  • Real-time: Push notifications keep users informed about events

Notes

This summary is based on the current project architecture with Laravel 13 (PHP 8.3) and React Native 0.81 / React 19. The API-first approach with Sanctum ensures a robust token-based security model, while the use of polymorphic relationships keeps the data schema clean and scalable.


© 2026 Felipe Giraldo