- GitHub Repository: https://github.com/FreeDirt/task-management-app
| Layer | Technology | Reason |
|---|---|---|
| Backend | Laravel 11 | Robust PHP framework with excellent ORM, validation, and REST API support |
| Database | MariaDB 11 | Drop-in MySQL replacement; performant, open-source, Docker-friendly |
| Frontend | Vanilla HTML/CSS/JS | Lightweight, zero-build-step; fast execution; responsive with Dark/Light mode |
| Web Server | Nginx (Alpine) | Fast, lightweight reverse proxy routing HTTP → PHP-FPM |
| Container | Docker + Docker Compose | Reproducible, isolated environment; one-command startup on port 8012 |
- ✅ GET /api/projects: List all projects
- ✅ GET /api/projects/{id}: Retrieve single project details
- ✅ POST /api/projects: Create new project
- ✅ PUT /api/projects/{id}: Update existing project
- ✅ DELETE /api/projects/{id}: Delete project
- ✅ Frontend UI: Complete management dashboard (create, edit, delete, view)
- ✅ Client Name is required
- ✅ Project Name is required
- ✅ Status must be one of:
Planning,In Progress,On Hold,Completed - ✅ Priority must be one of:
Low,Medium,High - ✅ Due Date cannot be earlier than Start Date
- ✅ Meaningful JSON error responses (422 Unprocessable Entity) for invalid requests
- ✅ Search functionality (by client name, project name, or description)
- ✅ Filter by Status
- ✅ Filter by Priority
- ✅ Column Sorting (Ascending / Descending)
- ✅ Light / Dark / System Mode Theme Switcher (persisted in
localStorage) - ✅ Containerized Docker Setup (Laravel + MariaDB + Nginx on port 8012)
- Docker Desktop installed and running.
git clone https://github.com/FreeDirt/task-management-app.git
cd task-management-appdocker compose up -d --build⚡ Sample Data is Seeded Automatically!
You do NOT need to manually run a seeder command. The container's startup entrypoint automatically detects an empty database, runs migrations, and populates all 12 sample projects fromtest_data.json.
- Frontend Dashboard: http://localhost:8012
- REST API Base URL:
http://localhost:8012/api/projects
- Environment Setup: Default credentials for MariaDB container are pre-configured in
.envanddocker-compose.ymlfor local evaluation convenience. - Data Model:
client_nameandproject_nameare non-empty strings.statusdefaults toPlanningandprioritytoMedium. - Date Validation: Start and due dates are optional, but if both are provided,
due_datemust be on or afterstart_date. - Automatic Data Seeding: Database seeding runs automatically when containers start up so evaluators immediately see full sample project data upon opening
http://localhost:8012. - No Authentication: Authentication was left optional to keep evaluation straightforward.
| Action | Makefile Command | Raw Docker Command |
|---|---|---|
| Start containers | make up |
docker compose up -d |
| Stop containers | make down |
docker compose down |
| Rebuild containers | make build |
docker compose build --no-cache |
| Access app container shell | make shell |
docker exec -it fds_app sh |
| Run migrations | make migrate |
docker exec fds_app php artisan migrate |
| Re-seed sample data | make seed |
docker exec fds_app php artisan db:seed |
| Wipe & re-seed from scratch | make fresh |
docker exec fds_app php artisan migrate:fresh --seed |
| View logs | make logs |
docker compose logs -f |
{
"success": true,
"data": { ... },
"message": "..."
}| Method | Endpoint | Description |
|---|---|---|
| GET | /api/projects |
List projects (supports search, status, priority, sort_by, sort_direction) |
| GET | /api/projects/{id} |
Get single project by ID |
| POST | /api/projects |
Create a new project |
| PUT | /api/projects/{id} |
Update existing project |
| DELETE | /api/projects/{id} |
Delete a project |
Laravel 11 was selected for the backend due to its expressive Eloquent ORM, robust Request validation rules, and structured API routing capabilities. MariaDB was used as a reliable, production-ready relational database that pairs seamlessly with Laravel.
For the frontend, vanilla JavaScript with HTML5/CSS3 was chosen over a heavy framework like React/Next.js. Since the app centers around single-page CRUD management, vanilla JS eliminates build step dependencies and bundler overhead while keeping page loads instantaneous.
- Vanilla JS vs. SPA Framework: Kept the architecture clean and zero-build, but sacrifices standard component reusability found in React/Vue.
- Blade-served Frontend: Served the single-page frontend directly through Laravel Blade to eliminate CORS complexity and simplify single-port (8012) deployment.
- Session/State in Browser: Theme preferences and UI filters are handled client-side via
localStorageand URL parameters rather than persisted user settings in DB.
- Automated Testing Suite: Add PHPUnit/Pest feature tests for API validation, search filtering, and CRUD operations.
- Pagination: Implement server-side pagination for scaling to thousands of project records.
- Authentication & Authorization: Integrate Laravel Sanctum for API token authentication and role-based permissions (e.g. Admin vs PM).
- Real-time Notifications: Add WebSockets (Laravel Reverb) to update project lists across multiple open browser tabs in real-time.
Ensuring seamless initialization inside Docker where MariaDB container readiness can lag behind container startup. This was solved by adding MariaDB container health checks in docker-compose.yml along with a robust PDO retry loop in docker/app/entrypoint.sh before running migrations and seeders.
Yes.
-
Which tools? Google Antigravity (Claude Sonnet 4.6 Thinking & Gemini 3.6 Flash).
-
How were they used?
- Scaffolding Laravel 11 structure, API Controller logic, and Form Validation rules.
- Designing and styling the dark/light/system theme dashboard UI with CSS variables.
- Writing Docker Compose, Nginx, and PHP 8.4-FPM container configurations.
- Debugging container PHP version compatibility and fine-tuning git remote configurations.