Skip to content

InnaTarasyan/hurgada

Repository files navigation

Crystal-clear Red Sea water over coral reef

✨ Red Sea Diaries

Hurghada · Egypt · the most beautiful sea on earth

🌊   🐚   ☀️   🌸   ✈️

A modern, girlish travel blog for dreamers, divers, and sunset chasers —
built with love for turquoise water, coral gardens, and slow days by the shore.


Hello, lovely traveler

Some seas are just pretty. The Red Sea is something else — crystal clarity, warm shallows, rainbow reefs, and light that turns every evening into a watercolor. Hurghada is where this diary lives: beaches, island hops, marina walks, and the kind of magic you pack in your heart long after the flight home.

Red Sea Diaries (Hurgada) is your aesthetic guide to that world — part postcard, part planner, part community. Browse in flip-flops energy; save favorites when you fall in love with a spot; share stories in the forum. No rush. Salt in your hair. Free spirit welcome. 🌸

Golden beach at the Red Sea

Golden hour — because the Red Sea knows how to glow

Snorkeling over coral in the Red Sea

Underwater daydreams — 1,200+ fish species await


Table of contents


Why the Red Sea?

2,250 km of coastline Room to wander, dive, and disappear into blue
~28°C average water Swim-season energy almost all year
1,200+ fish species Snorkel once; talk about it forever
365 days of sunshine Pack the cute sunglasses — you'll need them

Pink sunset over a Red Sea beach

They call it the most beautiful sea on earth. After one sunset here, you'll understand why.


Explore the site

Everything is written for you — the curious traveler, not the backend. Soft cards, serif headlines, sea-and-blush colors, and pages that feel like a magazine spread.

🏠 Home — Stories from the Red Sea

Your welcome mat. Editorial hero, personal letter from the blog, Red Sea fact strip, discover cards, polaroid photo strip, image carousel, interactive Hurghada map with pastel pins, live weather for the coast, and reader testimonials. One scroll = pure vacation mood.

📖 About — Meet the diary

The story behind the blog: why Hurghada, why the Red Sea, and the free-spirit vibe that ties it all together.

✍️ Journal — Travel blog & sea stories

Long-form blog posts with slugs, publish dates, and reading-friendly layouts. Tips, guides, and honest moments from life by the water. Perfect for planning — or for armchair dreaming with tea.

🌴 Discover — Attractions & hidden gems

Curated attractions: beaches, reefs, islands, desert trips, and local favorites. Each place has descriptions, categories, ratings, popularity, price range, opening hours, contact details, and map coordinates so you know exactly where paradise is.

  • Browse the full directory
  • Open a detail page for the full story
  • Heart what you love (when logged in)
  • Leave comments and read what other travelers said

📸 Gallery — Photo diary

A masonry wall of Red Sea beauty — turquoise bays, white sand, resort shores, coral glimpses. Click to lightbox full-size. Images come from the media library when seeded; gorgeous fallbacks keep the page alive even on a fresh install.

🎉 Events & tours

Upcoming events: festivals, diving trips, desert safaris, marina nights. Filter by date, see what's featured, and open event pages for schedules and details. Your social calendar for Hurghada.

🏨 Stay — Hotels & resorts

Hotels with descriptions, star ratings, amenities, and links — from boutique hideaways to big resort energy. Find where to drop your bag after a day in the sun.

🍽️ Eat — Restaurants

Restaurants for every mood: seafood by the marina, casual beach bites, date-night spots. Browse, compare, and pick your next meal with a view.

💬 Forum — Traveler community

A cozy community board for questions, tips, and “just got back!” stories.

  • Browse threads by category
  • Search titles and posts
  • Sort by latest or most popular
  • Start a thread (members or guests with name/email)
  • Reply on thread pages
  • Edit or delete your own threads when signed in

📬 Contact

A simple contact form — say hello, ask for advice, or share a tip. We love hearing from fellow sea lovers.

🗺️ Map & weather (on Home)

  • Leaflet map centered on Hurghada with clickable spots (beaches, marina, Giftun Island)
  • Open-Meteo live temperature — “perfect beach weather” at a glance

Your personal corner

Sign up (or log in) and the site becomes yours.

💕 Favorites

Tap the heart on attractions, events, or blog posts. Livewire saves it instantly — no page reload, no fuss. Your picks show up on the Dashboard so your trip moodboard is always one click away.

💬 Comments

On attraction, event, and blog pages, drop a comment in the pink-toned thread. Built with Livewire — post and see the conversation update right there.

🎀 Dashboard — Your travel moodboard

After login (email verified), your private space includes:

Section What you get
Favorites Recent hearts across the site
Your voice Latest comments + forum replies in one timeline
Coming up Upcoming events so you don't miss a tour
Inspiration Suggested attractions & journal posts
Moodboard A strip of gallery thumbnails — pure aesthetic

👤 Profile & account

Update your name and email, change password, or manage account settings via Laravel Breeze — clean, minimal, secure.


Little details that matter

  • Mobile-friendly navigation with a soft, blush-and-sea palette
  • Privacy policy & terms of use for peace of mind
  • SEO sitemap at /sitemap.xml — blogs, events, attractions, forum threads
  • Custom 404 — even lost pages stay on-brand
  • Docker option for nginx + PHP + MySQL + phpMyAdmin
  • Typography: Playfair Display, Crimson Text, Dancing Script, Poppins — editorial meets beachy

Snorkeling adventure in Hurghada


Getting started (developers)

Pack your laptop like a carry-on — setup is quick.

Requirements

  • PHP 8.2+
  • Composer
  • Node.js 18+ & npm
  • SQLite (default) or MySQL

Local setup

# Clone and enter the project
cd hurgada

# PHP dependencies
composer install

# Environment
cp .env.example .env
php artisan key:generate

# Database (SQLite file is created automatically on fresh install)
php artisan migrate --seed

# Frontend
npm install
npm run build   # or: npm run dev

# Run (pick one)
composer dev    # serves app + queue + logs + Vite together
# — or —
php artisan serve

Open http://localhost:8000 (or your APP_URL).

Demo login (after seeding): demo@hurghada.test / password

Docker

docker compose up -d
Service URL
App (nginx) http://localhost:8000
phpMyAdmin http://localhost:9090
MySQL port 3307

Point .env at MySQL when using containers (DB_HOST=mysql, etc.).


Technical documentation

The sand-between-your-toes section — for engineers who build the dream.

Architecture overview

Red Sea Diaries is a monolithic Laravel 12 web application: server-rendered Blade views, Livewire 3 for reactive islands, Alpine.js for lightweight client behavior, and Vite 7 for asset bundling. No separate SPA — fast first paint, SEO-friendly HTML, and maintainable PHP throughout.

┌─────────────────────────────────────────────────────────────┐
│  Browser                                                    │
│  Blade layouts · Livewire components · Alpine.js · Vite CSS │
└───────────────────────────┬─────────────────────────────────┘
                            │ HTTP
┌───────────────────────────▼─────────────────────────────────┐
│  Laravel 12 (PHP 8.2+)                                      │
│  Routes → Controllers → Eloquent → MySQL / SQLite           │
│  Middleware · Policies · Form Requests · Events/Queues      │
└───────────────────────────┬─────────────────────────────────┘
                            │
┌───────────────────────────▼─────────────────────────────────┐
│  Storage · Session/Cache DB · Queue (database driver)         │
└─────────────────────────────────────────────────────────────┘

Runtime & language

Component Version / role
PHP ^8.2 — typed properties, readonly, enums, attributes
Composer PSR-4 autoloading; App\, Database\Factories\, Database\Seeders\
Laravel Framework ^12.0 — streamlined bootstrap/app.php routing & middleware

Laravel core — what we use and where

Application bootstrap (bootstrap/app.php)

Laravel 11+ style configuration: Application::configure() registers web routes, console commands, and the /up health endpoint. Middleware and exception handling are closure-based hooks ready for extension.

HTTP layer

Area Implementation
Routing routes/web.php — named routes, resource controllers (only index/show), auth group, forum CRUD with policies, fallback 404 view
Controllers Thin controllers under app/Http/Controllers/PageController, AttractionController, EventController, BlogController, GalleryController, HotelsController, RestaurantController, ForumController, ContactController, DashboardController, SitemapController
Form requests app/Http/Requests/ — e.g. ProfileUpdateRequest, LoginRequest with validation rules
Auth routes routes/auth.php — Breeze-generated login, register, password reset, email verification

Eloquent ORM & domain model

Model Relationships / notes
User Authenticatable; Breeze-compatible
Attraction morphMany comments; auto-slug on create; geo latitude/longitude, open_hours JSON cast
Event Scheduled content with starts_at, featured flag
Blog Published scope for sitemap; slug-based URLs
Hotel, Restaurant Listing + detail pages
Gallery Collection-based images (hurghada), file + thumbnail paths via Storage
Favorite Polymorphic favoritable — user ↔ attraction/event/blog
Comment Polymorphic commentable — user-authored thread on content
ForumCategory, ForumThread, ForumPost Threaded discussion; guest fields on posts; slug uniqueness

Factories & seeders (database/factories, database/seeders) populate realistic demo data: attractions, events, blogs, hotels, restaurants, forum categories. DatabaseSeeder creates demo@hurghada.test.

Database & migrations

  • Timestamped migrations in database/migrations/ for users, cache, jobs, attractions, events, blogs, galleries, favorites, comments, forum tables, hotels, restaurants
  • SQLite default (database/database.sqlite) for zero-config local dev
  • MySQL 8 via Docker or config/database.php + .env

Authorization

  • Policies: ForumThreadPolicy, ForumPostPolicy$this->authorize() in ForumController
  • Middleware: auth, verified on dashboard and protected forum actions
  • CSRF on all state-changing forms

Caching, session & queues

  • SESSION_DRIVER=database, CACHE_STORE=database, QUEUE_CONNECTION=database
  • Jobs table migration scaffolded for async work
  • composer dev runs queue:listen alongside artisan serve and Vite

Filesystem & media

  • Flysystem disks in config/filesystems.phppublic disk for gallery assets
  • Spatie Laravel Media Library (^11) in composer.json — ready for advanced media conversions (gallery currently uses custom Gallery model + paths)

Mail & notifications

  • Transport-agnostic config/mail.php; default MAIL_MAILER=log for local dev
  • Laravel notification channels available for future contact/alert flows

Livewire 3 — server-driven UI

Component Path Behavior
FavoritesToggle app/Livewire/FavoritesToggle.php Polymorphic favorite create/delete; auth gate + toast event for guests
Comments app/Livewire/Comments.php Inline Blade render; validate & persist morph comments; real-time list refresh

Views: resources/views/livewire/. Config: config/livewire.php. No custom JavaScript framework required for these flows — full-stack reactivity in PHP.

Frontend stack

Tool Role
Vite 7 + laravel-vite-plugin ESM bundling, HMR, manifest in public/build/
Tailwind CSS 3 Utility-first; custom sea, sand, blush, coral, rose palettes in tailwind.config.js
@tailwindcss/forms Accessible form styling
PostCSS + Autoprefixer CSS pipeline (postcss.config.js)
Alpine.js 3 Mobile nav, map init, weather widget — resources/js/app.js
Leaflet 1.9 Lazy-loaded maps via window.hurghada.loadLeaflet()
Masonry + imagesLoaded Pinterest-style gallery layout
Lightbox2 Full-screen image viewing
jQuery Lightbox/Masonry integration (legacy-friendly)
Axios HTTP client (bootstrap)

Entry: resources/css/app.css, resources/js/app.js. Blade components: resources/views/components/ (ui/card, ui/button, ui/modal, section-header, etc.). Layouts: resources/views/layouts/.

Authentication — Laravel Breeze 2

  • Dev dependency laravel/breeze:^2.3 — Blade stack
  • Registration, login, logout, password reset, email verification, confirm password
  • Profile CRUD in ProfileController + ProfileUpdateRequest
  • Views under resources/views/auth/ and resources/views/profile/

SEO & HTTP extras

  • SitemapController: dynamic XML — static pages, featured attractions/events, published blogs, latest forum threads
  • Fallback route: custom errors/404 Blade view
  • public/sitemap.xml: can coexist with dynamic route

Testing & code quality

Tool Usage
PHPUnit 11 tests/Feature, tests/Unit — auth flows (RegistrationTest, EmailVerificationTest, …)
Mockery Test doubles
Laravel Pint PHP style fixer (vendor/bin/pint)
Faker Factory data generation

Run: composer testphp artisan test

Observability & DX

Tool Purpose
Artisan migrate, seed, queue:listen, config:cache, route:cache, tinker
Laravel Tinker REPL debugging
Laravel Pail Stream logs in composer dev
Laravel Sail Optional Docker dev environment (project also ships custom docker-compose.yml)
Monolog Channels in config/logging.php

Security practices

  • CSRF middleware on POST/PATCH/DELETE
  • Bcrypt password hashing (BCRYPT_ROUNDS=12)
  • Mass assignment protection via $fillable on models
  • Validation at controller and Livewire layers
  • Policy-based authorization for forum mutations
  • Encrypted cookies & session configuration via config/session.php

Deployment notes

composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
npm ci && npm run build

Ensure storage/ and bootstrap/cache/ are writable; link public/storage if serving uploads (php artisan storage:link).

Project structure (key paths)

app/
├── Http/Controllers/     # HTTP entry points
├── Http/Requests/          # Validated input
├── Livewire/               # Reactive components
├── Models/                 # Eloquent domain
├── Policies/               # Authorization rules
└── View/Components/        # Blade layout components

database/
├── migrations/
├── factories/
└── seeders/

resources/
├── views/pages/            # Public site pages
├── views/livewire/
├── views/components/
├── css/app.css
└── js/app.js

routes/web.php
routes/auth.php
docker-compose.yml

Reference links


Pack light. Chase horizons. Leave only footprints in the sand.
Made with salt, sun, and Laravel — for everyone who believes the Red Sea is the most beautiful sea on earth. 🌊

License

Open-source under the MIT License.

About

Hurgada is a Laravel-powered web app for managing and sharing tourism content. Explore Attractions, Events, Blogs, and Galleries, with interactive features like Favorites and comments powered by Livewire. Built with Blade, Tailwind CSS, and Vite, it combines modern PHP and Laravel tools for a fast, responsive, and developer-friendly experience

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages