TROIS PRODUITS EN PRODUCTIONCARRIVSTUDYLUMINASANADE--:--:--MONTRÉAL · UTC-5
DISPONIBLE · STAGE 2027MONTRÉAL · UTC-5B.ING · DÉC. 2027

HoussamNadir.

l'IA là où elle aide, le code là où il faut être sûr. trois produits en production, seul. un invariant non testé n’existe pas. de la maquette au paiement en production

Je construis des produits complets, seul, et je les mets en production : interface, backend, paiement, sécurité.

3
PRODUITS EN PRODUCTION
1,1 M
OFFRES SURVEILLÉES
1 500+
TESTS AUTOMATISÉS
E2EE
PROTOCOLE SIGNAL, RECODÉ
01 · UNE SÉLECTION, CONSTRUITE SEUL

Ce que j'ai construit

EN PRODUCTION
01CARRIÈRE · IAEn production

Carriv

Adapte un CV à une offre en 30 secondes, sans jamais rien inventer.

  1. offre
  2. analyse LLM
  3. CV adapté
  4. score ATS déterministe
PAR CANDIDATURE
~30 s
MODÈLES PDF ATS-SAFE
10
EXPÉRIENCE INVENTÉE
0
SvelteKitTypeScriptMongoDBOpenAI Structured OutputsStripeVercel
VOIR EN LIGNE ↗
Sous le capot
LE PROBLÈME

Demander à un chatbot de « faire le CV » produit des expériences inventées qui s'effondrent en entretien.

LA DÉCISION

Le modèle reformule, réordonne, omet, mais ne fabrique jamais. Le score ATS sort d'une fonction déterministe : re-scorer donne toujours le même nombre.

POST /api/generate
reserveCredit findOneAndUpdate atomique { credits: { $gte: 1 } } → 402 analyzeJob Structured Outputs adaptCVAndLetter Structured Outputs scoreATS matching déterministe, must=2 / nice=1 catch → refundCredit + alerte jamais payé pour rien
02ÉDUCATION · RAGEn production

StudyLumina

Dit à un étudiant s'il est prêt pour son examen, chapitre par chapitre.

  1. PDF du cours
  2. RAG hybride
  3. quiz & flashcards
  4. score de préparation
RÉPONSES SOURCÉES
100 %
ROUTES API
78
FICHIERS DE TESTS
75
Next.jsPostgreSQL + pgvectorPrismaBullMQ + RedisStripenext-intl
VOIR EN LIGNE ↗
Sous le capot
LE PROBLÈME

Un résumé ne dit pas si l'étudiant est prêt. Une moyenne globale non plus.

LA DÉCISION

Le score est une fonction pure, sans LLM. Il se rend réfutable : l'écart avec les vraies notes est affiché.

INGESTION · 6 FILES BULLMQ
upload → ingestion extraction PDF → embeddings chunking, pgvector → course-map chunks ↔ chapitres → summary | flashcards | quiz (en parallèle) RAG : pgvector + BM25 fusionnés · citations → document + page
03PRODUCTIVITÉ · WEB + MOBILEEn production

Sanade

Transforme une journée dispersée en deux ou trois objectifs tenables.

  1. note libre FR / darija
  2. extraction validée
  3. scores de cohérence
  4. priorité du jour
TESTS
1 020
COUVERTURE DU DOMAINE
94 %
APPS, UN SEUL CŒUR
2
Next.js 16ExpotRPCPrismaPostgreSQLTurborepo
VOIR EN LIGNE ↗
Sous le capot
LE PROBLÈME

Les trackers affichent l'écart entre le prévu et le fait pendant des mois, sans jamais rien en faire.

LA DÉCISION

Faits contre projections : tout calcul stocké est jetable et recalculable. Un test d'architecture interdit qu'un fait dépende d'une projection.

UNE EXTRACTION NE CRÉE JAMAIS DE DONNÉE
texte brut (FR / darija / arabe) → RawNote stockée telle quelle → LLM + schéma Zod strict → écran de revue validation item par item → Trackable ou LogEntry
LABO · OUTILS ET PROTOCOLES
~/job-radar
registre
4 899 sources validées
offres
1 133 000+ couvertes
ATS
Workday · Greenhouse · Lever · Oracle · +20
avance
2 h à 72 h sur LinkedIn
04VEILLE · TEMPS RÉELOutil personnel

Job Radar

Voit une offre de stage quelques minutes après sa publication, pas quelques jours.

  1. 4 899 sites carrière
  2. diff des réquisitions
  3. score sans LLM
  4. notification
SOURCES
4 899
OFFRES COUVERTES
1,1 M
TESTS
429
Node.jsExtension navigateurPlaywrightScoring déterministe
DÉPÔT PRIVÉ · DÉMO SUR DEMANDE
Sous le capot
LE PROBLÈME

Une offre met 2 à 72 h à arriver sur LinkedIn, alors que la majorité des embauches se joue dans les premiers jours.

LA DÉCISION

Interroger l'endpoint que la page carrière appelle elle-même, et comparer les IDs de réquisition, jamais le contenu. Le registre a été miné depuis 37 000 URL réelles, puis chaque source validée en direct.

UN PASSAGE
fetch ~1 req/s par domaine pré-score titre + lieu, déterministe diff sur les IDs de réquisition enrichissement seulement si le score peut passer le seuil notification individuelle, ou digest
~/ratchet
serveur
ne voit que des octets opaques
clé
un message, puis détruite
appels
WebRTC, signalisation chiffrée
crypto
WebCrypto auditée, zéro maison
05CRYPTOGRAPHIE · E2EEOpen source

Ratchet

Une messagerie chiffrée de bout en bout où même un serveur compromis ne lit rien.

↳ Réutilisé dans Yamor, une messagerie privée pour couples.

  1. X3DH
  2. Double Ratchet
  3. relais aveugle
  4. déchiffré sur l'appareil
TESTS
91
INVARIANTS DE SÉCURITÉ
6
OCTET LISIBLE CÔTÉ SERVEUR
0
TypeScript strictReact 19WebCryptoSupabaseWebRTCPWA
VOIR LE CODE ↗
Sous le capot
LE PROBLÈME

La plupart des « chats chiffrés » enveloppent le message dans AES et s'arrêtent là.

LA DÉCISION

Implémenter le vrai protocole de Signal, avec des primitives auditées uniquement, et documenter ce qu'il ne protège pas (métadonnées, appareil compromis).

INVARIANTS VÉRIFIÉS PAR LES TESTS
clé privée ne quitte jamais l'appareil nonce GCM jamais réutilisé avec la même clé en-tête authentifié en AAD sauvegarde l'état du ratchet est exclu par construction
~/cspm-lite
détecte
S3 public · SSH ouvert · sans MFA
norme
CIS Benchmark
sorties
JSON (machine) + HTML (humain)
en CI
faille critique → build bloqué
06SÉCURITÉ CLOUD · CLIOutil personnel

CSPM-Lite

Scanne un compte AWS et bloque le déploiement si une faille critique apparaît.

  1. compte AWS
  2. contrôles CIS
  3. rapport JSON + HTML
  4. gate CI
RÉFÉRENTIEL
CIS
FORMATS DE RAPPORT
2
BLOCAGE ACTIF
CI
Pythonboto3CIS BenchmarkGitHub Actions
DÉPÔT PRIVÉ · DÉMO SUR DEMANDE
Sous le capot
LE PROBLÈME

Une mauvaise configuration cloud ne se voit pas en revue de code. Elle se voit en production, ou dans une fuite.

LA DÉCISION

Personne ne lit un rapport : le contrôle devient une porte, qui arrête le pipeline.

$ cspm-lite scan --account prod --gate
scan → détection → conformité CIS → priorisation → rapports JSON + HTML → faille critique → exit 1
Une sélection de six. Les autres sont sur GitHub ↗
02 · ./PRINCIPES --APPLIQUÉS

Trois règles, tenues partout

Pas des slogans : chacune est vérifiée par du code.

PRINCIPE I

L'IA là où elle aide, le code là où il faut être sûr

Un LLM lit et reformule très bien. Un score, un crédit, une décision sortent d'une fonction testée.

✓Carrivscore ATS déterministe✓StudyLuminascore sans LLM✓Job Radartri sans LLM
PRINCIPE II

Un invariant non testé n'existe pas

Une règle produit qui ne fait pas échouer la CI n'est qu'un vœu.

✓Sanadefaits ⇸ projections, testé✓Ratchetaucune clé sur le réseau✓Couleursaucun littéral en dur
PRINCIPE III

La contrainte d'exécution est une contrainte de conception

Timeout, débit, mort d'une Lambda : des paramètres, pas des accidents.

✓Carriv90 s < durée de vie Lambda✓Créditréservé avant l'appel✓Job Radar~1 req/s par domaine
03 · CHAQUE OUTIL, SA PREUVE

Stack

PRODUIT & BACKEND
  • TypeScript strictpartout
  • Next.js · SvelteKit · ReactCarriv · StudyLumina · Sanade
  • Node.js · tRPCSanade · Job Radar
  • Expo · React NativeSanade
  • PythonCSPM-Lite
  • C / C++Polytechnique
CLOUD & DONNÉES
  • PostgreSQL · PrismaStudyLumina · Sanade
  • pgvector · RAG hybrideStudyLumina
  • MongoDBCarriv
  • BullMQ · RedisStudyLumina
  • AWS · Vercel · serverlessCarriv · CSPM-Lite
  • Docker · Linuxpartout
SÉCURITÉ
  • Cryptographie appliquéeRatchet
  • Paiement · webhooks signésCarriv · StudyLumina
  • Posture cloud · CIS · IAMCSPM-Lite
  • Authentification · tokens hachésCarriv
  • Reconnaissance réseauTryHackMe
04 · GLISSER →

Parcours

→ DÉC. 2027

B.Ing. génie informatique

Polytechnique Montréal
Cybersécurité : ASystèmes répartis & infonuagique : B+GPA : 3,65 (hiver 2026)
2025-2026

Des projets construits seul

3 en production · d'autres en labo
Carriv · StudyLumina · SanadeJob Radar · Ratchet · CSPM-Lite
DEPUIS OCT. 2024

Représentant de marque

Qualcomm / Snapdragon PC

Rendre une technologie claire en deux minutes, à n'importe qui.

REPÈRES

Certifications & langues

Advent of Cyber · TryHackMe · déc. 2025Français : natifAnglais : courantMontréal · ouvert au télétravail
~/contact
$ ouvrir --canal stage-2027

Donnez-moi la contrainte, je reviens avec l’architecture.

Un stage où je touche à la production : pipeline, sécurité, données. Réponse sous 24 h.

MONTRÉAL, QCUTC-5FR / ENDISPONIBLE 2027