Back to portfolio
WebappStudy / personal

Project Management

Laravel 12 + Livewire prototype for a personal collaboration-management platform, with authentication, admin/client roles, reactive client CRUD, and a structure prepared for projects, tasks, and invoices.

Project Management

Core stack

PHP 8.2+
Laravel 12
Livewire 3
Livewire Volt
Laravel BreezeEloquent ORMSQLiteBladeTailwind CSSVitePHPUnitLaravel PailLaravel Pint

The challenge

Building a coherent foundation for managing collaborations within a single application, with authentication and role separation, while keeping administrative interactions reactive without introducing a separate SPA frontend. At the same time, the project needed to be able to evolve from client tracking toward projects, tasks, and invoicing.

The solution

Laravel 12 with Livewire 3 was used for a server-driven dashboard: administrative routes are protected with Gates, the Clients module offers search, pagination, and CRUD in a reactive component with server-side validation, and Blade/Tailwind deliver the shared visual shell. The navigation structure and placeholder screens fix the product direction for projects, tasks, and invoices without presenting them as already-implemented features.

Notable complexity

Project Management is a personal project built as a foundation for centralizing client relationships and, in the direction suggested by the interface, for later linking clients to projects, tasks, and invoices. The repository's current state, however, is a partial prototype: the Clients module is functional, while the Projects, Tasks, and Invoices pages are only placeholder screens accessible to the administrator.

The application uses Laravel 12 on PHP 8.2+, Livewire 3, and Livewire Volt, with Blade and Tailwind CSS for the interface. There is no separate JavaScript framework for business interactions: the Clients Livewire component keeps the form, search, edit-mode, and pagination state, validates data on the server, and persists directly through Eloquent. The search filters by name, company, email, or phone, and results are ordered descending by creation date and paginated at 10 per page.

The Client model and its migration cover personal and company data: name, company, tax ID, trade registry number, address, city, country, phone, email, contact person, and notes. The current UI exposes most of these fields in a create/edit modal. However, there is a functional issue in the creation flow: the component starts hasCompany as false and clears the company fields before saving, but the form provides no control to enable hasCompany. As a result, company data entered for a new client is not retained in the current form. The country field exists in the model and DB but is not exposed in the component.

Authentication and the profile area come mostly from the Laravel Breeze/Livewire Volt scaffolding and include login, logout, password reset, password confirmation, and profile update/deletion. Login has rate limiting at five attempts per email + IP key. The application defines two roles, admin and client, through a role field on users and two Laravel Gates. The Clients, Projects, Tasks, and Invoices routes are protected by auth + can:admin; the client role is defined but does not yet have its own flow in the product. The migration defaults the role to admin, which needs to be revisited before any public registration is enabled.

The frontend is a desktop-first dashboard with a fixed sidebar, sticky header, white cards on a gray background, and an indigo visual identity. The custom logo uses #6366F1 and #A5B4FC and schematically represents a work panel. The landing page describes the application as a personal platform for project management and client collaboration, and the dashboard indicates the direction clients → projects → tasks → invoices. This text supports the end goal, but it is not evidence that the missing modules are implemented.

The default persistence from .env.example is SQLite. Sessions, cache, and the queue are configured on the database driver, and the Composer development script starts the Laravel server, a queue listener, Pail, and Vite in parallel. However, there are no custom jobs, business events, webhooks, external integrations, uploads, dedicated search, project notifications, comments, a Kanban board, an audit trail, or project/task/invoice relations in the current schema. The default mailer is log, so the repository does not demonstrate email delivery through an external provider.

The client list is paginated, but the search uses LIKE with wildcards across four columns and the clients table defines no additional indexes. There is no business cache, batching, locking, or custom idempotency. Client deletion is a hard delete, and there is no soft delete, relations blocking deletion, audit, or explicit confirmation in the component's code.

The repository contains no .github/workflows, Docker/Compose, deploy scripts, or Nginx/PM2/Supervisor configuration. Laravel exposes the standard /up health endpoint, and the packages include Laravel Sail as a development dependency, with no versioned Docker files. The present tests mostly cover the authentication and profile scaffolding; there are no tests for Clients or for the authorization of custom modules. RegistrationTest still expects the /register route, even though routes/auth.php no longer defines it, so the saved suite is not fully aligned with the current routes.

The available Git history contains a single commit, "Initial commit — portfolio backup," which introduces the entire repository. For this reason, the contribution can be described through the existing custom code — the Clients module, the Client model and migration, the roles and Gates, the dashboard shell, and the direction pages — but the history does not allow demonstrating a feature-by-feature evolution or attributing the entire Laravel scaffolding as a from-scratch implementation.

Key results

  • Laravel 12 application with a dashboard shell and authentication based on Breeze/Livewire Volt scaffolding
  • Two roles modeled on users — admin and client — with dedicated Laravel Gates
  • Routes for the administrative area protected with auth and can:admin
  • Livewire CRUD for clients with create, edit, and delete
  • Client search by name, company, email, or phone
  • Client listing ordered by creation date and paginated at 10 results
  • Client model and migration for personal and company data
  • User profile with information update, password change, and account deletion
  • Rate limiting on authentication using email + IP
  • Pages and navigation conceptually prepared for Projects, Tasks, and Invoices, marked in code as future features
  • Laravel /up health endpoint and local infrastructure configured for queue, cache, and sessions on the database driver

Related projects

Want something similar?

Start with the estimate wizard — answer a few questions and get a realistic price range and timeline.