Full-Stack Web

Ease Travel — Egyptian Tourism Platform

Full-stack bilingual tourism platform with headless architecture: Next.js 16 frontend, Laravel 11 REST API, and Filament v3 admin panel.

Timeline: 13 days from initial commit to production deployment (61 commits)

Key Results

13 days

Development Speed

61 commits from initial commit to full production deployment

28 bilingual

Page Routes

14 routes × 2 locales — 10 static + 4 dynamic slug-based routes

15 RESTful

API Endpoints

Full CRUD coverage for 7 content types under /api/v1

7 types

Schema.org Types

TravelAgency, WebSite, TouristTrip, BlogPosting, BreadcrumbList, FAQPage, GovernmentService

The Problem

Egypt's tourism market is dominated by outdated WordPress sites and legacy PHP platforms that fail to deliver fast, mobile-first, SEO-optimized experiences — especially for Arabic-speaking users.

  • Existing competitor sites run on legacy WordPress/PHP with poor Core Web Vitals, slow load times, and no RTL-first design.
  • No centralized system to manage tours, blog content, embassy appointment schedules, flight bookings, and service pages from a single admin panel.
  • Arabic (RTL) support was typically an afterthought — causing layout bugs, poor readability, and lower conversion rates for the primary Egyptian audience.
  • Zero structured data (JSON-LD) on competitor sites, missing out on Google rich results for tours, pricing, FAQs, and breadcrumbs.

The Solution

Built a decoupled headless architecture with a Next.js 16 SSR frontend consuming a Laravel 11 REST API, with a Filament v3 admin panel for content management. Every feature was designed RTL-first with full Arabic/English bilingual support and comprehensive Schema.org structured data.

  1. 1Designed the database schema with full bilingual column strategy — every content field duplicated as _ar / _en columns across 11 domain tables (trips, blogs, services, embassies, governorates, categories, bookings, contact messages, trip images, users, personal access tokens).
  2. 2Built the Laravel 11 REST API with 15 endpoints under /api/v1 — RESTful CRUD for trips, categories, blogs, services, embassies, and governorates. Write endpoints rate-limited at 6 requests/minute with email notifications via Markdown mail templates.
  3. 3Built the Filament v3 admin panel with 8 CRUD resources across 3 navigation groups (Tourism, Content, Operations) — rich text editors, bilingual form sections, file uploads, status badges, reorderable items, and FAQs repeater (JSON).
  4. 4Built the Next.js 16 frontend with 14 page routes (10 static + 4 dynamic [slug]), 22 components, and full next-intl i18n routing with Arabic as default locale.
  5. 5Implemented comprehensive SEO: dynamic sitemap.ts (bilingual URLs for all content types), Schema.org JSON-LD on every page (TravelAgency, TouristTrip, BlogPosting, BreadcrumbList, FAQPage, GovernmentService, WebSite with SearchAction), and semantic HTML with breadcrumbs.
  6. 6Deployed to AWS EC2 (t3.micro, Amazon Linux 2023) with Cloudflare DNS/SSL. Custom middleware handles www→non-www 301 redirects and Cloudflare SSL x-forwarded-proto header rewriting.

Architecture Decisions

Key technical decisions made during the project and the reasoning behind them.

Headless (Next.js + Laravel) over Monolithic Laravel

Reasoning

A monolithic Laravel app with Blade templates would be simpler, but SSR performance, image optimization (AVIF/WebP via next/image), and React's component model for complex interactive UIs (tour filters, booking forms, animated navigation) made Next.js the better frontend choice. Laravel excels as a pure API + admin panel via Filament.

Outcome

Clean separation of concerns — the API serves both the website and potential future mobile apps. Frontend can be independently deployed and cached.

Full Column Duplication (_ar / _en) over JSON Translation Columns

Reasoning

Using a JSON column would simplify the schema but prevent database-level indexing and querying on translated fields. Separate columns allow unique indexes on slug_ar / slug_en for SEO-friendly URL lookups and direct WHERE clauses.

Outcome

Slug-based lookups are indexed and fast. The API controller checks both slug_en and slug_ar in a single WHERE clause without JSON parsing.

Filament v3 over Custom Admin or Nova

Reasoning

Filament v3 provides a complete admin panel (forms, tables, filters, file uploads, rich text editors) with zero frontend build step — it runs on Livewire. Nova requires a license and has less flexibility. A custom admin panel would take weeks.

Outcome

8 fully functional CRUD resources built rapidly with bilingual form sections, status badges, repeater fields (FAQs), and file upload management.

next-intl with Arabic Default Locale

Reasoning

The primary audience is Egyptian Arabic speakers. Setting ar as the default locale means the root URL (/) serves Arabic content — no redirect penalty. English is the secondary locale at /en/. next-intl was chosen over next-i18next for its native App Router support.

Outcome

Clean URL structure: ease-travel.online/ar/tours/رحلات-دهب and ease-travel.online/en/tours/enchanting-dahab-trips with proper hreflang alternates.

The Tech Stack

Next.js 16

App Router with force-dynamic SSR, [locale] routing via next-intl, dynamic sitemap.ts / robots.ts, next/image with AVIF/WebP optimization

Laravel 11

REST API with 15 endpoints, Eloquent ORM with model accessors, request validation, rate limiting on write endpoints, Markdown mail templates

Filament v3

Admin panel with 8 CRUD resources, rich text editors (TinyMCE), file upload management, reorderable items, repeater fields for FAQs

TypeScript

Full type safety across frontend — typed API interfaces (ApiTrip, ApiBlog, ApiService, ApiGovernorate, ApiCategory)

Tailwind CSS 4

Utility-first styling with RTL logical properties (ms-*, me-*, start-0, end-0), @tailwindcss/typography for blog prose

MySQL

11 domain tables with bilingual columns, unique slug indexes, cascading foreign keys, enum status fields

AWS EC2

t3.micro Amazon Linux 2023 hosting both frontend (Node.js/PM2) and backend (Nginx/PHP-FPM)

Cloudflare

DNS management, SSL (Flexible mode), CDN caching for static assets

The Impact

A production tourism platform built and deployed in under 2 weeks, serving both Arabic and English audiences with comprehensive SEO foundations across 7 Schema.org structured data types.

Deep dives and comparisons related to the technologies used in this project.

Explore similar case studies with overlapping technologies and challenges.