A full internal ICT management system for Kenya School of Government — covering asset lifecycle management (procurement to retirement) and a service desk with SLA tracking, real-time WebSocket notifications, and role-based access. Deployed on Oracle Cloud VPS with Docker.
Samuel is currently working as an intern/developer at Kenya School of Government (KSG), building and maintaining a full internal ICT management platform. This is his most complete, production-deployed full-stack system to date — live at ksg-ict.duckdns.org, running on Oracle Cloud VPS with Docker, and actively used by KSG staff.
The KSG ICT Platform replaces two manual, paper-based and spreadsheet-driven processes with a single integrated digital platform:
Previously: devices were purchased, assigned to staff via paper forms, and tracked in spreadsheets. There was no centralised view of who had which device, no maintenance history, and no verification that the correct person received the correct device.
Every asset moves through a defined status chain: PROCURED → INSPECTED → AVAILABLE → ASSIGNED → UNDER MAINTENANCE → RETIRED. The system enforces this chain — you cannot skip stages.
When a supervisor assigns a device, the system emails the staff member a unique link. The staff member clicks the link, reads the Terms and Conditions, and clicks to accept. This click is timestamped and stored as a legally binding digital signature — replacing the paper acceptance form entirely.
Every action on every asset — creation, inspection, assignment, status change, return — is logged with the actor and timestamp. Nothing is ever permanently deleted (soft deletes only).
Existing spreadsheet data was imported via CSV upload with a row-by-row success/failure report.
Previously: staff with IT issues called or walked to the ICT office. There was no record of the issue, who handled it, how long it took, or whether the staff member was satisfied. ICT management had zero visibility into workload or performance.
Each priority level has a target resolution time: Critical (4 hours), High (8 hours), Medium (24 hours), Low (72 hours). The system tracks every ticket against its SLA, flags breaches, and alerts supervisors when deadlines are approaching.
Built with Socket.io (WebSocket technology). Notifications appear instantly in the browser notification bell without any page refresh. Email notifications sent via Nodemailer for significant events (ticket assignment, resolution, SLA breach).
Four roles with distinct permission sets:
| Component | Technology | |---|---| | Frontend | React.js + Vite | | Styling | Tailwind CSS | | State | Zustand (auth state) | | Data fetching | React Query | | Real-time | Socket.io client | | Backend | Node.js + Express.js | | Database | PostgreSQL | | ORM | Prisma | | Real-time | Socket.io server | | Email | Nodemailer | | Scheduler | node-cron | | Deployment | Docker + Docker Compose | | Reverse proxy | Nginx + Let's Encrypt SSL | | Hosting | Oracle Cloud Free Tier VPS |
Four Docker containers managed by Docker Compose:
ksg_db — PostgreSQL database with volume persistenceksg_backend — Node.js/Express API serverksg_frontend — React app built and served by Nginxksg_nginx — Reverse proxy, SSL termination, HTTP → HTTPS redirectThis is Samuel's first production Docker deployment. Managing the container networking, volume mounts, environment variable injection, SSL certificate renewal, and live debugging on a running VPS has given him practical DevOps experience beyond theoretical knowledge.
Live in production at ksg-ict.duckdns.org. Actively used by KSG ICT staff. Ongoing maintenance and feature additions.
This project demonstrates Samuel's ability to: