Skip to content

Case study

Enssure: training and events, run from one place

Enssure runs a vocational skills-development program. Since May 2026 I've been building two systems for it as a consultant: ENSSURE, a training management information system, and an event management system.

Role
Senior Software Engineer (Consultant)
Since
May 2026
Systems
Training MIS · Event Management
Based in
Bhaktapur, Nepal
enssure.org.np
role-based access · resource.action

The problem

A skills-development program has a lot to track: training providers, their contracts, the trainees they enroll, and the reports the program owes its stakeholders. Alongside that, the organization's own events (creating them, scheduling them, taking registrations, and tracking who attended) needed to move into software. Old reports also lived in a legacy CodeIgniter system that had to be retired without losing them.

What I built

ENSSURE, the training management system

A multi-module monolith with an Inertia.js and Vue 3 frontend, so the app feels like a single-page application without a separate API layer to maintain. It manages training providers, contracts, trainees, and program reporting.

The event management system

A full-stack system that digitizes the event workflow end to end: creation, scheduling, registration, and attendee tracking. Organizers work from a role-based dashboard that gives them control of the whole event lifecycle.

Hard problems I worked on

Permissions that mean the same thing everywhere

I implemented granular role-based access control with Spatie Permissions, using per-resource policies and a resource.action model. The same permission names are enforced in the backend controllers and in the frontend, so a button a user can't use is hidden, and the request behind it is refused anyway.

Notifications that run themselves

Registrations, confirmations, and reminders go out through automated notification flows, so organizers don't chase attendees by hand.

Numbers organizers can act on

Analytics views surface attendance and event-performance metrics, so decisions about future events rest on data rather than impressions.

A data layer that can change

I architected a repository-pattern data layer that decouples controllers from the ORM, and built reusable, component-driven UIs on top. Business logic stays testable and the storage details stay in one place.

Retiring legacy reports

I migrated the legacy CodeIgniter reports into the new reporting engine.

Stack

  • Vue 3
  • Inertia.js
  • Spatie Permissions
  • Role-based access control
  • Repository pattern
  • Component-driven UI