All Posts

Thoughts, learnings, and snippets from the journey back to dev.

Koreans say 'better than expected' more than expected

A quiet observation about why Koreans soften every compliment with "better than I thought"

#thoughts

Google Play Production Approved

Google Play production approved

#googleplay#app registration

앱 개념어를 바꿨다 — Folder에서 Chain으로, 전면 리네이밍 작업기

ChainPlay 앱에서 Folder 개념을 Chain으로 전면 리네이밍하면서 겪은 과정과 TypeScript 타입 주도 리팩토링 방법

#React Native#TypeScript#리팩토링#ChainPlay

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 Console#app launch#Private testing

구글 플레이 비공개 테스트, 자주 업데이트할수록 승인이 빨라진다

Tilt 게임 버전업을 하면서 느낀 것 — 비공개 테스트 중에는 업데이트 빈도가 심사 통과에 직접 영향을 준다

#Android#GooglePlay#비공개테스트#앱출시#게임개발

Android 빌드 파일 정리하는 법 — 디스크 수 GB를 한 방에

안드로이드 프로젝트 빌드 파일이 디스크를 잡아먹을 때, 안전하게 정리하는 방법 총정리

#Android#Gradle#개발환경#디스크관리

Next.js 다국어 블로그 SEO — Google이 /ko를 무시하는 이유와 두 가지 해결법

Google Search Console 중복 페이지 오류의 원인인 x-default hreflang 누락과 isFallback noindex 처리 방법

#Next.js#SEO#next-intl#hreflang

Supabase Free Usage Restrictions

Found out the hard way that Supabase free plan only allows 2 active projects

#Supabase

How to Create and Use Agents

Using AI agents on the blog

#AI Agent#Claude Code

[INFO] Blockchain & AI Hackathon utilizing mobile IDs

Applying for a blockchain & AI hackathon that uses mobile digital IDs

#Hackathon#AI#BlockChain

Next.js + next-intl, /ko/ 리디렉션 오류와 proxy.ts 충돌 삽질기

Google Search Console 리디렉션 오류를 잡으려다 빌드 에러까지 만난 과정과 proxy.ts 구조 이해

#Next.js#next-intl#SEO#middleware

Ollama Review (How it feels to use each model)

Review of each model - DeepSeek, EXAONE, QWEN comparison

#Ollama#AI#Local AI#DeepSeek#EXAONE#Qwen

Installing Ollama and getting started with local AI

A guide to installing Ollama and selecting a model for local AI

#Ollama#AI#local AI#macOS

블로그 포스트 목록에서 "1분 읽기" 지운 이유

읽기 시간 표시가 초기 블로그에서 오히려 역효과가 나는 이유와 Next.js 컴포넌트에서 제거하는 방법

#Next.js#UI#블로그#React

Google이 내 블로그 예시 코드를 링크로 크롤링한 날

Search Console 404 오류를 추적했더니 포스트 본문의 코드 예시 파일명을 Google이 실제 URL로 인식한 것이었다 — next.config.ts redirects로 해결

#NextJS#SEO#GoogleSearchConsole#Debugging

Next.js 다국어 블로그에서 canonical 빠뜨리면 생기는 일

Google Search Console에서 "중복 페이지, Google에서 사용자와 다른 표준을 선택함" 오류가 뜬 이유와 next-intl 환경에서 canonical 설정하는 방법

#NextJS#SEO#next-intl#GoogleSearchConsole

Next.js 페이지 이동할 때마다 스크롤 애니메이션이 생기는 이유

뒤로 가기 버튼과 scroll-behavior smooth가 얽혀서 만든 스크롤 점프 버그 두 개를 연속으로 잡은 과정

#NextJS#AppRouter#Debugging#UX#CSS

GitHub에 AAB 올렸다가 용량 경고 받은 후 — 빌드 파일 로컬 버전관리로 전환하기

Android 릴리즈 빌드 파일(AAB/APK)을 GitHub에 올리면 안 되는 이유와, 로컬 폴더로 버전 관리하는 방법

#Android#AAB#GitHub#Git#ReactNative

React Native(Expo) 앱에 한/영 다국어 지원 추가하기 — locale 감지 삽질기

expo-localization부터 NativeModules, Intl API까지 세 가지 방법을 직접 써보고 최종 해답을 찾은 과정

#React Native#Expo#i18n#Android

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.

#Vercel#GitHub#NextJS#Debugging

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.

#googleplay#Android#AppStore#app launch

개인정보처리방침의 어린이 조항과 Play Store 전체 이용가는 별개다

개인정보처리방침에 "13세 미만 어린이 대상 아님" 문구를 넣으면 13세 이상 등급을 줘야 하는 게 아닌지 헷갈렸던 경험 정리

#Google Play#앱출시#개인정보처리방침#COPPA#콘텐츠등급

[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

#thoughts

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.

#Expo#ReactNative#Android#GooglePlayStore#Supabase

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.

#Vercel#YAML#NextJS#Debugging#GitHubActions

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

#AdSense#React#i18n#SEO#SideProject

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

#React#TypeScript#i18n#SideProject#qrcode

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

#React Native#Expo#expo#YouTube#Android

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.

#Android#adb#React Native#development environment#app development

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.

#GitHub#GitHubActions#ContributionGraph#Automation

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.

#ReactNative#Expo#Android#WebView#Bugfixes#YouTube

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.

#Android#play store#React Native#Expo#ASO

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.

#Claude Code#context window#token management#AI development tools

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.

#Next.js#seo#canonical#i18n#Google Search Console

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.

#Obsidian#git#android#GitHub#Mobile

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.

#Obsidian#Git#macOS#GitHub#xcode

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.

#Supabase#Next.js#PostgreSQL#PostgREST#Multiuser

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

#Android#React Native#Expo#BackgroundAudio#WakeLock

[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#Supabase#OAuth#Debugging#SideProject

[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

#JobRadar#Supabase#NextJS#TypeScript#SideProject

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.

#ClaudeCode#blogging#Automation

[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.

#Claude#ClaudeConsole#Troubleshooting

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#NextJS#Playwright#cheerio#AI#SideProject

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.

#JobRadar#cheerio#Scraping#Vercel

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.

#Claude#Support

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.

#ClaudeCode#Agent#Automation

[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.

#JobRadar#Playwright#Vercel#Serverless

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.

#ClaudeCode#MCP#Gemini#AI

[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.

#JobRadar#Playwright#Supabase#Scraping

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.

#ClaudeCode#Hooks#Automation

[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.

#JobRadar#NextJS#Vercel#SideProject

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.

#Android#Google Play#App Publishing#React Native

[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.

#AppStore#AppTesting#GooglePlay

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.

#DeepL#Translation API#Next.js#API Integration

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.

#GitHub Actions#Automation#CI/CD#Vercel#Blog

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.

#Google Play Console

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.

#Translation API#DeepL#MyMemory#Claude API#Next.js

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.

#React#SEO#react-helmet-async#SPA

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.

#android

[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.

#Claude Code#Skill#Automation#Slash commands

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.

#SEO#Next.js#Google Search Console#Open Graph

[App] Developing Cassette Player App_02

Cassette Tape Player App Development Journal 02

#React Native#Cassette App

[App] Developing Cassette Player App_01

Cassette tape player app development journal 01

#React Native#Cassette App

What is a good platform for beginners to Replit vs Claude Code?

Reviews comparing Replit and ClaudeCode.

#Replit#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

#thoughts#Essay

[Claude Code] Claude Code Study Guidelines to Learn Efficiently and Quickly

Claude Code The direction to study and the basic study sequence

#Claude Code Study#Study Guideline

[AI] Stitch review

Reviews using Design AI in Stitch

#Stitch#Design system

[AI_StartDevelopment04] Maintain Session

If the network changes while working, the session is sometimes broken.: (

#AI coding start#Session

I was a legacy developer.

#AI Development#Legacy

[Start AI Development_000] Opinion on AI Development (Guidelines)

Comments and Thoughts on AI Development

#AI coding start

[AI development start_003] Create multilingual features

How to create multilingual features

#AI coding start#multilingual

[AI Start_001] Claude Code Start

start creating this blog with ai clod code

#Start Claude Code

[AI Start Development_002] Add Image

Add image embedding feature

#Add blog image.ai

Starting Over at 40

Why I built this site — and why I'm returning to development after a decade away

#BackToDev