{"id":31574543,"url":"https://github.com/zjbthomas/portfolio","last_synced_at":"2026-02-14T07:03:01.852Z","repository":{"id":317000284,"uuid":"1065606315","full_name":"zjbthomas/Portfolio","owner":"zjbthomas","description":"Welcome to my project showcase! This repository serves as a central hub for exploring the 🎮games, 🛠️scripts, 🔬research projects, and 🌐websites I have developed.","archived":false,"fork":false,"pushed_at":"2025-10-28T19:24:14.000Z","size":13,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-28T21:23:37.873Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zjbthomas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-28T04:09:21.000Z","updated_at":"2025-10-28T19:24:18.000Z","dependencies_parsed_at":"2025-09-28T07:11:12.199Z","dependency_job_id":"e44e7460-1717-4260-adc4-8109bc4a5bd9","html_url":"https://github.com/zjbthomas/Portfolio","commit_stats":null,"previous_names":["zjbthomas/portfolio"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zjbthomas/Portfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zjbthomas%2FPortfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zjbthomas%2FPortfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zjbthomas%2FPortfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zjbthomas%2FPortfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zjbthomas","download_url":"https://codeload.github.com/zjbthomas/Portfolio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zjbthomas%2FPortfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29438984,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T05:24:35.651Z","status":"ssl_error","status_checked_at":"2026-02-14T05:24:34.830Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-05T16:07:39.678Z","updated_at":"2026-02-14T07:03:01.846Z","avatar_url":"https://github.com/zjbthomas.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Portfolio\n\n*Junbin Zhang (Thomas), Ph.D.*  \n[![LinkedIn](https://custom-icon-badges.demolab.com/badge/LinkedIn-0A66C2?logo=linkedin-white\u0026logoColor=fff)](https://www.linkedin.com/in/junbinzhang/)\n\nWelcome to my project showcase!  \nThis repository serves as a central hub for exploring the 🎮[**games**](#-toy-arcade-games), 🔬[**research projects**](#-research-corner), 🛠️[**scripts**](#%EF%B8%8F-toy-workshop-scripts), and 🌐[**websites**](#-website-creations) I have developed.\n\n## 🎮 Toy Arcade (Games)\n\n***A collection of fun games I have built.***\n\n| Game | Code | Demo | Description | Highlighted Features | Tech Stack |\n| - | - | - | - | - | - |\n| **DukeChess** | [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/DukeChess) | [![play](https://img.shields.io/badge/play-4f7f6a?style=flat)](https://dexaint.itch.io/dukechess)    | ♟️ Digital adaptation of the chess-inspired board game *The Duke* | - AI opponent\u003cbr\u003e- Cross-platform multiplayer support (desktop \u0026 web) | Desktop:\u003cbr\u003e![Godot](https://img.shields.io/badge/Godot-478cbf?style=flat\u0026logo=godot-engine\u0026logoColor=white)\u003cbr\u003eFront-end:\u003cbr\u003e![React](https://img.shields.io/badge/React-20232a?style=flat\u0026logo=react\u0026logoColor=61dafb) ![JavaScript](https://img.shields.io/badge/JavaScript-323330?style=flat\u0026logo=javascript\u0026logoColor=f7df1e)\u003cbr\u003eBack-end:\u003cbr\u003e![Java](https://img.shields.io/badge/Java-333333?style=flat\u0026logo=java\u0026logoColor=white) ![Node.js](https://img.shields.io/badge/Node.js-333333?style=flat\u0026logo=node.js\u0026logoColor=68a063) ![Socket.IO](https://img.shields.io/badge/Socket.IO-(WebSocket)-333333?style=flat\u0026logo=socket.io\u0026logoColor=white) ![Redis](https://img.shields.io/badge/Redis-333333?style=flat\u0026logo=redis\u0026logoColor=dc382d) |\n| **MemoryDungeon** | [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/MemoryDungeon) | [![play](https://img.shields.io/badge/play-4f7f6a?style=flat)](http://memorydungeon.junbinzhang.com) | 👾 Roguelike twist on the memory game  | - AI opponent\u003cbr\u003e- Heroes with unique abilities\u003cbr\u003e- Gacha mechanics | Front-end (desktop):\u003cbr\u003e![Godot](https://img.shields.io/badge/Godot-478cbf?style=flat\u0026logo=godot-engine\u0026logoColor=white) ![Qt](https://img.shields.io/badge/Qt-(C++)-333333?style=flat\u0026logo=qt\u0026logoColor=41cd52)\u003cbr\u003eBack-end:\u003cbr\u003e![Node.js](https://img.shields.io/badge/Node.js-333333?style=flat\u0026logo=node.js\u0026logoColor=68a063) ![Redis](https://img.shields.io/badge/Redis-333333?style=flat\u0026logo=redis\u0026logoColor=dc382d) |\n| **LinkWord** | [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/LinkWord) |  | 🔤 Lightweight Chinese word-chain game |  | ![Python](https://img.shields.io/badge/Python-333333?style=flat\u0026logo=python\u0026logoColor=3776ab) |\n\n\u003e ℹ️ If any of the demo links above do not work, please **[create an issue](../../issues)** so I can take a look.\n\n[⤴️ \u003cu\u003e*back to top*\u003c/u\u003e](#portfolio)\n\n## 🔬 Research Corner\n\n***A selection of my most meaningful research projects.***\n\n[![Google Scholar](https://img.shields.io/badge/Google_Scholar-4285F4?logo=googlescholar\u0026logoColor=white\u0026style=flat)](https://scholar.google.ca/citations?user=KJKRoyEAAAAJ)\n\n[![PhD](https://img.shields.io/badge/PhD%20Thesis-Detection,%20Attribution,%20and%20Localization%20of%20Manipulated%20Images-8b1a1a?style=flat)](https://dx.doi.org/10.14288/1.0450146)  \n[![MASc](https://img.shields.io/badge/MASc%20Thesis-Analyzing%20Android%20Taint%20Analysis%20Tools:%20FlowDroid,%20Amandroid,%20and%20DroidSafe-8b1a1a?style=flat)](https://dx.doi.org/10.14288/1.0392613)\n\n### 🤖 Image Forensics\n\n#### *Pixel-frequency Hybrid Approaches*\n- **Shallow- \u0026 Deep-fake Images Localization**  \n    [![paper](https://img.shields.io/badge/paper%20(conference)-8b1a1a?style=flat)](https://ieeexplore.ieee.org/document/10074246)\n    [![arXiv](https://img.shields.io/badge/arXiv-2601.02566-b31b1b.svg)](https://arxiv.org/abs/2601.02566)\n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/ShallowDeepFakesLocalization)  \n    ![UperNet](https://img.shields.io/badge/UperNet-9aa5b1?style=flat)\n    ![Vision Mamba](https://img.shields.io/badge/Vision%20Mamba-9aa5b1?style=flat)\n    ![GNN](https://img.shields.io/badge/GNN-9aa5b1?style=flat)  \n    A deep learning solution that detects and localizes manipulated regions in both shallow- and deep-fake images.\n    - Built upon the **UperNet** semantic segmentation framework.\n    - A journal extension leveraging **Vision Mamba** and **Graph Neural Networks** is currently under review and available on [arXiv](https://arxiv.org/abs/2601.02566).\n\n#### *Frequency-domain Approaches*\n- **Frequency-based AI-generated Images Detection**  \n    [![paper](https://img.shields.io/badge/paper-8b1a1a?style=flat)](https://ieeexplore.ieee.org/abstract/document/10221905)\n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/FreqAIDetector)  \n    A deep learning model that detects images generated by Stable Diffusion models using frequency-domain artifacts (\u003e99% accuracy).  \n    🏰 Disney images were used as a case study.\n\n- **Frequency-based AI-generated Images Attribution**  \n    [![paper](https://img.shields.io/badge/paper-8b1a1a?style=flat)](https://ieeexplore.ieee.org/abstract/document/10855423)\n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/FreqGANAttribution)  \n    A frequency-based network that attributes fake images to their source Generative Adversarial Network (GAN) architecture (\u003e95% accuracy).\n\n#### *Sensor-level Approaches*\n- **AI-generated Images Detection Trained with Raw Images Only**  \n    ![paper](https://img.shields.io/badge/paper%20(available%20soon)-8b1a1a?style=flat)\n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/BayerRealOnlyDetector)  \n    ![VAE](https://img.shields.io/badge/VAE-9aa5b1?style=flat)  \n    A **Variational Autoencoder (VAE)**-based approach trained solely on real/raw images for detecting AI-generated content (~94% accuracy).\n\n- **AI-generated Images Detection by Reconstructing Raw Images**  \n    [![paper](https://img.shields.io/badge/paper-8b1a1a?style=flat)](https://link.springer.com/chapter/10.1007/978-3-031-94962-3_2)\n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/BayerRecDetector)  \n    A method that detects AI-generated images by reconstructing Bayer patterns and comparing statistical differences between real and fake images (~98% accuracy).  \n    Notably, this method requires no deep learning.\n\n### 📱 Mobile Security\n- **Comparison of Android Static Taint Analyzers**  \n    [![paper](https://img.shields.io/badge/paper-8b1a1a?style=flat)](https://www.computer.org/csdl/journal/ts/2022/10/09529015/1wB2FS12ld6)\n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/LinaQiu/UBCBench)  \n    ![Android](https://img.shields.io/badge/Android-8fa3b8?style=flat\u0026logo=android\u0026logoColor=444)  \n    A comparative study of **Android** **static taint analysis** tools (*FlowDroid*, *Amandroid*, and *DroidSafe*), evaluating their effectiveness and limitations using standardized benchmarks.\n    - We built [**UBCBench**](https://github.com/LinaQiu/UBCBench), a benchmark suite for evaluating Android static taint analysis tools.\n    - Bug fixes and improvements were merged by their original authors (details [here](https://resess.github.io/artifacts/StaticTaint/ubcbench/#fixed-bugs)).\n\n- **Android OAuth Vulnerability Analysis**  \n    [![report](https://img.shields.io/badge/report-8b1a1a?style=flat)](https://github.com/zjbthomas/OAuthUsage/blob/main/report.pdf)\n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/OAuthUsage)  \n    A course project that investigates security risks in Android applications using the **OAuth** protocol.\n\n- **Android Password Leakage Detection**  \n    [![report](https://img.shields.io/badge/report-8b1a1a?style=flat)](https://github.com/zjbthomas/EECE512/blob/master/report.pdf)\n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/EECE512)  \n    A course project that detects potential password leakage in Android applications using the *FlowDroid* framework, an Android static analysis tool.\n\n### 🖼️ Image Generation\n- **TMO GAN**  \n    [![paper](https://img.shields.io/badge/paper-8b1a1a?style=flat)](https://ieeexplore.ieee.org/abstract/document/10074176)\n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/TMO-GAN)  \n    ![GAN](https://img.shields.io/badge/GAN-9aa5b1?style=flat)  \n    A **GAN** designed to tone map high-quality 4K **High Dynamic Range (HDR)** images, significantly enhancing perceptual quality.\n\n### 🥽 Virtual Reality\n- **Subjective Evaluation of Foveated Image Quality in Head-mounted Displays (HMDs)**  \n    [![paper](https://img.shields.io/badge/paper-8b1a1a?style=flat)](https://sid.onlinelibrary.wiley.com/doi/abs/10.1002/sdtp.14152)  \n    ![Unity](https://img.shields.io/badge/Unity-9b8bc1?style=flat\u0026logo=unity\u0026logoColor=444)\n    ![OpenVR](https://img.shields.io/badge/OpenVR-9b8bc1?style=flat)\n    ![OpenGL](https://img.shields.io/badge/OpenGL-9b8bc1?style=flat\u0026logo=opengl\u0026logoColor=444)  \n    A novel subjective evaluation methodology for assessing the perceptual quality of foveated rendering in HMDs.\n    - Developed an interactive voting mechanism using controllers in **Unity** to collect subjective user ratings.\n    - Captured **eye-tracking** data via **OpenVR** and **OpenGL** and integrated it into the evaluation pipeline.\n\n### 🎞️ Video Compression\n- **Visual-Attention-Model-based HDR Video Compression**  \n    ![paper](https://img.shields.io/badge/paper%20(available%20soon)-8b1a1a?style=flat)  \n    ![HEVC](https://img.shields.io/badge/HEVC-(HM)-8aa399?style=flat)  \n    A visual-attention-driven HDR video compression method that incorporates perceptual saliency into the adaptive Quantization Parameter (QP) assignment of the **High Efficiency Video Coding (HEVC)** standard.\n\n### 🎯 Serious Games\n- **BankPet**  \n    [![report](https://img.shields.io/badge/report-8b1a1a?style=flat)](https://courses.ece.ubc.ca/518/previous/hit2017W/papers/WuRangZhang.pdf)  \n    ![Android](https://img.shields.io/badge/Android-8fa3b8?style=flat\u0026logo=android\u0026logoColor=444)\n    ![Arduino](https://img.shields.io/badge/Arduino-8aa399?style=flat\u0026logo=arduino\u0026logoColor=444)  \n    A serious game–based banking application featuring a virtual character (🐱 *everyone loves cats!*) designed to help users develop better credit card and personal money management habits, validated through a user study.\n\n[⤴️ \u003cu\u003e*back to top*\u003c/u\u003e](#portfolio)\n\n## 🛠️ Toy Workshop (Scripts)\n\n***Handy scripts I have crafted to make life easier.***\n\n### 🐵 Tampermonkey Userscripts (*JavaScript*) \n- **Steam Wishlist Language Highlighter**  \n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/Tampermonkey/tree/main/SteamLanguage)  \n    ![GitHub Actions](https://img.shields.io/badge/GitHub%20Actions-8aa399?style=flat\u0026logo=githubactions\u0026logoColor=444)\n    ![Google Chrome Extension](https://img.shields.io/badge/Chrome%20Extension-8fa3b8?style=flat\u0026logo=googlechrome\u0026logoColor=444)  \n    Highlights games in a user's Steam wishlist that lack support for specific languages.\n    - Language information is retrieved using a **Python** script [here](https://github.com/zjbthomas/SteamOnlineChecker/blob/main/steam_language.py) as a **GitHub Actions** workflow. \n    - A Google Chrome extension version is also available [here](https://github.com/zjbthomas/LanguageInfo).\n\n- **Arknights YiTuLiu Store Optimizer**  \n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/Tampermonkey/blob/main/Arknights)  \n    Annotates and 🏆**prioritizes** redeemed event resources on a popular third-party Arknights support site, helping players decide what to redeem first.\n\n- **ICBC Road Test Helper**  \n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/Tampermonkey/tree/main/ICBC)  \n    Simplifies the process of booking road tests on the Insurance Corporation of British Columbia (ICBC) website.\n\n### 🐍 *Python* Scripts \n- **Steam Online Status Checker**  \n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/SteamOnlineChecker)  \n    ![GitHub Actions](https://img.shields.io/badge/GitHub%20Actions-8aa399?style=flat\u0026logo=githubactions\u0026logoColor=444)  \n    A tool using **GitHub Actions** to automatically monitor the status of a Steam user and send updates via Telegram messages.\n\n- **PRTS Scraper**  \n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/PRTS-Scraper)  \n    A lightweight script to scrape Arknights skill icons using MediaWiki APIs.  \n    These icons can later be used to train AI image generators to create new ones.\n\n### 💻 Code Contributions\n- **web-clipper**  \n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/zjbthomas/web-clipper)  \n    ![Google Chrome Extension](https://img.shields.io/badge/Chrome%20Extension-8fa3b8?style=flat\u0026logo=googlechrome\u0026logoColor=444)  \n    I contributed to this Google Chrome extension that supports webpage clipping for popular note-taking apps (e.g., OneNote, Notion) by adding support for OneNote note groups.  \n    **The [pull request](https://github.com/webclipper/web-clipper/pull/950) was merged by the original author.**\n\n[⤴️ \u003cu\u003e*back to top*\u003c/u\u003e](#portfolio)\n\n## 🌐 Website Creations\n\n***Websites I have built or contributed to.***\n\n- **University of British Columbia, Digital Multimedia Lab**  \n    [![live](https://img.shields.io/badge/live-4f7f6a?style=flat)](https://dml.ece.ubc.ca/)  \n    ![Hugo Blox](https://img.shields.io/badge/Hugo%20Blox-8fa3b8?style=flat)  \n    I designed and currently maintain the website for my Ph.D. research lab, built on the [Hugo Blox](https://hugoblox.com/) framework.  \n    I customized the framework to meet specific lab requirements:\n    - Publications are categorized into finer-grained types (e.g., conference papers, journal articles), and the search function was rewritten to work within each category.\n    - By adding new metadata to page elements, lab members can redirect to their own departmental web pages.\n    - Embedded website statistics by modifying the universal footer.\n\n- **Personal Website**  \n    [![live](https://img.shields.io/badge/live-4f7f6a?style=flat)](https://people.ece.ubc.ca/~zjbthomas/)  \n    ![jQuery](https://img.shields.io/badge/jQuery-8fa3b8?style=flat\u0026logo=jquery\u0026logoColor=444)  \n    My personal website built with **HTML** and **jQuery**.  \n    🌈 *Refresh the page to see dynamically changing background colors!*\n\n- **BC Liquor Store Explorer**  \n    [![demo](https://img.shields.io/badge/demo-shiny-4a6fa5?style=flat)](https://junbinzhang.shinyapps.io/junbinzhang-bcl/)\n    [![code](https://img.shields.io/badge/code-333333?style=flat)](https://github.com/STAT545-UBC-hw-2018-19/hw08-zjbthomas)  \n    A course project web app that allows users to explore BC Liquor products with filters such as price, type, and country.\n    - **Highlighted features**: interactive search and filtering, data visualization with Shiny.\n    - **Tech Stack**: R, Shiny\n\n[⤴️ \u003cu\u003e*back to top*\u003c/u\u003e](#portfolio)\n\n---\n\n## 🧭 In the End: Why This Portfolio?\n\nThis repository serves two purposes:\n- It presents an organized overview of my work, making my projects easier to understand and explore for readers beyond individual repositories.\n- It also functions as a centralized index of my GitHub projects for long-term organization and reference.\n\nAs projects naturally grow across multiple repositories and organizations, GitHub currently offers limited support for presenting them as a coherent body of work. This portfolio serves as a developer-maintained overview that improves **organization and discoverability**, addressing a gap in how evolving personal GitHub project collections are presented.\n\n[⤴️ \u003cu\u003e*back to top*\u003c/u\u003e](#portfolio)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzjbthomas%2Fportfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzjbthomas%2Fportfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzjbthomas%2Fportfolio/lists"}