Skip to content

Looking for an internship or a junior role — AI / full-stack / software engineeringÀ la recherche d'un stage ou d'un poste junior — IA / Fullstack / Ingénierie logicielle

Mohamed Mortadha Hachani

Software engineering student · AI & full-stackÉtudiant ingénieur en informatique · IA & développement fullstack · TunisiaTunisie

I put AI into applications people actually use — a tutor for Tunisian students, a governance platform for enterprise AI tooling, medical triage. I build them end to end: frontend, backend, database, deployment.J'intègre l'IA dans des applications concrètes — un tuteur pour les élèves tunisiens, une plateforme de gouvernance pour l'outillage IA en entreprise, du triage médical. Je les construis de bout en bout : frontend, backend, base de données, déploiement.

5
Projects built end to endProjets menés de bout en bout
5
Backend stacks: Python, Java, C#, PHP, JSStacks backend : Python, Java, C#, PHP, JS
3
Of them with AI at the coreDont trois avec l'IA au cœur

WorkProjets

Things I've builtCe que j'ai construit

Fahem

FeaturedÀ la une Personal projectProjet personnel · 2026

An AI tutor that solves algorithmique homework in exactly the syntax a Tunisian student has been taught — grounded in the real curriculum, not in generic AI knowledge.Un tuteur IA qui résout les exercices d'algorithmique dans exactement la syntaxe qu'un élève tunisien a apprise — ancré dans le programme réel, pas dans les connaissances génériques d'une IA.

I teach algorithmique to six groups of students. I watched them paste exercises into chatbots and get back answers in whatever Python the model liked — a for loop, a helper function, an f-string. All correct Python. All useless to someone marked against the notation in their own textbook, who has not been taught any of it yet.J'enseigne l'algorithmique à six groupes d'élèves. Je les ai vus coller leurs exercices dans des chatbots et récupérer des réponses dans le Python que le modèle préférait — une boucle for, une fonction, une f-string. Du Python correct. Inutile pour quelqu'un noté sur la notation de son propre manuel, et à qui on n'a encore rien enseigné de tout cela.

Grounded in the student's own chapterAncré dans le chapitre de l'élève

Fahem retrieves the chapter the student is actually working through and constrains the answer to the syntax that chapter contains — Lire and Ecrire, ← for assignment, div and mod, the Objet | Nature/type declaration table. If a problem genuinely needs something the chapter has not covered, it says so instead of inventing it.Fahem récupère le chapitre que l'élève travaille réellement et contraint la réponse à la syntaxe de ce chapitre — Lire et Ecrire, ← pour l'affectation, div et mod, le tableau de déclaration Objet | Nature/type. Si un exercice exige vraiment une notion non couverte, il le dit au lieu de l'inventer.

A verdict you can checkUn verdict vérifiable

A mechanical syntax checker puts a verdict under every answer — syntaxe du chapitre respectée, or the exact offending lines. A grounding strip opens to show the pinned syntax tables and the retrieved excerpts the answer was built on, so nothing has to be taken on faith.Un vérificateur syntaxique mécanique place un verdict sous chaque réponse — syntaxe du chapitre respectée, ou les lignes exactes en faute. Un bandeau d'ancrage s'ouvre sur les tableaux de syntaxe épinglés et les extraits retrouvés qui ont servi à construire la réponse : rien n'est à croire sur parole.

Three ways to askTrois façons de demander

La solution gives the worked answer. Mode guidé walks four steps — comprendre, indice, squelette, solution — and stops where the student still has work to do. Ma réponse takes what the student wrote and corrects it line by line, naming the rule behind each correction.La solution donne la réponse rédigée. Le mode guidé déroule quatre étapes — comprendre, indice, squelette, solution — et s'arrête là où l'élève a encore du travail. Ma réponse reprend ce que l'élève a écrit et le corrige ligne par ligne, en nommant la règle derrière chaque correction.

Built for how students actually workPensé pour la façon dont les élèves travaillent

Photograph the exercise or paste a screenshot and it reads the statement out of the image. Answers stream as they are written. Every model call queues for Groq, so a student hitting a busy service sees their place in line instead of an error.Photographiez l'exercice ou collez une capture : Fahem lit l'énoncé dans l'image. Les réponses s'affichent au fil de leur écriture. Chaque appel au modèle passe par une file d'attente vers Groq : un élève qui tombe sur un service saturé voit sa place dans la file plutôt qu'une erreur.

  • FastAPI
  • Python
  • RAG / Qdrant
  • Groq
  • React
  • TypeScript
  • Vite
  • PostgreSQL
  • Redis
  • Docker

4 screensécrans

autoauto

  • The Fahem landing page

    Landing — try it before any accountAccueil — essayer avant tout compte

  • Guided mode walking through an exercise in four steps

    Mode guidé — four steps, not one answerMode guidé — quatre étapes, pas une réponse

  • Feature cards in dark mode

    Dark theme, following the OS by defaultThème sombre, aligné sur l'OS par défaut

  • The sign-in screen

    Google or email, with verificationGoogle ou email, avec vérification

MCP Hub

FeaturedÀ la une Internship · SagemcomStage · Sagemcom · 2026

A catalog, governance layer and runtime gateway for enterprise MCP servers — one governed source of truth in place of ad-hoc mcpServers JSON scattered across wiki pages.Un catalogue, une couche de gouvernance et une passerelle d'exécution pour les serveurs MCP en entreprise — une source de vérité gouvernée à la place de bouts de JSON mcpServers éparpillés sur des pages wiki.

An MCP server is only useful to an agent once it is discoverable, vetted, and reachable over a transport the agent can speak. Doing that by hand — copying command/args/env blocks, tracking who approved what, remembering which endpoints are safe — does not scale past a handful of servers.Un serveur MCP n'est utile à un agent qu'une fois découvrable, validé, et joignable via un transport que l'agent parle. Le faire à la main — recopier des blocs command/args/env, suivre qui a approuvé quoi, se souvenir des endpoints sûrs — ne passe pas l'échelle de quelques serveurs.

A catalog with provenanceUn catalogue avec provenance

Every MCP is a database record: identity, provenance, documentation, governance ratings, and a cached tool manifest. Local servers are stdio processes the Hub spawns from an allowlisted interpreter; external ones are HTTPS endpoints reached over SSE or streamable HTTP.Chaque MCP est un enregistrement en base : identité, provenance, documentation, notations de gouvernance et manifeste d'outils mis en cache. Les serveurs locaux sont des processus stdio lancés depuis un interpréteur autorisé ; les externes sont des endpoints HTTPS joints en SSE ou streamable HTTP.

Governance that leaves a trailUne gouvernance qui laisse une trace

Each MCP moves through an explicit lifecycle — draft, under review, approved, published — against an append-only audit log recording who changed what, with before and after snapshots. Gated servers take consumer access requests a platform admin approves or rejects.Chaque MCP suit un cycle de vie explicite — brouillon, en revue, approuvé, publié — adossé à un journal d'audit en ajout seul qui enregistre qui a changé quoi, avec instantanés avant et après. Les serveurs restreints reçoivent des demandes d'accès qu'un administrateur approuve ou rejette.

A runtime gateway, two shapesUne passerelle d'exécution, deux formes

Approved servers reach agents as OpenAPI HTTP tools through MCPO: either one process per MCP, each with its own port, PID and health status, or all of them behind a shared daemon whose config is regenerated atomically and hot-reloaded on every activation.Les serveurs approuvés atteignent les agents comme des outils HTTP OpenAPI via MCPO : soit un processus par MCP, chacun avec son port, son PID et son état de santé, soit tous derrière un démon partagé dont la configuration est régénérée atomiquement et rechargée à chaud à chaque activation.

One identity seam, two auth modesUne couture d'identité, deux modes d'authentification

Production callers carry a JWT; local dev reads a role from a header. Both resolve through a single seam, so every role check is written once and holds in both — and the role is always read from the linked user profile, never trusted from the token itself.En production l'appelant porte un JWT ; en développement local le rôle vient d'un en-tête. Les deux passent par une même couture : chaque contrôle de rôle est écrit une fois et vaut dans les deux cas — et le rôle est toujours lu depuis le profil utilisateur lié, jamais tiré du token.

  • Django 6
  • DRF
  • Angular 22
  • TypeScript
  • PostgreSQL
  • Docker
  • MCPO
  • OpenAPI
  • JWT

4 screensécrans

autoauto

  • The MCP Hub dashboard

    Dashboard — the governed estate at a glanceTableau de bord — le parc gouverné d'un coup d'œil

  • The MCP Hub catalog listing servers with their lifecycle state

    Catalog — filtered by category, local vs. hostedCatalogue — filtré par catégorie, local ou hébergé

  • The admin view for managing MCP servers

    Admin — lifecycle transitions and bridgesAdmin — transitions de cycle de vie et bridges

  • The user administration view

    Users — three roles, one permission modelUtilisateurs — trois rôles, un modèle de permissions

Screenshots are from the internship environment, with server names redacted. The repository is private.Captures issues de l'environnement de stage, noms de serveurs masqués. Le dépôt est privé.

ProManager

FeaturedÀ la une Personal projectProjet personnel · 2026

A project-management platform where the AI does the staffing work — reading a CV into a skill profile, generating a realistic task breakdown, and explaining which member should take what and why.Une plateforme de gestion de projets où l'IA fait le travail d'affectation — lire un CV pour en tirer un profil de compétences, générer un découpage de tâches réaliste, et expliquer qui doit prendre quoi et pourquoi.

Assigning work well means knowing who can actually do it and who is already buried. That knowledge lives in CVs nobody re-reads and in a board nobody aggregates, so tasks get handed to whoever is nearest rather than whoever fits.Bien répartir le travail suppose de savoir qui sait vraiment faire et qui est déjà noyé. Ce savoir dort dans des CV que personne ne relit et sur un tableau que personne n'agrège : les tâches finissent chez le plus proche plutôt que chez le plus adapté.

A CV becomes a skill profileUn CV devient un profil de compétences

Upload a PDF résumé and the AI service extracts its skills with PyMuPDF and Llama 3.3. The user reviews the suggestions as removable chips, adds their own, and saves the final list — which then feeds every assignment decision the platform makes.Déposez un CV en PDF et le service IA en extrait les compétences avec PyMuPDF et Llama 3.3. L'utilisateur relit les suggestions sous forme d'étiquettes supprimables, ajoute les siennes et enregistre la liste finale — qui alimente ensuite chaque décision d'affectation.

Assignment with a reason attachedUne affectation motivée

Task generation produces a realistic breakdown and names who should take each item, justified against recorded skills and current workload. A separate risk pass flags bottlenecks, overloaded members and likely delays, with recommendations rather than just a score.La génération de tâches produit un découpage réaliste et désigne qui doit prendre chaque élément, en le justifiant par les compétences enregistrées et la charge en cours. Une passe de risque distincte signale goulots, membres surchargés et retards probables, avec des recommandations plutôt qu'un simple score.

A board that moves in real timeUn tableau qui bouge en temps réel

Drag-and-drop Kanban on the Angular CDK, grouped by sprint or backlog, with per-column scrolling and approval actions. A STOMP WebSocket pushes project refresh events, so a card moved by one member lands on everyone else’s board.Kanban en glisser-déposer sur le CDK Angular, groupé par sprint ou backlog, avec défilement par colonne et actions d'approbation. Un WebSocket STOMP diffuse les événements de rafraîchissement : une carte déplacée par un membre arrive sur le tableau des autres.

Four roles and a control centerQuatre rôles et un centre de contrôle

Owner, admin, member and viewer gate every action through route guards on the front and authorization services on the back, all behind Spring Security and JWT. An admin control center covers users, projects, tasks, logs and system-level actions.Owner, admin, membre et viewer filtrent chaque action via des gardes de routes côté front et des services d'autorisation côté back, le tout derrière Spring Security et JWT. Un centre de contrôle couvre utilisateurs, projets, tâches, journaux et actions système.

Model output treated as untrustedLa sortie du modèle traitée comme non fiable

The FastAPI service parses and normalizes every response into Pydantic models with strict JSON handling, and falls back to a second model under load — so a malformed or slow generation degrades the feature instead of the board.Le service FastAPI analyse et normalise chaque réponse en modèles Pydantic avec un JSON strict, et bascule sur un second modèle en charge — une génération malformée ou lente dégrade la fonctionnalité, pas le tableau.

  • Java
  • Spring Boot 3
  • Spring Security
  • JPA / Hibernate
  • Angular 17
  • TypeScript
  • FastAPI
  • Groq / Llama 3.3
  • PyMuPDF
  • PostgreSQL
  • STOMP / WebSocket
  • Docker
  • nginx

4 screensécrans

autoauto

  • The Kanban board with four columns, priority badges and workload counters

    Kanban — four columns, priorities, workload countersKanban — quatre colonnes, priorités, charge

  • The AI CV analyser, offering to extract skills from an uploaded PDF résumé

    Analyseur de CV — a PDF becomes a skill profileAnalyseur de CV — un PDF devient un profil

  • The admin dashboard with project, task and team counters

    Dashboard — projects, tasks and seats at a glanceTableau de bord — projets, tâches et sièges d'un coup d'œil

  • The ProManager sign-in screen

    Sign-in, with demo access spelled outConnexion, avec accès démo indiqué

PlatformeMed

Personal projectProjet personnel · 2026

A telemedicine platform where the AI does the triage — reading a patient’s symptoms in plain French to route them to the right specialist, at the right urgency, before a human ever reads the request.Une plateforme de télémédecine où l'IA fait le triage — lire les symptômes du patient en français courant pour l'orienter vers le bon spécialiste, au bon niveau d'urgence, avant qu'un humain ne lise la demande.

A patient describing symptoms does not know which specialist they need, or how urgent it is. Getting that wrong wastes an appointment slot at best and delays a critical case at worst — and the triage happens before anyone qualified has looked at it.Un patient qui décrit ses symptômes ignore quel spécialiste il lui faut, et à quel degré d'urgence. Se tromper gaspille un créneau au mieux, retarde un cas critique au pire — et ce triage se fait avant qu'une personne qualifiée n'ait rien regardé.

Triage before bookingLe triage avant la réservation

Symptoms typed in natural language are interpreted, matched to a speciality, and graded across four urgency levels from low to critical. The booking flow then offers the slots that fit, instead of a blank calendar and a guess.Les symptômes saisis en langage naturel sont interprétés, rattachés à une spécialité et gradués sur quatre niveaux d'urgence, de faible à critique. Le parcours de réservation propose alors les créneaux adaptés, au lieu d'un calendrier vide et d'une supposition.

Three spaces, one codebaseTrois espaces, une base de code

Patients get a digital record, prescriptions, uploaded analyses and charted vitals — glycaemia, blood pressure, weight. Doctors get the day’s appointments, critical alerts, consultation write-ups and availability slots. Admins get platform statistics and system alerts.Les patients disposent d'un dossier numérique, d'ordonnances, d'analyses déposées et de constantes tracées — glycémie, tension, poids. Les médecins ont les rendez-vous du jour, les alertes critiques, les comptes-rendus et leurs disponibilités. Les administrateurs ont les statistiques et les alertes système.

Diagnostic support, not diagnosisAide au diagnostic, pas diagnostic

For the doctor, the model synthesises the patient’s history into differential diagnoses — framed as input to a clinician’s judgement rather than a verdict, which is the only defensible shape for this in a medical setting.Pour le médecin, le modèle synthétise l'historique du patient en diagnostics différentiels — présentés comme une entrée du jugement clinique et non comme un verdict, seule forme défendable en contexte médical.

Isolation as a first-class concernL'isolation comme exigence de premier plan

A role middleware gates every space, uploads are validated strictly, and patient data is isolated per account — the part of a medical app where a mistake is not a bug but a breach.Un middleware de rôle filtre chaque espace, les dépôts de fichiers sont validés strictement et les données patient sont isolées par compte — la partie d'une application médicale où une erreur n'est pas un bug mais une fuite.

  • PHP 8.3
  • Laravel
  • Blade
  • Alpine.js
  • Tailwind
  • MySQL
  • Groq / Llama 3.3
  • Vite

4 screensécrans

autoauto

  • The patient dashboard, with the next appointment, the AI assistant and recorded vitals

    Espace patient — next appointment, vitals, agendaEspace patient — rendez-vous, constantes, agenda

  • The AI orientation screen with symptoms described in free text

    Orientation IA — symptoms in, speciality and urgency outOrientation IA — symptômes en entrée, spécialité et urgence en sortie

  • The doctor dashboard showing the day’s schedule and critical alerts

    Espace médecin — the day’s plan and critical alertsEspace médecin — planning du jour et alertes critiques

  • Health tracking with blood pressure and glycaemia charts against critical thresholds

    Suivi santé — constants charted against thresholdsSuivi santé — constantes tracées face aux seuils

DigiRH

FeaturedÀ la une Final-year project (PFE) · STBProjet de fin d'études (PFE) · STB · 2025

A ground-up rewrite of the HR app used by 300+ staff at Société Tunisienne de Banque — Flutter on .NET Core 8, replacing a dated portal with one app for accounts, requests, meetings, chat and wellbeing.La refonte complète de l'application RH utilisée par plus de 300 collaborateurs de la Société Tunisienne de Banque — Flutter sur .NET Core 8, remplaçant un portail vieillissant par une seule application : comptes, demandes, réunions, messagerie et bien-être.

The bank already had DigiRH; the problem was that people avoided it. The ergonomics were dated, mobile access was limited, nothing arrived in real time, and the data handling was not good enough for a bank. An HR tool nobody opens is not an HR tool.La banque avait déjà DigiRH ; le problème, c'est que personne ne l'ouvrait. Ergonomie dépassée, accessibilité mobile limitée, aucune notification en temps réel et une sécurité des données insuffisante pour une banque. Un outil RH que personne n'ouvre n'est pas un outil RH.

One app instead of a portalUne application plutôt qu'un portail

Accounts, cards and credit — with repayment charted against the outstanding balance — sit beside leave, advance, authorisation and training requests, a shared calendar, company news and internal polls. Each is a .NET entity with its own controller, surfaced through one bottom-nav app on Web, Android and iOS from a single Flutter codebase.Comptes, cartes et crédits — avec le remboursement tracé face à l'encours — côtoient les demandes de congé, d'avance, d'autorisation et de formation, un calendrier partagé, les actualités et les sondages internes. Chacun est une entité .NET avec son contrôleur, exposée dans une seule application à navigation basse sur Web, Android et iOS depuis une unique base Flutter.

Real time was the pointLe temps réel était l'objectif

The old app had no live notifications at all. Two SignalR hubs now push chat and notifications to the device; if the recipient is offline the notification is persisted and delivered when they return, and an unread one stays unread rather than being silently dropped.L'ancienne application n'avait aucune notification en direct. Deux hubs SignalR poussent désormais messages et notifications sur l'appareil ; si le destinataire est hors ligne, la notification est conservée puis délivrée à son retour, et une non lue reste non lue au lieu d'être perdue.

Wellbeing that reaches a managerUn bien-être qui remonte au manager

Employees answer periodic polls that produce a wellbeing score with an alert level and a message. Managers see aggregated team scores — so a dip surfaces to someone who can act on it, instead of a survey result nobody reads.Les collaborateurs répondent à des sondages périodiques qui produisent un score de bien-être avec un niveau d'alerte et un message. Les managers voient les scores agrégés de leur équipe — une baisse remonte donc à quelqu'un qui peut agir, au lieu d'un résultat que personne ne lit.

Modelled before it was builtModélisé avant d'être codé

Four Scrum sprints, each opening with use-case refinement, class, sequence and activity diagrams before any code. The notification flow was drawn as an activity diagram down to the offline branch — which is why that case works rather than being discovered in testing.Quatre sprints Scrum, chacun ouvert par un raffinement des cas d'utilisation et des diagrammes de classes, de séquence et d'activité avant toute ligne de code. Le flux de notification a été dessiné jusqu'à la branche hors ligne — c'est pourquoi ce cas fonctionne au lieu d'être découvert en test.

  • Flutter
  • Dart
  • Cubit / BLoC
  • C#
  • .NET Core 8
  • Entity Framework
  • SQL Server
  • SignalR
  • JWT
  • Swagger
  • Scrum

3 screensécrans

autoauto

  • The DigiRH home screen showing an account balance and the request shortcuts

    Home — account, balance, and every request one tap awayAccueil — compte, solde et chaque demande à un geste

  • The calendar, main menu and credit breakdown screens side by side

    Calendar, menu and credit — one Flutter codebase, three platformsCalendrier, menu et crédit — une base Flutter, trois plateformes

  • The previous DigiRH app the project replaced

    What it replaced — the app staff were avoidingCe qu'elle remplace — l'application que le personnel évitait

Built in a team of three, with Med Amin Zouaoui. Repositories are private.Réalisé en équipe de trois, avec Med Amin Zouaoui. Les dépôts sont privés.

SkillsCompétences

What I work withCe que j'utilise

Languages & frontendLangages & frontend

  • TypeScript
  • Angular
  • React
  • Flutter / Dart
  • Astro
  • Tailwind

BackendBackend

  • Spring Boot
  • FastAPI
  • ASP.NET Core (MVC)
  • Django
  • Laravel
  • REST / OpenAPI

Databases & infraBases de données & infra

  • PostgreSQL
  • MySQL
  • SQL Server
  • Qdrant
  • Redis
  • Docker
  • nginx

AI & integrationIA & intégration

  • LLM APIs (Groq / Llama 3.3)
  • RAG pipelines
  • Applied chatbots
  • MCP
  • Prompt design

OtherAutres

  • JWT / RBAC
  • WebSocket (STOMP)
  • SignalR
  • Git / GitHub
  • Scrum

PathParcours

Where I come fromD'où je viens

  1. Aug 2026Août 2026

    Internship — internal MCP hubStage — hub MCP interne

    Sagemcom

    An internal Model Context Protocol hub wired to an AI agent builder.Un hub Model Context Protocol interne connecté à un constructeur d'agents IA.

  2. Since 2025Depuis 2025

    Computer engineering degreeCycle ingénieur en informatique

    Iteam University

    In progress.En cours.

  3. Since 2025Depuis 2025

    Algorithmics & programming instructorFormateur en algorithmique et programmation

    Tuto Academy

    Six groups of students, on the Tunisian curriculum. This is where Fahem came from.Six groupes d'élèves, sur le programme tunisien. C'est de là qu'est né Fahem.

  4. Jan – May 2025Janvier – Mai 2025

    Mobile developer — final-year internshipDéveloppeur mobile — stage de fin d'études

    Société Tunisienne de Banque

    A banking mobile app in Flutter/Dart on an ASP.NET Core backend, with JWT auth, in an agile team of three.Une application bancaire mobile en Flutter/Dart sur un backend ASP.NET Core, authentification JWT, en équipe agile de trois.

  5. 2022 – 20252022 – 2025

    BSc, Management Information SystemsLicence en systèmes d'information de gestion

    FSEG Nabeul

    Université de Carthage.Université de Carthage.

  6. Jul 2024Juillet 2024

    Web developer — internshipDéveloppeur web — stage

    Poulina Group

    An e-commerce site in ASP.NET Core MVC: catalogue, basket, orders and authentication.Un site e-commerce en ASP.NET Core MVC : catalogue, panier, commandes et authentification.

LanguagesLangues

  • ArabicArabe NativeLangue maternelle
  • FrenchFrançais B1B1
  • EnglishAnglais B1B1

AboutÀ propos

A bit of contextUn peu de contexte

I'm a computer engineering student, working on full-stack development and on putting AI into applications people actually use — chatbots, teaching tools, automation.Je suis étudiant en cycle ingénieur informatique, orienté développement fullstack et intégration de l'IA dans des applications concrètes — chatbots, outils pédagogiques, automatisation.

I also teach algorithmics and programming to six groups of students on the Tunisian curriculum. That is where Fahem came from: I could see exactly where the existing tools were failing them, because I was the one marking the work.J'enseigne aussi l'algorithmique et la programmation à six groupes d'élèves sur le programme tunisien. C'est de là qu'est né Fahem : je voyais précisément où les outils existants les desservaient, puisque c'est moi qui corrigeais.

Between internships in mobile and web development and my own projects, what I keep coming back to is building the whole thing — frontend, backend, database, deployment — rather than one slice of it.Entre mes stages en développement mobile et web et mes projets personnels, ce qui revient toujours, c'est de construire l'ensemble — frontend, backend, base de données, déploiement — plutôt qu'une seule tranche.

I'm looking for an internship or a junior role in AI, full-stack or software engineering.Je suis à la recherche d'un stage ou d'un poste junior en IA, fullstack ou ingénierie logicielle.

ContactContact

Get in touchMe contacter

The fastest way to reach me is email. I read everything.Le plus rapide pour me joindre est le mail. Je lis tout.

hachanimedmortadha@outlook.com