Skip to main content

Technology Stack

Backend

LayerChoiceVersionNotes
LanguagePHP^8.2From composer.json require.php
FrameworkLaravel^12.0Uses the new PHP-8 attribute-based structure
Admin UIFilament^5.5Livewire-powered, mounted at /systemadmin
API authlaravel/sanctum^4.0Token-based for SPA/mobile; session for Filament
OpenAPIzircote/swagger-php^6.1Attribute-driven spec generation
PDF renderingbarryvdh/laravel-dompdflatestReceipts, vaccination certificates, pet passport, statement
Paymentsrazorpay/razorpaylatestOwner-side checkout + webhooks
REPLlaravel/tinker^2.10Dev-only
Database (prod)MySQL≥ 8.0Configured in .env.example
Database (tests)SQLite:memory:Fast hermetic phpunit runs (RefreshDatabase)
Cache driverdatabase (prod), array (tests)
Queue driverdatabase (prod), sync (tests)Notification jobs run on a dedicated notifications queue
Mail drivermailgun / ses / mail / logSwitchable per tenant via service_settings; tests use array
Session driverdatabase (prod), array (tests)
TestingPHPUnit + Pest infra11.xRefreshDatabase per test, factory-driven setup

Web frontend (admin / clinic / owner web portal)

LayerChoiceVersionNotes
LibraryReact^18.2.0
Build toolingreact-scripts5.0.1Create-React-App
StylingTailwind CSS^3.4.0Custom primary palette (emerald)
Iconslucide-reactlatestReplaces text-button labels per task #11
CSS pipelinePostCSS + autoprefixer
HTTP clientnative fetchThin wrapper in src/services/core/httpClient.js
StateReact ContextAuthContext, TenantContext, PermissionContext
RouternoneModule switch driven by state in App.js
Auth storagelocalStorageAudit P0 — should move to httpOnly cookie

Mobile (vetty + vetdoctor)

LayerChoiceNotes
FrameworkFlutter (Dart)vetyy/, vetdoctor/ — share core/ patterns
HTTP clientthin wrapper around Dio-styleBearer attached per request
Auth storageSharedPreferencesAudit P0 — should move to flutter_secure_storage
Platform targetsiOS, Android, web (Flutter web), macOS / Windows / Linux for vetdoctor
Razorpayrazorpay_fluttervetty only
QR scannermobile_scannervetdoctor for share-code scan, vetty for code reading
File uploadfile_picker, image_pickervetty pet documents + vetdoctor attachments

Docs

LayerChoiceVersion
Static-site generatorDocusaurus^3.5.2
Diagrams@docusaurus/theme-mermaid^3.5.2
Code highlightingprism-react-renderer^2.3.0

Why each choice

  • Laravel 12 + Filament 5 — fastest way to get a production-grade API, queue, mailer and admin panel in one PHP codebase. Filament removes the need to hand-roll a back office.
  • Sanctum over Passport — Vetty only needs API tokens and SPA sessions, not full OAuth2. Sanctum is lighter and ships with Laravel.
  • Zircote Swagger-PHP with attributes — keeps the OpenAPI spec colocated with each controller method, so it never drifts from the implementation.
  • React + Tailwind — a common, well-known combo. Tailwind's utility classes keep components self-contained without a heavy design system.
  • Create React App (for now) — matches the existing ui/ project; a move to Vite is a drop-in improvement when needed.
  • Context instead of Redux — the app has a small number of globals (current user, current tenant) so Redux or Zustand would be overkill.
  • MySQL + SQLite for tests — MySQL for production richness, SQLite for fast, hermetic test runs (database/verify.sqlite).

Version pin cheatsheet

From backend/composer.json:

{
"require": {
"php": "^8.2",
"filament/filament": "^5.5",
"laravel/framework": "^12.0",
"laravel/sanctum": "^4.0",
"laravel/tinker": "^2.10.1",
"zircote/swagger-php": "^6.1"
}
}

From ui/package.json:

{
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1"
},
"devDependencies": {
"tailwindcss": "^3.4.0",
"autoprefixer": "^10.4.16",
"postcss": "^8.4.31"
}
}