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
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