All Posts
Thoughts, learnings, and snippets from the journey back to dev.
My last day using Fable5....
I'm using Fable5 like crazy right up until the very last day.
Building a Prescription Fraud-Verification Blockchain With an AI Coding Assistant (From Smart Contract to Web UI)
A record of recording prescription hashes on-chain with a Solidity smart contract, going from a local demo to a Sepolia testnet deployment and a web UI, all in one day
Landing a Job in Deep Learning & Big Data — What a Developer Should Nail Down in 6 Months
A portfolio beats finishing every course. A learning roadmap for deep learning and big data, organized by job role, aimed squarely at getting hired
Two Different AI Functions Were Writing Resumes in the Same Service — One Better Than the Other
Following up on a user's subtle quality-comparison feedback led to discovering a duplicated resume-generation API, unified by porting the RAG and prompt techniques, and cleaning up the redundant buttons
Building My Own Local LLM — A Realistic Way to Run Sonnet-Level Performance on My Mac
Can an individual actually build an LLM? A rundown of realistic options — from running open-weight models, to RAG, LoRA fine-tuning, and training nanoGPT
Getting a Free support@yourdomain.com Email With ImprovMX
How to forward custom-domain email to a personal Gmail account for free, and even send from that address, without a paid mailbox
Paddle Domain Review: Matchida (Typeform Survey) Answer Guide
Paddle Instead of Stripe for SaaS Payment Systems... Guide to Answering the Paddle Survey
Why We're Returning to a Strategy of Reducing the Number of Tokens
AI ultimately moves at the pace of humans.
Claude Fable 5: Resumes After an 18-Day Hiatus; “Free Credits” Period Runs Until 3:59 p.m. on July 8 (KST) – Including Strategies for Generating Codes
Clog Fable 5: Review and Future Usage Tips
From JobRadar to Matchda — A Side Project Rebranding Story
The naming criteria and branding decisions behind renaming the feature-descriptive "JobRadar" to Matchda
Job Sites Where Link Copying Doesn't Work? Solved With a Manual Card-Add Feature
A record of building a feature to manually enter and create a card for job postings blocked from URL scraping, using Next.js Server Actions
Building a Proper Next.js App Router Favicon: From an SVG Monogram to Shrinking a 285KB .ico Down to 2KB
The App Router icon conventions, sharp rendering, the png-to-ico size trap, and hand-rolling ICO encoding I ran into while replacing the default Next.js favicon with a brand monogram
Screen Breaks Every Evening? The prefers-color-scheme and Tailwind v4 Layer Trap
The cause of a bug where only the background turned black due to automatic OS dark mode, and the fix using color-scheme to lock it to light
For a Multilingual Site, Separate URLs Per Language Win at SEO
Why a multilingual site needs distinct per-language URLs like /en/ and /ko/ instead of a single URL that swaps content by browser language, plus hreflang and canonical basics
Renaming a Service: Custom Domain Setup and the OAuth Redirect Trap (Vercel + GoDaddy + Supabase)
A field report of rebranding from JobRadar to matchda.com — buying the domain, connecting it to Vercel, GoDaddy DNS, and Supabase Auth configuration
Knowing When to Give Up on Scraping Is a Skill Too: Landing on a Click-Through Fallback After Fighting Cloudflare + an SPA
A record of throwing a stealth browser at scraping Canva's careers page, giving up, then finding the real cause through diagnostic logs and wrapping up with a practical fallback
Drag Works, But the Order Doesn't Change — Making Sorting and Manual Order Coexist
How I fixed a bug where dnd-kit drag reordering was getting overwritten by auto-sort, then persisted the user's manual order to the database
An AI That Blocks You One More Time Before You Commit — Automating Commit Validation With a Subagent
How I built a pre-commit-validator subagent to catch hardcoded emails or missing user_id filters from slipping into commits, and the design principles behind it
It Works Locally But Not on the Server — Fighting a Job-Scraping Bot Block
How I absorbed intermittent 403s from Akamai bot blocking with retries and better headers, and fixed a bug where failures were overwriting perfectly good data
I Was Calling the Translation API Every Single Time — Caching Translations in the DB
Eliminating the waste of re-translating the same content every time a modal opens, by caching it in the DB — plus the pattern for invalidating the cache when the source text changes
Just One Username Changed — Tracking Down Hardcoded Absolute Paths
When my macOS username changed from hy to hs after switching laptops, I traced every /Users/hy absolute path across the project with grep and fixed them all — an experience and its lesson
When Claude Code Breaks Into Dotted Lines in iTerm2: CJK Width Settings and Coding Fonts
A record of fixing horizontal lines breaking into dotted dashes and Korean characters spacing out oddly in iTerm2, using the Unicode 9 width option and D2Coding/Sarasa fonts
Can You Switch iTerm2s Menus to Korean? My Actual Findings
What I learned trying to switch iTerm2 to Korean via macOS's per-app language setting, and how that differs from the real problem — garbled non-ASCII text
What You Actually Need to Save When Switching MacBooks Isn't Code — It's Keys
How to safely move signing keys, environment variables, and credentials that git clone doesn't bring along, over to a new MacBook
4 Ways to Quickly Copy Just a File Path on a MacBook
How to copy the full path of a file or folder on macOS without installing any app — Option right-click, the ⌥⌘C shortcut, terminal drag-and-drop, and pbcopy
Korean Chat Answers, Translated to English All at Once at the End — Building an Onboarding Flow
My experience collecting user info via chat right after signup, then translating and structuring it into English with a single Claude API call at completion time, saving both Korean and English
When pnpm install Dies With Exit 1: Build Script Approval and the Per-Platform Native Binary Trap
A record of fixing pnpm install exit 1 while moving an Expo monorepo configured for Replit (linux-x64) over to an Apple Silicon Mac, resolved via onlyBuiltDependencies and allowBuilds
Building a React Native (Expo) Project on a New Laptop — 4 Traps I Hit
A record of solving JDK, node, Gradle cache, and launcher issues in order while building and installing an RN app on a new Mac with copied node_modules and android folders
Moving a React Native (Expo) Project to a New Computer — Copying Without node_modules, Then Restoring the Environment
The full process of restoring an Expo project moved without node_modules using npm ci, including catching a missing nvm shell load
From 'Installing' Apps to 'Generating' Them — The Vision of an AI-Native OS
Mobile and desktop OSes are no longer just about selling apps — we're entering an era where you build what you need, together with AI, right inside the OS
Auto-Generating Slugs in the Admin Editor — DeepL + camelCase + Date
How I improved slug auto-generation from Korean titles by adding English translation, camelCase conversion, and a date suffix
Logging Into Claude Code With a Different Account, Only in a Specific Folder — Using direnv
How to combine CLAUDE_CONFIG_DIR and direnv to keep separate Claude Code login accounts per project folder
I Tried Fable 5 — Then the US Government Shut It Down for Non-Americans
Anthropic's new Fable 5 Mythos model was noticeably better at explaining things. Then it got blocked for overseas users overnight
What It Means to Share a Playlist — Why I Built Sharing Into ChainPlay
Adding a share feature to ChainPlay wasn't just a convenience feature — I wanted to build a culture of sharing taste through playlists
Sharing App Content Without a Server — GitHub Pages + Android Deep Links
How I added a chain-sharing feature to ChainPlay using nothing but GitHub Pages and deep links, with no server involved
Building a Share Feature Without a Database — Shrinking a URL That Got Too Long
How I fixed a share-link URL that ballooned past 1,300 characters, by dropping titles and listing only videoIds, bringing it down to 266
Building a Tailored Resume With AI While Keeping DOCX Formatting Intact — JSZip + Claude API
How I used JSZip to manipulate a DOCX's internal XML directly, keeping the original layout untouched while letting Claude AI rewrite only the paragraph text to match a job description
Turning Off the Red Warnings in Google Search Console — Fixing Next.js i18n Redirect Errors
From 404s to redirect errors to duplicate pages — digging through Search Console errors one by one and fixing them with a few lines in next.config.ts
Managing My Application History in Code — Storing Submitted Resumes + Auto-Logging Application Dates
How I used Next.js Server Actions and Supabase to attach a submitted resume and application date directly to each job card
Got an IARC Email After Registering an App on Google Play — Just Ignore It
An IARC Live Rating Notice is just a notification that your app's age rating is now live on the store. Here's why you don't need to do anything about it
Showing an English Page to Foreign Users — By Browser Language, Not IP
How I auto-detect language in Next.js 16 proxy.ts using the Accept-Language header, with a cookie to persist the user's choice
The Menu Is Cut Off on Mobile — Fix It with a Hamburger Menu
How I fixed the scrolling issue in the Next.js blog navigation on mobile using a hamburger menu
How I Fixed Google AdSense's "Low Value Content" Rejection
When a single-feature tool site keeps getting rejected by AdSense as low-value content, here's how I restructured the pages and content to pass review
Koreans say 'better than expected' more than expected
A quiet observation about why Koreans soften every compliment with "better than I thought"
Google Play Production Approved
Google Play production approved
Renaming a Core App Concept — From Folder to Chain, Front to Back
What it took to rename the Folder concept to Chain across the ChainPlay app, and how a type-driven TypeScript refactor made it manageable
Why Should You Delete a Merged Feature Branch? — Local & Remote Deletion, Summarized
Why you should delete feature branches after merging, plus the commands for deleting them both locally and remotely
My Blog's Post List Vanished Because of a GitHub REST API Rate Limit
How I fixed a Next.js blog's post list disappearing after hitting the GitHub API rate limit, by switching to the GraphQL API
Upload 10 Images, Get 1 Commit — Batch Uploads With the GitHub Tree API
How I improved a Next.js admin so that selecting multiple images produces only a single commit, using the GitHub Tree API
Google Play Console - Registering for production after private testing
A summary of what you need to fill out to apply for production access after completing 14 days of private testing.
Google Play Closed Testing — the More Often You Update, the Faster Approval Comes
What I felt bumping the Tilt game version — update frequency directly affects review approval during closed testing
How to Clean Up Android Build Files — Reclaim Several GB in One Shot
A complete rundown of how to safely clean up Android build files once they start eating your disk space
Next.js Multilingual Blog SEO — Why Google Ignores /ko, and Two Fixes
How a missing x-default hreflang and unhandled isFallback posts caused a Google Search Console duplicate-page error, and how to fix both
Supabase Free Usage Restrictions
Found out the hard way that Supabase free plan only allows 2 active projects
How to Create and Use Agents
Using AI agents on the blog
[INFO] Blockchain & AI Hackathon utilizing mobile IDs
Applying for a blockchain & AI hackathon that uses mobile digital IDs
Next.js + next-intl: A /ko/ Redirect Error and a proxy.ts Conflict Ordeal
How I hit a build error while trying to fix a Google Search Console redirect error, and what I learned about the proxy.ts structure
Ollama Review (How it feels to use each model)
Review of each model - DeepSeek, EXAONE, QWEN comparison
Installing Ollama and getting started with local AI
A guide to installing Ollama and selecting a model for local AI
Why I Removed "1 min read" From the Blog Post List
Why a read-time badge backfires on a young blog, and how I removed it from Next.js components
The Day Google Crawled a Code Example on My Blog as an Actual Link
Tracing a 404 error in Search Console led to discovering Google had interpreted a filename inside a post's code example as a real URL — fixed with redirects in next.config.ts
What Happens When You Forget Canonical on a Next.js Multilingual Blog
Why Google Search Console flagged "Duplicate, Google chose different canonical than user" and how to set up canonical correctly in a next-intl environment
Why My Next.js Site Got a Scroll Animation Every Time I Navigated Pages
Tracking down two consecutive scroll-jump bugs caused by a back button implementation tangled up with scroll-behavior smooth
After GitHub Warned Me About a Huge AAB File — Moving Build Artifacts to Local Version Control
Why you shouldn't commit Android release build files (AAB/APK) to GitHub, and how to version them in a local folder instead
Adding Korean/English Support to a React Native (Expo) App — My Locale Detection Ordeal
Trying three different approaches — expo-localization, NativeModules, and the Intl API — and landing on the final answer
50 screenshots blew up my blog - debugging GitHub API limit exceedance
The story of how committing 50 images at once caused a Vercel build to spin 50 times and hit the GitHub API request limit.
Google Play Store App Registration A-Z - The whole process with screenshots
A hands-on, screenshot-filled guide to the entire Google Play Console process, from creating an app to passing a private test.
A Privacy Policy's Children's Clause and Play Store's 'Everyone' Rating Are Separate Things
My confusion over whether adding "not directed at children under 13" to a privacy policy meant I had to set a 13+ content rating
[Essay] Something Is Starting to Click
Seven weeks of building with AI — and somewhere along the way, I fell into AI engineering without meaning to
Getting an Expo app to the Play Store - From building AAB to creating store assets
A walkthrough of the build, asset creation, and bug fixing process we went through to get our React Native (Expo) game app to the Google Play Store for the first time.
One apostrophe broke my Vercel build — the YAML frontmatter trap
When local builds were fine but only Vercel failed, the culprit was a single line of YAML title with English abbreviations.
Google AdSense Rejected Me — The Reality of a Tool-Only Site
After being rejected for "low value content," I expanded content and reapplied to AdSense on a WiFi QR code generator site
I Built a WiFi QR Code Generator — My First Completed Side Project with AI
A WiFi QR code generator I made because sharing passwords to guests was annoying — React + i18n + print support
Your own playlist app without YouTube Premium - Build it yourself with React Native (Expo)
Building a YouTube playlist app from scratch with Expo SDK 54 + TypeScript — what broke and how I fixed it
How to Install Android Apps Directly - From APK to USB Debugging
How to install Android apps without Google Play and how to install them directly with ADB USB debugging.
Why GitHub Actions Commits Don't Show on Your Contribution Graph — Fix with KST Timezone
The timezone issue where GitHub Actions auto-commits don't appear on the contribution graph. One line — TZ=Asia/Seoul — fixes it.
React Native YouTube App — Android WebView Playback, Custom Button, and Keyboard Bugs
From Android WebView security policies, KeyboardAvoidingView pitfalls, and autoplay timing bugs - here are the issues and solutions we encountered while improving the YT Player app.
Launching a React Native app on the Play Store - from build to intro copywriting
A recap of our first launch, including automating AAB builds, resolving versionCode errors, writing store intro copy, and analyzing Play Console recommended actions.
Claude Code, why longer conversations get slower and how to use /clear
Claude Code gives a practical overview of why piling on context gets slower and more expensive, and how to fix it with /clear.
Why Google Ignored My Blog - 2 Next.js SEO Bug Fixes
How I discovered a missing index in Google Search Console and fixed the canonical tag and footer 404 links.
Obsidian Git Mobile Settings - Synchronizing GitHub on Android
How to clone a GitHub repo with the Obsidian Git plugin on Android and set up automatic synchronization.
The story of setting up the Obsidian Git plugin and encountering an xcrun error
How to resolve the xcrun error I encountered while connecting Obsidian to GitHub and setting up the Git plugin.
Data isolation bugs exposed by creating multi-user apps with Supabase service role
4 data isolation pitfalls and solutions when using only the service role client without RLS.
Why Is Android Background Playback So Hard — Doze, WakeLock, and Foreground Service
How I fixed a bug where track transitions stopped working when the screen turned off in a cassette music player app, using Foreground Service + PARTIAL_WAKE_LOCK
[JobRadar Part 7] Google OAuth "Database error" — Down the Supabase Trigger Rabbit Hole
Google login kept failing with "Database error saving new user" — I dug all the way to creating a new Supabase project before finding the fix was one line in a trigger function
[JobRadar Part 6] Cover Letters Done Right, UX Polish, and Adding Login
Cover letter save/download/AI review, memo and status management, direct JD input, and Supabase Auth — everything built in one day
How to run a blog with Claude Code - automate from creation to scheduled distribution
The complete workflow of running a blog with Claude Code, from post creation, translation, registration, and scheduled distribution.
[Claude Console] Buy Credits button is disabled - Causes and solutions for not checking out
In the Claude Console, the Buy button would not activate even after all payment information was entered. The cause was a bug that reset the city selection when switching languages.
JobRadar Part 5: Dropping the Automation Fantasy and Building a Practical Pipeline
After giving up on Playwright auto-scraping, I built an on-demand pipeline — URL paste → JD scraping → AI matching → cover letter generation — over two days.
JobRadar Part 4: Why I Ditched Playwright for cheerio — The Day-4 Pivot
After three days fighting Playwright, I gave up. On day 4, I completely changed direction — from auto-collection to URL-based on-demand scraping, using cheerio + JSON-LD.
How to Email Claude Support — Bypassing the AI Chatbot
When Claude support only gives you AI responses, here's the step-by-step process to create a real email ticket and reach an actual person.
Building a Claude Code Custom Agent — A Practical Guide with blog-auto-draft
How to create Claude Code custom agents to automate repetitive tasks. A step-by-step walkthrough using blog-auto-draft as a real example, from file structure to invocation.
[Claude Console] Payment Broken. DO NOT Delete Your Organization!!!
Claude Console organization deletion accidentally deleted the account — a cautionary tale
JobRadar Part 3: Deploying Playwright to Vercel Blew Up — The @sparticuz/chromium Journey
Why a scraper that ran fine locally kept exploding on Vercel. From @sparticuz/chromium adoption to ETXTBSY, 60-second timeouts, and everything in between.
Connecting Gemini to Claude Code via MCP — Using Two AIs Without Token Anxiety
A step-by-step guide to connecting Gemini as an MCP tool inside Claude Code, so you can delegate token-heavy tasks to Gemini without leaving your workflow.
[JobRadar Part 2] Supabase Schema + Playwright Scraper — Debugging Notes
JobRadar part 2. From Supabase multi-user schema design to Indeed and Seek Playwright scraper implementation. Glassdoor blocks, ETXTBSY, missing modules — all the pain points documented.
Claude Code Hooks — Automate Tasks When Claude Finishes
Auto-format on save, response completion alerts, approval request notifications — a step-by-step guide to automating repetitive tasks with Claude Code Hooks.
[JobRadar Part 1] Project Setup — I Built an AI Tool to Help Me Find a Job
From automated job scraping to AI matching — JobRadar side project part 1. A step-by-step walkthrough of the initial Next.js + Supabase + Vercel setup.
I Built an App — Now How Do I Publish It? Google Play Console from Start to Finish
A step-by-step walkthrough of publishing an app on Google Play Console for the first time — from developer account registration to AAB upload and review submission.
[App Launch] How to Gather 12 Testers — Why You Should Use Google Groups
How to efficiently recruit 12 testers for a Google Play test track. Why Google Groups beats manual email registration, and the exact order of steps that actually works.
DeepL API Integration — Adding Translation to a Next.js App
A step-by-step guide to adding translation functionality to a Next.js app using the DeepL API Free plan. From getting an API key to building a server-side route.
Scheduled Blog Post Publishing with GitHub Actions
How to set up a GitHub Actions workflow that automatically publishes blog posts on a specified date — based on a real implementation experience.
How to Register a Google Play Developer Account (2026 Guide)
A complete step-by-step guide to creating a Google Play Console developer account and completing identity verification as of 2026.
Comparing 3 translation APIs - MyMemory vs DeepL vs Claude, what should I use?
I'm comparing and contrasting my experience with MyMemory, DeepL, and Claude APIs while adding translation functionality to my blog admin.
Changing Page Title and Meta Tags per Page in React SPA — react-helmet-async
How to dynamically control title and meta tags per page in a React SPA using react-helmet-async for better SEO.
Wireless ADB Debugging — Install APKs Without a Cable
How to set up wireless ADB debugging between a MacBook and an Android device. Install APKs over Wi-Fi with a single command — no USB cable needed.
[Claude Code] How to Create and Use Skills - Your Own Slash Commands
Learn how to create and use Skills to automate repetitive tasks in Claude Code with hands-on examples.
Getting Your Site on Google — Next.js SEO Setup Guide
How to add robots.txt, sitemap.xml, Open Graph, and JSON-LD to a Next.js App Router blog to get it indexed on Google — based on a real implementation.
[App] Developing Cassette Player App_02
Cassette Tape Player App Development Journal 02
[App] Developing Cassette Player App_01
Cassette tape player app development journal 01
What is a good platform for beginners to Replit vs Claude Code?
Reviews comparing Replit and ClaudeCode.
Data inbreeding
When the data produced by AI-dependent humans stops growing, what happens to AI?
I Go to the Library to Look at Covers
Book titles reflect what an era cares about — and I think I've been going to the library just to browse them
[Claude Code] Claude Code Study Guidelines to Learn Efficiently and Quickly
Claude Code The direction to study and the basic study sequence
[AI] Stitch review
Reviews using Design AI in Stitch
[AI_StartDevelopment04] Maintain Session
If the network changes while working, the session is sometimes broken.: (
I was a legacy developer.
[Start AI Development_000] Opinion on AI Development (Guidelines)
Comments and Thoughts on AI Development
[AI development start_003] Create multilingual features
How to create multilingual features
[AI Start_001] Claude Code Start
start creating this blog with ai clod code
[AI Start Development_002] Add Image
Add image embedding feature
Starting Over at 40
Why I built this site — and why I'm returning to development after a decade away