Codename: Mjolnir

CRM platform for personal injury cases

A screenshot of mjolnir-featured-1726438896.png

Lead Developer

I was the sole back-end developer and handled the “back of the front-end” by integrating another developer’s markup into Vue. I also set up all of the server and deployment infrastructure.

  • Vue
  • Laravel
  • Full-stack
  • PestPHP
  • InertiaJS

About the project

Mjolnir* was effectively a CRM for personal injury lawsuits, built to keep medical providers and attorneys in sync with a patient's care and case progress. I built a flexible system that automatically created and assigned new tasks as others were completed. Each task type had multiple custom Vue components, notifications and form requests classes, as well as logic for creation, updating, and completion. I built a CLI tool to generate all required files for new actions and implemented over two dozen task types.

*We helped the client roll out a pilot program to eight providers and a handful of law firms. Unfortunately, the project fell into limbo after the initial engagement ended and hasn't had any further roll-out.

Laravel all the way down

In many ways, this was my ideal project. I was able to build the backend fully in Laravel, relying on first- and third- party packages that I know and love:

  • Laravel Scout to power lightning-fast quick search across the entire application

  • Laravel Nova for an admin panel for the client to manage users, add new firms and providers, and reset dummy data in staging and other test environments.

  • Inertia for seamlessly bridging the front- and back-end.

  • Laravel's built in queued jobs powered notifications and intelligently completing/assigning tasks.

Though most of the functionality happened during typical page routing, I also built a lightweight API to handle one-off's like updating preferences, marking notifications as seen, and task confirmations.

The back of the front

A colleague built out most of the markup in HTML, SCSS, and AlpineJS. The UI was designed to be very modular, so I took his markup and quickly converted it to Vue - one of the many benefits of AlpineJS borrowing so much of it’s syntax from Vue.

Different personas would see slightly different data on any particular page or Vue component, so Inertia was crucial in letting me define much of that logic on one side (Laravel) and easily pass it to the front.

One class to rule them all

The patient journey was fairly linear, but as more managing attorneys and medical providers were added, each of their unique processes and requirements would need to be accounted for. I built a modular and powerful tasking system built around a single monolithic PHP class for each task “type” (e.g. Schedule an Appointment, Review Consult Notes, etc). Each PHP class included all of the logic for creating, assigning and completing its specific task type. The classes also referenced custom Vue components, form requests, and notifications that would be used for that task type.

Each task type included 5 to 8 (or more) files spread across the Laravel file structure. To accommodate, I built a generator on top of Laravel Prompts that creates and populates the required files for a new task type and links all of the necessary files together. It even generates a custom data seeder a Pest class for testing that specific task type. Building all of this out early in the project greatly accelerated my work as I implemented over two dozen task types.