| Layer | Technology | Version constraint |
|---|---|---|
| Language | PHP | composer ^8.5 · CI 8.2 · Docker image 8.5-fpm-alpine |
| Framework | Laravel | ^13.0 |
| Auth | tymon/jwt-auth + Laravel Socialite | ^2.1 / * |
| RBAC | spatie/laravel-permission | `^6.16 |
| Database | MySQL (prod) · SQLite (tests/local quickstart) | — |
| Cache/Queue backend | Redis via predis | `^2.0 |
| Payments | paymob/php-library | ^1.0 |
| AI | lucianotonet/groq-laravel → Groq LLM | ^1.0 (model default llama-3.1-8b-instant) |
| PDF / Excel | barryvdh/laravel-dompdf · openspout | ^3.1 / `^4.24 |
| API docs | dedoc/scramble (OpenAPI at /docs/api) | ^0.13.36 |
| Testing | PHPUnit ^11–13, Mockery, Collision | dev |
| Frontend | Vanilla HTML5/CSS3/JS + GSAP 3.12, Tailwind utilities | no build step for pages |
pecl redis because it fails against PHP 8.5; predis needs no extension (Dockerfile comment).itinera_token via the canonical Itinera config/api/session stack (window.Itinera).css/ (common.css, index.css, page-specific sheets + css/components/); GSAP drives hero timelines, tilt micro-interactions, KPI counters./weather (Open-Meteo backed) for 17+ cities.Support/Constants/CacheKeys.php, throttle limiters (throttle:weather|maps|ai|login…), and AI quota counters (AiUsageService).| Symptom | Cause | Fix guidance |
|---|---|---|
| Composer platform errors locally | "php": "^8.5" requirement vs local 8.2 | run inside Docker or adjust platform check consciously |
| Redis features silently off | CACHE_DRIVER=array fallback | set redis driver for quota/throttle correctness in tests that assert it |
| Scramble docs stale | cached annotations | clear config/route caches after controller edits |
| GSAP animations missing | CDN blocked offline | pages degrade gracefully; verify network or vendor locally |