Not just learning by reading — shipping things and logging them here.
FEATURED PROJECTS
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.
Intro — new dark themePlayer — Side A playbackTape editor — Side A/B, 30-min limitTape collection — customizable shell colorsLink sharing — web preview + one-tap importWeb 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
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.