# Tech Stack

> Frameworks, runtimes, and libraries actually used, from `composer.json`, `package.json`, and config.

_Verified against the codebase on 2026-07-23._

---

## Backend
| Area | Choice |
|------|--------|
| Language / framework | PHP `^8.2`, Laravel `^12.0` |
| Database | MySQL / MariaDB (reported MariaDB 10.4.32 in Phase-5 handoff; DB name `numu_angels`) |
| Auth | `laravel/sanctum` `^4.3` (tokens/session), `spatie/laravel-permission` `^6.25` (RBAC), a full **OAuth 2.1 server** (custom tables), and `firebase/php-jwt` `^7.0` (PWA JWT) |
| Queue / cache / session | all on the **`database`** driver (Redis client available but not the default) |
| Mail | Laravel Mail + `phpmailer/phpmailer` over SMTP (Office365) |
| Other libs | `smalot/pdfparser` (PDF/pitch-deck parsing), `laravel/tinker` |

## Frontend
| Area | Choice |
|------|--------|
| Rendering | Server-side **Blade** (no SPA framework) |
| Styling / build | **Tailwind CSS v4**, **Vite 7**, `laravel-vite-plugin`, `axios` |

## AI / model configuration
- **Anthropic** via raw HTTPS (no SDK). `config/services.php` default model `claude-opus-4-7`.
- Agent runtime (`config/agent_runtime.php`): default `claude-sonnet-5`; per-agent override `prescreen` → `claude-opus-4-8`; provider `anthropic` (or `fake` in tests).
- **Model IDs are documented as configured; whether they resolve to deployed models in a given environment is Unknown - requires confirmation.**

## Tooling
- `laravel/pint` (style), `phpunit/phpunit` `^11.5` with the Pest plugin allowed, `mockery/mockery`, `fakerphp/faker`, `laravel/pail`, `laravel/sail`.
- `composer dev` runs server + `queue:listen` + `pail` + `vite` concurrently.
