Skip to content
View joelstephen97's full-sized avatar
🛠️
Building
🛠️
Building

Block or report joelstephen97

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
joelstephen97/README.md
Joel Stephen — Full-Stack & AI Engineer, Abu Dhabi. A request travels from a UI card through an API card to a model that streams tokens back.

About

I build web products from the front end (React, Vue) through the back end (FastAPI, Django) down to the LLM or vision layer inside them. Five-plus years of it, most of that in Dubai and Abu Dhabi.

At AppliedAI I work on Opus, an enterprise AI workflow platform used by teams in finance, telecom, healthcare and AI infrastructure. I own Process Discovery, a multiplayer canvas built on Yjs where customers co-edit the process documentation that Opus turns into workflows, wired to Anthropic and OpenAI models. I also rewrote large parts of the n8n fork that became Opus' technical canvas, and built Opus-CX on React and Zustand.

On my own time I like products where the model is the product and privacy is the feature. That is why most of the repos below run on-device.

Now Getting ScamShield 0.5 through the Chrome and Firefox stores Growing MeetingMind past its first paying users A year of Mandarin, one character at a time
Career timeline: BITS Pilani Dubai 2015 to 2019, Alucor intern 2019, RIOT 2019 to 2023, Otani Trading 2023 to 2025, AppliedAI 2025 to now

Flagship: ScamShield

A Manifest V3 extension for Chrome, Edge, Brave and Firefox. Every check runs inside the browser; nothing about the page or your browsing leaves the device. Published on the Chrome Web Store; the Firefox build ships from the same repo.

  • Two tiny models as plain JavaScript. A gradient-boosted URL classifier and a page-content classifier, trained in scikit-learn and exported to JSON. No ONNX runtime, no WebAssembly. Whole extension is ~170 KB zipped, down from 14 MB in early versions.
  • Brand look-alikes caught by icon. Favicons and logos are hash-matched against 64 brands, including UAE banks, telcos and government portals, so a page wearing a brand's icon on the wrong domain gets flagged even if the brand name never appears.
  • Guards for the nasty stuff. Fake login forms (including programmatic form.submit()), crypto-wallet drainer requests, clipboard hijacks ("paste this to verify"), tech-support scare loops.
  • Message checker. Paste a suspicious SMS or email into the popup for a private verdict.
  • Daily threat feed. A sibling repo curates OpenPhish and URLhaus into the blocklist with a Tranco top-10k false-positive guard.
  • 373 unit tests, 34 Playwright end-to-end tests, Python/JS parity checks on both models.

MV3 vanilla JS scikit-learn → JSON declarativeNetRequest Playwright Vercel + Neon (opt-in reporting relay)

Animated mock: a look-alike PayPal login on paypa1-secure-verify.com gets flagged by ScamShield as a dangerous page, with a one-click link to the real site What it looks like when a page is wearing a brand it doesn't own.

Available in the Chrome Web Store

Chrome Web Store version Latest tag Stars

Source Threat feed
Privacy policy

Free and open source. Donations welcome.
If it saved you from a bad page, a ⭐ on the repo helps more than you'd think.
Real screenshots from the store listing (popup, in-page banner, message checker, settings, wallet guard)
ScamShield popup showing a dangerous verdict In-page warning banner with the rescue link to the real site
Scam message checker in the popup Crypto wallet guard intercepting a risky request

More things I've built

🎙️ MeetingMind

Offline-first meeting recorder PWA. Records in the browser, keeps audio and notes in IndexedDB on the device, writes Gemini summaries, exports Markdown or PDF. Pro tier billed through Paddle; UI in five languages.

React Vite Dexie Firebase Auth Gemini Paddle Vercel Functions

Live app →

Spotify companion that uses Claude to fill a weekly discovery playlist, since Spotify retired its recommendation endpoints for new apps. It also turns your stats into a downloadable Wrapped-style poster, with lifetime numbers taken from your own GDPR export rather than invented.

Next.js 16 TypeScript Claude Spotify API Upstash Redis Vitest

Source →

My site, with a chat agent that answers questions about my experience and projects instead of making you scroll.

Nuxt Vue Groq

Live → · Source →

Daily GitHub Action that curates OpenPhish and URLhaus into ScamShield's blocklist, with shared-host scoping and a Tranco top-10k false-positive guard.

Node.js GitHub Actions

Source →

pip-installable resume and document parser: cleans and sections the text, then pulls out names, emails, phone numbers and skills. Written because the open-source options were thin.

Python

Source →

Streamlit front end for chatting with local models over Ollama, with model pulling and management built in.

Python Streamlit Ollama

Source →

Older experiments (kept public because they were useful once)
  • tracr: recursive image finder that crawls out from a starting URL. Python.
  • cv_analysis: Dockerised CV analysis server with OCR, a parser and a test suite, on port 8501. Python.
  • sessions-node-api: tiny session API that fed a randomizer on an early version of my site. Node.js.
  • huffman-test-python: Huffman encoding from scratch, because reading about it wasn't enough. Python.
  • sentiment-analysis: Flask API wrapping a sentiment model. Python.

Stack

Python, TypeScript, JavaScript, React, Vue, Nuxt, Next.js, Tailwind, FastAPI, Django, Node.js, GraphQL, PostgreSQL, MySQL, SQLite, scikit-learn, OpenCV, Vercel, Git, Linux

AI layer: Anthropic and OpenAI SDKs · Ollama · Gemini · scikit-learn models exported to ONNX or plain JS · YOLOv5 and OpenCV · Yjs / CRDT real-time collaboration · n8n · Manifest V3 extensions

Testing: Pytest · Vitest · Cypress · Playwright


Beyond the keyboard

  • Based in Abu Dhabi. B.E. Computer Science (Hons), BITS Pilani Dubai Campus.
  • Languages: English, Malayalam, Hindi, and a year of Mandarin underway.
  • Weekend reading is astronomy, the software side of it: how telescopes catch things that flare up or explode in the night sky, and how you sort through millions of those alerts a night.
  • Small, sharp tools over big frameworks. Most repos here started as a Friday-evening problem.

GitHub

Followers Public repos

3D contribution calendar for the last year Contribution snake

Both images are generated daily by a GitHub Action in this repo (visuals.yml); no third-party stats service involved. The banner and cards above are hand-written SVG, built by tools/build-assets.py.


Thanks for stopping by. Say hi at joel.stephen.work@gmail.com or on LinkedIn.  ·  Sponsor

Last updated August 2026

Pinned Loading

  1. personal-website personal-website Public

    My portfolio site: Nuxt 3 SPA with in-browser ML demos and a Groq-backed chat agent that answers questions about me

    Vue

  2. shell-automation-linux shell-automation-linux Public

    systemd unit template + installer that runs any shell script on boot as a service and restarts it on failure

    Shell

  3. ollama-chat ollama-chat Public

    Single-file Streamlit chat UI for local Ollama models with saved, reopenable chat sessions

    Python

  4. scamshield scamshield Public

    On-device scam & phishing protection for Chrome/Edge/Brave/Opera and Firefox — warns before you're tricked, spots brand look-alikes, checks messages. Nothing leaves your device.

    JavaScript

  5. spotify-curator spotify-curator Public

    Soundprint: Spotify stats, year-in-sound poster, liked-songs curation and weekly LLM-picked discoveries playlist (Next.js 16, Upstash Redis)

    TypeScript