# CLAUDE.md - EZSCALE Site ## Project EZSCALE Site — Laravel 12 application for VPS/Dedicated Server hosting management (billing, subscriptions, provisioning, customer management, SSO). ## Phase Tracking (MANDATORY) All work MUST be tracked against Gitea issues and `TASKS.md`. **Use Gitea MCP tools (`mcp__gitea__*`) — never `gh` CLI.** 1. **Before starting:** Check the relevant Gitea issue (`mcp__gitea__list_issues` for repo `EZSCALE/website`) and `TASKS.md` for current status. 2. **While working:** Update the Gitea issue with progress comments (`mcp__gitea__add_issue_comment`). 3. **After completing:** Update `TASKS.md` to check off completed items and close the corresponding Gitea issue. 4. **New tasks discovered:** Create sub-issues or add items to `TASKS.md` immediately. 5. **Commit messages:** Reference the Gitea issue number (e.g., `Fix checkout validation (#3)`). Gitea repo: https://git.ezscale.cloud/EZSCALE/website Gitea issues: https://git.ezscale.cloud/EZSCALE/website/issues ## Documentation Updates (MANDATORY) When a phase or significant task is finished, update: `TASKS.md`, GitHub issues, `CLAUDE.md`, memory files, and `PROJECT_DEVELOPMENT.md` (if architecture changed). ### Visual Verification (MANDATORY) After every successful `npm run build`: 1. Take headless Chrome screenshots of affected pages 2. Compare against the EZSCALE design system (navy blue palette, Plus Jakarta Sans, custom SCSS in `resources/styles/`) 3. Fix any visual discrepancies before considering the task complete 4. Key pages: Login/Register, Marketing homepage, Admin/Account dashboards, Pricing page ## Laravel App Location The Laravel application is in **`website/`**. All artisan, composer, and npm commands run from there. ``` website/ ├── app/ │ ├── Models/ # 29 Eloquent models │ ├── Http/Controllers/ # Account/, Admin/, Api/V1/ controllers │ ├── Http/Resources/ # API Resources │ ├── Services/Billing/ # BillingServiceInterface, Stripe, PayPal, Dunning │ ├── Events/ # Payment, Subscription events │ ├── Listeners/ # Event handlers │ └── Console/Commands/ # RetryProvisioning, SyncStripePrices ├── bootstrap/app.php # Middleware, exceptions, routing (Laravel 12 slim — no Kernel files) ├── database/ # 59 migrations, 24 factories, seeders ├── resources/ │ ├── ts/ # TypeScript source (Vue 3 + Inertia) │ │ ├── types/ # Shared TypeScript interfaces │ │ ├── Layouts/ # AccountLayout, AdminLayout, AuthLayout, MarketingLayout │ │ ├── Components/ # Shared + marketing components │ │ └── Pages/ # 85 Vue pages (Auth/7, Admin/41, Marketing/14, etc.) │ └── styles/ # EZSCALE design system SCSS (8 files) ├── routes/ # web, account, admin, marketing, webhooks, api └── tests/ # ~497 Pest tests ``` ## Tech Stack - **Framework:** Laravel 12 (PHP 8.3) - **Frontend:** Vue 3 + Inertia.js v2 + TypeScript (REQUIRED) + Vuetify 3 + Vite 7 - **UI Theme:** Custom EZSCALE design system — navy blue `#1d4ed8`, Plus Jakarta Sans + JetBrains Mono (Bunny Fonts CDN), subdomain-aware theming (light for marketing, dark for admin/account) - **Charts:** ECharts via `vue-echarts` - **Utilities:** `@vueuse/core` - **Testing:** Pest 4 + PHPUnit 12 (~497 tests) - **Formatting:** Laravel Pint - **Payments:** Laravel Cashier (Stripe) + srmklive/paypal (PayPal) - **Database:** MySQL 8.x, database driver for sessions (Redis NOT installed) - **Auth:** Laravel Fortify (login, register, 2FA, password reset, email verify) + Passport (OAuth2/SSO) - **Roles:** spatie/laravel-permission (admin, customer) - **Queue:** Laravel Horizon ## Commands ```bash cd website composer run dev # Start all dev servers (artisan serve + queue + pail + vite) php artisan test --compact # Run Pest tests npm run build # Production build vendor/bin/pint --dirty --format agent # Format changed files ``` ## TypeScript Requirement (MANDATORY) **All frontend code MUST use TypeScript.** - All `.vue` files must use `