Context
This CRM was taken over from a previous developer, then maintained and extended solo between 2017 and 2019. It served a non-government organization and included a full AngularJS single-page application alongside a Ruby backend.
Problem
The existing system needed ongoing maintenance and new features across a broad application surface. Authorization, communications, payment handling, document generation, APIs, and real-time behavior all had to coexist in one maintained product.
Approach
- Maintained and extended a domain with 65 models.
- Worked with more than 60 Grape REST endpoints.
- Used CanCanCan for permissions.
- Added Mailgun campaigns and Prawn PDF generation.
- Integrated LiqPay payments and WebSocket behavior.
- Built and maintained the AngularJS SPA frontend.
Outcome
The system remained a single maintained application with API, permissions, communication, document, payment, and frontend concerns connected through its existing model layer. The work extended an inherited CRM rather than replacing it with a new system.
Details are generalized because the project is private property of its owner.