Revelation Software Concepts · Feb 2025 – Present
Modernising an e-learning platform
We rebuilt the backend from the data model up, added Stripe payments, and moved the AWS infrastructure to Terraform. The platform is now in beta with paying content creators.
- Role
- Tech lead, hands-on
- Team
- 3 engineers
- Stack
- Java · Spring Boot · Spring Security · PostgreSQL · Angular · Ionic · Stripe · Terraform · AWS · Jenkins
What I decided
- Redesigned the backend with the other architects, starting from the data model, and upgraded the full technology stack.
- Built the Stripe integration end to end: Designed and developed the platform Stripe integration from scratch. We decided on Direct Charges model for creators. We support subscription and on-time payments through Stripe. We also host the platform Plans on Stripe which the creator subscribes to.
- Built a validation strategy framework, the OAuth2 and OIDC setup, and a background job runner.
- Split AWS into one account per environment and defined all of the infrastructure in Terraform.
- Chose AWS API Gateway over Kong. It is simpler and cheaper to run.
Outcome
App load times improved by 50% with the new data model and backend. We can now provision a new environment in about 10 minutes, and Jenkins deploys to AWS through OIDC with no stored keys.
Backend
We redesigned the backend starting from the data model and upgraded the full stack. I built the validation strategy framework, set up OAuth2 and OIDC on Spring Security, and built the background job runner. App load times improved by 50%.
When I joined, I was managing four offshore contractors. Today I lead three in-house engineers who use AI coding agents in their daily work.
Payments
I built the Stripe integration end to end. It handles subscriptions and memberships, one-off course purchases, and payouts to content creators through Stripe Connect. Webhook handling and reconciliation keep the platform in sync with Stripe.
A few things I learned along the way. We only subscribe to the webhook events we actually need. Stripe keeps resending an event until it gets a success response, so every handler has to acknowledge correctly. Webhooks are tied to an API version, so the API and the webhook endpoint have to be upgraded together, or you risk downtime.
Infrastructure
Infrastructure was outside my core competency but I took it on. We split AWS into one account per environment and defined everything in Terraform: networking and NAT gateways, load balancers, Auto Scaling groups on Packer-built AMIs, API Gateway, RDS, CloudFront, Route 53, SES, Secrets Manager, CloudWatch and IAM. Jenkins deploys to each account.
The product used long term AWS credentials in Jenkins pipelines for deployment. In the new pipelines I introduced Jenkins OIDC credentials, which removed the need for AWS keys to be stored in Jenkins thus improving security and the recurring overhead of key rotation for ISO compliance.
We can now provision a new environment in about 10 minutes.