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.
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 hour — because the Red Sea knows how to glow |
Underwater daydreams — 1,200+ fish species await |
- Why the Red Sea?
- Explore the site
- Your personal corner
- Little details that matter
- Getting started (developers)
- Technical documentation
| 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 |
They call it the most beautiful sea on earth. After one sunset here, you'll understand why.
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.
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.
The story behind the blog: why Hurghada, why the Red Sea, and the free-spirit vibe that ties it all together.
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
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.
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.
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.
Restaurants for every mood: seafood by the marina, casual beach bites, date-night spots. Browse, compare, and pick your next meal with a view.
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
A simple contact form — say hello, ask for advice, or share a tip. We love hearing from fellow sea lovers.
- Leaflet map centered on Hurghada with clickable spots (beaches, marina, Giftun Island)
- Open-Meteo live temperature — “perfect beach weather” at a glance
Sign up (or log in) and the site becomes yours.
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.
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.
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 |
Update your name and email, change password, or manage account settings via Laravel Breeze — clean, minimal, secure.
- 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
Pack your laptop like a carry-on — setup is quick.
- PHP 8.2+
- Composer
- Node.js 18+ & npm
- SQLite (default) or MySQL
# 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 serveOpen http://localhost:8000 (or your APP_URL).
Demo login (after seeding): demo@hurghada.test / password
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.).
The sand-between-your-toes section — for engineers who build the dream.
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) │
└─────────────────────────────────────────────────────────────┘
| 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 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.
| 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 |
| 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.
- 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
- Policies:
ForumThreadPolicy,ForumPostPolicy—$this->authorize()inForumController - Middleware:
auth,verifiedon dashboard and protected forum actions - CSRF on all state-changing forms
SESSION_DRIVER=database,CACHE_STORE=database,QUEUE_CONNECTION=database- Jobs table migration scaffolded for async work
composer devrunsqueue:listenalongsideartisan serveand Vite
- Flysystem disks in
config/filesystems.php—publicdisk for gallery assets - Spatie Laravel Media Library (
^11) incomposer.json— ready for advanced media conversions (gallery currently uses customGallerymodel + paths)
- Transport-agnostic
config/mail.php; defaultMAIL_MAILER=logfor local dev - Laravel notification channels available for future contact/alert flows
| 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.
| 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/.
- 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/andresources/views/profile/
SitemapController: dynamic XML — static pages, featured attractions/events, published blogs, latest forum threads- Fallback route: custom
errors/404Blade view public/sitemap.xml: can coexist with dynamic route
| 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 test → php artisan test
| 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 |
- CSRF middleware on POST/PATCH/DELETE
- Bcrypt password hashing (
BCRYPT_ROUNDS=12) - Mass assignment protection via
$fillableon models - Validation at controller and Livewire layers
- Policy-based authorization for forum mutations
- Encrypted cookies & session configuration via
config/session.php
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 buildEnsure storage/ and bootstrap/cache/ are writable; link public/storage if serving uploads (php artisan storage:link).
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
- Laravel 12 Documentation
- Livewire 3 Documentation
- Laravel Breeze
- Vite
- Tailwind CSS
- Spatie Media Library
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. 🌊
Open-source under the MIT License.