Cross-company access
Company endpoints accepted a company_id, but ownership checks depended on a configuration flag. I made the check run whenever a JWT subject is present and added cross-company regression coverage.
Backend / ML Engineer
I build backend systems for search, matching, and secure AI workflows.
Recent Information Systems graduate and FlyRank ML intern (2026-present). I use FastAPI, vector search, and practical security controls to turn applied ML features into services teams can review and depend on.
Featured case study
My part of the graduation project was the complete AI backend: a separate service for resume understanding, semantic job matching, and candidate/company chat. I also hardened its trust boundaries by fixing cross-company access, unsafe JWT defaults, resume URL request risks, and concurrent FAISS/SQLite writes.
Resume parsing, embeddings, FAISS search, and Gemini chat stay outside the main CRUD platform.
Authorization, JWT defaults, resume URL validation, and concurrent index writes were reviewed and hardened.
17 endpoints, externalized artifacts, and 45 tests are presented with the system limits clearly named.
01 / The problem
The main Jobify application was a standard CRUD system on SQL Server. It could store applicants, resumes, and job postings, but it had no intelligence layer. Search was limited to exact filters such as title or location.
It could not understand resume content, compare skills with a job description, recommend relevant jobs, or support recommendation-aware chat. The challenge was to add those capabilities without forcing ML workloads into the existing application or putting the core platform at risk while the AI layer changed quickly.
02 / What I did and decided
I built a FastAPI service connected to the hosted SQL Server data through each applicant's user_id. It retrieves the active resume, extracts PDF or DOCX text, creates embeddings, and searches job vectors with FAISS. SQLite maps FAISS results back to job records, while Gemini supports analysis and candidate/company chat.
SQL Server handled relational data; FAISS handled nearest-neighbor search over embeddings.
Resume parsing, transformer models, and Gemini integration belonged in a Python service.
Admin endpoints update new jobs and resumes without a full re-ingest.
I moved jobs.db and jobs.index to Hugging Face and download them when the container starts. That kept the image smaller and allowed the artifacts to be updated independently from the application image.
Security review
Company endpoints accepted a company_id, but ownership checks depended on a configuration flag. I made the check run whenever a JWT subject is present and added cross-company regression coverage.
The service silently used a public fallback secret and made authentication opt-in. Authentication now defaults on, and insecure or missing secrets stop the application at startup.
I added scheme, hostname, resolved-IP, and redirect-hop checks to block direct private-address and unchecked-redirect SSRF paths. The remaining DNS-rebinding risk is documented rather than hidden.
FAISS and SQLite are shared mutable state. One threading.RLock now protects the complete update and autosave sequence so writers cannot interleave.
03 / What came of it
Health, candidate matching and chat, company AI workflows, and administrative synchronization.
New jobs and resumes become searchable after the main application saves them.
The documented ~700 MB SQLite database and ~2.5 GB FAISS index now download at startup instead of shipping inside the image.
Coverage exists for API behavior, company authorization, and resume helpers; this is not presented as a current pass count.
This version is designed for one service replica because its FAISS index and SQLite metadata are local files. Multiple replicas need a shared vector store or centralized synchronization. The repository also has no labeled relevance set or benchmark, so I do not claim measured matching accuracy or latency.
Supporting work
Retrieval / multimodal ingestion
An Arabic-first FastAPI backend that turns documents, images, audio, and video into searchable educational material using OCR, transcription, metadata-aware retrieval, and configurable model providers.
FastAPI / ChromaDB / OCR / FFmpeg / OpenAI / Gemini
View sourceModel serving / API contract
A FastAPI wrapper around a trained scikit-learn model with an eight-field JSON contract, human-readable prediction output, model serialization, ngrok startup, and endpoint tests.
FastAPI / scikit-learn / REST / ngrok
View sourceAbout
I am Omar Fouda, a backend/ML engineer and 2026 graduate of Menoufia University's Faculty of Computers and Information. I earned a B.Sc. in Computers and Information, specializing in Information Systems.
I build Python backends and applied ML features, with a focus on semantic search, recommendation systems, integrations, and the security work needed to make them dependable.
I am completing a 2026 ML internship with FlyRank, where I am strengthening my practice around data contracts, leakage checks, baselines, validation, and careful reporting.
Technical toolkit
Grouped by the job they do, not as a keyword wall.
Python, FastAPI, REST APIs, WebSockets, Uvicorn, Docker
scikit-learn, PyTorch, TensorFlow/Keras, Sentence Transformers, FAISS, ChromaDB
Pandas, NumPy, SQL Server, PostgreSQL, MySQL, MongoDB, SQLite
OpenAI API, Gemini API, OpenCV, Tesseract OCR, FFmpeg, Whisper
Learning
Contact
I am looking for backend and applied ML opportunities. Contact me and I will walk you through the architecture, tradeoffs, and security decisions behind Jobify.