A full-stack task and project management application built with Laravel, Inertia.js, Vue 3, Pinia, GraphQL, and Laravel Sanctum.
The application supports authenticated project and task workflows, task prioritisation and ordering, GraphQL queries and mutations, personal access tokens, automated tests, and continuous integration.
The demo is hosted on a free DOM Cloud subdomain, which may display a third-party safety notice before opening the application.
- Create, view, update, and delete projects
- Organise tasks under projects
- Retrieve project-specific task data
- Query projects through GraphQL
- Create, view, update, and delete tasks
- Assign tasks to projects
- Set task priorities
- Reorder tasks
- Group tasks by project
- Remove a task from its associated project
- Query tasks through GraphQL
- Laravel Breeze authentication
- Email-verified application routes
- Laravel Sanctum personal access tokens
- Authenticated GraphQL endpoint
- User profile management
- Protected GraphiQL interface
- Pest and PHPUnit backend tests
- Vitest frontend tests
- Laravel Pint formatting
- ESLint and Prettier
- GitHub Actions for tests and code quality
- Docker development with Laravel Sail
- PHP 8.2+
- Laravel 12
- Laravel Sanctum
- Inertia Laravel
- Rebing GraphQL for Laravel
- Ziggy
- Pest 4
- PHPUnit
- Laravel Pint
- Vue 3
- Inertia.js
- TypeScript
- Pinia
- Pinia persisted state
- Vite
- Axios
- VueUse
- Vue Draggable
- Tailwind CSS
- Heroicons
- Vue Toastification
- Vitest
- Vue Test Utils
- ESLint
- Prettier
- Laravel Sail
- Docker
- MySQL 8
- Mailpit
- GitHub Actions
Task Manager uses Laravel and Inertia.js as a server-driven single-page application.
taskmanager/
├── app/
│ ├── GraphQL/ # GraphQL queries, mutations, and types
│ ├── Http/ # Controllers, middleware, and requests
│ ├── Models/ # Eloquent models
│ ├── Repositories/ # Data-access logic
│ └── Services/ # Application service layer
├── database/
│ ├── factories/
│ ├── migrations/
│ └── seeders/
├── resources/
│ └── js/
│ ├── Components/
│ ├── Layouts/
│ ├── Pages/
│ └── stores/
├── routes/
│ ├── web.php
│ ├── api.php
│ └── auth.php
├── tests/
│ ├── Feature/
│ └── Unit/
├── .github/
│ └── workflows/
├── docker/
├── docker-compose.yml
├── composer.json
└── package.json
The application separates HTTP controllers, repositories, services, Eloquent models, Inertia pages, Pinia stores, and GraphQL resolvers to keep responsibilities organised.
Authenticated and email-verified users can access the task-management application.
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/dashboard |
Display the authenticated dashboard |
GET |
/app |
Display the task-manager interface |
GET |
/projects |
Retrieve projects |
POST |
/projects/store |
Create a project |
PUT |
/projects/update |
Update a project |
DELETE |
/projects/delete/{id} |
Delete a project |
GET |
/tasks |
Retrieve tasks |
POST |
/tasks/store |
Create a task |
PUT |
/tasks/update |
Update a task |
DELETE |
/tasks/delete/{id} |
Delete a task |
PUT |
/tasks/unlinkproject |
Remove a task from a project |
Profile routes support profile editing, profile deletion, and Sanctum token generation.
The GraphQL endpoint is protected by Laravel Sanctum.
/graphql
usersuserprojectprojectstasktasks
createProjectcreateTask
GraphQL batching is enabled.
Authenticated users can use the GraphiQL interface at:
/graphiql
Install the following before running the application:
- PHP 8.2 or later
- Composer
- Node.js and npm
- MySQL 8, or Docker with Laravel Sail
- Git
git clone https://github.com/josiahking/taskmanager.git
cd taskmanagercomposer install
npm installcp .env.example .env
php artisan key:generateUpdate the database configuration in .env.
Example for a local MySQL installation:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=taskmanager
DB_USERNAME=root
DB_PASSWORD=php artisan migrate --seedRun Laravel, the queue listener, and Vite together:
composer devAlternatively, use separate terminals:
php artisan servenpm run devThe Laravel development server is normally available at:
http://127.0.0.1:8000
Copy the environment file and install dependencies before starting Sail:
cp .env.example .env
composer installConfigure the Sail database values:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=sail
DB_PASSWORD=passwordStart the containers:
./vendor/bin/sail up -dInstall frontend dependencies and initialise the application:
./vendor/bin/sail npm install
./vendor/bin/sail artisan key:generate
./vendor/bin/sail artisan migrate --seed
./vendor/bin/sail npm run buildThe Docker configuration includes:
- PHP 8.4 application container
- MySQL 8
- Mailpit
- Vite development port
Authenticated users can generate a Laravel Sanctum personal access token through the profile token route.
Use the generated token for protected GraphQL requests:
Authorization: Bearer <token>
Accept: application/json
Content-Type: application/jsonExample request:
curl -X POST http://127.0.0.1:8000/graphql \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"{ projects { id name } }"}'php artisan testOr:
./vendor/bin/pestThe Composer test script clears the Laravel configuration cache before running the test suite:
composer testnpm testnpm run buildvendor/bin/pintnpm run formatnpm run format:checknpm run lintThe repository includes two GitHub Actions workflows.
The test workflow:
- Starts the Laravel Sail environment.
- Installs Composer and npm dependencies.
- Generates the application key.
- Generates Ziggy configuration.
- Builds frontend assets.
- Runs the Laravel test suite.
The lint workflow:
- Configures PHP.
- Installs backend and frontend dependencies.
- Runs Laravel Pint.
- Formats frontend code.
- Runs ESLint.
Both workflows run on pushes and pull requests targeting main and develop.
Add verified screenshots under docs/screenshots/, then replace these placeholders:



Screenshots are intentionally not embedded until the image files are committed.
Task Manager is a portfolio application demonstrating:
- Laravel application architecture
- Repository and service-layer organisation
- Inertia.js and Vue integration
- Pinia state management
- REST-style web workflows
- Authenticated GraphQL APIs
- Sanctum personal access tokens
- Backend and frontend tests
- Docker-based development
- Continuous integration
Potential improvements include:
- Additional GraphQL update and delete mutations
- Pagination, search, and filtering
- Project collaboration and invitations
- Role-based permissions
- Due dates and reminders
- Activity history and audit events
- File attachments
- Notification delivery
- Improved accessibility
- Increased test coverage
- OpenAPI documentation for HTTP endpoints
- Verified screenshots
- Deployment documentation
- Demo seed account instructions
Josiah Gerald
Senior Backend Engineer specialising in PHP, Laravel, REST APIs, payment integrations, WordPress, and production business platforms.
- GitHub: github.com/josiahking
- LinkedIn: linkedin.com/in/josiah-g-0919763b
This project is available under the MIT License.