A software engineer who enjoys solving problems by building useful products.

I built video.fm, a Last.fm video maker, and Scrollapp, a macOS auto-scroll utility.

♪
recent listening
Loading...
♪
top artists ·
Loading...
Loading...
Loading...
thinking...

I like turning random thoughts into useful products.

Software Engineer Intern

Feb. 2026 - Apr. 2026

Investie

Built secure account and password flows, strengthened frontend state handling, and evaluated KYC integrations.

Software Engineer Intern

May 2025 - Aug. 2025

Family Options

Built a Flutter reporting app that cut daily reporting time by roughly 60% and reduced errors through automated PDFs.

Software Engineer Intern

Dec. 2024 - Apr. 2025

Adonai Consultants

Optimized Python scripts and improved JavaScript dashboards, cutting consultant wait time by about 40%.

Python · JavaScript · C# · Lua · Java · Node.js · Express.js · Electron · Flutter · Dart · React · Swift · SwiftUI · FFmpeg · TensorFlow · Git · Docker

Client-Server Game Architecture Draft · Sep. 3, 2026

WIP

Hello World Oct. 1, 2025

Just to push something out, I will just briefely talk about why my portfolio site is designed the way is. It's a static site deployed on Vercel that uses multiple APIs to display my music listening data and Gemini AI.

I love minimalism, and I when I discovered jamesli.io (which I took inspiration from), I knew I wanted my portfolio site to be as simple as that - with my own twist. I like music, which is pretty apparent. You will also notice that I have a number of projects that are related to music, including this website.

Top Artists screenshot

I've extracted my listening data combining the tracking site and Spotify Image metadata. The music tracking API deprecated support for fetching artist images, so I had to find a new way to get them. I ended up searching for the artist name on Spotify and using the first image returned.

if ((!imageUrl || looksLikePlaceholder(imageUrl)) && spotifyToken) {
  try {
    const sRes = await fetch(`https://api.spotify.com/v1/search?type=artist&limit=1&q=${encodeURIComponent(name)}`, {
      headers: { 'Authorization': `Bearer ${spotifyToken}` }
    });
    const sData = await sRes.json();
    const spArtist = sData?.artists?.items?.[0];
    const spImage = spArtist?.images?.[0]?.url || spArtist?.images?.slice(-1)?.[0]?.url || null;
    imageUrl = spImage || imageUrl;
  } catch (_) {}
}

My next plans are to work on squeezing in my personal logo without taking the visual focus away, and implementing a container forthe shows I've been watching.