Rima Nafougui
I build things the way I approach everything else: with full commitment and a need to understand how it works. Software developer, Director of Technology at Careforall.org, and someone who has yet to find a problem worth walking away from.
About Me

Rima Nafougui
Builder. Optimist. Aspiring.
Experience
Director of Technology
Careforall.org
Managing website infrastructure maintenance, security, and email delivery systems for a non-profit platform. Leading SEO optimization, performance improvements, and compliance efforts to ensure a reliable and accessible experience for users.
Programming Tutor
Cégep Ahuntsic / Freelance
Mentoring 15+ students weekly in SQL, Java, Python, JavaScript, Kotlin, and Swift. Improved student pass rates by 85% through real-time debugging, algorithm problem-solving, and personalized learning materials including interactive dashboards and visualization tools.
Mathematics Tutor
Cégep Ahuntsic
Tutored 5 CS students in linear algebra and discrete mathematics, creating 10+ Python visualization scripts to bridge theory to real-world programming. Topics included ray tracing calculations, graph theory, and probability for ML applications.
Projects
6 selected works

RCapsule — Smart Closet Manager
Problem
My first production-level application, built around something I genuinely care about: fashion as a design problem. Managing a wardrobe across dozens of e-commerce tabs with no inventory visibility leads to repeat purchases and underused clothing.
- →AWS Lambda + ECR pipeline processing 176MB ONNX models for real-time BG removal
- →Chrome Extension with DOM scraping reducing manual data entry by 90%
Key Decisions
Used AWS Lambda with a containerized ONNX model for background removal rather than a third-party API to avoid per-image fees at scale and control the model version.
Built a Chrome Extension for auto-import rather than requiring manual uploads — reducing input friction was the most important retention factor surfaced in early user testing.
Chose NextAuth.js with Supabase over custom auth to shrink the security surface area and ship the core product logic faster.

Supply Chain Analytics Dashboard
Problem
Shipping disruptions are invisible in standard reports because data aggregation hides the selection bias that distorts cost and delay estimates.
- →Star schema data model with 50+ DAX measures for prescriptive analytics
- →4-page interactive dashboard with drill-through on $17M+ shipping costs
Key Decisions
Chose a star schema over a flat model to support complex DAX relationships without query fan-traps across 50+ measures.
Surfaced the selection bias explicitly in the report rather than silently correcting it — decision-makers need to see the distortion to trust the analysis.
Used what-if parameters for prescriptive analytics instead of stopping at descriptive — the goal was to support decisions, not just describe past data.

ArXiv RAG Research Assistant
Problem
Reading full papers to find relevant insights is hours of manual work that a well-designed retrieval system can reduce to seconds.
- →Automated ETL pipeline via GitHub Actions with weekly scheduled scraping
- →384-dim vector embeddings + Supabase pgvector for semantic search
Key Decisions
Used pgvector on Supabase rather than a standalone vector DB — it kept the stack at one host and avoided the operational overhead of a separate service for what was essentially an index.
Chose 384-dim sentence-transformers over larger models because the speed-quality tradeoff is optimal for academic abstracts, and latency matters more than marginal embedding precision.
Scheduled weekly GitHub Actions scraping instead of real-time ingestion — ArXiv relevance doesn't decay in hours, so weekly freshness avoids rate-limit complexity for no practical gain.
ExpenseFlow — Finance REST API
Problem
Finance APIs commonly become untestable as role and rule complexity grows, causing production bugs that are expensive to trace back to a specific layer.
- →JWT authentication with role-based authorization and pagination
- →50% test coverage using JUnit 5, Mockito, MockMvc
Key Decisions
Used JWT over session-based auth to keep the API stateless and horizontally scalable — no shared session store means simpler deployment without sticky sessions.
Enforced a JaCoCo 50% coverage floor in CI rather than treating coverage as aspirational — a build gate creates accountability that a goal does not.
Applied strict domain layering (controller / service / repository) from the start so adding new expense categories never requires cross-layer rewrites.

Accessible Component Library
Problem
Most component libraries achieve visual polish while treating keyboard navigation and screen reader support as an afterthought, forcing teams to retrofit compliance after shipping.
- →Focus trap management and Tab cycling across 3 accessible components
- →15+ TypeScript component variants with strict typing
Key Decisions
Implemented focus trap management from scratch rather than using a library so I could fully understand and document the exact behavior required per component type.
Used CSS Modules over utility classes to keep styles co-located with component logic and avoid purge-related class stripping in consumer build systems.
Validated with VoiceOver and NVDA alongside axe-core — automated tools catch roughly 40% of WCAG failures, so manual testing is non-negotiable for a real accessibility guarantee.

To Do App — Android Task Manager
Problem
Most Android task apps manage search, filters, and persistence as separate states, causing UI flicker and stale reads whenever any one of them changes.
- →Sealed TaskUiState (Loading | Success | Error) powered by a combine() pipeline merging 5 flows — Room data, text search, priority filter, completed-task toggle, and DataStore sort order — into one WhileSubscribed(5000) StateFlow
- →WorkManager OneTimeWorkRequest reminders per task triggered 1h before deadline, auto-rescheduled on edit and cancelled on delete via a custom HiltWorkerFactory
Key Decisions
Combined five independent flows (Room data, search, priority filter, completed toggle, DataStore sort) into one StateFlow using combine() so the UI always derives from a single consistent snapshot.
Used Hilt over manual DI because its compile-time verification catches missing bindings before runtime — critical for a WorkManager component that must survive process death.
Chose WorkManager over AlarmManager for reminders because it handles Doze mode, device reboots, and cancellation automatically — AlarmManager requires custom broadcast receivers for each of those edge cases.
Skills
Languages
Frameworks
Databases
Version Control
IDEs & Tools
Cloud & DevOps
Technical Journey
- MAY 2026
DEC in Web & Applications
Collège Ahuntsic
Graduating from intensive training in full-stack web development, mobile applications, and systems analysis. Strong foundations in OOP, algorithms, database management, and cloud computing.
- MARCH 2026 – PRESENT
Director of Technology
Careforall.org
Managing website infrastructure maintenance, security, and email delivery systems. Driving SEO optimization, performance improvements, and compliance for the non-profit platform.
- FALL 2026
BSc in Computer Science
University of Montreal
Incoming CS student. Deepening theoretical foundations in software architecture and large-scale systems while continuing to ship production projects.
- 2027+
Build Something of My Own
To Be Written
Working toward founding a company or research initiative that solves a real problem for real people. The next chapter is still being decided — but the direction is clear.