Things I've built

Not just learning by reading — shipping things and logging them here.

FEATURED

Cassette Music Player

Mix MP3s and YouTube into a cassette, gift it with one link

ReleasedMay 2025

An Android music player that brings the 1980s cassette tape experience to a modern phone. For v2.0.0 I rebuilt the app from scratch with a premium cassette-deck dark theme and seven shell colors to personalize each tape. Tapes can now hold YouTube links alongside local MP3 files, while still enforcing the real physical limit of a cassette — 30 minutes per side, cutting off and flipping to the other side at 30:00. Skipping isn't instant; you have to hold FF to move to the next track, and tape hiss plays between songs, keeping the focus on listening through like an album. The feature I'm proudest of is link sharing — send a finished tape as a single link, and the recipient can preview the tracklist on the web with no app required, or import it straight into the app if they already have it installed. Each tape remembers its own playback position, so swapping tapes still picks up where you left off, and lock screen controls let you manage local tracks with the screen off. Available in Korean and English.

React NativeTypeScriptExpo SDK 54expo-routerexpo-avreact-native-reanimatedreact-native-svgAsyncStorage
Intro — new dark theme
Player — Side A playback
Tape editor — Side A/B, 30-min limit
Tape collection — customizable shell colors
Link sharing — web preview + one-tap import
Web preview — browse the tracklist with no app required
FEATURED

RepoNote

A mobile notepad that auto-syncs with your Obsidian repo

Private testingJul 2026

Connecting Obsidian to Git on mobile was painfully complex, and resolving merge conflicts on a phone screen was worse — so I built my own note app. The idea is inverted: instead of cloning the repo to the phone, it uses only the GitHub Contents API with no Git CLI at all. Open, write, close — your note is committed automatically. Every keystroke is saved to a local database first (600ms debounce), and changes are pushed to GitHub five seconds after you stop typing, so nothing is lost offline or when the API fails. Conflicts are detected by comparing the SHA from when the file was read against the server's SHA right before upload; instead of overwriting, the app shows both versions and lets you choose. This app was actually built twice — first in React Native from the same spec document, but constant build and state-management errors killed it, so I rebuilt it from scratch in Flutter. Lesson learned: a well-written spec makes switching frameworks surprisingly cheap. It ships in English and Korean, with a demo mode that injects a fake GitHub API via Riverpod provider overrides for store screenshots.

FlutterDartRiverpodgo_routerdiodriftGitHub REST API
File tree — collapsible folders
Editor — auto-save & auto-commit
Preview — rendered checklists
GitHub connect — least-privilege token
FEATURED

Matchda

Paste a job URL → AI matching → auto-generated cover letter

Preparing to launchApr 2026 ~

A personal tool built to automate the daily grind of job searching. Paste a job posting URL from Seek, Indeed, LinkedIn, or Glassdoor — Matchda scrapes the JD automatically and uses AI to score the match against your profile. Track each application through status stages (interested → applied → interview → offer), and generate English or Korean cover letters with one click. Export as TXT, DOCX, or PDF. Tailored resume generation runs on a lightweight RAG built without embeddings or a vector database — it pulls up to three of your own past tailored resumes that share the most keywords with the current JD, injects them into the prompt purely as phrasing and emphasis reference, and keeps every fact sourced strictly from the original resume, preventing the kind of embellishment creep that can compound across AI-generated versions. It originally launched as "JobRadar," but was rebranded through a branding process to Matchda (match + da) — capturing the idea of matching every job in the world.

Next.jsTypeScriptSupabaseVercelCheerioClaude APIRAG
AI job matching
Resume translation
Application tracking

More projects

More projects I have shipped, operated, or built hands-on.

YouTube Link Video Editor

Paste links → pick segments → one MP4

Running locallyJul 2026
Next.jsTypeScriptTailwind CSSzustanddnd-kitFastAPI

Interactive Learning Platform

A hands-on lab in the browser — from running code to deploying on Kubernetes

Running locallyJul 2026
Next.jsTypeScriptMonaco EditorXterm.jsFastAPIPyTorch

Nogari

News in articles, reactions in Nogari — an anonymous community opened by vote, not admins

LiveJul 2026
Next.jsTypeScriptReactSupabasePostgreSQLpg_cron

Blog Auto-Publisher SaaS

Register a topic — AI drafts it, the cloud publishes it

Preparing to launchJul 2026 ~
Next.jsTypeScriptPlaywright@sparticuz/chromiumUpstash RedisAuth.js

Document Verification Blockchain

Smart contract that verifies documents by matching file hashes on-chain

Deployed to Sepolia testnetJul 2026
SolidityHardhatOpenZeppelinEthereumEthers.jsExpress

KidsPlay

No payment popups, no ads — a web playground a kid can't escape alone

LiveJul 2026
Next.jsTypeScriptReactFullscreen APIWeb Speech APIPWA

Mahjong Joy

Mahjong is intimidating — so I stripped it down to just matching

Private testingJul 2026
FlutterDartdart:io SocketsProvideraudioplayers

Football Dice

An American football board game resolved by dice and cards

Private testingJul 2026
FlutterDartdart:io Socketsshared_preferencesaudioplayers

TILT — The Maze Puzzle

Tilt to escape — fully playable by blind users via voice alone

ReleasedMay 2026
React NativeTypeScriptExpoSupabaseexpo-sensorsexpo-speech

ChainPlay

Autoplay YouTube videos in the order you choose

ReleasedMay 2026
React NativeTypeScriptExpo SDK 54react-native-youtube-iframeAsyncStorageIntl API

back to dev

A developer blog — a 40-something PM returning to code

LiveApr 2026 ~
Next.jsTypeScriptVercelGitHub APIGitHub Actionsnext-intl

Village — Pixel Village Guestbook

Find the easter egg to plant a tree, and leave a comment

LiveJul 2026
Next.jsTypeScriptReactGitHub REST API

// more coming soon.