All notable changes to HandOff will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Initial admin workspace: projects, clients, milestones, deliverables, credentials, meetings
- Service-based architecture with typed DTOs (
Save{Domain}Data) - Domain event system with consolidated listeners for activity logging and notifications
Save*Livewire modal pattern — one component per domain for create + edit- Agency project hub with middleware-guarded sections
- UUID-based route keys to prevent enumeration attacks
BaseCRUDServicewith standardized filtering, search, and paginationAuthorizesProjectHubResourcestrait for project hub Save* modals and section list row actions- Scoped service finders (
findDeliverableForProject,findCredentialForProject, etc.) - Policy tests under
tests/Feature/Policies/and per-domain project hub authorization tests (tests/Feature/Agency/ProjectHub/*HubAuthorizationTest.php) composer setupone-command installcomposer devconcurrent development server- Pest test suite with policy and project hub authorization coverage
- Laravel Pint code style enforcement
- PHPStan static analysis
- CI pipeline (GitHub Actions)
- Deliverable review workflow: agency submits deliverables for review (
draft/rejected→in_review); only the project's client can approve or reject whilein_review. Admins cannot approve or reject. - Agency edit lock: deliverables in
in_revieworapprovedcannot be edited or receive file uploads by agency users. - Authorization at the edge: policies enforce who can act; services perform state transitions only (no duplicate auth guards in services).
- Project hub Livewire pattern: section lists dispatch modals or handle row actions directly (e.g.
DeliverablesList::submitForReview()); Save* modals authorize on open (view, edit only) and save (create/update). - Deliverable file uploads: multiple files per deliverable (configurable limit), 100 MB default per file, preview/remove in save modal; S3 when
AWS_BUCKETis set;DeliverableFilePolicyfor file delete/download. - Milestone completion: all milestone status writes go through
MilestoneService::updateStatus(); deliverable changes triggersyncFromDeliverables()synchronously (not via listeners).
- Redesign for UX and UI consistency
- Multiple clients for one project
- Client portal (client-facing views and routes, including approve/reject UI)
- Email notifications
- Invoice and Receipt Future
- Expenses and Break Down