Featured Mobile App 2024

Masroufi

A full-featured mobile recruitment platform connecting job seekers, recruiters, and admins — built with Flutter and Clean Architecture.

A full-featured mobile recruitment platform built with Flutter using Clean Architecture and BLoC, supporting three distinct user roles.

#flutter#recruitment#role-based-access#real-time#clean-architecture

Masroufi is a comprehensive mobile recruitment platform built with Flutter, designed to support three distinct user roles operating in the same system: job seekers, recruiters, and administrators.

Job seekers can browse, search, filter, save, and apply for positions with a full application tracking dashboard showing Pending, Accepted, and Rejected states. Recruiters manage their job postings and review applicant profiles. Admins have a system-wide management panel.

The project applies production-grade Flutter architecture patterns — Clean Architecture with feature-based modular structure, BLoC/Cubit for scalable state management, and JWT authentication with automatic token refresh via Dio interceptors. Local caching with Hive keeps the app responsive under poor connectivity.

A WebSocket-based real-time chat between recruiters and applicants and a skill-based quiz system were partially implemented, demonstrating the foundation for more advanced hiring workflows.

Key Features

👥

Three-role System

Distinct experiences for job seekers, recruiters, and admins — each with their own dashboards, permissions, and navigation flows enforced at both UI and data layers.

📋

Application Tracking

Job seekers track every application in real time with status updates (Pending, Accepted, Rejected) and recruiter feedback.

🔐

Secure JWT Authentication

Automatic token refresh via Dio interceptors with secure token storage using FlutterSecureStorage — no plain SharedPreferences.

📦

Offline Caching with Hive

Hive-powered local cache keeps the app functional under poor connectivity and reduces unnecessary API round trips.

💬

Real-time Recruiter Chat

WebSocket-based messaging channel between recruiters and applicants for direct in-app communication.

Tech Stack

FlutterDartBLoCDioHiveFlutterSecureStorage

Architecture

The app follows Clean Architecture with three layers: Data (remote + local sources, DTOs, repository implementations), Domain (use cases, entities, repository interfaces), and Presentation (BLoC/Cubit, screens, widgets). Features are fully modular — each feature is a self-contained folder with its own layers, making the codebase navigable and independently testable.

JWT tokens are managed through a Dio interceptor that automatically detects 401 responses, triggers a token refresh, and retries the original request — transparent to the rest of the app. Secure tokens are persisted using FlutterSecureStorage, never in plain SharedPreferences.

Challenges & Solutions

The hard problems — and how I solved them.

Managing three roles in one codebase without complexity explosion

Having three completely different user experiences in a single app risked creating a tangled, hard-to-navigate codebase. I resolved this by enforcing RBAC at both the UI and repository layers, combined with feature-based modular structure so each role's screens are completely isolated. Adding a new role feature doesn't touch unrelated code.

JWT refresh race conditions under concurrent requests

Multiple simultaneous API calls when a token expires caused a race condition — each request tried to refresh independently, flooding the auth endpoint. I fixed this by implementing a request queue in the Dio interceptor: the first 401 triggers a single refresh, all queued requests are held, and they all resume with the new token once refresh completes.

Cross-feature state synchronization without tight coupling

When a recruiter accepts an application, the job seeker's application list needed to update — but these are separate feature modules. I used a shared event bus pattern so BLoCs can broadcast state-changing events without importing each other directly.

More Projects

ExtMig

An open-source developer tool designed to improve migration workflows and productivity for modern development teams.

TypeScriptNode.js

Cat'aloge

An AI-powered mobile app that automatically scans your phone gallery and organizes pet photos using TensorFlow Lite inference running fully on-device.

FlutterDartTensorFlow LiteRiverpod +1

Accident Risk Navigator

A full-stack AI platform that predicts accident risk based on road conditions and weather, and visualizes high-risk zones on interactive maps.

ReactTypeScriptPythonTensorFlow +4

Interested in working together?

I'm always open to discussing new projects and opportunities.

Jihed Mrouki

Mobile & Flutter Developer specializing in scalable architectures and intelligent mobile solutions.

Connect

© 2026 Jihed Mrouki. All rights reserved.

Built with SvelteKit & TailwindCSS