I like turning random thoughts into useful products.
Experience
Software Engineer Intern
Feb. 2026 - Apr. 2026Investie
Built secure account and password flows, strengthened frontend state handling, and evaluated KYC integrations.
Software Engineer Intern
May 2025 - Aug. 2025Family 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. 2025Adonai Consultants
Optimized Python scripts and improved JavaScript dashboards, cutting consultant wait time by about 40%.
Technologies
Python · JavaScript · C# · Lua · Java · Node.js · Express.js · Electron · Flutter · Dart · React · Swift · SwiftUI · FFmpeg · TensorFlow · Git · Docker
Client-Server Game Architecture
WIP
Hello World
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.
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.