Software Engineer based in Ethiopia with 4 years of experience specializing in TypeScript, Next.js, React, TanStack, Node.js, PostgreSQL, and Golang. I build full-stack applications—from greenfield development and prototyping to debugging production issues, maintaining legacy codebases, and architecting systems.

Continuous Education Platform
CompletedThe Problem
The existing process for managing student registration, course communication, and instructor payments is manual and fragmented. Students must pay fees at a bank and then physically submit receipts and documents to the registrar’s office, causing administrative delays and errors. Course resources and announcements are scattered across unofficial channels like Telegram, leading to confusion. Instructors are paid manually at the end of each semester without a reliable way to track student payments, resulting in delayed and inaccurate salary processing. The platform solves these issues by providing an integrated online experience for registration, payment, centralized course communication, and automated salary administration.
Tech Stack
System Architecture
The system follows a modern web architecture with a Next.js application serving both frontend and backend (via server actions and API routes). External services handle file storage (Cloudinary) and payment processing. The database (PostgreSQL) stores all business data.

Sequence Diagram
See all →The following diagrams illustrate the core user workflows across all roles in the system. Each diagram captures a specific interaction between actors and the system, showing the sequence of messages exchanged.

Complaint handling workflow: users (students/instructors) create complaints with a title and exchange messages with coordinators. Coordinators see all complaints ordered by creation, with solved ones at the bottom. Either party can mark a complaint as solved, updating its status.
Entity Relationship Diagram
The database schema is centered around academic structure: colleges, departments, batches, students, instructors, courses, semesters, and the many relationships that enable enrollment, payments, assignments, exams, and communication.

Deployment Diagram
The system is deployed as a standard three‑tier web application, with the Next.js app serving both client and server logic, connected to a relational database and external cloud services.

Challenges
Building the Continuous Education Platform came with significant technical challenges due to its complex academic hierarchy, multi-role access control, and integration with external services.
| Problem | Solution |
|---|---|
| Manual registration requiring bank visits and paper receipts | Integrated online payment gateway; students upload documents and pay via mobile |
| Fragmented communication via Telegram and student reps | Centralized course panels with real‑time chat and resource sharing |
| Instructor salary delays due to untracked student payments | Automatic tracking of student payments; salary generation at semester end based on enrollment data |
| Deadline enforcement for assignments | Dual validation: client‑side disable and server‑side check on every submission |
| File uploads to multiple services | Single upload to Cloudinary via server actions; metadata stored in database |
| Coordinating complaints across multiple coordinators | Dedicated complaint panel with routing to appropriate coordinator |
| Managing different user roles (student, instructor, registrar, finance, coordinator, dean, head, admin) | Role‑based access control implemented in NextAuth and middleware |
| Complex academic hierarchy (college, department, batch, semester, course) | Prisma schema with proper relations and unique constraints |
| Preventing double‑assignment of heads/deans | Database constraints and validation in server actions |
| Exam timing and auto‑grading | Server‑side time checks; automatic score calculation based on correct options |
| Bulk salary payments | Grouping by instructor; integration with payment gateway; transaction logging |
Security Considerations
Comprehensive security measures to protect user data, prevent attacks, and ensure secure transactions across all roles and operations.
| Area | Measure |
|---|---|
| Authentication | NextAuth with multiple providers; secure session management |
| Authorization | Role‑based access control (RBAC) on all API routes and server actions |
| HTTPS | All communication encrypted in transit |
| Input validation | Server‑side validation for all user inputs; Prisma schema enforces data integrity |
| File upload security | File type and size validation; Cloudinary virus scanning (optional) |
| Payment security | Payment Gateway handles sensitive data; no PCI scope on platform |
| Deadline checks | Both client and server validate submission deadlines and exam time windows |
| SQL injection prevention | Prisma ORM with parameterized queries |
| Data encryption | Passwords hashed (via NextAuth); database encryption at rest (cloud provider) |
| Unique constraints | Database enforces unique emails, transaction IDs, course codes, etc. |
| Suspension mechanism | User accounts can be suspended; suspended users cannot perform actions |
| Audit logging | Timestamps on all major actions (createdAt, paidAt, submittedTime) |
Performance & Scalability
Strategies and implementations to ensure the platform handles load efficiently and scales with growing users.
| Area | Measure |
|---|---|
| Database indexing | Indexes on frequently queried fields (e.g., email, transactionId, composite keys) as seen in Prisma models |
| File offloading | Cloudinary handles file storage and optimization, reducing server load |
| Server‑side rendering (SSR) | Next.js SSR for initial page loads, improving perceived performance |
| Caching | In‑memory caching for reference data (e.g., department list) with React Query or SWR |
| Asynchronous processing | Webhooks for payment confirmations; background jobs for salary calculation |
| Horizontal scaling | Next.js app stateless; can be scaled horizontally behind a load balancer |
| Database connection pooling | Managed by Prisma and connection pooler (e.g., PgBouncer) |
| CDN | Cloudinary provides global CDN for file delivery |
| Optimized queries | Selective fetching of data; avoiding N+1 queries via Prisma include |
| Pagination | For large lists (e.g., students, complaints) to reduce payload size |
| Lazy loading | Frontend components load data only when needed (e.g., modal dialogs) |
No sponsors yet. Be the first!
Become a Sponsor