↓Skip to main content

Hi! I'm Tahmidul!

I’m an automation engineer. Right now that means building n8n workflows, AI pipelines, and internal web apps at Raphael Porcelain, a porcelain tile wholesaler, where I’ve worked remotely since October 2025. Before that I interned at AI Buddy Catalyst Labs building AI agents and deployment automation. I finished my HBSc in Computer Science at Lakehead University in 2024.

My laziness compels me to learn more about automation so that I can do less work. Most of what I build outside of work exists because I got tired of doing something by hand. Python is my main language, and I also write JavaScript and TypeScript, Bash, PowerShell, C#, and Java depending on what the job needs. I lean on Claude Code a lot these days, and I say so in the READMEs.

You can find some of my projects on Github @tahmidul612.

Work #

Raphael Porcelain #

Raphael Porcelain is a wholesale manufacturer of large-format porcelain tile. I’ve been their automation engineer since October 2025, working remotely from Toronto.

The first thing I built was the competitive intelligence pipeline: n8n workflows that find competitors’ accounts across nine social platforms, scrape posts and engagement into MongoDB every week, and run a two-stage AI analysis (an analyst pass, then an executive summary) that goes out as an HTML email and a print-ready PDF with the source images included. Past weeks live in a Qdrant vector store so the analysis can cite what changed. All the workflow code and JSON is version controlled in git.

Lead generation came next: scrapers for Houzz and Google Maps, classification prompts in Clay.com that decide whether a business is a wholesale target, an advertising partner, or a competitor showroom, and a sync into Salesforce. When the n8n enrichment workflow got too big to maintain, I replaced it with a FastAPI and React app that crawls each lead’s website, checks Google Maps, and runs specialized agents through the OpenAI Batch API, then lets a person review the result field by field before export. It has role-based access through a shared Better Auth server and ships as Docker images from GitHub Actions behind Traefik.

Two smaller apps round it out: a map and spreadsheet view of ten thousand plus leads for the sales team, and a tile visualizer that takes a floor plan and a tile choice, plans the layout, and streams an AI rendered isometric room back to the browser.

Tech Used

  • n8n
  • Python
  • FastAPI
  • React
  • TypeScript
  • MongoDB

 

  • Qdrant
  • OpenAI API
  • Docker
  • Traefik
  • Clay.com
  • Salesforce

AI Buddy Catalyst Labs #

An internship from May to October 2025 building AI agents and the automation around them. The public piece of that is insta_rag, a configuration-driven RAG library: semantic chunking, hybrid vector and BM25 retrieval, HyDE, optional reranking, Qdrant for vectors with MongoDB for content, and a Graph RAG mode on Neo4j. I set up its packaging, tests, pre-commit secret scanning, and the release workflow that publishes it to PyPI.

I also worked on a content pipeline that chains five different LLMs in sequence behind a FastAPI service, and wrote the Ansible playbooks and GitHub Actions workflows that stood up a kubeadm Kubernetes cluster with Tailscale, MetalLB, nginx ingress, and cert-manager.

Tech Used

  • Python
  • n8n
  • FastAPI
  • Qdrant

 

  • Ansible
  • Kubernetes
  • GitHub Actions
  • Neo4j

Personal Projects #

Should I Get Gas? #

A web app that answers one question: should you fill up now, or wait a couple of days? Most gas apps tell you where prices are lowest. This one looks at where regional prices are heading and gives a verdict (fill up, top off, or wait) with a short explanation.

A Python backend pulls prices from the US EIA, NRCAN, and Ontario datasets plus fuel news, runs part of the analysis through Claude Haiku, and commits a fresh snapshot for 62 regions four times a day from GitHub Actions. The frontend is React with no build step, works as a PWA, and is hosted on Vercel. I vibe-coded the whole thing with Claude and say so on the site, so treat the verdicts as a hint and not financial advice.

Tech Used

  • Python
  • React
  • Claude API

 

  • GitHub Actions
  • Vercel
  • EIA and NRCAN open data

Turns any artwork into a desktop wallpaper that looks like a painting hanging in a museum. The tool rebuilds a full ornate frame from a single scanned frame corner, inlays the artwork with depth and shadow, hangs it on a dark velvet wall under a picture light, and adds a museum placard.

It works offline with the bundled corner scans and no API keys, and the same input and seed always produce the same image byte for byte. With an OpenAI key it will identify the piece and write the placard text, and it can generate frames with OpenAI, Gemini, or a local SDXL model if you want something other than the reconstruction. Version 1.0.0 shipped in June 2026.

A painting in an ornate frame in a museum.
This photo I took at the MET museum is what I was going for

Tech Used

  • Python
  • OpenCV
  • Pillow

 

  • OpenAI and Gemini SDKs
  • Stable Diffusion XL
  • uv

System Monitoring #

A small tool that runs every hour from a systemd timer on my Arch desktop. It gathers anything worrying from the system and user journals, Docker container logs, and the pacman log, groups duplicates with counts and time ranges, and posts one JSON payload to an n8n webhook with retries. It remembers its place in the pacman log between runs so nothing gets reported twice, and one collector failing never blocks the others. It is a oneshot script rather than a daemon: collect, post, exit.

Tech Used

  • Python
  • systemd
  • journalctl

 

  • Docker
  • n8n
  • uv

A FastAPI service that drives the HondaLink Android app through uiautomator2 on a phone or emulator connected over ADB, so my car can be controlled from any HTTP client. It exposes lock, unlock, remote start, and stop as endpoints, reads fuel level, odometer, and door state, and reports the timer and cabin temperature of an active remote start. Because it controls a real car, every endpoint needs an API key, requests are rate limited and IP restricted, and every command goes into an audit log. A mock driver lets the test suite run without a phone.

Tech Used

  • Python
  • FastAPI
  • uiautomator2

 

  • ADB
  • Docker
  • pytest

Manhwa Discovery #

I track what I read on AniList and read it on MangaDex, and the two never agree on what anything is called. This app pulls my AniList lists, matches each entry to MangaDex using fuzzy title matching and release dates, and lets me fix the ones it gets wrong. From there I can search both catalogs at once, sort and filter by rating, chapter count, or unread chapters, and add new finds straight to AniList with the MangaDex link already attached. Redis and MongoDB cache everything so it rarely asks either API for the same thing twice.

Tech Used

  • Python
  • FastAPI
  • React

 

  • MongoDB
  • Redis
  • Docker

qBittorrent Peer Clustering #

A CLI that pulls the peer list from qBittorrent, geolocates every peer, clusters them with K-means, and recommends the ProtonVPN P2P server closest to each cluster. Output is a Rich terminal report plus an interactive HTML map, which Playwright can also render to a PNG.

Tech Used

  • Python
  • qBittorrent Web API
  • K-means clustering

 

  • Rich
  • Playwright
  • pytest

Plex Poster Downloader (tpdb) #

A CLI for people who care about their Plex posters. It downloads poster sets from ThePosterDB, matches them to your library with fuzzy matching, asks when it is unsure, and files them into a folder layout that Kometa understands. It can also link posters into the media folders and find duplicates. Version 0.4.0 added an interactive login that tests the Plex connection before saving anything.

Tech Used

  • Python
  • PlexAPI
  • RapidFuzz

 

  • Typer
  • Rich
  • Requests

Autogenerated Calendar for Free Concerts #

This Python script scrapes the Royal Conservatory of Music’s website for free student recitals and community performances and generates an iCalendar (.ics) file, so you can subscribe in your calendar app and stay updated with the latest free concert schedules. The public calendar is updated automatically every hour.

Tech Used

  • Python
  • BeautifulSoup
  • iCalendar

 

  • GitHub Actions
  • Cloudflare Workers

Homelab #

I have run a homelab for about eight years. These days it lives on my main desktop, which runs CachyOS (Arch) with rootless Docker, and every service is a Compose file in one git repo. A Cloudflare Tunnel with Access in front handles the public hostnames, a UniFi router handles the network, and a Raspberry Pi is a second Docker host for the small stuff.

The services I would miss most are Immich for photos and Paperless-ngx for documents, which now runs its AI features against the local GPU. There’s also Plex with Kometa, Audiobookshelf and Storyteller for audiobooks, Jellyfin, n8n, Ollama, Guacamole, and a Minecraft server. Most of what I know about networking, Linux, and containers came from breaking and fixing this setup. My Arch setup notes outgrew a README and became a MkDocs site.

Tech Used

  • CachyOS (Arch Linux)
  • Docker Compose
  • Cloudflare Tunnel
  • Bash

 

  • Python
  • n8n
  • Ollama
  • MkDocs

Application Setup Guides #

Markdown guides for the tools I keep reinstalling: Playnite, Plex HTPC, PowerShell with a custom prompt, and Fish. They are mostly so I don’t have to remember the same settings twice.

COMP4478 Game Programming (2023) #

A puzzle platformer in Unity for a university course. I wrote the game code and the UI, and handled merging everyone’s PRs. Although not a part of our final grade, I set up a GameCI pipeline in GitHub Actions that tests the project, builds it for Windows and WebGL, and deploys the WebGL build to GitHub Pages on each release.

Tech Used

  • Unity
  • C#

 

  • GameCI
  • GitHub Pages
Tahmidul Islam
Author
Tahmidul Islam
I’m an automation engineer at Raphael Porcelain and a computer science graduate from Lakehead University. I started coding because it was fun, and it’s still fun to learn about new things every day. Automation is what I do now, because I am super lazy and if I can get a computer to do my job for me, I will (even if it takes longer than just doing it myself).