Client platform · RHP Properties · 10+ years in production
RHP Learn: ten years of learning operations on AWS
A client and server learning platform for RHP Properties: a learner and manager portal, an admin console and a standards-based xAPI learning record store, built on CakePHP and MySQL. I architected and built it, set up and manage its AWS infrastructure, and have kept it running in production for more than ten years.
At a glance
How it runs ↓- 10+ yrsdesigned, built, hosted and maintained for one client
- 3 clientslearner portal, admin console and xAPI content on one server
- xAPIlearning record store with Statements, State and Profile APIs
- ~30report views with scheduled e-mail and Excel, CSV and PDF export
- 4 envsdev, dev2, staging and production, released through Git CI/CD
- 7 AWSservices: EC2, Elastic Load Balancing, VPC, RDS, S3, SES and SNS
The brief
One place to train, onboard and report, across every community
RHP Properties needed to assign, deliver and track training for community, maintenance, regional and corporate teams across the country, with onboarding that managers sign off and reports that leaders trust.
My role
I own it end to end: the architecture, the client and server code, the AWS account and infrastructure, releases, and day-to-day maintenance.
Who uses it
Learners see their assignments and courses. Managers and regional leaders sign off onboarding checklists and follow their teams. The learning team runs curricula, enrollment rules and reports from the admin console.
What I built
- Learner and manager portal: assignments, e-learning, completed courses, onboarding checklists with time-stamped sign-offs, team drill-downs and self-service reports.
- Admin console: curricula with due-date rules, auto-enroll learning plans driven by HR title codes, groups and roles, communities, notifications and tools.
- xAPI learning record store: Statements, State and Profile APIs that e-learning content from several vendors reports into, secured per client application.
- Reporting: about 30 report views (summary, individual, curriculum, overdue and activity) with scheduled e-mail, PDF certificates and Excel, CSV and PDF export.
- Automation: scheduled jobs for reminders, certification reports, bounced e-mail and inactive-employee checks, backups and log cleanup, plus an HR data sync for title codes, locations and regions.
Architecture as code
Two views, generated from a Python script
Both diagrams are drawn by tools/rhp_architecture.py from the application's code and configuration: the CakePHP layers, the xAPI endpoints, the scheduled jobs, the e-mail bounce loop and the environments it ships through.
Choose a view
Inside RHP Learn
Thirty screens, client and server
Four shelves, one per area of the platform. Scroll a shelf or use its arrows, and select a screen to enlarge it. Learner and staff names, e-mail addresses, IDs and IP addresses are blurred.
Learner portal
Client app · 6 screens
Learner dashboardAssignments, e-learning courses, completed courses, reports and team in one view, with supervisor and success-coach cards.
Leader dashboardA regional leader's view: completions plus a My Team panel with checklists, team drill-downs and dashboards per direct report.
Team drill-downOpening a manager's team lists each member's role, with links to their checklist, team and dashboard.
My activity reportA learner's activity by curriculum with status and last-action dates, exportable to Excel, PDF or CSV.
Overdue reportOverdue activities grouped by leader, community and learner, with days overdue.
Onboarding checklistThe community manager success guide: week-by-week tasks with time-stamped sign-offs.
Admin console
Server app · 16 screens
Admin homeActive users, curricula, completion and overdue rate, a statement-activity time series and active learners by state.
LearnersActive learners by state and group, and a roster with supervisor, title, community and e-mail status.
Active curriculaEvery live curriculum with due-date rule, visibility, publishing, enrollments and completion rate.
Archived curriculaRetired curricula kept for history and reporting.
Curriculum detailDue-date rule, enrollments, learning objects, dashboard placement and the groups enrolled through learning plans.
Auto-enroll learning plansRules that enroll people into curricula by group and verb, each switchable on or off.
Learning plan detailA plan's rule (verb, group, region) and the learners it enrolled.
Roles and groupsGroups mapped to roles, each with its own e-mail and dashboard settings.
Group settingsDashboard settings, mapped title codes, tools and notifications for one group.
Title codesHR title codes that map people to groups and learning plans.
NotificationsDashboard notices, such as classroom courses and recurrent safety training, with previews.
ToolsLinks to intranet tools and manuals that appear on learners' dashboards.
CommunitiesCommunities and regions, each with its learners, instructors and learning plans.
Community detailA community's learners and administrators.
Learner profileProfile, e-mail bounce status, enrolled and outstanding curricula, and a live activity stream.
Dashboard as the learner sees itAdmins can open any learner's dashboard to see assignments, courses and reports exactly as the learner does.
Reports
Server app · 4 screens
Summary reportUsers, completions and completion ratio, with curriculum and office breakdowns and a send-reminders action.
Curriculum reportFilter by region, group, curriculum and status; results grouped by community and role.
Individual reportOne learner's full history by activity, with completion dates.
Leader overdue reportOverdue curricula for a regional vice president's managers, grouped by community and role.
xAPI and operations
Learning record store and logs · 4 screens
Activity streamIncoming xAPI statements (enrolled, attempted, completed) with learner, activity and time.
xAPI statementOne statement with actor, verb and object, and the raw JSON stored in the learning record store.
ActivitiesLearning objects registered in the LRS: courses, curricula, objectives and modules.
LogsApplication log with severity, timestamp and user, including requests for controllers that don't exist.
Running it for ten years
Infrastructure, security and delivery
Building the platform was the start. Most of the value came from running it: keeping it secure, deploying safely and extending it as RHP's training needs grew.
AWS infrastructure
- EC2 web servers behind Elastic Load Balancing, inside a VPC with a security group per tier.
- Amazon RDS for MySQL as the system of record for learning records, people and curricula.
- S3 for course packages and learning assets; SES for e-mail and SNS for bounce notices.
- The AWS account itself: access, security groups and cost.
Security
- HTTPS everywhere, with the load balancer's forwarded protocol honored by the application.
- Role-based access control for every admin function, with menus filtered by role.
- HTTP Basic or OAuth 1.0 for registered client applications, and a CORS allow-list for content sites.
- Optional SAML single sign-on.
Delivery and maintenance
- Git-based CI/CD that promotes changes through dev, dev2, staging and production.
- A health endpoint for the load balancer, and scheduled jobs for reminders, reports, bounce and inactive checks, backups and log cleanup.
- Ten years of upgrades and new modules, such as assignments and enrollment plans, without changing the platform's foundations.
Stack
What it's built with
A deliberately conventional stack, chosen to be easy to host, secure and maintain over many years.
Front end
- HTML and JavaScript
- jQuery and Bootstrap
- DataTables with Excel, CSV and PDF export
- Chart.js and Flot
- pdf.js
Server
- PHP and CakePHP (MVC)
- Auth component with ACL roles
- OAuth 1.0 server for client apps
- CakePdf with wkhtmltopdf
- Cron shells and a job queue
Learning standards
- xAPI (Tin Can) learning record store
- TinCanJS and ADL xAPIWrapper
- Statements, State and Profile APIs
- Optional SAML single sign-on
Data
- MySQL on Amazon RDS
- activity_log_* learning record model
- HR feed: title codes, locations, regions
AWS
- EC2 and Elastic Load Balancing
- VPC and security groups
- RDS, S3, SES and SNS
- Account, IAM and cost management
Delivery
- Git and CI/CD
- dev → dev2 → staging → production
- Health checks and scheduled jobs
- Ten years in production