Rokkup
2020 - 2021An online e-learning platform for technical sales training.

Overview
I was contacted by a startup who had built and launched a gig-working platform for the Rwandan market and after client feedback wanted to pivot to building a focussed e-learning platform for startups to train their technical sales staff.
I was tasked as the lead developer to build and implement this platform. We launched the platform and had some success but unfortunately the target market (Rwanda) did not have a large enough Serviceable Obtainable Market (SOM) with enough budget to justify continuing the platform and it was discontinued.
Tech Stack & Architecture
- NestJS
- React
- SCSS
- MongoDB
- Turborepo
- Docker
- Jest
- Bitbucket Actions CI/CD
- AWS
- Codegen
Key Features
- Video Lessons
- Video Encoding and Streaming
- Text Lessons
- Quizzes
- Student notes
- Company management
Challenges & Learnings
One of the big challenges was implementing this app with very tight budgets for the infrastructure due to the low price we had to target in order to be an attractive prospect for our target market. This restriction meant we had to manually implement some features which larger projects with better backing could either self host a bigger service to handle or rely on an existing SaaS solution.
One of the biggest potential costs for this service if we opted to use a SaaS would be the video streaming. To keep costs as low as possible we implemented our own video encoding and streaming solution using AWS. We built a media processing pipeline using AWS Elemental MediaConvert to convert uploaded videos into MPEG-DASH format and then served those videos from S3 via CloudFront which ended up being a very cost effective solution.
The biggest learning was regarding market research and idea validation prior to building and launching new products. It's a little ironic that a platform designed to train technical sales people on how to identify markets and sell to them didn't do enough idea validation ahead of time. I was convinced by the in-person training courses that had been provided and the feedback from customers that they would be happy to pay for this service, but when we actually launched adoption was lower than expected. In the future automating the market research with funnels and flows that prove users would be willing to pay for a service is an important part of my idea validation framework.
A big learning was regarding the benefits of code generation. This was my first project using code generation to generate the React client code. We opted to use Redux Toolkit for the state management of the application (which was a drastic improvement over Redux, but nowadays I keep state as minimal as possible) which had a beta version of client generation from an OpenAPI spec. This spec was generated via the NestJS swagger plugin which meant it wasn't 'schema-first' development but still provided many benefits for developing the React client. At one point I hit a bug with the @rtk-query/codegen-openapi package and managed to get a PR merged to fix the issue for everyone.
Another big learning was the benefits of headless component libraries. After having a poor experience with component libraries that were popular at the time and in consultation with a frontend developer who assisted with some of the frontend we opted to instead build our own custom component library and implement styling with scss. We spent quite a lot of developer time building this component library and were happy with the results, but more modern headless component libraries now give you the full flexibility to override or edit components without needing to reinvent the wheel.
This was also my first time using Turborepo. It's only a modestly sized project but the benefits of shared modules, utils, and packages helped keep the codebase clean and organised. With this hands on experience I learned the best practices, quirks, and utility of monorepo management tools and brought that positive experience to my future projects.
Have a similar project in mind?
I'd love to hear about it. Let's talk about what we could build together.
Let's Talk