Skip to main content


The catalogue of projects I have worked on over the years

{ Typescript Node.js Docker MySQL }

A Discord bot built for gaming communities. Provides an easily accessible and status panel for Minecraft servers, in over 300 servers, with thousands of users.

Why: As I host a Minecraft server for myself and my friends, I wanted an easy way to display the online status, version, and player count of the server.

Challenges: In order to keep my bot responsive and fast, I had to tweak my algorithms and methods a lot as I added features so that it would not ping servers unecessarily and eat up network bandwidth.

What I learned: My most publically used application, I learned how to gracefully handle errors such that the bot would remain user friendly and would not crash upon encountering user error, as well as data privacy management.

Steve preview image

{ ChromeAPI HTML CSS Javascript }

A Google Chrome extension to keep track of your browsing sessions and restore tabs from a crash, Incognito included. All locally.

Why: I have the habit of opening too many Chrome tabs and have had Chrome crash on me many times, resulting in me losing all my work.

What I learned: This was my first dive into the Google Chrome API. I learned how to build extensions, and utilise Chrome's extensive library of functions.

{ Typescript React Node.js Express }

An extension of my Discord bot Steve, mcstatus is a status page for Minecraft servers. The frontend uses the React library and the backend uses the Express framework.

Why: To build an application that utilizes React and React hooks that can talk to a backend using REST.

What I learned: How to build REST APIs from scratch, and use it as a connection between my frontend and backend services.

MCSTATUS preview image

{ Typescript Node.js }

A logging module to send events and errors to a Discord text channel using webhooks,

Why: My preferred method of receiving errors for my publically hosted applications. This solution allows me to keep a record of all previous errors, and give me the details required to understand the severity of an event at a moment's notice.

{ C Bash }

wg-cli is a CLI tool that manages Wireguard® virtual private network (VPN) peers.

Why: Adding and removing peer devices in the Wireguard CLI is time consuming, so I built this app to automate the process and speed up my workflow by 10x.

Challenges: Building the remove-peer function. Due to the lack of unique peer identifiers in Wireguard, I essentially had to parse the configuration twice in order to remove a peer.

What I learned: Because the C language does not have built-in garbage collection, I learned how to best manage resources so that there would not be any memory leaks. This including using Valgrind, a memory debugging tool, to test my program.

wg-cli preview image

{ Vue.js }

A documentation website built with Vue and Vuepress that contains the documentation for all my public code repositories.

Why: I wanted a central documentation system that I could use to easily reference.

What I learned: I learned how to use static site generators like Vuepress to build functional websites quickly. I also learned how to write detailed but concise documentation that's easy for humans to understand.

Docs preview image

{ Electron Node.js React-Native }

Inhabit is a to-do desktop (Windows) and mobile (Android/iOS) app built in Electron and React Native respectively. It stores data in JSON.

Why: To practice my Javascript and React skills while implementing a modern looking application.

What I learned: How to build applications in Electron and React Native.

Inhabit preview image

{ Bash Cron }

A dynamic DNS client that updates Cloudflare's DNS records when your WAN/public IP is changed. Uses Cloudflare's RESTful APIv4.

Why: Because my ISP does not hand out static IP addresses to residential clients, my IP address could be updated any time, cutting off access to my services that rely on a static domain.

What I learned: I learned how to implement Cloudflare into my network infrastructure and use their DNS services to keep my domains up to date with the correct IP address. I also learned how to automate my scripts with the Linux cron scheduler.

Cloudflare banner

{ Python Tkinter SQLite }

An inventory manager program built in Python. Uses the Tkinter GUI Framework and SQLite.

Why: I wanted to build a functional program that fulfilled my needs outside of just a side project.

Challenges: I had issues with the SQL processor writing to the wrong database even after closing the connection. This was solved by disposing and recreating the engine when a new database is opened.

What I learned: I learned how to integrate SQLite with Python and build programs that could take advantage of databases.

Inventory manager preview

{ Typescript Javascript JSON }

This tool serves to annotate "interesting" and "non-interesting" sections of an image and returns the data as coordinates in a JSON array.

What I learned: Strongly typed Javascript using Typescript! I also learned how to work with HTML canvases to draw shapes that could be converted into objects with coordinates.

Image Annotation Tool Preview

{ Python Tkinter Gspread }

A desktop address book GUI in Python using the Tkinter Framework. Uses Google API's to update cross-device.

Address Book Preview

{ Python Pygame }

A Brick Breakers clone built with Python and Pygame to practice object oriented programming principles. Features lives, levels, and scores.

Why: To practice my object oriented programming skills while building a fun game in the process.

Challenges: A challenged I faced was writing the collision detection as bricks could be hit from all four sides. I built code that could detect collisions and calculate trajectories based of the collison angles.

What I learned: As every brick is generated on the fly, there is no hardcoding involved in brick generation. I achieved this through the use of classes, in which I learned how to effectively implement inheritance and aggregation, one of the most important aspects of object oriented programming.

Brick Breaker Preview

{ HTML CSS Javascript }

The website you are looking at right now!

Why: To challenge and showcase my understanding of web technologies and responsive UI design without using third party frameworks like Bootstrap.

Challenges: CSS. It's always CSS 😝. While finicky sometimes, I learned a lot about the inner workings of CSS and how to implement it efficently and responsively.

What I learned: How to deploy my website on my server securely using Nginx as a secure reverse proxy and webserver.

Nathanlytang Preview

{ Linux Docker Proxmox }

My homelab, consisting of multiple servers running Proxmox High Availability, hosting my internal services, such as Pihole, Wireguard, Nginx, Plex, Home Assistant, Codeserver, Pterodactyl Panel, and many Docker applications. This server also runs some external applications that I have built, including my Discord bot Steve.

My homelab has taught me how to marry the sysadmin role with the software developer role, and has given me a lot of insight on how to be an effective developer. Having to troubleshoot applications that I have built and serve to real people have taught me how to build with user friendliness, ease of use, and security in mind.