My Projects
AT Route Performance
Measures how far Auckland Transport runs from its own published schedule. Polls AT's GTFS-RT feed every couple of minutes and stores each stop arrival with its deviation. Rolls completed service days into per-route summaries behind daily boards, rankings, and per-route and per-stop pages. Counts cancellations separately and filters out ghost readings so a cancelled service cannot flatter a route.
Skills Used:
- Auckland Transport API
- Leaflet
- MongoDB
- Next.js
- Prisma
- TypeScript
Discord Events-to-iCal Bot
Slash command exports upcoming Discord events to a universal .ics feed. Handles timezone conversion and auto-fills missing end times. Attaches the .ics file directly in Discord. Roadmap includes more calendar features.
Skills Used:
- Cloudflare
- discord.py
- ICS Calendar library
- Nginx
- Python

ChatGPT Discord Bot
Discord bot using the OpenAI API to generate replies with configurable personality, tailored to each user. Thread-aware memory, emoji replacement, LaTeX-to-image conversion, and image/file inputs enhance chats. Slash commands for controlling cooldown between messages, encrypted memory storage, and rotating logs make debugging easy.
Skills Used:
- Discord.js
- Giphy API
- LaTeX Rendering
- OpenAI API
- Tenor API
- TypeScript

Triangle Location Dashboard
Website to select addresses and candidate meeting places on Google Maps. Computes geographic midpoint and picks the most central option. Drag-and-drop lists and auto-fit map bounds for better UX. Ranks by real driving times via the Routes API, falling back to straight-line distance.
Skills Used:
- Google Maps JavaScript API
- Next.js
- Tailwind CSS
- TypeScript
ReactionBot
Combines multiple bot ideas into one. Reacts with emojis using regex-based phrase triggers. Rewrites social links into embeddable forms with poster confirmation. Slash commands to add or update keywords. Originally Python. Migrating to TypeScript.
Skills Used:
- Discord.js
- discord.py
- Python
- TypeScript