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.
- 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).
- 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.
- 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).
- 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.
- 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.
- 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
App Router with force-dynamic SSR, [locale] routing via next-intl, dynamic sitemap.ts / robots.ts, next/image with AVIF/WebP optimization
REST API with 15 endpoints, Eloquent ORM with model accessors, request validation, rate limiting on write endpoints, Markdown mail templates
Admin panel with 8 CRUD resources, rich text editors (TinyMCE), file upload management, reorderable items, repeater fields for FAQs
Full type safety across frontend — typed API interfaces (ApiTrip, ApiBlog, ApiService, ApiGovernorate, ApiCategory)
Utility-first styling with RTL logical properties (ms-*, me-*, start-0, end-0), @tailwindcss/typography for blog prose
11 domain tables with bilingual columns, unique slug indexes, cascading foreign keys, enum status fields
t3.micro Amazon Linux 2023 hosting both frontend (Node.js/PM2) and backend (Nginx/PHP-FPM)
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.
Related Reading
Deep dives and comparisons related to the technologies used in this project.
Scaling Laravel APIs: From 500 to 10,000 Concurrent Users
Practical techniques for scaling Laravel beyond its reputation — queue-based processing, Redis caching strategies, and database optimization patterns from the Avidnote project.
Laravel vs. Django for Backend APIs — A Developer's Honest Comparison
Senior backend developer compares Laravel (PHP) and Django (Python) for APIs. Real benchmarks, development speed, hosting costs, and when to use each framework.
Related Projects
Explore similar case studies with overlapping technologies and challenges.