Work

Projects

Three case studies spanning full-stack web, real-time systems, and self-hosted tooling.

01Personal · Full-Stack

Shadow Anime

Nuxt 3Vue 3TypeScriptTailwind CSSREST API

The Problem

Most anime sites are either ad-heavy, unstable, or require accounts. I wanted a clean, fast, self-controlled streaming interface I could use daily — without ads, sign-ups, or unreliable third-party players.

What I Built

A full anime streaming platform with search, genre filtering, episode tracking, and a clean dark UI. Pulls real-time data from a third-party anime API. Built as an iterative improvement over the first version (anime-nuxt-app), with a more polished UI and better data handling.

Tech Stack

Nuxt 3 and Vue 3 for the frontend with TypeScript throughout. Tailwind CSS for styling. Third-party REST API (Jikan/AniList) for real-time anime metadata, episode data, and search. Deployed on Vercel.

Impact / Result

  • 13+ GitHub stars on the original version
  • 7 forks — other developers actively building on top of it
  • Actively used as a personal daily driver
02Personal · Real-Time

Nuxt Video Chat

Nuxt.jsExpress.jsSocket.ioWebRTCNode.js

The Problem

Most video chat tutorials rely on third-party SDKs — Daily.co, Twilio, Agora — which abstract away the hard parts. I wanted to understand WebRTC at a protocol level by building a working implementation from scratch, without any external video SDK.

What I Built

A peer-to-peer video chat web application using raw WebRTC for media streaming and Socket.io for signaling. Nuxt.js handles the frontend; an Express backend manages the signaling server. No external video SDKs involved — ICE, SDP, and peer connections are all handled manually.

Tech Stack

Nuxt.js frontend for the UI and room management. Express.js + Socket.io backend for WebRTC signaling (offer/answer exchange, ICE candidate relay). Native browser WebRTC API for peer connections and media streams. Node.js runtime.

Impact / Result

  • Demonstrates low-level networking and real-time systems knowledge beyond typical web dev scope
  • Full understanding of signaling flows, ICE candidates, and SDP negotiation
  • Working multi-user video sessions without any third-party video dependency
03Personal · Self-Hosted

Expense Tracker — Dual Currency PWA

Nuxt 3Express.jsSQLiteDockerCloudflare Tunnel

The Problem

Living and commuting between Singapore and Johor Bahru means dealing with SGD and MYR daily. Existing expense apps either lack real dual-currency support, lock data in the cloud, or are overly complex for everyday personal use.

What I Built

A self-hosted Progressive Web App for personal expense tracking. Supports SGD/MYR with live conversion, works offline as a PWA, and runs entirely on a home server via Docker Compose + Cloudflare Tunnel — no third-party cloud dependency whatsoever.

Tech Stack

Nuxt 3 frontend configured as a PWA with offline caching. Express.js REST API handling transactions and categories. SQLite for lightweight, file-based persistent storage. Docker Compose for local orchestration. Cloudflare Tunnel for secure remote access without opening ports.

Impact / Result

  • Fully operational personal daily driver — used every day
  • Complete data ownership — no third-party cloud
  • Demonstrates full product lifecycle: architecture, build, deploy, and maintain
Live demo available on request (self-hosted)

Interested in working together on something similar?

Let's talk